From 7f404ad003e46f6b2ec28bc23cc55a01c147483c Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 27 Jun 2025 14:59:40 -0600 Subject: [PATCH] Delete old code --- bootstrap/bloat-buster/base.h | 214 - bootstrap/bloat-buster/bb.c | 5081 ---- bootstrap/bloat-buster/bb_core.c | 276 - bootstrap/bloat-buster/bb_core.h | 7 - bootstrap/bloat-buster/data/instructions.dat | 281 - bootstrap/bloat-buster/data/x86_mnemonic.dat | 226 - bootstrap/bloat-buster/lld_api.cpp | 55 - bootstrap/bloat-buster/lld_api.h | 17 - bootstrap/bloat-buster/lld_driver.c | 244 - bootstrap/bloat-buster/lld_driver.h | 4 - bootstrap/bloat-buster/llvm.cpp | 166 - bootstrap/bloat-buster/llvm.h | 5 - bootstrap/bloat-buster/main.c | 25059 ----------------- bootstrap/bloat-buster/pdb_image.c | 8964 ------ bootstrap/bloat-buster/pdb_image.h | 2 - bootstrap/std/base.c | 463 - bootstrap/std/base.h | 373 - bootstrap/std/cocoa_windowing.c | 65 - bootstrap/std/cocoa_windowing.h | 18 - bootstrap/std/directx12_rendering.c | 1 - bootstrap/std/directx12_rendering.h | 1 - bootstrap/std/entry_point.c | 35 - bootstrap/std/entry_point.h | 11 - bootstrap/std/font_provider.c | 167 - bootstrap/std/font_provider.h | 35 - bootstrap/std/format.c | 1442 - bootstrap/std/format.h | 13 - bootstrap/std/image_loader.c | 26 - bootstrap/std/image_loader.h | 7 - bootstrap/std/md5.c | 178 - bootstrap/std/md5.h | 8 - bootstrap/std/metal_rendering.c | 148 - bootstrap/std/metal_rendering.h | 16 - bootstrap/std/os.c | 1701 -- bootstrap/std/os.h | 195 - bootstrap/std/project.h | 60 - bootstrap/std/rendering.c | 15 - bootstrap/std/rendering.h | 334 - bootstrap/std/sha1.c | 163 - bootstrap/std/sha1.h | 0 bootstrap/std/shaders/rect.frag | 43 - bootstrap/std/shaders/rect.inc | 22 - bootstrap/std/shaders/rect.metal | 122 - bootstrap/std/shaders/rect.vert | 61 - bootstrap/std/string.c | 136 - bootstrap/std/string.h | 10 - bootstrap/std/ui_builder.c | 14 - bootstrap/std/ui_builder.h | 6 - bootstrap/std/ui_core.c | 810 - bootstrap/std/ui_core.h | 223 - bootstrap/std/virtual_buffer.c | 88 - bootstrap/std/virtual_buffer.h | 54 - bootstrap/std/vulkan_rendering.c | 2502 -- bootstrap/std/vulkan_rendering.h | 130 - bootstrap/std/wayland_windowing.c | 1 - bootstrap/std/wayland_windowing.h | 1 - bootstrap/std/win32_windowing.c | 59 - bootstrap/std/win32_windowing.h | 13 - bootstrap/std/windowing.c | 15 - bootstrap/std/windowing.h | 206 - bootstrap/std/x11_windowing.c | 197 - bootstrap/std/x11_windowing.h | 17 - build.c | 2656 -- dependencies/stb/.gitignore | 3 - dependencies/stb/LICENSE | 37 - dependencies/stb/stb_image.h | 7988 ------ dependencies/stb/stb_truetype.h | 5089 ---- licenses/raw_pdb/LICENSE.txt | 27 - licenses/simple/LICENSE.txt | 203 - licenses/tb/LICENSE.txt | 23 - 70 files changed, 66832 deletions(-) delete mode 100644 bootstrap/bloat-buster/base.h delete mode 100644 bootstrap/bloat-buster/bb.c delete mode 100644 bootstrap/bloat-buster/bb_core.c delete mode 100644 bootstrap/bloat-buster/bb_core.h delete mode 100644 bootstrap/bloat-buster/data/instructions.dat delete mode 100644 bootstrap/bloat-buster/data/x86_mnemonic.dat delete mode 100644 bootstrap/bloat-buster/lld_api.cpp delete mode 100644 bootstrap/bloat-buster/lld_api.h delete mode 100644 bootstrap/bloat-buster/lld_driver.c delete mode 100644 bootstrap/bloat-buster/lld_driver.h delete mode 100644 bootstrap/bloat-buster/llvm.cpp delete mode 100644 bootstrap/bloat-buster/llvm.h delete mode 100644 bootstrap/bloat-buster/main.c delete mode 100644 bootstrap/bloat-buster/pdb_image.c delete mode 100644 bootstrap/bloat-buster/pdb_image.h delete mode 100644 bootstrap/std/base.c delete mode 100644 bootstrap/std/base.h delete mode 100644 bootstrap/std/cocoa_windowing.c delete mode 100644 bootstrap/std/cocoa_windowing.h delete mode 100644 bootstrap/std/directx12_rendering.c delete mode 100644 bootstrap/std/directx12_rendering.h delete mode 100644 bootstrap/std/entry_point.c delete mode 100644 bootstrap/std/entry_point.h delete mode 100644 bootstrap/std/font_provider.c delete mode 100644 bootstrap/std/font_provider.h delete mode 100644 bootstrap/std/format.c delete mode 100644 bootstrap/std/format.h delete mode 100644 bootstrap/std/image_loader.c delete mode 100644 bootstrap/std/image_loader.h delete mode 100644 bootstrap/std/md5.c delete mode 100644 bootstrap/std/md5.h delete mode 100644 bootstrap/std/metal_rendering.c delete mode 100644 bootstrap/std/metal_rendering.h delete mode 100644 bootstrap/std/os.c delete mode 100644 bootstrap/std/os.h delete mode 100644 bootstrap/std/project.h delete mode 100644 bootstrap/std/rendering.c delete mode 100644 bootstrap/std/rendering.h delete mode 100644 bootstrap/std/sha1.c delete mode 100644 bootstrap/std/sha1.h delete mode 100644 bootstrap/std/shaders/rect.frag delete mode 100644 bootstrap/std/shaders/rect.inc delete mode 100644 bootstrap/std/shaders/rect.metal delete mode 100644 bootstrap/std/shaders/rect.vert delete mode 100644 bootstrap/std/string.c delete mode 100644 bootstrap/std/string.h delete mode 100644 bootstrap/std/ui_builder.c delete mode 100644 bootstrap/std/ui_builder.h delete mode 100644 bootstrap/std/ui_core.c delete mode 100644 bootstrap/std/ui_core.h delete mode 100644 bootstrap/std/virtual_buffer.c delete mode 100644 bootstrap/std/virtual_buffer.h delete mode 100644 bootstrap/std/vulkan_rendering.c delete mode 100644 bootstrap/std/vulkan_rendering.h delete mode 100644 bootstrap/std/wayland_windowing.c delete mode 100644 bootstrap/std/wayland_windowing.h delete mode 100644 bootstrap/std/win32_windowing.c delete mode 100644 bootstrap/std/win32_windowing.h delete mode 100644 bootstrap/std/windowing.c delete mode 100644 bootstrap/std/windowing.h delete mode 100644 bootstrap/std/x11_windowing.c delete mode 100644 bootstrap/std/x11_windowing.h delete mode 100644 build.c delete mode 100644 dependencies/stb/.gitignore delete mode 100644 dependencies/stb/LICENSE delete mode 100644 dependencies/stb/stb_image.h delete mode 100644 dependencies/stb/stb_truetype.h delete mode 100644 licenses/raw_pdb/LICENSE.txt delete mode 100644 licenses/simple/LICENSE.txt delete mode 100644 licenses/tb/LICENSE.txt diff --git a/bootstrap/bloat-buster/base.h b/bootstrap/bloat-buster/base.h deleted file mode 100644 index f3d53c9..0000000 --- a/bootstrap/bloat-buster/base.h +++ /dev/null @@ -1,214 +0,0 @@ -#pragma once - -#include -#include - -typedef enum CpuArchitecture : u8 -{ - CPU_ARCH_X86_64, - CPU_ARCH_AARCH64, -} CpuArchitecture; - -fn String cpu_to_string(CpuArchitecture cpu) -{ - switch (cpu) - { - case CPU_ARCH_X86_64: - return strlit("x86_64"); - case CPU_ARCH_AARCH64: - return strlit("aarch64"); - } -} - -typedef enum OperatingSystem : u8 -{ - OPERATING_SYSTEM_LINUX, - OPERATING_SYSTEM_MAC, - OPERATING_SYSTEM_WINDOWS, -} OperatingSystem; - -fn String operating_system_to_string(OperatingSystem os) -{ - switch (os) - { - case OPERATING_SYSTEM_LINUX: - return strlit("linux"); - case OPERATING_SYSTEM_MAC: - return strlit("macos"); - case OPERATING_SYSTEM_WINDOWS: - return strlit("windows"); - } -} - -STRUCT(Target) -{ - CpuArchitecture cpu; - OperatingSystem os; -}; - -typedef enum CompilerBackend : u8 -{ - COMPILER_BACKEND_BB, - COMPILER_BACKEND_LLVM, - COMPILER_BACKEND_COUNT, -} CompilerBackend; - -fn String compiler_backend_to_one_char_string(CompilerBackend backend) -{ - switch (backend) - { - case COMPILER_BACKEND_BB: - return strlit("b"); - case COMPILER_BACKEND_LLVM: - return strlit("l"); - case COMPILER_BACKEND_COUNT: - unreachable(); - } -} - -fn String compiler_backend_to_string(CompilerBackend backend) -{ - switch (backend) - { - case COMPILER_BACKEND_BB: - return strlit("bb"); - case COMPILER_BACKEND_LLVM: - return strlit("llvm"); - case COMPILER_BACKEND_COUNT: - unreachable(); - } -} - -typedef enum BinaryFileType : u8 -{ - BINARY_FILE_OBJECT, - BINARY_FILE_STATIC_LIBRARY, - BINARY_FILE_DYNAMIC_LIBRARY, - BINARY_FILE_EXECUTABLE, -} BinaryFileType; - -STRUCT(BinaryPathOptions) -{ - String build_directory; - String name; - Target target; - CompilerBackend backend; - BinaryFileType binary_file_type; -}; - -fn String binary_path_from_options(Arena* arena, BinaryPathOptions options) -{ - String object_extension; - switch (options.target.os) - { - case OPERATING_SYSTEM_WINDOWS: - object_extension = strlit(".obj"); - break; - default: - object_extension = strlit(".o"); - break; - } - String executable_extension; - switch (options.target.os) - { - case OPERATING_SYSTEM_WINDOWS: - executable_extension = strlit(".exe"); - break; - default: - executable_extension = strlit(""); - break; - } - - String extension; - switch (options.binary_file_type) - { - case BINARY_FILE_OBJECT: - extension = object_extension; - break; - case BINARY_FILE_STATIC_LIBRARY: - unreachable(); - break; - case BINARY_FILE_DYNAMIC_LIBRARY: - unreachable(); - break; - case BINARY_FILE_EXECUTABLE: - extension = executable_extension; - break; - } - - auto backend_string = compiler_backend_to_string(options.backend); - auto cpu_string = cpu_to_string(options.target.cpu); - auto os_string = operating_system_to_string(options.target.os); - String parts[] = { - options.build_directory, - strlit("/"), - options.name, - // strlit("_"), - // cpu_string, - // strlit("_"), - // os_string, - // strlit("_"), - // backend_string, - extension, - }; - - auto result = arena_join_string(arena, (Slice(String)) array_to_slice(parts)); - return result; -} - -fn CompilerBackend one_char_string_to_compiler_backend(String string) -{ - CompilerBackend result = COMPILER_BACKEND_COUNT; - - for (u32 i = 0; i < COMPILER_BACKEND_COUNT; i += 1) - { - auto candidate = (CompilerBackend)i; - if (s_equal(compiler_backend_to_one_char_string(candidate), string)) - { - result = candidate; - break; - } - } - - return result; -} - -STRUCT(CodegenOptions) -{ - String test_name; - Target target; - CompilerBackend backend; - u8 generate_debug_information; -}; - -fn Target native_target_get() -{ - Target target = { -#ifdef __x86_64__ - .cpu = CPU_ARCH_X86_64, -#else - .cpu = CPU_ARCH_AARCH64, -#endif -#if _WIN32 - .os = OPERATING_SYSTEM_WINDOWS, -#elif defined(__APPLE__) - .os = OPERATING_SYSTEM_MAC, -#elif defined(__linux__) - .os = OPERATING_SYSTEM_LINUX, -#else -#error "Unknown platform" -#endif - }; - - return target; -} - -STRUCT(LinkerArguments) -{ - Target target; - String out_path; - Slice(String) objects; - Slice(String) libraries; - u8 link_libc:1; - u8 link_libcpp:1; -}; diff --git a/bootstrap/bloat-buster/bb.c b/bootstrap/bloat-buster/bb.c deleted file mode 100644 index b1f6977..0000000 --- a/bootstrap/bloat-buster/bb.c +++ /dev/null @@ -1,5081 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -global_variable char** environment_pointer; - -typedef enum GPR_x86_64 -{ - REGISTER_X86_64_AL = 0x0, - REGISTER_X86_64_AH = REGISTER_X86_64_AL | (1 << 2), - REGISTER_X86_64_AX = REGISTER_X86_64_AL, - REGISTER_X86_64_EAX = REGISTER_X86_64_AL, - REGISTER_X86_64_RAX = REGISTER_X86_64_AL, - - REGISTER_X86_64_CL = 0x1, - REGISTER_X86_64_CH = REGISTER_X86_64_CL | (1 << 2), - REGISTER_X86_64_CX = REGISTER_X86_64_CL, - REGISTER_X86_64_ECX = REGISTER_X86_64_CL, - REGISTER_X86_64_RCX = REGISTER_X86_64_CL, - - REGISTER_X86_64_DL = 0x2, - REGISTER_X86_64_DH = REGISTER_X86_64_DL | (1 << 2), - REGISTER_X86_64_DX = REGISTER_X86_64_DL, - REGISTER_X86_64_EDX = REGISTER_X86_64_DL, - REGISTER_X86_64_RDX = REGISTER_X86_64_DL, - - REGISTER_X86_64_BL = 0x3, - REGISTER_X86_64_BH = REGISTER_X86_64_BL | (1 << 2), - REGISTER_X86_64_BX = REGISTER_X86_64_BL, - REGISTER_X86_64_EBX = REGISTER_X86_64_BL, - REGISTER_X86_64_RBX = REGISTER_X86_64_BL, - - REGISTER_X86_64_SPL = 0x4, - REGISTER_X86_64_SP = REGISTER_X86_64_SPL, - REGISTER_X86_64_ESP = REGISTER_X86_64_SPL, - REGISTER_X86_64_RSP = REGISTER_X86_64_SPL, - - REGISTER_X86_64_BPL = 0x5, - REGISTER_X86_64_BP = REGISTER_X86_64_BPL, - REGISTER_X86_64_EBP = REGISTER_X86_64_BPL, - REGISTER_X86_64_RBP = REGISTER_X86_64_BPL, - - REGISTER_X86_64_SIL = 0x6, - REGISTER_X86_64_SI = REGISTER_X86_64_SIL, - REGISTER_X86_64_ESI = REGISTER_X86_64_SIL, - REGISTER_X86_64_RSI = REGISTER_X86_64_SIL, - - REGISTER_X86_64_DIL = 0x7, - REGISTER_X86_64_DI = REGISTER_X86_64_DIL, - REGISTER_X86_64_EDI = REGISTER_X86_64_DIL, - REGISTER_X86_64_RDI = REGISTER_X86_64_DIL, - - REGISTER_X86_64_R8L = 0x8, - REGISTER_X86_64_R8W = REGISTER_X86_64_R8L, - REGISTER_X86_64_R8D = REGISTER_X86_64_R8L, - REGISTER_X86_64_R8 = REGISTER_X86_64_R8L, - - REGISTER_X86_64_R9L = 0x9, - REGISTER_X86_64_R9W = REGISTER_X86_64_R9L, - REGISTER_X86_64_R9D = REGISTER_X86_64_R9L, - REGISTER_X86_64_R9 = REGISTER_X86_64_R9L, - - REGISTER_X86_64_R10L = 0xa, - REGISTER_X86_64_R10W = REGISTER_X86_64_R10L, - REGISTER_X86_64_R10D = REGISTER_X86_64_R10L, - REGISTER_X86_64_R10 = REGISTER_X86_64_R10L, - - REGISTER_X86_64_R11L = 0xb, - REGISTER_X86_64_R11W = REGISTER_X86_64_R11L, - REGISTER_X86_64_R11D = REGISTER_X86_64_R11L, - REGISTER_X86_64_R11 = REGISTER_X86_64_R11L, - - REGISTER_X86_64_R12L = 0xc, - REGISTER_X86_64_R12W = REGISTER_X86_64_R12L, - REGISTER_X86_64_R12D = REGISTER_X86_64_R12L, - REGISTER_X86_64_R12 = REGISTER_X86_64_R12L, - - REGISTER_X86_64_R13L = 0xd, - REGISTER_X86_64_R13W = REGISTER_X86_64_R13L, - REGISTER_X86_64_R13D = REGISTER_X86_64_R13L, - REGISTER_X86_64_R13 = REGISTER_X86_64_R13L, - - REGISTER_X86_64_R14L = 0xe, - REGISTER_X86_64_R14W = REGISTER_X86_64_R14L, - REGISTER_X86_64_R14D = REGISTER_X86_64_R14L, - REGISTER_X86_64_R14 = REGISTER_X86_64_R14L, - - REGISTER_X86_64_R15L = 0xf, - REGISTER_X86_64_R15W = REGISTER_X86_64_R15L, - REGISTER_X86_64_R15D = REGISTER_X86_64_R15L, - REGISTER_X86_64_R15 = REGISTER_X86_64_R15L, -} GPR_x86_64; - -fn u8 gpr_is_extended(GPR_x86_64 gpr) -{ - return (gpr & 0b1000) >> 3; -} - -#define X86_64_GPR_COUNT (16) - -typedef enum OpcodeLength -{ - OPCODE_LENGTH_1 = 0, - OPCODE_LENGTH_2 = 1, // 0f xx - OPCODE_LENGTH_3 = 2, // 0f yy xx -} OpcodeLength; - -STRUCT(Opcode) -{ - u8 plus_register:1; - u8 prefix_0f:1; - u8 extension:3; - u8 reserved:2; - u8 bytes[2]; -}; - -typedef enum LegacyPrefix -{ - LEGACY_PREFIX_F0, - LEGACY_PREFIX_F2, - LEGACY_PREFIX_F3, - LEGACY_PREFIX_2E, - LEGACY_PREFIX_36, - LEGACY_PREFIX_3E, - LEGACY_PREFIX_26, - LEGACY_PREFIX_64, - LEGACY_PREFIX_65, - LEGACY_PREFIX_66, - LEGACY_PREFIX_67, - LEGACY_PREFIX_COUNT, -} LegacyPrefix; - -typedef enum SegmentRegisterOverride -{ - SEGMENT_REGISTER_OVERRIDE_CS, - SEGMENT_REGISTER_OVERRIDE_SS, - SEGMENT_REGISTER_OVERRIDE_DS, - SEGMENT_REGISTER_OVERRIDE_ES, - SEGMENT_REGISTER_OVERRIDE_FS, - SEGMENT_REGISTER_OVERRIDE_GS, - SEGMENT_REGISTER_OVERRIDE_COUNT, -} SegmentRegisterOverride; - -fn String segment_register_override_to_register_string(SegmentRegisterOverride segment_register_override) -{ - switch (segment_register_override) - { - case SEGMENT_REGISTER_OVERRIDE_CS: return strlit("cs"); - case SEGMENT_REGISTER_OVERRIDE_SS: return strlit("ss"); - case SEGMENT_REGISTER_OVERRIDE_DS: return strlit("ds"); - case SEGMENT_REGISTER_OVERRIDE_ES: return strlit("es"); - case SEGMENT_REGISTER_OVERRIDE_FS: return strlit("fs"); - case SEGMENT_REGISTER_OVERRIDE_GS: return strlit("gs"); - case SEGMENT_REGISTER_OVERRIDE_COUNT: unreachable(); - } -} - -global_variable const u8 segment_register_overrides[] = { - [SEGMENT_REGISTER_OVERRIDE_CS] = LEGACY_PREFIX_2E, - [SEGMENT_REGISTER_OVERRIDE_SS] = LEGACY_PREFIX_36, - [SEGMENT_REGISTER_OVERRIDE_DS] = LEGACY_PREFIX_3E, - [SEGMENT_REGISTER_OVERRIDE_ES] = LEGACY_PREFIX_26, - [SEGMENT_REGISTER_OVERRIDE_FS] = LEGACY_PREFIX_64, - [SEGMENT_REGISTER_OVERRIDE_GS] = LEGACY_PREFIX_65, -}; -static_assert(array_length(segment_register_overrides) == SEGMENT_REGISTER_OVERRIDE_COUNT); - -global_variable u8 legacy_prefixes[] = { - 0xf0, - 0xf2, - 0xf3, - 0x2e, - 0x36, - 0x3e, - 0x26, - 0x64, - 0x65, - 0x66, - 0x67, -}; - -static_assert(array_length(legacy_prefixes) == LEGACY_PREFIX_COUNT); - -STRUCT(EncodingScalar) -{ - EncodingInvariantData invariant; - u64 legacy_prefixes:LEGACY_PREFIX_COUNT; - u64 rm_register:4; - u64 reg_register:4; - union - { - u8 bytes[8]; - u64 value; - } immediate; - union - { - s32 value; - s8 bytes[4]; - } displacement; - Opcode opcode; -}; - -#define batch_element_count (64) -#define max_instruction_byte_count (16) - -u32 encode_scalar(u8* restrict output, const EncodingScalar* const restrict encodings, u64 encoding_count) -{ - assert(encoding_count); - u8 buffers[batch_element_count][max_instruction_byte_count]; - u8 instruction_lengths[batch_element_count]; - - for (u32 encoding_index = 0; encoding_index < encoding_count; encoding_index += 1) - { - let(encoding, encodings[encoding_index]); - - const u8* const start = (const u8* const) &buffers[encoding_index]; - u8* restrict local_buffer = (u8* restrict)&buffers[encoding_index]; - u8* restrict it = local_buffer; - - for (LegacyPrefix prefix = 0; prefix < LEGACY_PREFIX_COUNT; prefix += 1) - { - let(is_prefix, (encoding.legacy_prefixes & (1 << prefix)) >> prefix); - let(prefix_byte, legacy_prefixes[prefix]); - *it = prefix_byte; - it += is_prefix; - } - - u8 has_base_register = encoding.invariant.is_rm_register | encoding.invariant.is_reg_register | encoding.invariant.implicit_register; - - u8 rex_base = 0x40; - u8 rex_b = 0x01; - u8 rex_x = 0x02; - unused(rex_x); - u8 rex_r = 0x04; - u8 rex_w = 0x08; - u8 is_reg_direct_addressing_mode = !encoding.invariant.is_displacement; - u8 reg_register = encoding.reg_register; - u8 rm_register = encoding.rm_register; - u8 byte_rex_b = rex_b * gpr_is_extended(rm_register); - u8 byte_rex_x = 0; // TODO: rex_x * encoding.scaled_index_register; - u8 byte_rex_r = rex_r * gpr_is_extended(reg_register); - u8 byte_rex_w = rex_w * encoding.invariant.rex_w; - u8 byte_rex = (byte_rex_b | byte_rex_x) | (byte_rex_r | byte_rex_w); - u8 rex = (rex_base | byte_rex); - u8 encode_rex = byte_rex != 0; - *it = rex; - it += encode_rex; - - u8 encode_prefix_0f = encoding.opcode.prefix_0f; - *it = 0x0f * encode_prefix_0f; - it += encode_prefix_0f; - - u8 encode_three_byte_opcode = encoding.opcode.bytes[1] != 0; - *it = encoding.opcode.bytes[1] * encode_three_byte_opcode; - it += encode_three_byte_opcode; - - *it = encoding.opcode.bytes[0] | ((encoding.rm_register & 0b111) * encoding.opcode.plus_register); // *it = encoding.opcode.bytes[0] | - it += 1; - - u8 encode_mod_rm = ((encoding.invariant.is_rm_register | encoding.invariant.is_reg_register) & (!encoding.opcode.plus_register)) | encoding.invariant.is_displacement; - - // Mod: - // 00: No displacement (except when R/M = 101, where a 32-bit displacement follows). - // 01: 8-bit signed displacement follows. - // 10: 32-bit signed displacement follows. - // 11: Register addressing (no memory access). - - u8 mod_is_displacement32 = encoding.invariant.is_displacement & encoding.invariant.displacement_size; - u8 mod_is_displacement8 = (encoding.invariant.is_displacement & !(encoding.invariant.displacement_size)) & ((encoding.displacement.bytes[0] != 0) | (encoding.invariant.is_rm_register & ((encoding.rm_register & 0b111) == REGISTER_X86_64_RBP))); - // TODO: fix if necessary - u8 mod = (((mod_is_displacement32 * has_base_register) << 1) | (mod_is_displacement8 * has_base_register)) | ((is_reg_direct_addressing_mode << 1) | is_reg_direct_addressing_mode); - // A register operand. - // An opcode extension (in some instructions). - u8 reg = (reg_register & 0b111) | encoding.opcode.extension; - // When mod is 00, 01, or 10: Specifies a memory address or a base register. - // When mod is 11: Specifies a register. - u8 rm = (rm_register & 0b111) | (!has_base_register * 0b100); - u8 mod_rm = (mod << 6) | (reg << 3) | rm; - *it = mod_rm; - it += encode_mod_rm; - - // When mod is 00, 01, or 10 and rm = 100, a SIB (Scale-Index-Base) byte follows the ModR/M byte to further specify the addressing mode. - u8 encode_sib = (mod != 0b11) & (rm == 0b100); - u8 sib_scale = 0; - u8 sib_index = 0b100; - u8 sib_base = ((rm_register & 0b111) * encoding.invariant.is_rm_register) | (!encoding.invariant.is_rm_register * 0b101); - u8 sib_byte = sib_scale << 6 | sib_index << 3 | sib_base; - *it = sib_byte; - it += encode_sib; - - *(s8*)it = encoding.displacement.bytes[0]; - it += mod_is_displacement8 * sizeof(s8); - - *(s32*)it = encoding.displacement.value; - it += mod_is_displacement32 * sizeof(s32); - - *(u8*) it = encoding.immediate.bytes[0]; - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 0)) * sizeof(u8); - - *(u16*) it = *(u16*)(&encoding.immediate.bytes[0]); - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 1)) * sizeof(u16); - - *(u32*) it = *(u32*)(&encoding.immediate.bytes[0]); - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 2)) * sizeof(u32); - - *(u64*) it = encoding.immediate.value; - it += (encoding.invariant.is_immediate & (encoding.invariant.immediate_size == 3)) * sizeof(u64); - - *(s8*)it = encoding.displacement.bytes[0]; - it += (encoding.invariant.is_relative & !encoding.invariant.displacement_size) * sizeof(s8); - - *(s32*)it = encoding.displacement.value; - it += (encoding.invariant.is_relative & encoding.invariant.displacement_size) * sizeof(s32); - - let_cast(u8, instruction_length, it - start); - instruction_lengths[encoding_index] = instruction_length; - } - - u8* restrict it = output; - - for (u32 encoding_index = 0; encoding_index < MIN(encoding_count, batch_element_count); encoding_index += 1) - { - let(instruction_length, instruction_lengths[encoding_index]); -#if USE_MEMCPY - memcpy(it, &buffers[encoding_index], instruction_length); -#else - for (u8 byte = 0; byte < instruction_length; byte += 1) - { - it[byte] = buffers[encoding_index][byte]; - } -#endif - it += instruction_length; - } - - let(length, (u32)(it - output)); - assert(it - output != 0); - assert(length); - return length; -} - -#define cc_count(x) ((MNEMONIC_x86_64_ ## x ## z - MNEMONIC_x86_64_ ## x ## a) + 1) -// #define cmov_count ((MNEMONIC_x86_64_cmovz - MNEMONIC_x86_64_cmova) + 1) -// #define jcc_count ((MNEMONIC_x86_64_jz - MNEMONIC_x86_64_ja) + 1) -#define cmov_count cc_count(cmov) -#define jcc_count cc_count(j) -#define setcc_count cc_count(set) - -#define cc_index(x) \ -fn u8 x ## _index(Mnemonic_x86_64 mnemonic) \ -{\ - assert(mnemonic >= MNEMONIC_x86_64_ ## x ## a && mnemonic <= MNEMONIC_x86_64_ ## x ## z);\ - return (u8)(mnemonic - MNEMONIC_x86_64_ ## x ## a);\ -} - -cc_index(cmov) -cc_index(j) -cc_index(set) - -global_variable const u8 cc_opcodes_low[] = { - 0x07, - 0x03, - 0x02, - 0x06, - 0x02, - 0x04, - 0x0F, - 0x0D, - 0x0C, - 0x0E, - 0x06, - 0x02, - 0x03, - 0x07, - 0x03, - 0x05, - 0x0E, - 0x0C, - 0x0D, - 0x0F, - 0x01, - 0x0B, - 0x09, - 0x05, - 0x00, - 0x0A, - 0x0A, - 0x0B, - 0x08, - 0x04, -}; -static_assert(array_length(cc_opcodes_low) == cmov_count); -static_assert(array_length(cc_opcodes_low) == jcc_count); -static_assert(array_length(cc_opcodes_low) == setcc_count); - -ENUM(OperandId, u8, - op_none, - op_al, - op_ax, - op_eax, - op_rax, - op_cl, - op_cx, - op_ecx, - op_rcx, - op_dl, - op_dx, - op_edx, - op_rdx, - op_r8, - op_r16, - op_r32, - op_r64, - op_rm8, - op_rm16, - op_rm32, - op_rm64, - op_imm8, - op_imm16, - op_imm32, - op_imm64, - op_rel8, - op_rel32, - op_m8, - op_m16, - op_m32, - op_m64, - op_m128, - - op_ds_rsi_m8, - op_ds_rsi_m16, - op_ds_rsi_m32, - op_ds_rsi_m64, - - op_es_rdi_m8, - op_es_rdi_m16, - op_es_rdi_m32, - op_es_rdi_m64, - - op_one_literal, -); - -#define operand_kind_array_element_count (4) - -fn String operand_to_string(OperandId operand_id) -{ - switch (operand_id) - { - case_to_name(op_, none); - case op_al: return strlit("al"); - case op_ax: return strlit("ax"); - case op_eax: return strlit("eax"); - case op_rax: return strlit("rax"); - case op_cl: return strlit("cl"); - case op_cx: return strlit("cx"); - case op_ecx: return strlit("ecx"); - case op_rcx: return strlit("rcx"); - case op_dl: return strlit("dl"); - case op_dx: return strlit("dx"); - case op_edx: return strlit("edx"); - case op_rdx: return strlit("rdx"); - case_to_name(op_, r8); - case_to_name(op_, r16); - case_to_name(op_, r32); - case_to_name(op_, r64); - case_to_name(op_, rm8); - case_to_name(op_, rm16); - case_to_name(op_, rm32); - case_to_name(op_, rm64); - case_to_name(op_, imm8); - case_to_name(op_, imm16); - case_to_name(op_, imm32); - case_to_name(op_, imm64); - case_to_name(op_, rel8); - case_to_name(op_, rel32); - case_to_name(op_, m8); - case_to_name(op_, m16); - case_to_name(op_, m32); - case_to_name(op_, m64); - case_to_name(op_, m128); - case_to_name(op_, ds_rsi_m8); - case_to_name(op_, ds_rsi_m16); - case_to_name(op_, ds_rsi_m32); - case_to_name(op_, ds_rsi_m64); - - case_to_name(op_, es_rdi_m8); - case_to_name(op_, es_rdi_m16); - case_to_name(op_, es_rdi_m32); - case_to_name(op_, es_rdi_m64); - case op_one_literal: return strlit("1"); - } -} - -STRUCT(Operands) -{ - OperandId values[operand_kind_array_element_count]; - u8 count:7; - u8 implicit_operands:1; -}; - -STRUCT(Encoding) -{ - Operands operands; - Opcode opcode; - u8 rex_w:1; - u8 operand_size_override:1; -}; -decl_vb(Encoding); - -STRUCT(Batch) -{ - Mnemonic_x86_64 mnemonic; - u64 legacy_prefixes:LEGACY_PREFIX_COUNT; - u32 encoding_offset; - u32 encoding_count; -}; -decl_vb(Batch); - -fn u8 op_is_gpra(OperandId operand_kind) -{ - return operand_kind >= op_al && operand_kind <= op_rax; -} - -fn u8 op_gpra_get_index(OperandId operand) -{ - assert(op_is_gpra(operand)); - return operand - op_al; -} - -fn String op_gpra_to_string(OperandId operand) -{ - let(index, op_gpra_get_index(operand)); - String register_a_names[] = { - strlit("al"), - strlit("ax"), - strlit("eax"), - strlit("rax"), - }; - - return register_a_names[index]; -} - -fn u8 op_is_gprd(OperandId operand_kind) -{ - return operand_kind >= op_dl && operand_kind <= op_rdx; -} - -fn String op_gprd_to_string(OperandId operand) -{ - assert(op_is_gprd(operand)); - switch (operand) - { - case op_dl: return strlit("dl"); - case op_dx: return strlit("dx"); - case op_edx: return strlit("edx"); - case op_rdx: return strlit("rdx"); - default: unreachable(); - } -} - -fn u8 op_is_imm(OperandId operand_kind) -{ - return operand_kind >= op_imm8 && operand_kind <= op_imm64; -} - -fn u8 op_is_gpr_no_gpra_exclusive(OperandId operand_kind) -{ - return operand_kind >= op_r8 && operand_kind <= op_r64; -} - -fn u8 op_is_rm(OperandId operand_kind) -{ - return operand_kind >= op_rm8 && operand_kind <= op_rm64; -} - -fn u8 op_is_gpr_no_gpra(OperandId operand_kind) -{ - return op_is_gpr_no_gpra_exclusive(operand_kind) | op_is_rm(operand_kind); -} - -fn u8 op_is_relative(OperandId operand_kind) -{ - return operand_kind >= op_rel8 && operand_kind <= op_rel32; -} - -fn u8 op_is_memory(OperandId operand) -{ - return operand >= op_m8 && operand <= op_m128; -} - -fn u8 op_is_es_rdi_memory(OperandId operand) -{ - return operand >= op_es_rdi_m8 && operand <= op_es_rdi_m64; -} - -fn u8 op_is_ds_rsi_memory(OperandId operand) -{ - return operand >= op_ds_rsi_m8 && operand <= op_ds_rsi_m64; -} - -fn u8 op_rm_get_index(OperandId operand_kind) -{ - assert(op_is_rm(operand_kind)); - return operand_kind - op_rm8; -} - -fn u8 op_gprd_get_index(OperandId operand_kind) -{ - assert(op_is_gprd(operand_kind)); - return operand_kind >= op_dl && operand_kind <= op_rdx; -} - -fn u8 op_gpr_exclusive_get_index(OperandId operand_kind) -{ - assert(op_is_gpr_no_gpra_exclusive(operand_kind)); - return operand_kind - op_r8; -} - -fn u8 op_gpr_get_index(OperandId operand_kind) -{ - assert(op_is_gpr_no_gpra(operand_kind)); - return op_is_rm(operand_kind) ? op_rm_get_index(operand_kind) : op_gpr_exclusive_get_index(operand_kind); -} - -fn u8 op_imm_get_index(OperandId operand_kind) -{ - assert(op_is_imm(operand_kind)); - return operand_kind - op_imm8; -} - -fn u8 op_get_size_out_of_index(u8 index) -{ - return 1 << index; -} - -STRUCT(TestDataset) -{ - const Batch* const restrict batches; - u64 batch_count; - const Encoding* const restrict encodings; - u64 encoding_count; -}; - -fn String sample_immediate_strings(u8 index) -{ - global_variable const String strings[] = { - strlit("10"), - strlit("1000"), - strlit("10000000"), - strlit("1000000000000000"), - }; - - return strings[index]; -} - -fn u64 sample_immediate_values(u8 index) -{ - global_variable const u64 immediates[] = { - 10, - 1000, - 10000000, - 1000000000000000, - }; - return immediates[index]; -} - -fn String gpr_to_string(GPR_x86_64 gpr, u8 index, u8 switcher) -{ - assert(switcher == 0 || switcher == 1); - global_variable const String gpr_names[X86_64_GPR_COUNT][4] = { - [REGISTER_X86_64_AX] = { - strlit("al"), - strlit("ax"), - strlit("eax"), - strlit("rax"), - }, - [REGISTER_X86_64_CX] = { - strlit("cl"), - strlit("cx"), - strlit("ecx"), - strlit("rcx"), - }, - [REGISTER_X86_64_DX] = { - strlit("dl"), - strlit("dx"), - strlit("edx"), - strlit("rdx"), - }, - [REGISTER_X86_64_BX] = { - strlit("bl"), - strlit("bx"), - strlit("ebx"), - strlit("rbx"), - }, - [REGISTER_X86_64_SP] = { - strlit("ah"), // Check alt names - strlit("sp"), - strlit("esp"), - strlit("rsp"), - }, - [REGISTER_X86_64_BP] = { - strlit("ch"), - strlit("bp"), - strlit("ebp"), - strlit("rbp"), - }, - [REGISTER_X86_64_SI] = { - strlit("dh"), - strlit("si"), - strlit("esi"), - strlit("rsi"), - }, - [REGISTER_X86_64_DI] = { - strlit("bh"), - strlit("di"), - strlit("edi"), - strlit("rdi"), - }, - [REGISTER_X86_64_R8] = { - strlit("r8b"), - strlit("r8w"), - strlit("r8d"), - strlit("r8"), - }, - [REGISTER_X86_64_R9] = { - strlit("r9b"), - strlit("r9w"), - strlit("r9d"), - strlit("r9"), - }, - [REGISTER_X86_64_R10] = { - strlit("r10b"), - strlit("r10w"), - strlit("r10d"), - strlit("r10"), - }, - [REGISTER_X86_64_R11] = { - strlit("r11b"), - strlit("r11w"), - strlit("r11d"), - strlit("r11"), - }, - [REGISTER_X86_64_R12] = { - strlit("r12b"), - strlit("r12w"), - strlit("r12d"), - strlit("r12"), - }, - [REGISTER_X86_64_R13] = { - strlit("r13b"), - strlit("r13w"), - strlit("r13d"), - strlit("r13"), - }, - [REGISTER_X86_64_R14] = { - strlit("r14b"), - strlit("r14w"), - strlit("r14d"), - strlit("r14"), - }, - [REGISTER_X86_64_R15] = { - strlit("r15b"), - strlit("r15w"), - strlit("r15d"), - strlit("r15"), - }, - }; - - global_variable const String alt_register_names[] = { - strlit("spl"), - strlit("bpl"), - strlit("sil"), - strlit("dil"), - }; - - return (unlikely(((gpr & 0b100) >> 2) & ((switcher != 0) & (index == 0)))) ? alt_register_names[gpr & 0b11] : gpr_names[gpr][index]; -} - -fn String format_instruction1(String buffer, String mnemonic, String op) -{ - u64 i = 0; - - memcpy(buffer.pointer + i, mnemonic.pointer, mnemonic.length); - i += mnemonic.length; - - buffer.pointer[i] = ' '; - i += 1; - - memcpy(buffer.pointer + i, op.pointer, op.length); - i += op.length; - - assert(i < buffer.length); - buffer.pointer[i] = 0; - - return (String) { - .pointer = buffer.pointer, - .length = i, - }; -} - -fn String format_instruction2(String buffer, String mnemonic, String op1, String op2) -{ - u64 i = 0; - - memcpy(buffer.pointer + i, mnemonic.pointer, mnemonic.length); - i += mnemonic.length; - - buffer.pointer[i] = ' '; - i += 1; - - memcpy(buffer.pointer + i, op1.pointer, op1.length); - i += op1.length; - - buffer.pointer[i] = ','; - buffer.pointer[i + 1] = ' '; - i += 2; - - memcpy(buffer.pointer + i, op2.pointer, op2.length); - i += op2.length; - - assert(i < buffer.length); - buffer.pointer[i] = 0; - - return (String) { - .pointer = buffer.pointer, - .length = i, - }; -} - -fn String format_instruction3(String buffer, String mnemonic, String op1, String op2, String op3) -{ - u64 i = 0; - - memcpy(buffer.pointer + i, mnemonic.pointer, mnemonic.length); - i += mnemonic.length; - - buffer.pointer[i] = ' '; - i += 1; - - memcpy(buffer.pointer + i, op1.pointer, op1.length); - i += op1.length; - - buffer.pointer[i] = ','; - buffer.pointer[i + 1] = ' '; - i += 2; - - memcpy(buffer.pointer + i, op2.pointer, op2.length); - i += op2.length; - - buffer.pointer[i] = ','; - buffer.pointer[i + 1] = ' '; - i += 2; - - memcpy(buffer.pointer + i, op3.pointer, op3.length); - i += op3.length; - - assert(i < buffer.length); - buffer.pointer[i] = 0; - - return (String) { - .pointer = buffer.pointer, - .length = i, - }; -} - -fn String format_displacement(String buffer, String register_string, String displacement_string, u8 register_index) -{ - u64 length = 0; - String result = { - .pointer = buffer.pointer, - }; - - const String indirect_types[] = { - strlit("byte ptr "), - strlit("word ptr "), - strlit("dword ptr "), - strlit("qword ptr "), - strlit("xmmword ptr "), - }; - - String indirect_type = indirect_types[register_index]; - - memcpy(&buffer.pointer[length], indirect_type.pointer, indirect_type.length); - length += indirect_type.length; - - buffer.pointer[length] = '['; - length += 1; - - memcpy(&buffer.pointer[length], register_string.pointer, register_string.length); - length += register_string.length; - - u8 omit_displacement = displacement_string.pointer[0] == '0' && displacement_string.length == 1; - buffer.pointer[length] = ' '; - length += !omit_displacement; - - buffer.pointer[length] = '+'; - length += !omit_displacement; - - buffer.pointer[length] = ' '; - length += !omit_displacement; - - memcpy(&buffer.pointer[length], displacement_string.pointer, displacement_string.length); - length += displacement_string.length * !omit_displacement; - - buffer.pointer[length] = ']'; - length += 1; - - result.length = length; - - return result; -} - -STRUCT(ClangCompileAssembly) -{ - String instruction; - String clang_path; - VirtualBuffer(u8)* clang_pipe_buffer; -}; - -fn String clang_compile_assembly(Arena* arena, ClangCompileAssembly args) -{ - String my_assembly_path = strlit(BUILD_DIR "/my_assembly_source.S"); - FileWriteOptions options = { - .path = my_assembly_path, - .content = args.instruction, - }; - file_write(options); - - String out_path = strlit(BUILD_DIR "/my_assembly_output"); - - char* arguments[] = { - string_to_c(args.clang_path), - string_to_c(my_assembly_path), - "-o", - string_to_c(out_path), - "-masm=intel", - "-nostdlib", - "-Wl,--oformat=binary", - 0, - }; - RunCommandOptions run_options = { - .stdout_stream = { - .buffer = args.clang_pipe_buffer->pointer, - .length = &args.clang_pipe_buffer->length, - .capacity = args.clang_pipe_buffer->capacity, - .policy = CHILD_PROCESS_STREAM_PIPE, - }, - // .stderr_stream = { - // .policy = CHILD_PROCESS_STREAM_IGNORE, - // }, - }; - RunCommandResult result = run_command(arena, (CStringSlice)array_to_slice(arguments), environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } - - String bytes = file_read(arena, out_path); - return bytes; -} - -STRUCT(DisassemblyResult) -{ - String whole; - String instruction; -}; - -STRUCT(DisassemblyArguments) -{ - String binary; - LLVMDisasmContextRef context; - String disassembly_buffer; - u64 gross:1; -}; - -#define llvm_initialize_macro(target, fn_prefix) \ - fn_prefix LLVMInitialize ## target ## Target();\ - fn_prefix LLVMInitialize ## target ## TargetInfo();\ - fn_prefix LLVMInitialize ## target ## TargetMC();\ - fn_prefix LLVMInitialize ## target ## AsmParser();\ - fn_prefix LLVMInitialize ## target ## AsmPrinter();\ - fn_prefix LLVMInitialize ## target ## Disassembler() - -#define _null_prefix_() - -llvm_initialize_macro(X86, extern void); - -fn String disassemble_binary(Arena* arena, DisassemblyArguments arguments) -{ - unused(arena); - unused(arguments); - String result = {}; - let(instruction_bytes, LLVMDisasmInstruction(arguments.context, arguments.binary.pointer, arguments.binary.length, 0, (char*)arguments.disassembly_buffer.pointer, arguments.disassembly_buffer.length)); - - if (instruction_bytes) - { - result = cstr(arguments.disassembly_buffer.pointer); - - assert(result.pointer[0] == '\t'); - result.pointer += 1; - result.length -= 1; - for (u64 i = 0; i < result.length; i += 1) - { - if (result.pointer[i] == '\t') - { - result.pointer[i] = ' '; - } - } - } - - return result; -} - -STRUCT(CheckInstructionArguments) -{ - String clang_path; - String text; - String binary; - String error_buffer; - u64* error_buffer_length; - VirtualBuffer(u8)* clang_pipe_buffer; - LLVMDisasmContextRef disassembler; - u64 reserved:63; -}; - -fn Mnemonic_x86_64 parse_cmov(String instruction) -{ - let(space_index, string_first_ch(instruction, ' ')); - assert(space_index != STRING_NO_MATCH); - String mnemonic_string = s_get_slice(u8, instruction, 0, space_index); - String cmov_prefix = strlit("cmov"); - assert(string_starts_with(mnemonic_string, cmov_prefix)); - String cmov_suffix = s_get_slice(u8, mnemonic_string, cmov_prefix.length, mnemonic_string.length); - String suffixes[] = { - strlit("a"), - strlit("ae"), - strlit("b"), - strlit("be"), - strlit("c"), - strlit("e"), - strlit("g"), - strlit("ge"), - strlit("l"), - strlit("le"), - strlit("na"), - strlit("nae"), - strlit("nb"), - strlit("nbe"), - strlit("nc"), - strlit("ne"), - strlit("ng"), - strlit("nge"), - strlit("nl"), - strlit("nle"), - strlit("no"), - strlit("np"), - strlit("ns"), - strlit("nz"), - strlit("o"), - strlit("p"), - strlit("pe"), - strlit("po"), - strlit("s"), - strlit("z"), - }; - u64 suffix; - for (suffix = 0; suffix < array_length(suffixes); suffix += 1) - { - if (s_equal(cmov_suffix, suffixes[suffix])) - { - break; - } - } - - assert(suffix != array_length(suffixes)); - Mnemonic_x86_64 result = suffix + MNEMONIC_x86_64_cmova; - return result; -} - -fn Mnemonic_x86_64 parse_cc_ext(String instruction, String prefix, Mnemonic_x86_64 base_mnemonic) -{ - let(space_index, string_first_ch(instruction, ' ')); - assert(space_index != STRING_NO_MATCH); - String mnemonic_string = s_get_slice(u8, instruction, 0, space_index); - assert(string_starts_with(mnemonic_string, prefix)); - String suffix = s_get_slice(u8, mnemonic_string, prefix.length, mnemonic_string.length); - String suffixes[] = { - strlit("a"), - strlit("ae"), - strlit("b"), - strlit("be"), - strlit("c"), - strlit("e"), - strlit("g"), - strlit("ge"), - strlit("l"), - strlit("le"), - strlit("na"), - strlit("nae"), - strlit("nb"), - strlit("nbe"), - strlit("nc"), - strlit("ne"), - strlit("ng"), - strlit("nge"), - strlit("nl"), - strlit("nle"), - strlit("no"), - strlit("np"), - strlit("ns"), - strlit("nz"), - strlit("o"), - strlit("p"), - strlit("pe"), - strlit("po"), - strlit("s"), - strlit("z"), - }; - u64 suffix_index; - for (suffix_index = 0; suffix_index < array_length(suffixes); suffix_index += 1) - { - if (s_equal(suffix, suffixes[suffix_index])) - { - break; - } - } - - assert(suffix_index != array_length(suffixes)); - Mnemonic_x86_64 result = base_mnemonic + suffix_index; - return result; -} - -fn String parse_operand(String instruction, u8 operand_index) -{ - String result = {}; - String it = instruction; - u8 index = 0; - - it = s_get_slice(u8, it, string_first_ch(it, ' ') + 1, it.length); - - while (1) - { - if (it.length == 0) - { - break; - } - - if (operand_index == index) - { - let(length, MIN(string_first_ch(it, ','), it.length)); - result = s_get_slice(u8, it, 0, length); - break; - } - - let(next, MIN(string_first_ch(it, ','), it.length)); - it = s_get_slice(u8, it, next + 2, it.length); - index += 1; - } - - return result; -} - -#define parse_cc(i, cc_i_kind) parse_cc_ext(i, strlit(TOSTRING(cc_i_kind)), (MNEMONIC_x86_64_ ## cc_i_kind ## a)) - -fn u64 check_instruction(Arena* arena, CheckInstructionArguments arguments) -{ - StringFormatter error_buffer = { - .buffer = arguments.error_buffer, - }; - u8 disassembly_buffer[256]; - assert(arguments.binary.length); - - u8 result = 1; - - DisassemblyArguments disassemble_arguments = { - .binary = arguments.binary, - .disassembly_buffer = (String)array_to_slice(disassembly_buffer), - .context = arguments.disassembler, - }; - String disassembly_text = disassemble_binary(arena, disassemble_arguments); - - result = disassembly_text.length == arguments.text.length; - if (result) - { - for (u64 i = 0; i < arguments.text.length; i += 1) - { - if (disassembly_text.pointer[i] != arguments.text.pointer[i]) - { - result = 0; - - break; - } - } - } - - if (!result) - { - if (string_starts_with(arguments.text, strlit("ud0"))) - { - // TODO: figure out - // Somehow clang doesn't disassemble this instruction properly - assert(disassembly_text.pointer == 0); - assert(disassembly_text.length == 0); - result = 1; - } - else if (string_starts_with(arguments.text, strlit("xchg "))) - { - if (s_equal(disassembly_text, strlit("nop"))) - { - result = 1; - } - else - { - String my_op0 = parse_operand(arguments.text, 0); - String my_op1 = parse_operand(arguments.text, 1); - - String their_op0 = parse_operand(disassembly_text, 0); - String their_op1 = parse_operand(disassembly_text, 1); - - result = s_equal(my_op0, their_op1) && s_equal(my_op1, their_op0); - } - } - if (string_starts_with(arguments.text, strlit("cmov")) && string_starts_with(disassembly_text, strlit("cmov"))) - { - Mnemonic_x86_64 mine = parse_cc(arguments.text, cmov); - Mnemonic_x86_64 theirs = parse_cc(disassembly_text, cmov); - u8 my_opcode = cc_opcodes_low[cmov_index(mine)]; - u8 their_opcode = cc_opcodes_low[cmov_index(theirs)]; - result = my_opcode == their_opcode; - } - else if (string_starts_with(arguments.text, strlit("j")) && string_starts_with(disassembly_text, strlit("j"))) - { - Mnemonic_x86_64 mine = parse_cc(arguments.text, j); - Mnemonic_x86_64 theirs = parse_cc(disassembly_text, j); - u8 my_opcode = cc_opcodes_low[j_index(mine)]; - u8 their_opcode = cc_opcodes_low[j_index(theirs)]; - result = my_opcode == their_opcode; - } - else if (string_starts_with(arguments.text, strlit("set")) && string_starts_with(disassembly_text, strlit("set"))) - { - Mnemonic_x86_64 mine = parse_cc(arguments.text, set); - Mnemonic_x86_64 theirs = parse_cc(disassembly_text, set); - u8 my_opcode = cc_opcodes_low[set_index(mine)]; - u8 their_opcode = cc_opcodes_low[set_index(theirs)]; - result = my_opcode == their_opcode; - } - else if (string_starts_with(arguments.text, strlit("mov r")) && string_starts_with(disassembly_text, strlit("movabs r"))) - { - result = 1; - } - else if (string_starts_with(arguments.text, strlit("sal ")) && string_starts_with(disassembly_text, strlit("shl "))) - { - result = 1; - } - } - - if (!result) - { - if (disassembly_text.length) - { - formatter_append(&error_buffer, "Disassembly mismatch. Intended to assemble:\n\t{s}\nbut got from LLVM:\n\t{s}\n", arguments.text, disassembly_text); - } - assert(arguments.binary.length); - ClangCompileAssembly args = { - .instruction = arguments.text, - .clang_path = arguments.clang_path, - .clang_pipe_buffer = arguments.clang_pipe_buffer, - }; - String clang_binary = clang_compile_assembly(arena, args); - - if (clang_binary.pointer && s_equal(clang_binary, arguments.binary)) - { - formatter_append_string(&error_buffer, strlit("Clang and this binary generated the same output (earlier string comparison failed):\n\t")); - for (u64 bin_i = 0; bin_i < arguments.binary.length; bin_i += 1) - { - formatter_append(&error_buffer, "0x{u32:x,w=2} ", (u32)arguments.binary.pointer[bin_i]); - } - } - else - { - formatter_append_string(&error_buffer, strlit("Failed to match correct output. Got:\n\t")); - - for (u64 bin_i = 0; bin_i < arguments.binary.length; bin_i += 1) - { - formatter_append(&error_buffer, "0x{u32:x,w=2} ", (u32)arguments.binary.pointer[bin_i]); - } - - formatter_append_character(&error_buffer, '\n'); - - formatter_append_string(&error_buffer, strlit("While clang generated the following:\n\t")); - - for (u64 bin_i = 0; bin_i < clang_binary.length; bin_i += 1) - { - formatter_append(&error_buffer, "0x{u32:x,w=2} ", (u32)clang_binary.pointer[bin_i]); - } - - formatter_append_character(&error_buffer, '\n'); - } - } - - assert(!!error_buffer.index == !result); - - return error_buffer.index; -} - -STRUCT(EncodingTestOptions) -{ - u64 scalar:1; - u64 wide:1; -}; - -#if defined(__x86_64__) -#include -#endif -typedef u64 Bitset; - -STRUCT(GPR) -{ - Bitset mask[4]; -}; - -STRUCT(VectorOpcode) -{ - Bitset prefix_0f; - Bitset plus_register; - u8 values[2][64]; - u8 extension[64]; -}; - -STRUCT(EncodingBatch) -{ - Bitset legacy_prefixes[LEGACY_PREFIX_COUNT]; - Bitset is_rm_register; - Bitset is_reg_register; - GPR rm_register; - GPR reg_register; - Bitset implicit_register; - VectorOpcode opcode; - Bitset is_relative; - Bitset is_displacement; - Bitset displacement_size; - Bitset rex_w; - u8 segment_register_override[64]; - Bitset is_immediate; - Bitset immediate_size[2]; - u8 immediate[8][64]; - u8 displacement[4][64]; -}; - -fn Bitset bitset_from_bit(u8 bit) -{ - return -(u64)(bit != 0); -} - -fn GPR register_mask_batch_from_scalar(u8 scalar_register) -{ - u64 reg = scalar_register & 0b1111; - assert(reg == scalar_register); - u64 value64 = (reg << 60) | (reg << 56) | (reg << 52) | (reg << 48) | (reg << 44) | (reg << 40) | (reg << 36) | (reg << 32) | (reg << 28) | (reg << 24) | (reg << 20) | (reg << 16) | (reg << 12) | (reg << 8) | (reg << 4) | reg; - GPR result = { value64, value64, value64, value64 }; - return result; -} - -fn EncodingBatch encoding_batch_from_scalar(EncodingScalar scalar) -{ - EncodingBatch batch = { - .rm_register = register_mask_batch_from_scalar(scalar.rm_register), - .reg_register = register_mask_batch_from_scalar(scalar.reg_register), - .is_rm_register = bitset_from_bit(scalar.invariant.is_rm_register), - .is_reg_register = bitset_from_bit(scalar.invariant.is_reg_register), - .is_displacement = bitset_from_bit(scalar.invariant.is_displacement), - .is_relative = bitset_from_bit(scalar.invariant.is_relative), - .displacement_size = bitset_from_bit(scalar.invariant.displacement_size), - .rex_w = bitset_from_bit(scalar.invariant.rex_w), - .implicit_register = bitset_from_bit(scalar.invariant.implicit_register), - .is_immediate = bitset_from_bit(scalar.invariant.is_immediate), - .opcode = { - .plus_register = bitset_from_bit(scalar.opcode.plus_register), - .prefix_0f = bitset_from_bit(scalar.opcode.prefix_0f), - }, - }; - - for (u64 i = 0; i < array_length(batch.immediate_size); i += 1) - { - batch.immediate_size[i] = bitset_from_bit(scalar.invariant.immediate_size & (1 << i)); - } - - for (LegacyPrefix legacy_prefix = 0; legacy_prefix < LEGACY_PREFIX_COUNT; legacy_prefix += 1) - { - batch.legacy_prefixes[legacy_prefix] = bitset_from_bit((scalar.legacy_prefixes & (1 << legacy_prefix)) >> legacy_prefix); - } - - for (u64 i = 0; i < batch_element_count; i += 1) - { - batch.opcode.values[0][i] = scalar.opcode.bytes[0]; - batch.opcode.values[1][i] = scalar.opcode.bytes[1]; - batch.opcode.extension[i] = scalar.opcode.extension; - } - - for (u32 immediate_index = 0; immediate_index < array_length(scalar.immediate.bytes); immediate_index += 1) - { - for (u32 batch_index = 0; batch_index < batch_element_count; batch_index += 1) - { - batch.immediate[immediate_index][batch_index] = scalar.immediate.bytes[immediate_index]; - } - } - - for (u32 displacement_index = 0; displacement_index < array_length(scalar.displacement.bytes); displacement_index += 1) - { - for (u32 batch_index = 0; batch_index < batch_element_count; batch_index += 1) - { - batch.displacement[displacement_index][batch_index] = scalar.displacement.bytes[displacement_index]; - } - } - - return batch; -} - -u32 encode_wide(u8* restrict buffer, const EncodingBatch* const restrict batch) -{ - __m512i prefixes[LEGACY_PREFIX_COUNT]; - __mmask64 prefix_masks[LEGACY_PREFIX_COUNT]; - for (LegacyPrefix prefix = 0; prefix < LEGACY_PREFIX_COUNT; prefix += 1) - { - prefix_masks[prefix] = _cvtu64_mask64(batch->legacy_prefixes[prefix]); - prefixes[prefix] = _mm512_maskz_set1_epi8(prefix_masks[prefix], legacy_prefixes[prefix]); - } - - __m512i instruction_length; - - u8 prefix_group1_bytes[64]; - u8 prefix_group1_positions[64]; - { - __mmask64 prefix_group1_mask = _kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_F0], prefix_masks[LEGACY_PREFIX_F2]), prefix_masks[LEGACY_PREFIX_F3]); - __m512i prefix_group1 = _mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_F0], prefixes[LEGACY_PREFIX_F2]), prefixes[LEGACY_PREFIX_F3]); - __m512i prefix_group1_position = _mm512_maskz_set1_epi8(_knot_mask64(prefix_group1_mask), 0x0f); - instruction_length = _mm512_maskz_set1_epi8(prefix_group1_mask, 0x01); - - _mm512_storeu_epi8(prefix_group1_bytes, prefix_group1); - _mm512_storeu_epi8(prefix_group1_positions, prefix_group1_position); - } - - u8 prefix_group2_bytes[64]; - u8 prefix_group2_positions[64]; - { - __mmask64 prefix_group2_mask = _kor_mask64(_kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_2E], prefix_masks[LEGACY_PREFIX_36]), _kor_mask64(prefix_masks[LEGACY_PREFIX_3E], prefix_masks[LEGACY_PREFIX_26])), _kor_mask64(prefix_masks[LEGACY_PREFIX_64], prefix_masks[LEGACY_PREFIX_65])); - __m512i prefix_group2 = _mm512_or_epi32(_mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_2E], prefixes[LEGACY_PREFIX_36]), _mm512_or_epi32(prefixes[LEGACY_PREFIX_3E], prefixes[LEGACY_PREFIX_26])), _mm512_or_epi32(prefixes[LEGACY_PREFIX_64], prefixes[LEGACY_PREFIX_65])); - __m512i prefix_group2_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group2_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group2_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group2_bytes, prefix_group2); - _mm512_storeu_epi8(prefix_group2_positions, prefix_group2_position); - } - - u8 prefix_group3_bytes[64]; - u8 prefix_group3_positions[64]; - { - __mmask64 prefix_group3_mask = prefix_masks[LEGACY_PREFIX_66]; - __m512i prefix_group3 = prefixes[LEGACY_PREFIX_66]; - __m512i prefix_group3_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group3_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group3_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group3_bytes, prefix_group3); - _mm512_storeu_epi8(prefix_group3_positions, prefix_group3_position); - } - - u8 prefix_group4_bytes[64]; - u8 prefix_group4_positions[64]; - { - __mmask64 prefix_group4_mask = prefix_masks[LEGACY_PREFIX_67]; - __m512i prefix_group4 = prefixes[LEGACY_PREFIX_67]; - __m512i prefix_group4_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group4_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group4_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group4_bytes, prefix_group4); - _mm512_storeu_epi8(prefix_group4_positions, prefix_group4_position); - } - - __mmask64 is_plus_register = _cvtu64_mask64(batch->opcode.plus_register); - __mmask64 is_implicit_register = _cvtu64_mask64(batch->implicit_register); - - __mmask64 is_displacement8 = _kand_mask64(_cvtu64_mask64(batch->is_displacement), _knot_mask64(_cvtu64_mask64(batch->displacement_size))); - __mmask64 is_displacement32 = _kand_mask64(_cvtu64_mask64(batch->is_displacement), _cvtu64_mask64(batch->displacement_size)); - - __mmask64 is_relative8 = _kand_mask64(_cvtu64_mask64(batch->is_relative), _knot_mask64(_cvtu64_mask64(batch->displacement_size))); - __mmask64 is_relative32 = _kand_mask64(_cvtu64_mask64(batch->is_relative), _cvtu64_mask64(batch->displacement_size)); - - __mmask64 is_rm_register; - __m512i rm_register; - { - __m256i register_mask_256 = _mm256_loadu_epi8(&batch->rm_register); - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - rm_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - is_rm_register = _cvtu64_mask64(batch->is_rm_register); - } - - __mmask64 is_reg_register; - __m512i reg_register; - { - __m256i register_mask_256 = _mm256_loadu_epi8(&batch->reg_register); - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - reg_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - is_reg_register = _cvtu64_mask64(batch->is_reg_register); - } - - __mmask64 is_reg_direct_addressing_mode = _knot_mask64(_kor_mask64(is_displacement8, is_displacement32)); - __mmask64 has_base_register = _kor_mask64(_kor_mask64(is_rm_register, is_reg_register), is_implicit_register); - - __m512i rex_b = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(rm_register, _mm512_set1_epi8(0b1000)), 1 << 0); - __m512i rex_x = _mm512_set1_epi8(0); // TODO - __m512i rex_r = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(reg_register, _mm512_set1_epi8(0b1000)), 1 << 2); - __m512i rex_w = _mm512_maskz_set1_epi8(_cvtu64_mask64(batch->rex_w), 1 << 3); - __m512i rex_byte = _mm512_or_epi32(_mm512_set1_epi32(0x40), _mm512_or_epi32(_mm512_or_epi32(rex_b, rex_x), _mm512_or_epi32(rex_r, rex_w))); - __mmask64 rex_mask = _mm512_test_epi8_mask(rex_byte, _mm512_set1_epi8(0x0f)); - __m512i rex_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), rex_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(rex_mask, 0x01)); - - u8 rex_bytes[64]; - u8 rex_positions[64]; - _mm512_storeu_epi8(rex_bytes, rex_byte); - _mm512_storeu_epi8(rex_positions, rex_position); - - __m512i plus_register = _mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)); - __m512i opcode_extension = _mm512_loadu_epi8(&batch->opcode.extension[0]); - - __mmask64 prefix_0f_mask = _cvtu64_mask64(batch->opcode.prefix_0f); - __m512i prefix_0f = _mm512_maskz_set1_epi8(prefix_0f_mask, 0x0f); - __m512i prefix_0f_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_0f_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_0f_mask, 0x01)); - - u8 prefix_0f_bytes[64]; - u8 prefix_0f_positions[64]; - _mm512_storeu_epi8(prefix_0f_bytes, prefix_0f); - _mm512_storeu_epi8(prefix_0f_positions, prefix_0f_position); - - __m512i three_byte_opcode = _mm512_loadu_epi8(&batch->opcode.values[1]); - __mmask64 three_byte_opcode_mask = _mm512_test_epi8_mask(three_byte_opcode, _mm512_set1_epi8(0xff)); - __m512i three_byte_opcode_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), three_byte_opcode_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(three_byte_opcode_mask, 0x01)); - - u8 three_byte_opcode_bytes[64]; - u8 three_byte_opcode_positions[64]; - _mm512_storeu_epi8(three_byte_opcode_bytes, three_byte_opcode); - _mm512_storeu_epi8(three_byte_opcode_positions, three_byte_opcode_position); - - __m512i base_opcode = _mm512_or_epi32(_mm512_loadu_epi8(&batch->opcode.values[0]), _mm512_maskz_mov_epi8(is_plus_register, plus_register)); - __m512i base_opcode_position = instruction_length; - instruction_length = _mm512_add_epi8(instruction_length, _mm512_set1_epi8(0x01)); - - u8 base_opcode_bytes[64]; - u8 base_opcode_positions[64]; - _mm512_storeu_epi8(base_opcode_bytes, base_opcode); - _mm512_storeu_epi8(base_opcode_positions, base_opcode_position); - - __m512i displacement8 = _mm512_loadu_epi8(batch->displacement[0]); - __mmask64 mod_is_displacement32 = is_displacement32; - __mmask64 mod_is_displacement8 = _kand_mask64(is_displacement8, _kor_mask64(_mm512_test_epi8_mask(displacement8, displacement8), _kand_mask64(is_rm_register, _mm512_cmpeq_epi8_mask(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_set1_epi8(REGISTER_X86_64_BP))))); - - __mmask64 mod_rm_mask = _kor_mask64(_kand_mask64(_kor_mask64(is_rm_register, is_reg_register), _knot_mask64(is_plus_register)), _kor_mask64(is_displacement8, is_displacement32)); - __m512i register_direct_address_mode = _mm512_maskz_set1_epi8(is_reg_direct_addressing_mode, 1); - __m512i mod = _mm512_or_epi32(_mm512_or_epi32(_mm512_slli_epi32(_mm512_maskz_set1_epi8(_kand_mask64(mod_is_displacement32, has_base_register), 1), 1), _mm512_maskz_set1_epi8(mod_is_displacement8, 1)), _mm512_or_epi32(_mm512_slli_epi32(register_direct_address_mode, 1), register_direct_address_mode)); - __m512i rm = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_maskz_set1_epi8(_knot_mask64(has_base_register), 0b100)); - __m512i reg = _mm512_or_epi32(_mm512_and_si512(reg_register, _mm512_set1_epi8(0b111)), opcode_extension); - __m512i mod_rm = _mm512_or_epi32(_mm512_or_epi32(rm, _mm512_slli_epi32(reg, 3)), _mm512_slli_epi32(mod, 6)); - __m512i mod_rm_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_rm_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_rm_mask, 0x01)); - - u8 mod_rm_bytes[64]; - u8 mod_rm_positions[64]; - _mm512_storeu_epi8(mod_rm_bytes, mod_rm); - _mm512_storeu_epi8(mod_rm_positions, mod_rm_position); - - __mmask64 sib_mask = _kand_mask64(_mm512_cmpneq_epi8_mask(mod, _mm512_set1_epi8(0b11)), _mm512_cmpeq_epi8_mask(rm, _mm512_set1_epi8(0b100))); - __m512i sib_scale = _mm512_set1_epi8(0); - __m512i sib_index = _mm512_maskz_set1_epi8(sib_mask, 0b100 << 3); - __m512i sib_base = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_maskz_set1_epi8(is_rm_register, 0b111)), _mm512_maskz_set1_epi8(_knot_mask64(is_rm_register), 0b101)); - __m512i sib = _mm512_or_epi32(_mm512_or_epi32(sib_index, sib_base), sib_scale); - __m512i sib_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), sib_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(sib_mask, 0x01)); - - u8 sib_bytes[64]; - u8 sib_positions[64]; - _mm512_storeu_epi8(sib_bytes, sib); - _mm512_storeu_epi8(sib_positions, sib_position); - - __m512i displacement8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement8, sizeof(s8))); - u8 displacement8_positions[64]; - _mm512_storeu_epi8(displacement8_positions, displacement8_position); - - __m512i displacement32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement32, sizeof(s32))); - u8 displacement32_positions[64]; - _mm512_storeu_epi8(displacement32_positions, displacement32_position); - - __m512i relative8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative8, sizeof(s8))); - u8 relative8_positions[64]; - _mm512_storeu_epi8(relative8_positions, relative8_position); - - __m512i relative32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative32, sizeof(s32))); - u8 relative32_positions[64]; - _mm512_storeu_epi8(relative32_positions, relative32_position); - - __mmask64 is_immediate_mask = _cvtu64_mask64(batch->is_immediate); - __mmask64 mask0 = _cvtu64_mask64(batch->immediate_size[0]); - __m512i mask_v0 = _mm512_maskz_set1_epi8(_kand_mask64(is_immediate_mask, mask0), 1 << 0); - __mmask64 mask1 = _cvtu64_mask64(batch->immediate_size[1]); - __m512i mask_v1 = _mm512_maskz_set1_epi8(_kand_mask64(is_immediate_mask, mask1), 1 << 1); - __m512i immediate_size = _mm512_or_si512(mask_v0, mask_v1); - __mmask64 is_immediate[4]; - u8 immediate_positions[array_length(is_immediate)][64]; - for (u64 i = 0; i < array_length(is_immediate); i += 1) - { - __mmask64 immediate_mask = _mm512_cmpeq_epi8_mask(immediate_size, _mm512_set1_epi8(i)); - __m512i immediate_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), immediate_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(immediate_mask, 1 << i)); - _mm512_storeu_epi8(immediate_positions[i], immediate_position); - } - - u8 separate_buffers[64][max_instruction_byte_count]; - u8 separate_lengths[64]; - _mm512_storeu_epi8(separate_lengths, instruction_length); - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - separate_buffers[i][prefix_group1_positions[i]] = prefix_group1_bytes[i]; - separate_buffers[i][prefix_group2_positions[i]] = prefix_group2_bytes[i]; - separate_buffers[i][prefix_group3_positions[i]] = prefix_group3_bytes[i]; - separate_buffers[i][prefix_group4_positions[i]] = prefix_group4_bytes[i]; - - separate_buffers[i][rex_positions[i]] = rex_bytes[i]; - - separate_buffers[i][prefix_0f_positions[i]] = prefix_0f_bytes[i]; - separate_buffers[i][three_byte_opcode_positions[i]] = three_byte_opcode_bytes[i]; - separate_buffers[i][base_opcode_positions[i]] = base_opcode_bytes[i]; - - separate_buffers[i][mod_rm_positions[i]] = mod_rm_bytes[i]; - - separate_buffers[i][sib_positions[i]] = sib_bytes[i]; - - for (u32 immediate_position_index = 0; immediate_position_index < array_length(immediate_positions); immediate_position_index += 1) - { - u8 start_position = immediate_positions[immediate_position_index][i]; - for (u32 byte = 0; byte < 1 << immediate_position_index; byte += 1) - { - u8 destination_index = start_position + byte * (start_position != 0xf); - separate_buffers[i][destination_index] = batch->immediate[byte][i]; - } - } - - separate_buffers[i][displacement8_positions[i]] = batch->displacement[0][i]; - - u8 displacement32_start = displacement32_positions[i]; - for (u32 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = displacement32_start + byte * (displacement32_start != 0xf); - separate_buffers[i][destination_index] = batch->displacement[byte][i]; - } - - separate_buffers[i][relative8_positions[i]] = batch->displacement[0][i]; - - u8 relative32_start = relative32_positions[i]; - for (u32 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = relative32_start + byte * (relative32_start != 0xf); - separate_buffers[i][destination_index] = batch->displacement[byte][i]; - } - } - - u32 buffer_i = 0; - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - let(separate_length, separate_lengths[i]); - if (separate_length >= 1 && separate_length <= 15) - { - memcpy(&buffer[buffer_i], &separate_buffers[i], separate_length); - buffer_i += separate_length; - } - else - { - unreachable(); - } - } - - return buffer_i; -} - -STRUCT(TestCounter) -{ - u64 total; - u64 failure; -}; - -typedef enum TestMode -{ - TEST_MODE_SCALAR, - TEST_MODE_WIDE, - TEST_MODE_COUNT, -} TestMode; - -fn String test_mode_to_string(TestMode test_mode) -{ - switch (test_mode) - { - case_to_name(TEST_MODE_, SCALAR); - case_to_name(TEST_MODE_, WIDE); - case TEST_MODE_COUNT: unreachable(); - } -} - -STRUCT(TestSetup) -{ - String instruction_binary_buffer; - String clang_path; - String error_buffer; - VirtualBuffer(u8)* clang_pipe_buffer; - LLVMDisasmContextRef disassembler; - Arena* arena; - TestCounter counters[TEST_MODE_COUNT]; - EncodingTestOptions options; -}; - -STRUCT(TestInstruction) -{ - EncodingScalar encoding; - String text; -}; - -fn void test_instruction(TestSetup* setup, TestInstruction* instruction) -{ - if (setup->options.scalar) - { - let(length, encode_scalar(setup->instruction_binary_buffer.pointer, &instruction->encoding, 1)); - assert(length <= setup->instruction_binary_buffer.length); - String instruction_bytes = { - .pointer = setup->instruction_binary_buffer.pointer, - .length = length, - }; - CheckInstructionArguments check_args = { - .clang_path = setup->clang_path, - .text = instruction->text, - .binary = instruction_bytes, - .error_buffer = setup->error_buffer, - .clang_pipe_buffer = setup->clang_pipe_buffer, - .disassembler = setup->disassembler, - }; - u64 error_buffer_length = check_instruction(setup->arena, check_args); - setup->counters[TEST_MODE_SCALAR].total += 1; - let(first_failure, setup->counters[TEST_MODE_SCALAR].total == 0); - setup->counters[TEST_MODE_SCALAR].failure += error_buffer_length != 0; - String error_string = { .pointer = setup->error_buffer.pointer, .length = error_buffer_length }; - if (error_buffer_length != 0) - { - print("{cstr}{u64}) {s}... [FAILED]\n{s}\n", first_failure ? "\n" : "", setup->counters[TEST_MODE_SCALAR].total, instruction->text, error_string); - os_exit(1); - } - } - - if (setup->options.wide) - { - EncodingBatch batch = encoding_batch_from_scalar(instruction->encoding); - let(wide_length, encode_wide(setup->instruction_binary_buffer.pointer, &batch)); - assert(wide_length % batch_element_count == 0); - let(length, wide_length / batch_element_count); - - String instruction_bytes = { - .pointer = setup->instruction_binary_buffer.pointer, - .length = length, - }; - CheckInstructionArguments check_args = { - .clang_path = setup->clang_path, - .text = instruction->text, - .binary = instruction_bytes, - .error_buffer = setup->error_buffer, - .clang_pipe_buffer = setup->clang_pipe_buffer, - .disassembler = setup->disassembler, - }; - u64 error_buffer_length = check_instruction(setup->arena, check_args); - setup->counters[TEST_MODE_WIDE].total += 1; - let(first_failure, setup->counters[TEST_MODE_WIDE].total == 0); - setup->counters[TEST_MODE_WIDE].failure += error_buffer_length != 0; - String error_string = { .pointer = setup->error_buffer.pointer, .length = error_buffer_length }; - if (error_buffer_length != 0) - { - print("{cstr}{u64}) {s}... [FAILED]\n{s}\n", first_failure ? "\n" : "", setup->counters[TEST_MODE_WIDE].total, instruction->text, error_string); - } - } -} - -fn u8 encoding_test_instruction_batches(Arena* arena, TestDataset dataset, EncodingTestOptions options) -{ - u8 result = 0; - u8 instruction_binary_buffer[256 * batch_element_count]; - u8 instruction_text_buffer[256]; - u8 error_buffer[4096]; - String instruction_text_buffer_slice = array_to_slice(instruction_text_buffer); - VirtualBuffer(u8) clang_pipe_buffer = {}; - vb_ensure_capacity(&clang_pipe_buffer, 1024*1024); - llvm_initialize_macro(X86, _null_prefix_()); - let(disassembler, LLVMCreateDisasmCPU("x86_64-freestanding", "znver4", 0, 0, 0, 0)); - u64 disassembly_options = LLVMDisassembler_Option_AsmPrinterVariant | LLVMDisassembler_Option_PrintImmHex; - if (!LLVMSetDisasmOptions(disassembler, disassembly_options)) - { - failed_execution(); - } - - String clang_path = executable_find_in_path(arena, strlit("clang"), cstr(getenv("PATH"))); - assert(clang_path.pointer); - - global_variable const s32 displacements[] = { - 0, - 10, - 10000000, - }; - - global_variable const String displacement_strings[] = { - strlit("0"), - strlit("10"), - strlit("10000000"), - }; - - TestSetup setup = { - .instruction_binary_buffer = array_to_slice(instruction_binary_buffer), - .clang_path = clang_path, - .error_buffer = array_to_slice(error_buffer), - .clang_pipe_buffer = &clang_pipe_buffer, - .options = options, - .disassembler = disassembler, - .arena = arena, - }; - - for (u64 batch_index = 0; batch_index < dataset.batch_count; batch_index += 1) - { - let(batch, &dataset.batches[batch_index]); - - String mnemonic_string = mnemonic_x86_64_to_string(batch->mnemonic); - print("============================\n~~~~~~~ MNEMONIC {s} ~~~~~~~\n============================\n", mnemonic_string); - - u64 encoding_top = batch->encoding_offset + batch->encoding_count; - - for (u64 encoding_index = batch->encoding_offset; encoding_index < encoding_top; encoding_index += 1) - { - memset(setup.counters, 0, sizeof(setup.counters)); - let(encoding, &dataset.encodings[encoding_index]); - OperandId first_operand = encoding->operands.values[0]; - OperandId second_operand = encoding->operands.values[1]; - u8 operand_count = encoding->operands.count; - - u8 encoding_buffer[256]; - u8 encoding_separator[256]; - u64 encoding_buffer_i = 0; - String encoding_string; - String encoding_separator_string; - { - memcpy(encoding_buffer + encoding_buffer_i, mnemonic_string.pointer, mnemonic_string.length); - encoding_buffer_i += mnemonic_string.length; - - encoding_buffer[encoding_buffer_i] = ' '; - encoding_buffer_i += operand_count != 0; - - for (u8 operand_i = 0; operand_i < operand_count; operand_i += 1) - { - String operand_string = operand_to_string(encoding->operands.values[operand_i]); - memcpy(encoding_buffer + encoding_buffer_i, operand_string.pointer, operand_string.length); - encoding_buffer_i += operand_string.length; - - u8 not_last_operand = operand_i != operand_count - 1; - - encoding_buffer[encoding_buffer_i] = ','; - encoding_buffer_i += not_last_operand; - - encoding_buffer[encoding_buffer_i] = ' '; - encoding_buffer_i += not_last_operand; - } - memcpy(&encoding_buffer[encoding_buffer_i], "... ", 4); - encoding_buffer_i += 4; - - encoding_buffer[encoding_buffer_i] = 0; - - encoding_string = (String) { .pointer = encoding_buffer, .length = encoding_buffer_i }; - - let(failed_string, strlit("FAILED")); - encoding_separator_string = (String) { .pointer = encoding_separator, .length = encoding_buffer_i + 3 + 1 + failed_string.length }; - memset(encoding_separator, '-', encoding_separator_string.length); - print_string(encoding_separator_string); - print_string(strlit("\n")); - print_string(encoding_string); - } - - if (operand_count == 0) - { - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = mnemonic_string, - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_gpra(first_operand)) - { - let(first_operand_index, op_gpra_get_index(first_operand)); - String register_a_names[] = { - strlit("al"), - strlit("ax"), - strlit("eax"), - strlit("rax"), - }; - String first_operand_register_name = register_a_names[first_operand_index]; - String first_operand_string = first_operand_register_name; - - switch (operand_count) - { - case 1: - { - if (encoding->operands.implicit_operands) - { - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || (first_operand_index == 3), - .implicit_register = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = mnemonic_string, - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } break; - case 2: - { - if (op_is_gpr_no_gpra(second_operand)) - { - u8 second_operand_index = op_gpr_get_index(second_operand); - GPR_x86_64 second_operand_register_count = (unlikely(second_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 second_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String second_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 second_is_rm = op_is_rm(second_operand); - - if (second_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String second_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - second_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(second_rm_buffer[gpr][displacement_index]), second_operand_rm_name, displacement_strings[displacement_index], second_operand_index); - } - } - } - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || second_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = second_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - if (second_is_rm) - { - for (GPR_x86_64 second_gpr = 0; second_gpr < X86_64_GPR_COUNT; second_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String second_operand_string = second_rm_strings[second_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || second_operand_index == 3, - .is_rm_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .rm_register = second_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - else if (op_is_imm(second_operand)) - { - let(second_operand_index, op_imm_get_index(second_operand)); - // We output the string directly to avoid formatting cost - String second_operand_string = sample_immediate_strings(second_operand_index); - u64 immediate = sample_immediate_values(second_operand_index); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .implicit_register = 1, - .is_immediate = 1, - .immediate_size = second_operand_index, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate, }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - test_instruction(&setup, &instruction); - } - else if (op_is_gprd(second_operand)) - { - assert(encoding->operands.implicit_operands); - String second_operand_string = op_gprd_to_string(second_operand); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .implicit_register = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - test_instruction(&setup, &instruction); - } - else if (op_is_ds_rsi_memory(second_operand)) - { - // u8 second_operand_index = second_operand - op_ds_rsi_m8; - String second_operand_string; - switch (second_operand) - { - case op_ds_rsi_m8: second_operand_string = strlit("byte ptr [rsi]"); break; - case op_ds_rsi_m16: second_operand_string = strlit("word ptr [rsi]"); break; - case op_ds_rsi_m32: second_operand_string = strlit("dword ptr [rsi]"); break; - case op_ds_rsi_m64: second_operand_string = strlit("qword ptr [rsi]"); break; - default: unreachable(); - } - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_es_rdi_memory(second_operand)) - { - // u8 second_operand_index = second_operand - op_ds_rsi_m8; - String second_operand_string; - switch (second_operand) - { - case op_es_rdi_m8: second_operand_string = strlit("byte ptr es:[rdi]"); break; - case op_es_rdi_m16: second_operand_string = strlit("word ptr es:[rdi]"); break; - case op_es_rdi_m32: second_operand_string = strlit("dword ptr es:[rdi]"); break; - case op_es_rdi_m64: second_operand_string = strlit("qword ptr es:[rdi]"); break; - default: unreachable(); - } - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } break; - case 3: - { - todo(); - } break; - case 4: - { - todo(); - } break; - default: unreachable(); - } - } - else - { - switch (operand_count) - { - case 1: - { - if (op_is_gpr_no_gpra(first_operand)) - { - u8 first_operand_index = op_gpr_get_index(first_operand); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 first_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String first_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 first_is_rm = op_is_rm(first_operand); - - if (first_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String first_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - first_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(first_rm_buffer[gpr][displacement_index]), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - } - } - } - - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .rm_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - else if (op_is_relative(first_operand)) - { - String first_operand_string = strlit("-1"); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - .is_relative = 1, - .displacement_size = first_operand == op_rel32, - }, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - .displacement = { .value = 0xffffffff }, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_memory(first_operand)) - { - u8 first_operand_index = first_operand - op_m8; - String first_operand_indirect_string; - switch (first_operand_index) - { - case 0: first_operand_indirect_string = strlit("byte ptr "); break; - case 1: first_operand_indirect_string = strlit("word ptr "); break; - case 2: first_operand_indirect_string = strlit("dword ptr "); break; - case 3: first_operand_indirect_string = strlit("qword ptr "); break; - case 4: first_operand_indirect_string = strlit("xmmword ptr "); break; - default: unreachable(); - } - - // Segment overrides - { - let_cast(u32, memory_value, sample_immediate_values(2)); - String memory_string = sample_immediate_strings(2); - - for (SegmentRegisterOverride segment_register_override = 0; segment_register_override < SEGMENT_REGISTER_OVERRIDE_COUNT; segment_register_override += 1) - { - String segment_register_string = segment_register_override_to_register_string(segment_register_override); - - String parts[] = { - first_operand_indirect_string, - segment_register_string, - strlit(":["), - memory_string, - strlit("]"), - }; - String first_operand_string = arena_join_string(setup.arena, (Slice(String)) array_to_slice(parts)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 4, - .is_displacement = 1, - .displacement_size = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | (1 << segment_register_overrides[segment_register_override]) | (encoding->operand_size_override << LEGACY_PREFIX_66), - .displacement = { .value = memory_value, }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - - // No segment override - { - let_cast(u32, memory_value, sample_immediate_values(2)); - String memory_string = sample_immediate_strings(2); - - String parts[] = { - first_operand_indirect_string, - strlit("["), - memory_string, - strlit("]"), - }; - String first_operand_string = arena_join_string(setup.arena, (Slice(String)) array_to_slice(parts)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 4, - .is_displacement = 1, - .displacement_size = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .displacement = { .value = memory_value, }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - String first_operand_rm_name = gpr_to_string(first_gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - u8 first_operand_buffer[256]; - String first_operand_string = format_displacement((String)array_to_slice(first_operand_buffer), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .is_displacement = 1, - .displacement_size = displacement_index == 2, - .rex_w = encoding->rex_w || first_operand_index == 4, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | (encoding->operand_size_override << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - else if (op_is_imm(first_operand)) - { - u8 first_operand_index = op_imm_get_index(first_operand); - String first_operand_string = sample_immediate_strings(first_operand_index); - u64 immediate = sample_immediate_values(first_operand_index); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_immediate = 1, - .immediate_size = first_operand_index, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate }, - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } break; - case 2: - { - if (op_is_gpr_no_gpra(first_operand)) - { - u8 first_operand_index = op_gpr_get_index(first_operand); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - - u8 first_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String first_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 first_is_rm = op_is_rm(first_operand); - - if (first_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String first_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - first_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(first_rm_buffer[gpr][displacement_index]), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - } - } - } - - if (op_is_gpr_no_gpra(second_operand)) - { - u8 second_operand_index = op_gpr_get_index(second_operand); - GPR_x86_64 second_operand_register_count = (unlikely(second_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 second_is_rm = op_is_rm(second_operand); - u8 second_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String second_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - - if (second_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String second_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - second_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(second_rm_buffer[gpr][displacement_index]), second_operand_rm_name, displacement_strings[displacement_index], second_operand_index); - } - } - } - - // Only test with rm_r and not r_rm with register direct addressing mode because it makes no sense otherwise - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - }, - .rm_register = first_gpr, - .reg_register = second_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, gpr_is_extended(first_gpr)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .rm_register = first_gpr, - .reg_register = second_gpr, - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - - if (second_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - for (GPR_x86_64 second_gpr = 0; second_gpr < X86_64_GPR_COUNT; second_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, gpr_is_extended(second_gpr)); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String second_operand_string = second_rm_strings[second_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = displacements[displacement_index] }, - .rm_register = second_gpr, - .reg_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - } - else if (op_is_gpra(second_operand)) - { - String second_operand_string = op_gpra_to_string(second_operand); - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else if (op_is_imm(second_operand)) - { - u8 second_operand_index = op_imm_get_index(second_operand); - String second_operand_string = sample_immediate_strings(second_operand_index); - u64 immediate = sample_immediate_values(second_operand_index); - - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_immediate = 1, - .immediate_size = second_operand_index, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate }, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_immediate = 1, - .immediate_size = second_operand_index, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = immediate }, - .displacement = { .value = displacements[displacement_index] }, - .rm_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - else if (op_is_memory(second_operand)) - { - u8 second_operand_index = second_operand - op_m8; - String second_operand_indirect_string; - String memory_string = sample_immediate_strings(2); - switch (second_operand_index) - { - case 0: second_operand_indirect_string = strlit(""); break; - case 1: second_operand_indirect_string = strlit(""); break; - case 2: second_operand_indirect_string = strlit(""); break; - case 3: second_operand_indirect_string = strlit(""); break; - case 4: second_operand_indirect_string = strlit(""); break; - default: unreachable(); - } - String parts[] = { - second_operand_indirect_string, - strlit("["), - memory_string, - strlit("]"), - }; - String second_operand_string = arena_join_string(setup.arena, (Slice(String)) array_to_slice(parts)); - - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - let_cast(u32, memory_value, sample_immediate_values(2)); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3 || second_operand_index == 3, - .is_reg_register = 0, - .is_displacement = 1, - .displacement_size = 1, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .displacement = { .value = memory_value, }, - .reg_register = first_gpr, - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else if (second_operand == op_one_literal) - { - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction1(instruction_text_buffer_slice, mnemonic_string, first_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else if (second_operand == op_cl) - { - String second_operand_string = strlit("cl"); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - }, - .rm_register = first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - else - { - todo(); - } - } - else if (op_is_ds_rsi_memory(first_operand)) - { - u8 first_operand_index = first_operand - op_ds_rsi_m8; - String first_operand_string; - switch (first_operand) - { - case op_ds_rsi_m8: first_operand_string = strlit("byte ptr [rsi]"); break; - case op_ds_rsi_m16: first_operand_string = strlit("word ptr [rsi]"); break; - case op_ds_rsi_m32: first_operand_string = strlit("dword ptr [rsi]"); break; - case op_ds_rsi_m64: first_operand_string = strlit("qword ptr [rsi]"); break; - default: unreachable(); - } - - if (op_is_es_rdi_memory(second_operand)) - { - String second_operand_string; - switch (second_operand) - { - case op_es_rdi_m8: second_operand_string = strlit("byte ptr es:[rdi]"); break; - case op_es_rdi_m16: second_operand_string = strlit("word ptr es:[rdi]"); break; - case op_es_rdi_m32: second_operand_string = strlit("dword ptr es:[rdi]"); break; - case op_es_rdi_m64: second_operand_string = strlit("qword ptr es:[rdi]"); break; - default: unreachable(); - } - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else if (op_is_es_rdi_memory(first_operand)) - { - u8 first_operand_index = first_operand - op_es_rdi_m8; - String first_operand_string; - switch (first_operand) - { - case op_es_rdi_m8: first_operand_string = strlit("byte ptr es:[rdi]"); break; - case op_es_rdi_m16: first_operand_string = strlit("word ptr es:[rdi]"); break; - case op_es_rdi_m32: first_operand_string = strlit("dword ptr es:[rdi]"); break; - case op_es_rdi_m64: first_operand_string = strlit("qword ptr es:[rdi]"); break; - default: unreachable(); - } - - if (op_is_ds_rsi_memory(second_operand)) - { - u8 second_operand_index = second_operand - op_ds_rsi_m8; - String second_operand_string; - switch (second_operand) - { - case op_ds_rsi_m8: second_operand_string = strlit("byte ptr [rsi]"); break; - case op_ds_rsi_m16: second_operand_string = strlit("word ptr [rsi]"); break; - case op_ds_rsi_m32: second_operand_string = strlit("dword ptr [rsi]"); break; - case op_ds_rsi_m64: second_operand_string = strlit("qword ptr [rsi]"); break; - default: unreachable(); - } - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (op_is_gpra(second_operand)) - { - u8 second_operand_index = op_gpra_get_index(second_operand); - String second_operand_string = op_gpra_to_string(second_operand); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || second_operand_index == 3, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else if (second_operand == op_dx) - { - String second_operand_string = strlit("dx"); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else if (op_is_imm(first_operand)) - { - u8 first_operand_index = op_imm_get_index(first_operand); - u64 first_operand_value = sample_immediate_values(first_operand_index); - String first_operand_string = sample_immediate_strings(first_operand_index); - - if (op_is_gpra(second_operand)) - { - let(second_operand_index, op_gpra_get_index(second_operand)); - String second_operand_string = op_gpra_to_string(second_operand); - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - .is_immediate = 1, - .immediate_size = first_operand_index, - }, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - .immediate = { .value = first_operand_value }, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else if (first_operand == op_dx) - { - String first_operand_string = strlit("dx"); - - if (op_is_gpra(second_operand)) - { - let(second_operand_index, op_gpra_get_index(second_operand)); - let(second_operand_string, op_gpra_to_string(second_operand)); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w, - }, - .legacy_prefixes = batch->legacy_prefixes | ((encoding->operand_size_override || second_operand_index == 1) << LEGACY_PREFIX_66), - .opcode = encoding->opcode, - }, - .text = format_instruction2(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string), - }; - - test_instruction(&setup, &instruction); - } - else - { - todo(); - } - } - else - { - todo(); - } - } break; - case 3: - { - OperandId third_operand = encoding->operands.values[2]; - if (op_is_gpr_no_gpra(first_operand)) - { - u8 first_operand_index = op_gpr_get_index(first_operand); - GPR_x86_64 first_operand_register_count = (unlikely(first_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - - u8 first_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String first_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - u8 first_is_rm = op_is_rm(first_operand); - - if (first_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String first_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - first_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(first_rm_buffer[gpr][displacement_index]), first_operand_rm_name, displacement_strings[displacement_index], first_operand_index); - } - } - } - - if (op_is_gpr_no_gpra(second_operand)) - { - u8 second_operand_index = op_gpr_get_index(second_operand); - GPR_x86_64 second_operand_register_count = (unlikely(second_operand_index == 0)) ? (X86_64_GPR_COUNT / 2) : X86_64_GPR_COUNT; - u8 second_is_rm = op_is_rm(second_operand); - u8 second_rm_buffer[X86_64_GPR_COUNT][array_length(displacements)][32]; - String second_rm_strings[X86_64_GPR_COUNT][array_length(displacements)]; - - if (second_is_rm) - { - for (GPR_x86_64 gpr = 0; gpr < X86_64_GPR_COUNT; gpr += 1) - { - String second_operand_rm_name = gpr_to_string(gpr, 3, 0); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - second_rm_strings[gpr][displacement_index] = format_displacement((String)array_to_slice(second_rm_buffer[gpr][displacement_index]), second_operand_rm_name, displacement_strings[displacement_index], second_operand_index); - } - } - } - - if (op_is_imm(third_operand)) - { - u8 third_operand_index = op_imm_get_index(third_operand); - String third_operand_string = sample_immediate_strings(third_operand_index); - u64 third_operand_value = sample_immediate_values(third_operand_index); - - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, 0); - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - String second_operand_string = gpr_to_string(second_gpr, second_operand_index, 0); - - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_immediate = 1, - .immediate_size = third_operand_index, - }, - .rm_register = first_is_rm ? first_gpr : second_gpr, - .reg_register = first_is_rm ? second_gpr : first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = third_operand_value, }, - .opcode = encoding->opcode, - }, - .text = format_instruction3(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string, third_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - - if (first_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < X86_64_GPR_COUNT; first_gpr += 1) - { - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - // String first_operand_string = first_rm_strings[first_gpr][displacement_index]; - - for (GPR_x86_64 second_gpr = 0; second_gpr < second_operand_register_count; second_gpr += 1) - { - // String second_operand_string = gpr_to_string(second_gpr, second_operand_index, gpr_is_extended(first_gpr)); - - todo(); - } - } - } - } - - if (second_is_rm) - { - for (GPR_x86_64 first_gpr = 0; first_gpr < first_operand_register_count; first_gpr += 1) - { - for (GPR_x86_64 second_gpr = 0; second_gpr < X86_64_GPR_COUNT; second_gpr += 1) - { - String first_operand_string = gpr_to_string(first_gpr, first_operand_index, gpr_is_extended(second_gpr)); - - for (u32 displacement_index = 0; displacement_index < array_length(displacements); displacement_index += 1) - { - String second_operand_string = second_rm_strings[second_gpr][displacement_index]; - TestInstruction instruction = { - .encoding = { - .invariant = { - .rex_w = encoding->rex_w || first_operand_index == 3, - .is_rm_register = 1, - .is_reg_register = 1, - .is_immediate = 1, - .immediate_size = third_operand_index, - .is_displacement = 1, - .displacement_size = displacement_index == 2, - }, - .rm_register = first_is_rm ? first_gpr : second_gpr, - .reg_register = first_is_rm ? second_gpr : first_gpr, - .legacy_prefixes = batch->legacy_prefixes | ((first_operand_index == 1 || second_operand_index == 1 || encoding->operand_size_override) << LEGACY_PREFIX_66), - .immediate = { .value = third_operand_value, }, - .displacement = { .value = displacements[displacement_index] }, - .opcode = encoding->opcode, - }, - .text = format_instruction3(instruction_text_buffer_slice, mnemonic_string, first_operand_string, second_operand_string, third_operand_string), - }; - - test_instruction(&setup, &instruction); - } - } - } - } - } - else - { - todo(); - } - } - } - else - { - todo(); - } - } break; - case 4: - { - todo(); - } break; - } - } - - u64 failure_count = 0; - static_assert(array_length(setup.counters) == TEST_MODE_COUNT); - print_string(strlit("\n")); - for (TestMode test_mode = 0; test_mode < TEST_MODE_COUNT; test_mode += 1) - { - String test_mode_string = test_mode_to_string(test_mode); - TestCounter test_counter = setup.counters[test_mode]; - failure_count += test_counter.failure; - if (test_counter.failure) - { - print("[{s}] {s}... [FAILED] {u64}/{u64} failures\n", test_mode_string, encoding_string, test_counter.failure, test_counter.total); - } - else - { - print("[{s}] [OK] ({u64}/{u64})\n", test_mode_string, test_counter.total, test_counter.total); - } - } - - print_string(strlit("\n")); - print_string(encoding_separator_string); - print_string(strlit("\n")); - - if (failure_count) - { - failed_execution(); - } - } - } - - return result; -} - -#define encode_instruction(_opcode, _operands)\ - do{\ - Encoding encoding = {\ - .opcode = _opcode,\ - .operands = _operands,\ - };\ - *vb_add(&builder->encodings, 1) = encoding;\ - } while (0) - -#define ops(...) ((Operands){ .values = { __VA_ARGS__ }, .count = array_length(((OperandId[]){ __VA_ARGS__ })), }) -#define ops_implicit_operands(...) ((Operands){ .values = { __VA_ARGS__ }, .count = array_length(((OperandId[]){ __VA_ARGS__ })), .implicit_operands = 1 }) -#define extension_and_opcode(_opcode_extension, ...) ((Opcode) { .length = array_length(((u8[]){__VA_ARGS__})), .bytes = { __VA_ARGS__ }, _opcode_extension }) -#define opcode3(y, x, ...) ((Opcode) { .prefix_0f = 1, .bytes = { (x), (y) }, __VA_ARGS__ }) -#define opcode2(b, ...) ((Opcode) { .prefix_0f = 1, .bytes = { (b) }, __VA_ARGS__ }) -#define opcode1(b, ...) ((Opcode) { .bytes = { (b) }, __VA_ARGS__ }) - -#define imm8_l 0x10 -#define imm16_l 0x1000 -#define imm32_l 0x10000000 -#define imm64_l 0x1000000000000000 - -#define imm8_s "0x10" -#define imm16_s "0x1000" -#define imm32_s "0x10000000" -#define imm64_s "0x1000000000000000" - -#define imm8_a 0x10, -#define imm16_a 0x00, 0x10, -#define imm32_a 0x00, 0x00, 0x00, 0x10, -#define imm64_a 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - -STRUCT(TestBuilder) -{ - VirtualBuffer(Batch) batches; - VirtualBuffer(Encoding) encodings; -}; - -STRUCT(ArithmeticOptions) -{ - u8 ra_imm; - u8 rm_imm_extension; - u8 rm_r; - u8 r_rm; -}; - -fn Batch batch_start(TestBuilder* builder, Mnemonic_x86_64 mnemonic) -{ - Batch batch = { - .mnemonic = mnemonic, - .encoding_offset = builder->encodings.length, - }; - - return batch; -} - -fn Batch batch_start_legacy_prefixes(TestBuilder* builder, Mnemonic_x86_64 mnemonic, u64 legacy_prefixes) -{ - Batch batch = { - .mnemonic = mnemonic, - .legacy_prefixes = legacy_prefixes, - .encoding_offset = builder->encodings.length, - }; - - return batch; -} - -fn void batch_end(TestBuilder* builder, Batch batch) -{ - batch.encoding_count = builder->encodings.length - batch.encoding_offset; - *vb_add(&builder->batches, 1) = batch; -} - -fn void encode_arithmetic_ex(TestBuilder* builder, Mnemonic_x86_64 mnemonic, ArithmeticOptions options) -{ - Batch batch = batch_start(builder, mnemonic); - - let(ra_imm, opcode1(options.ra_imm - 1)); - encode_instruction(ra_imm, ops(op_al, op_imm8)); - ra_imm.bytes[0] += 1; - encode_instruction(ra_imm, ops(op_ax, op_imm16)); - encode_instruction(ra_imm, ops(op_eax, op_imm32)); - encode_instruction(ra_imm, ops(op_rax, op_imm32)); - - let(rm_imm, opcode1(0x80, .extension = options.rm_imm_extension)); - encode_instruction(rm_imm, ops(op_rm8, op_imm8)); - rm_imm.bytes[0] += 1; - encode_instruction(rm_imm, ops(op_rm16, op_imm16)); - encode_instruction(rm_imm, ops(op_rm32, op_imm32)); - encode_instruction(rm_imm, ops(op_rm64, op_imm32)); - - let(rm_imm8, opcode1(0x83, .extension = options.rm_imm_extension)); - encode_instruction(rm_imm8, ops(op_rm16, op_imm8)); - encode_instruction(rm_imm8, ops(op_rm32, op_imm8)); - encode_instruction(rm_imm8, ops(op_rm64, op_imm8)); - - let(rm_r, opcode1(options.rm_r - 1)); - encode_instruction(rm_r, ops(op_rm8, op_r8)); - rm_r.bytes[0] += 1; - encode_instruction(rm_r, ops(op_rm16, op_r16)); - encode_instruction(rm_r, ops(op_rm32, op_r32)); - encode_instruction(rm_r, ops(op_rm64, op_r64)); - - let(r_rm, opcode1(options.r_rm - 1)); - encode_instruction(r_rm, ops(op_r8, op_rm8)); - r_rm.bytes[0] += 1; - encode_instruction(r_rm, ops(op_r16, op_rm16)); - encode_instruction(r_rm, ops(op_r32, op_rm32)); - encode_instruction(r_rm, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} -#define encode_arithmetic(_mnemonic, ...) encode_arithmetic_ex(&builder, MNEMONIC_x86_64_ ## _mnemonic, (ArithmeticOptions) { __VA_ARGS__ }) - -fn void encode_unsigned_add_flag(TestBuilder* builder, Mnemonic_x86_64 mnemonic) -{ - let(prefix_66, mnemonic == MNEMONIC_x86_64_adcx); - let(prefix_f3, mnemonic == MNEMONIC_x86_64_adox); - let(legacy_prefixes, (prefix_66 << LEGACY_PREFIX_66) | (prefix_f3 << LEGACY_PREFIX_F3)); - - Batch batch = batch_start_legacy_prefixes(builder, mnemonic, legacy_prefixes); - - let(opcode, opcode3(0x38, 0xf6)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} - -typedef enum BitScanKind -{ - BIT_SCAN_FORWARD = 0, - BIT_SCAN_REVERSE = 1, -} BitScanKind; - -fn void encode_bit_scan(TestBuilder* builder, BitScanKind bit_scan_kind) -{ - let(mnemonic, MNEMONIC_x86_64_bsf + bit_scan_kind); - let(opcode_byte, 0xbc | bit_scan_kind); - Batch batch = batch_start(builder, mnemonic); - - let(opcode, opcode2(opcode_byte)); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} - -fn void encode_bswap(TestBuilder* builder) -{ - let(mnemonic, MNEMONIC_x86_64_bswap); - Batch batch = batch_start(builder, mnemonic); - - let(opcode, opcode2(0xc8, .plus_register = 1)); - - encode_instruction(opcode, ops(op_r32)); - encode_instruction(opcode, ops(op_r64)); - - batch_end(builder, batch); -} - -fn void encode_bit_test(TestBuilder* builder, Mnemonic_x86_64 mnemonic, u8 opcode_last, u8 opcode_extension) -{ - Batch batch = batch_start(builder, mnemonic); - - { - let(opcode, opcode2(opcode_last)); - - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - { - let(opcode, opcode2(0xba, .extension = opcode_extension)); - - encode_instruction(opcode, ops(op_rm16, op_imm8)); - encode_instruction(opcode, ops(op_rm32, op_imm8)); - encode_instruction(opcode, ops(op_rm64, op_imm8)); - } - - batch_end(builder, batch); -} - -fn void encode_call(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_call); - { - let(opcode, opcode1(0xe8)); - encode_instruction(opcode, ops(op_rel32)); - } - - { - let(opcode, opcode1(0xff, .extension = 2)); - encode_instruction(opcode, ops(op_rm64)); - } - - // TODO: Figure out memory offset - - batch_end(builder, batch); -} - -fn void encode_convert(TestBuilder* builder) -{ - u8 base_opcode = 0x98; - - Mnemonic_x86_64 mnemonics[2][3] = { - { MNEMONIC_x86_64_cbw, MNEMONIC_x86_64_cwde, MNEMONIC_x86_64_cdqe }, - { MNEMONIC_x86_64_cwd, MNEMONIC_x86_64_cdq, MNEMONIC_x86_64_cqo }, - }; - - OperandId operands[] = { op_ax, op_eax, op_rax }; - - for (u32 category = 0; category < array_length(mnemonics); category += 1) - { - for (u32 i = 0; i < array_length(mnemonics[0]); i += 1) - { - Batch batch = batch_start(builder, mnemonics[category][i]); - let(implicit_operand, ops(operands[i])); - implicit_operand.implicit_operands = 1; - let(opcode, opcode1(base_opcode + category)); - encode_instruction(opcode, implicit_operand); - batch_end(builder, batch); - } - } -} - -fn void encode_no_operand_instruction(TestBuilder* builder, Mnemonic_x86_64 mnemonic, Opcode opcode, u64 legacy_prefixes) -{ - Batch batch = batch_start_legacy_prefixes(builder, mnemonic, legacy_prefixes); - Operands operands = {}; - encode_instruction(opcode, operands); - batch_end(builder, batch); -} - -fn void encode_clflush(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_clflush); - let(opcode, opcode2(0xae, .extension = 7)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_clflushopt(TestBuilder* builder) -{ - Batch batch = batch_start_legacy_prefixes(builder, MNEMONIC_x86_64_clflushopt, 1 << LEGACY_PREFIX_66); - let(opcode, opcode2(0xae, .extension = 7)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_cmov_instructions(TestBuilder* builder) -{ - for (u8 cmov_index = 0; cmov_index < cmov_count; cmov_index += 1) - { - Mnemonic_x86_64 mnemonic = MNEMONIC_x86_64_cmova + cmov_index; - Batch batch = batch_start(builder, mnemonic); - let(opcode, opcode2(0x40 | cc_opcodes_low[cmov_index])); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - batch_end(builder, batch); - } -} - -fn void encode_cmps(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpsb + i); - Operands operands = { - .values = { op_ds_rsi_m8 + i, op_es_rdi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xa7 - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_cmpxchg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpxchg); - let(opcode, opcode2(0xb0)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - - opcode.bytes[0] += 1; - - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - batch_end(builder, batch); -} - -fn void encode_cmpxchg_bytes(TestBuilder* builder) -{ - let(opcode, opcode2(0xc7, .extension = 1)); - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpxchg8b); - encode_instruction(opcode, ops(op_m64)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_cmpxchg16b); - encode_instruction(opcode, ops(op_m128)); - batch_end(builder, batch); - } -} - -fn void encode_crc32(TestBuilder* builder) -{ - Batch batch = batch_start_legacy_prefixes(builder, MNEMONIC_x86_64_crc32, 1 << LEGACY_PREFIX_F2); - { - let(opcode, opcode3(0x38, 0xf0)); - encode_instruction(opcode, ops(op_r32, op_rm8)); - } - - let(opcode, opcode3(0x38, 0xf1)); - Encoding encoding = { - .opcode = opcode, - .operands = ops(op_r32, op_rm16), - .operand_size_override = 1, - }; - *vb_add(&builder->encodings, 1) = encoding; - - { - let(opcode, opcode3(0x38, 0xf1)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - } - { - let(opcode, opcode3(0x38, 0xf0)); - encode_instruction(opcode, ops(op_r64, op_rm8)); - } - { - let(opcode, opcode3(0x38, 0xf1)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - batch_end(builder, batch); - } -} - -typedef enum IncDec -{ - OP_INC = 0, - OP_DEC = 1, -} IncDec; - -fn void encode_dec_inc(TestBuilder* builder, IncDec inc_dec) -{ - Batch batch = batch_start(builder, inc_dec == OP_DEC ? MNEMONIC_x86_64_dec : MNEMONIC_x86_64_inc); - let(opcode, opcode1(0xfe, .extension = inc_dec)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -typedef enum Signedness -{ - SIGNEDNESS_UNSIGNED = 0, - SIGNEDNESS_SIGNED = 1, -} Signedness; - -fn void encode_div(TestBuilder* builder, Signedness signedness) -{ - global_variable const Mnemonic_x86_64 div_mnemonics[] = { MNEMONIC_x86_64_div, MNEMONIC_x86_64_idiv }; - Batch batch = batch_start(builder, div_mnemonics[signedness]); - u8 opcode_extension = 6 | signedness; - let(opcode, opcode1(0xf6, .extension = opcode_extension)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_imul(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_imul); - - { - let(opcode, opcode1(0xf6, .extension = 5)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - } - - { - let(opcode, opcode2(0xaf)); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - } - - { - let(opcode, opcode1(0x6b)); - encode_instruction(opcode, ops(op_r16, op_rm16, op_imm8)); - encode_instruction(opcode, ops(op_r32, op_rm32, op_imm8)); - encode_instruction(opcode, ops(op_r64, op_rm64, op_imm8)); - } - - { - let(opcode, opcode1(0x69)); - encode_instruction(opcode, ops(op_r16, op_rm16, op_imm16)); - encode_instruction(opcode, ops(op_r32, op_rm32, op_imm32)); - encode_instruction(opcode, ops(op_r64, op_rm64, op_imm32)); - } - - batch_end(builder, batch); -} - -fn void encode_in(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_in); - - { - let(opcode, opcode1(0xe4)); - encode_instruction(opcode, ops(op_al, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_ax, op_imm8)); - encode_instruction(opcode, ops(op_eax, op_imm8)); - } - - { - let(opcode, opcode1(0xec)); - encode_instruction(opcode, ops_implicit_operands(op_al, op_dx)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops_implicit_operands(op_ax, op_dx)); - encode_instruction(opcode, ops_implicit_operands(op_eax, op_dx)); - } - - batch_end(builder, batch); -} - -fn void encode_ins(TestBuilder* builder) -{ - for (u8 i = 0; i < 3; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_insb + i); - Operands operands = { - .values = { op_es_rdi_m8 + i, op_dx }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0x6d - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_int(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_int); - let(opcode, opcode1(0xcd)); - encode_instruction(opcode, ops(op_imm8)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_int3); - Operands operands = {}; - let(opcode, opcode1(0xcc)); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_invlpg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_invlpg); - let(opcode, opcode2(0x01, .extension = 7)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_iret(TestBuilder* builder) -{ - Operands operands = {}; - let(opcode, opcode1(0xcf)); - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_iret); - Encoding encoding = { - .opcode = opcode, - .operands = operands, - .operand_size_override = 1, - }; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_iretd); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_iretq); - Encoding encoding = { - .opcode = opcode, - .operands = operands, - .rex_w = 1, - }; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_jmp(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_jmp); - - { - let(opcode, opcode1(0xeb)); - encode_instruction(opcode, ops(op_rel8)); - } - { - let(opcode, opcode1(0xe9)); - encode_instruction(opcode, ops(op_rel32)); - } - - { - let(opcode, opcode1(0xff, .extension = 4)); - encode_instruction(opcode, ops(op_rm64)); - } - - // TODO: (m16,m32,m64):(16,32,64) - - batch_end(builder, batch); -} - -fn void encode_jcc(TestBuilder* builder) -{ - for (u8 jcc_i = 0; jcc_i < jcc_count; jcc_i += 1) - { - Mnemonic_x86_64 mnemonic = MNEMONIC_x86_64_ja + jcc_i; - Batch batch = batch_start(builder, mnemonic); - { - let(opcode, opcode1(0x70 | cc_opcodes_low[jcc_i])); - encode_instruction(opcode, ops(op_rel8)); - } - { - let(opcode, opcode2(0x80 | cc_opcodes_low[jcc_i])); - encode_instruction(opcode, ops(op_rel32)); - } - batch_end(builder, batch); - } - - Mnemonic_x86_64 mnemonic = MNEMONIC_x86_64_jrcxz; - Batch batch = batch_start(builder, mnemonic); - let(opcode, opcode1(0xe3)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); -} - -fn void encode_lea(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_lea); - let(opcode, opcode1(0x8d)); - encode_instruction(opcode, ops(op_r16, op_m16)); - encode_instruction(opcode, ops(op_r32, op_m32)); - encode_instruction(opcode, ops(op_r64, op_m64)); - batch_end(builder, batch); -} - -fn void encode_lods(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_lodsb + i); - Operands operands = { - .values = { op_al + i, op_ds_rsi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xad - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_loop(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_loop); - let(opcode, opcode1(0xe2)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_loope); - let(opcode, opcode1(0xe1)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_loopne); - let(opcode, opcode1(0xe0)); - encode_instruction(opcode, ops(op_rel8)); - batch_end(builder, batch); - } -} - -fn void encode_mov(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_mov); - - { - let(opcode, opcode1(0x88)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - { - let(opcode, opcode1(0x8a)); - encode_instruction(opcode, ops(op_r8, op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - } - - // TODO: segments - - { - let(opcode, opcode1(0xb0, .plus_register = 1)); - encode_instruction(opcode, ops(op_r8, op_imm8)); - opcode.bytes[0] |= 8; - encode_instruction(opcode, ops(op_r16, op_imm16)); - encode_instruction(opcode, ops(op_r32, op_imm32)); - encode_instruction(opcode, ops(op_r64, op_imm64)); - } - - - { - let(opcode, opcode1(0xc6, .extension = 0)); - encode_instruction(opcode, ops(op_rm8, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_imm16)); - encode_instruction(opcode, ops(op_rm32, op_imm32)); - encode_instruction(opcode, ops(op_rm64, op_imm32)); - } - - batch_end(builder, batch); -} - -fn void encode_movs(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movsb + i); - Operands operands = { - .values = { op_es_rdi_m8 + i, op_ds_rsi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xa5 - (i == 0))); - Encoding encoding = { - .operands = operands, - .opcode = opcode, - .rex_w = i == 3, - }; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_movsx(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movsx); - { - let(opcode, opcode2(0xbe)); - encode_instruction(opcode, ops(op_r16, op_rm8)); - encode_instruction(opcode, ops(op_r32, op_rm8)); - encode_instruction(opcode, ops(op_r64, op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_r32, op_rm16)); - encode_instruction(opcode, ops(op_r64, op_rm16)); - } - batch_end(builder, batch); - } - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movsxd); - let(opcode, opcode1(0x63)); - encode_instruction(opcode, ops(op_r64, op_rm32)); - batch_end(builder, batch); - } -} - -fn void encode_movzx(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_movzx); - let(opcode, opcode2(0xb6)); - encode_instruction(opcode, ops(op_r16, op_rm8)); - encode_instruction(opcode, ops(op_r32, op_rm8)); - encode_instruction(opcode, ops(op_r64, op_rm8)); - - opcode.bytes[0] += 1; - - encode_instruction(opcode, ops(op_r32, op_rm16)); - encode_instruction(opcode, ops(op_r64, op_rm16)); - batch_end(builder, batch); - } -} - -fn void encode_mul(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_mul); - let(opcode, opcode1(0xf6, .extension = 4)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_neg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_neg); - let(opcode, opcode1(0xf6, .extension = 3)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_nop(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_nop); - let(opcode, opcode1(0x90)); - encode_instruction(opcode, (Operands){}); - { - let(opcode, opcode2(0x1f, .extension = 0)); - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - } - batch_end(builder, batch); -} - -fn void encode_not(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_not); - let(opcode, opcode1(0xf6, .extension = 2)); - encode_instruction(opcode, ops(op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm32)); - encode_instruction(opcode, ops(op_rm64)); - batch_end(builder, batch); -} - -fn void encode_out(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_out); - - { - let(opcode, opcode1(0xe6)); - encode_instruction(opcode, ops(op_imm8, op_al)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_imm8, op_ax)); - encode_instruction(opcode, ops(op_imm8, op_eax)); - } - - { - let(opcode, opcode1(0xee)); - encode_instruction(opcode, ops_implicit_operands(op_dx, op_al)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops_implicit_operands(op_dx, op_ax)); - encode_instruction(opcode, ops_implicit_operands(op_dx, op_eax)); - } - - batch_end(builder, batch); -} - -fn void encode_outs(TestBuilder* builder) -{ - for (u8 i = 0; i < 3; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_outsb + i); - Operands operands = { - .values = { op_dx, op_ds_rsi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0x6f - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_pop(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_pop); - - { - let(opcode, opcode1(0x8f, .extension = 0)); - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm64)); - } - - let(opcode, opcode1(0x58, .plus_register = 1)); - encode_instruction(opcode, ops(op_r16)); - encode_instruction(opcode, ops(op_r64)); - - batch_end(builder, batch); -} - -fn void encode_popcnt(TestBuilder* builder) -{ - Batch batch = batch_start_legacy_prefixes(builder, MNEMONIC_x86_64_popcnt, 1 << LEGACY_PREFIX_F3); - - let(opcode, opcode2(0xb8)); - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - batch_end(builder, batch); -} - -fn void encode_popf(TestBuilder* builder) -{ - Encoding encoding = { - .opcode = opcode1(0x9d), - .operand_size_override = 1, - }; - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_popf); - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_popfq); - encoding.operand_size_override = 0; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_prefetch(TestBuilder* builder) -{ - for (u8 i = 0; i < 3; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_prefetcht0 + i); - let(opcode, opcode2(0x18, .extension = i + 1)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); - } - - Batch batch = batch_start(builder, MNEMONIC_x86_64_prefetchnta); - let(opcode, opcode2(0x18, .extension = 0)); - encode_instruction(opcode, ops(op_m8)); - batch_end(builder, batch); -} - -fn void encode_push(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_push); - - { - let(opcode, opcode1(0xff, .extension = 6)); - encode_instruction(opcode, ops(op_rm16)); - encode_instruction(opcode, ops(op_rm64)); - } - - { - let(opcode, opcode1(0x50, .plus_register = 1)); - encode_instruction(opcode, ops(op_r16)); - encode_instruction(opcode, ops(op_r64)); - } - - let(opcode, opcode1(0x6a)); - encode_instruction(opcode, ops(op_imm8)); - opcode.bytes[0] -= 2; - encode_instruction(opcode, ops(op_imm16)); - encode_instruction(opcode, ops(op_imm32)); - - batch_end(builder, batch); -} - -fn void encode_pushf(TestBuilder* builder) -{ - Encoding encoding = { - .opcode = { - .bytes = { 0x9c }, - }, - .operand_size_override = 1, - }; - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_pushf); - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_pushfq); - encoding.operand_size_override = 0; - *vb_add(&builder->encodings, 1) = encoding; - batch_end(builder, batch); - } -} - -fn void encode_rotate(TestBuilder* builder) -{ - Mnemonic_x86_64 mnemonics[] = { MNEMONIC_x86_64_rol, MNEMONIC_x86_64_ror, MNEMONIC_x86_64_rcl, MNEMONIC_x86_64_rcr }; - for (u8 extension = 0; extension < 4; extension += 1) - { - Batch batch = batch_start(builder, mnemonics[extension]); - - Opcode opcodes[] = { - opcode1(0xd0, .extension = extension), - opcode1(0xd2, .extension = extension), - opcode1(0xc0, .extension = extension), - }; - encode_instruction(opcodes[0], ops(op_rm8, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm8, op_cl)); - encode_instruction(opcodes[2], ops(op_rm8, op_imm8)); - - for (u64 i = 0; i < array_length(opcodes); i += 1) - { - opcodes[i].bytes[0] += 1; - } - - encode_instruction(opcodes[0], ops(op_rm16, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm16, op_cl)); - encode_instruction(opcodes[2], ops(op_rm16, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm32, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm32, op_cl)); - encode_instruction(opcodes[2], ops(op_rm32, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm64, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm64, op_cl)); - encode_instruction(opcodes[2], ops(op_rm64, op_imm8)); - - batch_end(builder, batch); - } -} - -typedef enum ReturnType -{ - RETURN_TYPE_NEAR, - RETURN_TYPE_FAR, -} ReturnType; - -fn void encode_ret(TestBuilder* builder, ReturnType return_type) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_ret + (return_type == RETURN_TYPE_FAR)); - - let(opcode_flag, (u8)safe_flag(0b1000, return_type == RETURN_TYPE_FAR)); - - { - let(opcode, opcode1(0xc3 | opcode_flag)); - Operands ops = {}; - encode_instruction(opcode, ops); - } - { - let(opcode, opcode1(0xc2 | opcode_flag)); - encode_instruction(opcode, ops(op_imm16)); - } - - batch_end(builder, batch); -} - -fn void encode_shift(TestBuilder* builder) -{ - Mnemonic_x86_64 mnemonics[] = { MNEMONIC_x86_64_sal, MNEMONIC_x86_64_sar, MNEMONIC_x86_64_shl, MNEMONIC_x86_64_shr }; - u8 opcode_extensions[] = { 4, 7, 4, 5 }; - - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, mnemonics[i]); - u8 extension = opcode_extensions[i]; - - Opcode opcodes[] = { - opcode1(0xd0, .extension = extension), - opcode1(0xd2, .extension = extension), - opcode1(0xc0, .extension = extension), - }; - - encode_instruction(opcodes[0], ops(op_rm8, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm8, op_cl)); - encode_instruction(opcodes[2], ops(op_rm8, op_imm8)); - - for (u64 i = 0; i < array_length(opcodes); i += 1) - { - opcodes[i].bytes[0] += 1; - } - - encode_instruction(opcodes[0], ops(op_rm16, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm16, op_cl)); - encode_instruction(opcodes[2], ops(op_rm16, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm32, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm32, op_cl)); - encode_instruction(opcodes[2], ops(op_rm32, op_imm8)); - - encode_instruction(opcodes[0], ops(op_rm64, op_one_literal)); - encode_instruction(opcodes[1], ops(op_rm64, op_cl)); - encode_instruction(opcodes[2], ops(op_rm64, op_imm8)); - - batch_end(builder, batch); - } -} - -fn void encode_scas(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_scasb + i); - Operands operands = { - .values = { op_al + i, op_es_rdi_m8 + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xaf - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_setcc(TestBuilder* builder) -{ - for (u8 i = 0; i < setcc_count; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_seta + i); - let(opcode, opcode2(0x90 | cc_opcodes_low[i])); - encode_instruction(opcode, ops(op_rm8)); - batch_end(builder, batch); - } -} - -fn void encode_stos(TestBuilder* builder) -{ - for (u8 i = 0; i < 4; i += 1) - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_stosb + i); - Operands operands = { - .values = { op_es_rdi_m8 + i, op_al + i }, - .count = 2, - .implicit_operands = 1, - }; - let(opcode, opcode1(0xab - (i == 0))); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_test(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_test); - - { - let(opcode, opcode1(0xa8)); - encode_instruction(opcode, ops(op_al, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_ax, op_imm16)); - encode_instruction(opcode, ops(op_eax, op_imm32)); - encode_instruction(opcode, ops(op_rax, op_imm32)); - } - - { - let(opcode, opcode1(0xf6, .extension = 0)); - encode_instruction(opcode, ops(op_rm8, op_imm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_imm16)); - encode_instruction(opcode, ops(op_rm32, op_imm32)); - encode_instruction(opcode, ops(op_rm64, op_imm32)); - } - - { - let(opcode, opcode1(0x84)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - batch_end(builder, batch); -} - -fn void encode_ud(TestBuilder* builder) -{ - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_ud0); - let(opcode, opcode2(0xff)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_ud1); - let(opcode, opcode2(0xb9)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - batch_end(builder, batch); - } - - { - Batch batch = batch_start(builder, MNEMONIC_x86_64_ud2); - Operands operands = {}; - let(opcode, opcode2(0x0b)); - encode_instruction(opcode, operands); - batch_end(builder, batch); - } -} - -fn void encode_xadd(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_xadd); - let(opcode, opcode2(0xc0)); - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - - batch_end(builder, batch); -} - -fn void encode_xchg(TestBuilder* builder) -{ - Batch batch = batch_start(builder, MNEMONIC_x86_64_xchg); - - let(opcode, opcode1(0x90, .plus_register = 1)); - - encode_instruction(opcode, ops(op_ax, op_r16)); - encode_instruction(opcode, ops(op_r16, op_ax)); - encode_instruction(opcode, ops(op_eax, op_r32)); - encode_instruction(opcode, ops(op_r32, op_eax)); - encode_instruction(opcode, ops(op_rax, op_r64)); - encode_instruction(opcode, ops(op_r64, op_rax)); - - { - let(opcode, opcode1(0x86)); - encode_instruction(opcode, ops(op_r8, op_rm8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_r16, op_rm16)); - encode_instruction(opcode, ops(op_r32, op_rm32)); - encode_instruction(opcode, ops(op_r64, op_rm64)); - - opcode.bytes[0] -= 1; - encode_instruction(opcode, ops(op_rm8, op_r8)); - opcode.bytes[0] += 1; - encode_instruction(opcode, ops(op_rm16, op_r16)); - encode_instruction(opcode, ops(op_rm32, op_r32)); - encode_instruction(opcode, ops(op_rm64, op_r64)); - } - - batch_end(builder, batch); -} - -fn TestDataset construct_test_cases() -{ - TestBuilder builder = {}; - - encode_arithmetic(adc, .ra_imm = 0x15, .rm_imm_extension = 2, .rm_r = 0x11, .r_rm = 0x13); - encode_unsigned_add_flag(&builder, MNEMONIC_x86_64_adcx); - encode_arithmetic(add, .ra_imm = 0x05, .rm_imm_extension = 0, .rm_r = 0x01, .r_rm = 0x03); - encode_unsigned_add_flag(&builder, MNEMONIC_x86_64_adox); - encode_arithmetic(and, .ra_imm = 0x25, .rm_imm_extension = 4, .rm_r = 0x21, .r_rm = 0x23); - encode_bit_scan(&builder, BIT_SCAN_FORWARD); - encode_bit_scan(&builder, BIT_SCAN_REVERSE); - encode_bswap(&builder); - encode_bit_test(&builder, MNEMONIC_x86_64_bt, 0xa3, 0x04); - encode_bit_test(&builder, MNEMONIC_x86_64_btc, 0xbb, 0x07); - encode_bit_test(&builder, MNEMONIC_x86_64_btr, 0xb3, 0x06); - encode_bit_test(&builder, MNEMONIC_x86_64_bts, 0xab, 0x05); - encode_call(&builder); - encode_convert(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_clc, opcode1(0xf8), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cld, opcode1(0xfc), 0); - encode_clflush(&builder); - encode_clflushopt(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cli, opcode1(0xfa), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_clts, opcode2(0x06), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cmc, opcode1(0xf5), 0); - encode_cmov_instructions(&builder); - encode_arithmetic(cmp, .ra_imm = 0x3d, .rm_imm_extension = 7, .rm_r = 0x39, .r_rm = 0x3b); - encode_cmps(&builder); - encode_cmpxchg(&builder); - encode_cmpxchg_bytes(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_cpuid, opcode2(0xa2), 0); - encode_crc32(&builder); - encode_dec_inc(&builder, OP_DEC); - encode_div(&builder, SIGNEDNESS_UNSIGNED); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_hlt, opcode1(0xf4), 0); - encode_div(&builder, SIGNEDNESS_SIGNED); - encode_imul(&builder); - encode_in(&builder); - encode_dec_inc(&builder, OP_INC); - encode_ins(&builder); - encode_int(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_invd, opcode2(0x08), 0); - encode_invlpg(&builder); - encode_iret(&builder); - encode_jmp(&builder); - encode_jcc(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_lahf, opcode1(0x9f), 0); - encode_lea(&builder); - encode_lods(&builder); - encode_loop(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_monitor, opcode3(0x01, 0xc8), 0); - encode_mov(&builder); - encode_movs(&builder); - encode_movsx(&builder); - encode_movzx(&builder); - encode_mul(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_mwait, opcode3(0x01, 0xc9), 0); - encode_neg(&builder); - encode_nop(&builder); - encode_not(&builder); - encode_arithmetic(or, .ra_imm = 0x0d, .rm_imm_extension = 1, .rm_r = 0x09, .r_rm = 0x0b); - encode_out(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_pause, opcode1(0x90), 1 << LEGACY_PREFIX_F3); - encode_pop(&builder); - encode_popcnt(&builder); - encode_popf(&builder); - encode_prefetch(&builder); - encode_push(&builder); - encode_pushf(&builder); - encode_rotate(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdmsr, opcode2(0x32), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdpmc, opcode2(0x33), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdtsc, opcode2(0x31), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rdtscp, opcode3(0x01, 0xf9), 0); - encode_ret(&builder, RETURN_TYPE_NEAR); - encode_ret(&builder, RETURN_TYPE_FAR); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_rsm, opcode2(0xaa), 0); - encode_shift(&builder); - encode_arithmetic(sbb, .ra_imm = 0x1d, .rm_imm_extension = 3, .rm_r = 0x19, .r_rm = 0x1b); - encode_scas(&builder); - encode_setcc(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_stc, opcode1(0xf9), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_std, opcode1(0xfd), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sti, opcode1(0xfb), 0); - encode_stos(&builder); - encode_arithmetic(sub, .ra_imm = 0x2d, .rm_imm_extension = 5, .rm_r = 0x29, .r_rm = 0x2b); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_syscall, opcode2(0x05), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sysenter, opcode2(0x34), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sysexit, opcode2(0x35), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_sysret, opcode2(0x07), 0); - encode_test(&builder); - encode_ud(&builder); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_wbinvd, opcode2(0x09), 0); - encode_no_operand_instruction(&builder, MNEMONIC_x86_64_wrmsr, opcode2(0x30), 0); - encode_xadd(&builder); - encode_xchg(&builder); - encode_arithmetic(xor, .ra_imm = 0x35, .rm_imm_extension = 6, .rm_r = 0x31, .r_rm = 0x33); - - TestDataset result = { - .batches = builder.batches.pointer, - .batch_count = builder.batches.length, - .encodings = builder.encodings.pointer, - .encoding_count = builder.encodings.length, - }; - - return result; -} - -fn u8 is_asm_space(u8 ch) -{ - return ch == '\t' || ch == ' ' || ch == '\n' || ch == '\r'; -} - -fn u64 find_next_space(String string) -{ - return MIN(MIN(string_first_ch(string, ' '), string_first_ch(string, '\t')), MIN(string_first_ch(string, '\n'), string_first_ch(string, '\r'))); -} - -fn void n_word_mask(CStringSlice words, u8* mask, u8 length) -{ - for (u8 i = 0; i < length; i += 1) - { - mask[i] = 0xff; - } - - for (u8 byte = 0; byte < length; byte += 1) - { - for (u8 bit = 0; bit < 8; bit += 1) - { - u8 old = mask[byte]; - mask[byte] &= ~(u8)(1 << bit); - - u8 map[16*16][16] = {}; - u32 map_item_count = 0; - u8 candidate[16] = {}; - - for (u64 word_index = 0; word_index < words.length; word_index += 1) - { - char* word = words.pointer[word_index]; - for (u8 mask_index = 0; mask_index < length; mask_index += 1) - { - candidate[mask_index] = word[mask_index] & mask[mask_index]; - } - - u8 map_index; - for (map_index = 0; map_index < map_item_count; map_index += 1) - { - if (memcmp(map[map_index], candidate, length) == 0) - { - break; - } - } - - if (map_index != map_item_count) - { - mask[byte] = old; - break; - } - - memcpy(map[map_item_count], candidate, length); - map_item_count += 1; - } - } - } -} - -typedef enum OperandKind : u8 -{ - OPERAND_KIND_REGISTER, - OPERAND_KIND_IMMEDIATE, - OPERAND_KIND_INDIRECT, -} OperandKind; -STRUCT(OperandWork) -{ - OperandKind kind:2; - u8 size:6; -}; -static_assert(sizeof(OperandWork) == 1); - -STRUCT(OperandIndirect) -{ - x86_64_Register base; - s8 displacement8; - s32 displacement32; -}; - -STRUCT(MnemonicEncoding) -{ - OperandId operands[4]; -}; - -String assemble(String text) -{ - u8* buffer = os_reserve(0, align_forward_u64(text.length + 0x4000, 0x1000), (OSReserveProtectionFlags) { .read = 1, .write = 1 }, (OSReserveMapFlags) { .priv = 1, .anon = 1, .populate = 1 }); - u8* source = text.pointer; - - u8* top = source + text.length; - u8* destination = buffer; - - while (source < top) - { - u64 instruction_count = 0; - u8* base = source; - u32 mnemonic_offsets[64]; - u32 mnemonic_lengths[64]; -#define operand_buffer_count (64*4) - u32 operand_offsets[operand_buffer_count]; - u8 operand_lengths[operand_buffer_count]; - u32 instruction_operand_offsets[64]; - u8 instruction_operand_counters[64]; - OperandWork operand_works[operand_buffer_count]; - u64 immediates[operand_buffer_count]; - x86_64_Register registers[operand_buffer_count]; - OperandIndirect indirects[operand_buffer_count]; - u32 operand_count = 0; - - u64 operand_length_error_mask = 0; - u64 operand_count_error_mask = 0; - - while (instruction_count < 64) - { - while (is_asm_space(*source)) - { - source += 1; - } - - if (source == top) - { - break; - } - - let(instruction_length, MIN(string_first_ch((String) { .pointer = source, .length = top - source }, '\n'), (u64)(top - source))); - - String instruction = { .pointer = source, .length = instruction_length }; - let(instruction_top, source + instruction_length + (*(source + instruction_length) == '\n')); - - u32 mnemonic_offset = source - base; - u32 mnemonic_length = find_next_space(instruction); - mnemonic_offsets[instruction_count] = mnemonic_offset; - mnemonic_lengths[instruction_count] = mnemonic_length; - - source += mnemonic_length; - - u32 instruction_operand_offset = operand_count; - instruction_operand_offsets[instruction_count] = instruction_operand_offset; - - while (1) - { - while (is_asm_space(*source)) - { - source += 1; - } - - if (source == instruction_top) - { - break; - } - - String whats_left = { .pointer = source, .length = instruction_top - source }; - u32 operand_offset = source - base; - u32 operand_length = MIN(whats_left.length, MIN(string_first_ch(whats_left, ','), string_first_ch(whats_left, '\n'))); - operand_offsets[operand_count] = operand_offset; - operand_lengths[operand_count] = operand_length; - operand_length_error_mask |= operand_length >= UINT8_MAX; - source += operand_length; - source += *source == ','; - - operand_count += 1; - } - - let_cast(u8, instruction_operand_count, operand_count - instruction_operand_offset); - operand_count_error_mask |= instruction_operand_count > 4; - instruction_operand_counters[instruction_count] = instruction_operand_count; - - instruction_count += 1; - } - - if (unlikely((operand_length_error_mask | operand_count_error_mask | (source == top)) != 0)) - { - if (source == top) - { - break; - } - - todo(); - } - - let(lookup_result, pext_lookup_mnemonic_batch(base, mnemonic_offsets, mnemonic_lengths)); - - __mmask32 lookup_error_m0 = _mm512_cmpeq_epi16_mask(lookup_result.v[0], _mm512_set1_epi16(0xffff)); - __mmask32 lookup_error_m1 = _mm512_cmpeq_epi16_mask(lookup_result.v[1], _mm512_set1_epi16(0xffff)); - __mmask32 lookup_error_mask = _kor_mask32(lookup_error_m0, lookup_error_m1); - u32 lookup_error_mask_int = _cvtmask32_u32(lookup_error_mask); - - // Operand parsing - // GPR - // xmm{0-31} - // ymm{0-31} - // zmm{0-31} - // indirect - // immediate: decimal, hexadecimal, binary - - if (likely(operand_count != 0)) - { - for (u32 operand_index = 0; operand_index < operand_count; operand_index += 1) - { - let(operand_string_pointer, base + operand_offsets[operand_index]); - let(operand_string_length, operand_lengths[operand_index]); - u8 first_ch = operand_string_pointer[0]; - if ((first_ch >= 'a') & (first_ch <= 'z')) - { - let(value, pext_lookup_register_single(operand_string_pointer, operand_string_length)); - if (value == 0xffff) - { - todo(); - } - - registers[operand_index] = value; - operand_works[operand_index].kind = OPERAND_KIND_REGISTER; - } - else if ((first_ch >= '0') & (first_ch <= '9')) - { - switch (operand_string_pointer[1]) - { - case 'x': - { - u8* it = &operand_string_pointer[2]; - - u8* hex_it = it; - while (is_hex_digit(*hex_it)) - { - hex_it += 1; - } - - String operand_string = { .pointer = it, .length = hex_it - it }; - u8 is_error; - u64 result = parse_hexadecimal(operand_string, &is_error); - if (is_error) - { - todo(); - } - immediates[operand_index] = result; - - it = hex_it; - } break; - case 'b': - { - todo(); - } break; - case 'o': - { - todo(); - } break; - default: todo(); - } - - operand_works[operand_index].kind = OPERAND_KIND_IMMEDIATE; - } - else if (first_ch == '[') - { - u8* end = &operand_string_pointer[operand_string_length - 1]; - - while (is_asm_space(*end)) - { - end -= 1; - } - - if (*end != ']') - { - todo(); - } - - u8* it = operand_string_pointer + 1; - s8 bias8 = 1; - s32 bias32 = 1; - s8 displacement8 = 0; - s32 displacement32 = 0; - x86_64_Register base = 0; - - while (1) - { - while (is_asm_space(*it)) - { - it += 1; - } - - if (it == end) - { - break; - } - - u8 first_ch = *it; - if ((first_ch >= 'a') & (first_ch <= 'z')) - { - let(suboperand_it, it); - while (is_alphanumeric(*suboperand_it)) - { - suboperand_it += 1; - } - - u8* operand_string_pointer = it; - u8 operand_string_length = suboperand_it - it; - - let(value, pext_lookup_register_single(operand_string_pointer, operand_string_length)); - if (value == 0xffff) - { - todo(); - } - - base = value; - - it = suboperand_it; - } - else if (first_ch == '0') - { - it += 1; - - switch (*it) - { - case 'x': - { - it += 1; - - u8* hex_it = it; - while (is_hex_digit(*hex_it)) - { - hex_it += 1; - } - - String operand_string = { .pointer = it, .length = hex_it - it }; - u8 is_error; - u64 result = parse_hexadecimal(operand_string, &is_error); - if (is_error) - { - todo(); - } - unused(result); - - it = hex_it; - } break; - case 'b': - { - it += 1; - todo(); - } break; - case 'o': - { - it += 1; - todo(); - } break; - default: todo(); - } - } - else - { - todo(); - } - - while (is_asm_space(*it)) - { - it += 1; - } - - switch (*it) - { - case '+': - { - it += 1; - } break; - case '-': - { - bias8 = -1; - bias32 = -1; - it += 1; - } break; - case ']': - { - } break; - default: todo(); - } - } - - assert(*it == ']'); - it += 1; - - indirects[operand_index].displacement8 = displacement8 * bias8; - indirects[operand_index].displacement32 = displacement32 * bias32; - indirects[operand_index].base = base; - operand_works[operand_index].kind = OPERAND_KIND_INDIRECT; - } - else - { - todo(); - } - } - } - - if (unlikely(lookup_error_mask_int != 0)) - { - todo(); - } - - // for (u64 instruction_index = 0; instruction_index < 64; instruction_index += 1) - // { - // u8 instruction_operand_count = instruction_operand_counters[instruction_index]; - // u32 instruction_operand_offset = instruction_operand_offsets[instruction_index]; - // for (u8 instruction_operand_index = 0; instruction_operand_index < instruction_operand_count; instruction_operand_index += 1) - // { - // // u32 operand_index = instruction_operand_offset + instruction_operand_index; - // // OperandWork work = operand_works[operand_index]; - // // switch (work.kind) - // // { - // // // default: todo(); - // // } - // } - // for (u8 instruction_operand_index = instruction_operand_count; instruction_operand_index < 4; instruction_operand_index += 1) - // { - // // Check encoding operand is zero - // } - // } - -#if 0 - // ================================= - // TODO: START - // ================================= - u8 immediate[8][64] = {}; // TODO - u8 displacement[4][64] = {}; // TODO - u8 relative[4][64] = {}; // TODO - - __mmask64 prefix_masks[LEGACY_PREFIX_COUNT] = {}; // TODO - __mmask64 is_immediate[4] = {}; // TODO - __mmask64 is_plus_register = {}; // TODO - __mmask64 is_rm_register = {}; // TODO - __mmask64 is_reg_register = {}; // TODO - __mmask64 is_implicit_register = {}; // TODO - __mmask64 is_displacement8 = {}; // TODO - __mmask64 is_displacement32 = {}; // TODO - __mmask64 is_relative8 = {}; // TODO - __mmask64 is_relative32 = {}; // TODO - __mmask64 is_rex_w = {}; // TODO - - __m256i rm_register_mask_256 = {}; // TODO - __m256i reg_register_mask_256 = {}; // TODO - __m128i opcode_lengths_128 = {}; // TODO - __m512i opcode_extension = {}; // TODO - __m512i opcode0_pre = {}; // TODO - __m512i opcode1_pre = {}; // TODO - __m512i opcode2_pre = {}; // TODO - __m512i displacement8 = _mm512_loadu_epi8(&displacement[0][0]); - // ================================= - // TODO: END - // ================================= - - __m512i prefixes[LEGACY_PREFIX_COUNT]; - for (LegacyPrefix prefix = 0; prefix < LEGACY_PREFIX_COUNT; prefix += 1) - { - prefixes[prefix] = _mm512_maskz_set1_epi8(prefix_masks[prefix], legacy_prefixes[prefix]); - } - - __m512i instruction_length; - - u8 prefix_group1_bytes[64]; - u8 prefix_group1_positions[64]; - { - __mmask64 prefix_group1_mask = _kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_F0], prefix_masks[LEGACY_PREFIX_F2]), prefix_masks[LEGACY_PREFIX_F3]); - __m512i prefix_group1 = _mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_F0], prefixes[LEGACY_PREFIX_F2]), prefixes[LEGACY_PREFIX_F3]); - __m512i prefix_group1_position = _mm512_maskz_set1_epi8(_knot_mask64(prefix_group1_mask), 0x0f); - instruction_length = _mm512_maskz_set1_epi8(prefix_group1_mask, 0x01); - - _mm512_storeu_epi8(prefix_group1_bytes, prefix_group1); - _mm512_storeu_epi8(prefix_group1_positions, prefix_group1_position); - } - - u8 prefix_group2_bytes[64]; - u8 prefix_group2_positions[64]; - { - __mmask64 prefix_group2_mask = _kor_mask64(_kor_mask64(_kor_mask64(prefix_masks[LEGACY_PREFIX_2E], prefix_masks[LEGACY_PREFIX_36]), _kor_mask64(prefix_masks[LEGACY_PREFIX_3E], prefix_masks[LEGACY_PREFIX_26])), _kor_mask64(prefix_masks[LEGACY_PREFIX_64], prefix_masks[LEGACY_PREFIX_65])); - __m512i prefix_group2 = _mm512_or_epi32(_mm512_or_epi32(_mm512_or_epi32(prefixes[LEGACY_PREFIX_2E], prefixes[LEGACY_PREFIX_36]), _mm512_or_epi32(prefixes[LEGACY_PREFIX_3E], prefixes[LEGACY_PREFIX_26])), _mm512_or_epi32(prefixes[LEGACY_PREFIX_64], prefixes[LEGACY_PREFIX_65])); - __m512i prefix_group2_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group2_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group2_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group2_bytes, prefix_group2); - _mm512_storeu_epi8(prefix_group2_positions, prefix_group2_position); - } - - u8 prefix_group3_bytes[64]; - u8 prefix_group3_positions[64]; - { - __mmask64 prefix_group3_mask = prefix_masks[LEGACY_PREFIX_66]; - __m512i prefix_group3 = prefixes[LEGACY_PREFIX_66]; - __m512i prefix_group3_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group3_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group3_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group3_bytes, prefix_group3); - _mm512_storeu_epi8(prefix_group3_positions, prefix_group3_position); - } - - u8 prefix_group4_bytes[64]; - u8 prefix_group4_positions[64]; - { - __mmask64 prefix_group4_mask = prefix_masks[LEGACY_PREFIX_67]; - __m512i prefix_group4 = prefixes[LEGACY_PREFIX_67]; - __m512i prefix_group4_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), prefix_group4_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(prefix_group4_mask, 0x01)); - - _mm512_storeu_epi8(prefix_group4_bytes, prefix_group4); - _mm512_storeu_epi8(prefix_group4_positions, prefix_group4_position); - } - - __m512i rm_register; - { - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(rm_register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(rm_register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - rm_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - } - - __m512i reg_register; - { - __m256i selecting_mask = _mm256_set1_epi8(0x0f); - __m256i low_bits = _mm256_and_si256(reg_register_mask_256, selecting_mask); - __m256i high_bits = _mm256_and_si256(_mm256_srli_epi64(rm_register_mask_256, 4), selecting_mask); - __m256i low_bytes = _mm256_unpacklo_epi8(low_bits, high_bits); - __m256i high_bytes = _mm256_unpackhi_epi8(low_bits, high_bits); - reg_register = _mm512_inserti64x4(_mm512_castsi256_si512(low_bytes), high_bytes, 1); - } - - __mmask64 is_reg_direct_addressing_mode = _knot_mask64(_kor_mask64(is_displacement8, is_displacement32)); - __mmask64 has_base_register = _kor_mask64(_kor_mask64(is_rm_register, is_reg_register), is_implicit_register); - - __m512i rex_b = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(rm_register, _mm512_set1_epi8(0b1000)), 1 << 0); - __m512i rex_x = _mm512_set1_epi8(0); // TODO - __m512i rex_r = _mm512_maskz_set1_epi8(_mm512_test_epi8_mask(reg_register, _mm512_set1_epi8(0b1000)), 1 << 2); - __m512i rex_w = _mm512_maskz_set1_epi8(is_rex_w, 1 << 3); - __m512i rex_byte = _mm512_or_epi32(_mm512_set1_epi32(0x40), _mm512_or_epi32(_mm512_or_epi32(rex_b, rex_x), _mm512_or_epi32(rex_r, rex_w))); - __mmask64 rex_mask = _mm512_test_epi8_mask(rex_byte, _mm512_set1_epi8(0x0f)); - __m512i rex_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), rex_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(rex_mask, 0x01)); - - u8 rex_bytes[64]; - u8 rex_positions[64]; - _mm512_storeu_epi8(rex_bytes, rex_byte); - _mm512_storeu_epi8(rex_positions, rex_position); - - __m128i selecting_mask = _mm_set1_epi8(0x03); - __m128i opcode_length_nibbles_0 = _mm_and_si128(opcode_lengths_128, selecting_mask); - __m128i opcode_length_nibbles_1 = _mm_and_si128(_mm_srli_epi64(opcode_lengths_128, 2 * 1), selecting_mask); - __m128i opcode_length_nibbles_2 = _mm_and_si128(_mm_srli_epi64(opcode_lengths_128, 2 * 2), selecting_mask); - __m128i opcode_length_nibbles_3 = _mm_and_si128(_mm_srli_epi64(opcode_lengths_128, 2 * 3), selecting_mask); - - __m512i opcode_lengths_512 = _mm512_inserti64x4(_mm512_castsi256_si512(_mm256_inserti32x4(_mm256_castsi128_si256(_mm_unpacklo_epi8(opcode_length_nibbles_0, opcode_length_nibbles_1)), _mm_unpackhi_epi8(opcode_length_nibbles_0, opcode_length_nibbles_1), 1)), _mm256_inserti32x4(_mm256_castsi128_si256(_mm_unpacklo_epi8(opcode_length_nibbles_2, opcode_length_nibbles_3)), _mm_unpackhi_epi8(opcode_length_nibbles_2, opcode_length_nibbles_3), 1), 1); - - __mmask64 opcode_is_length_1 = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(1)); - __mmask64 opcode_is_length_2 = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(2)); - __mmask64 opcode_is_length_3 = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(3)); - - __m512i plus_register = _mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)); - - __m512i opcode0 = _mm512_or_epi32(opcode0_pre, _mm512_maskz_mov_epi8(_kand_mask64(is_plus_register, opcode_is_length_1), plus_register)); - __m512i opcode0_position = instruction_length; - instruction_length = _mm512_add_epi8(instruction_length, _mm512_set1_epi8(0x01)); - - u8 opcode0_bytes[64]; - u8 opcode0_positions[64]; - _mm512_storeu_epi8(opcode0_bytes, opcode0); - _mm512_storeu_epi8(opcode0_positions, opcode0_position); - - __m512i opcode1 = _mm512_or_epi32(opcode1_pre, _mm512_maskz_mov_epi8(_kand_mask64(is_plus_register, opcode_is_length_2), plus_register)); - __mmask64 opcode1_mask = _mm512_test_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(0b10)); - __m512i opcode1_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), opcode1_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(opcode1_mask, 0x01)); - - u8 opcode1_bytes[64]; - u8 opcode1_positions[64]; - _mm512_storeu_epi8(opcode1_bytes, opcode1); - _mm512_storeu_epi8(opcode1_positions, opcode1_position); - - __m512i opcode2 = _mm512_or_epi32(opcode2_pre, _mm512_maskz_mov_epi8(_kand_mask64(is_plus_register, opcode_is_length_3), plus_register)); - __mmask64 opcode2_mask = _mm512_cmpeq_epi8_mask(opcode_lengths_512, _mm512_set1_epi8(0b11)); - __m512i opcode2_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), opcode2_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(opcode2_mask, 0x01)); - - u8 opcode2_bytes[64]; - u8 opcode2_positions[64]; - _mm512_storeu_epi8(opcode2_bytes, opcode2); - _mm512_storeu_epi8(opcode2_positions, opcode2_position); - - __mmask64 mod_is_displacement32 = is_displacement32; - __mmask64 mod_is_displacement8 = _kand_mask64(is_displacement8, _kor_mask64(_mm512_test_epi8_mask(displacement8, displacement8), _kand_mask64(is_rm_register, _mm512_cmpeq_epi8_mask(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_set1_epi8(REGISTER_X86_64_BP))))); - - __mmask64 mod_rm_mask = _kor_mask64(_kand_mask64(_kor_mask64(is_rm_register, is_reg_register), _knot_mask64(is_plus_register)), _kor_mask64(is_displacement8, is_displacement32)); - __m512i register_direct_address_mode = _mm512_maskz_set1_epi8(is_reg_direct_addressing_mode, 1); - __m512i mod = _mm512_or_epi32(_mm512_or_epi32(_mm512_slli_epi32(_mm512_maskz_set1_epi8(_kand_mask64(mod_is_displacement32, has_base_register), 1), 1), _mm512_maskz_set1_epi8(mod_is_displacement8, 1)), _mm512_or_epi32(_mm512_slli_epi32(register_direct_address_mode, 1), register_direct_address_mode)); - __m512i rm = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_set1_epi8(0b111)), _mm512_maskz_set1_epi8(_knot_mask64(has_base_register), 0b100)); - __m512i reg = _mm512_or_epi32(_mm512_and_si512(reg_register, _mm512_set1_epi8(0b111)), opcode_extension); - __m512i mod_rm = _mm512_or_epi32(_mm512_or_epi32(rm, _mm512_slli_epi32(reg, 3)), _mm512_slli_epi32(mod, 6)); - __m512i mod_rm_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_rm_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_rm_mask, 0x01)); - - u8 mod_rm_bytes[64]; - u8 mod_rm_positions[64]; - _mm512_storeu_epi8(mod_rm_bytes, mod_rm); - _mm512_storeu_epi8(mod_rm_positions, mod_rm_position); - - __mmask64 sib_mask = _kand_mask64(_mm512_cmpneq_epi8_mask(mod, _mm512_set1_epi8(0b11)), _mm512_cmpeq_epi8_mask(rm, _mm512_set1_epi8(0b100))); - __m512i sib_scale = _mm512_set1_epi8(0); - __m512i sib_index = _mm512_maskz_set1_epi8(sib_mask, 0b100 << 3); - __m512i sib_base = _mm512_or_epi32(_mm512_and_si512(rm_register, _mm512_maskz_set1_epi8(is_rm_register, 0b111)), _mm512_maskz_set1_epi8(_knot_mask64(is_rm_register), 0b101)); - __m512i sib = _mm512_or_epi32(_mm512_or_epi32(sib_index, sib_base), sib_scale); - __m512i sib_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), sib_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(sib_mask, 0x01)); - - u8 sib_bytes[64]; - u8 sib_positions[64]; - _mm512_storeu_epi8(sib_bytes, sib); - _mm512_storeu_epi8(sib_positions, sib_position); - - __m512i displacement8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement8, sizeof(s8))); - u8 displacement8_positions[64]; - _mm512_storeu_epi8(displacement8_positions, displacement8_position); - - __m512i displacement32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), mod_is_displacement32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(mod_is_displacement32, sizeof(s32))); - u8 displacement32_positions[64]; - _mm512_storeu_epi8(displacement32_positions, displacement32_position); - - __m512i relative8_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative8, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative8, sizeof(s8))); - u8 relative8_positions[64]; - _mm512_storeu_epi8(relative8_positions, relative8_position); - - __m512i relative32_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), is_relative32, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(is_relative32, sizeof(s32))); - u8 relative32_positions[64]; - _mm512_storeu_epi8(relative32_positions, relative32_position); - - u8 immediate_positions[array_length(is_immediate)][64]; - for (u8 i = 0; i < array_length(immediate_positions); i += 1) - { - __mmask64 immediate_mask = is_immediate[i]; - __m512i immediate_position = _mm512_mask_mov_epi8(_mm512_set1_epi8(0x0f), immediate_mask, instruction_length); - instruction_length = _mm512_add_epi8(instruction_length, _mm512_maskz_set1_epi8(immediate_mask, 1 << i)); - _mm512_storeu_epi8(immediate_positions[i], immediate_position); - } - - u8 separate_buffers[64][max_instruction_byte_count]; - u8 separate_lengths[64]; - _mm512_storeu_epi8(separate_lengths, instruction_length); - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - separate_buffers[i][prefix_group1_positions[i]] = prefix_group1_bytes[i]; - separate_buffers[i][prefix_group2_positions[i]] = prefix_group2_bytes[i]; - separate_buffers[i][prefix_group3_positions[i]] = prefix_group3_bytes[i]; - separate_buffers[i][prefix_group4_positions[i]] = prefix_group4_bytes[i]; - - separate_buffers[i][rex_positions[i]] = rex_bytes[i]; - - separate_buffers[i][opcode0_positions[i]] = opcode0_bytes[i]; - separate_buffers[i][opcode1_positions[i]] = opcode1_bytes[i]; - separate_buffers[i][opcode2_positions[i]] = opcode2_bytes[i]; - - separate_buffers[i][mod_rm_positions[i]] = mod_rm_bytes[i]; - - separate_buffers[i][sib_positions[i]] = sib_bytes[i]; - - for (u8 immediate_position_index = 0; immediate_position_index < array_length(immediate_positions); immediate_position_index += 1) - { - u8 start_position = immediate_positions[immediate_position_index][i]; - for (u32 byte = 0; byte < 1 << immediate_position_index; byte += 1) - { - u8 destination_index = start_position + byte * (start_position != 0xf); - separate_buffers[i][destination_index] = immediate[byte][i]; - } - } - - separate_buffers[i][displacement8_positions[i]] = displacement[0][i]; - - u8 displacement32_start = displacement32_positions[i]; - for (u8 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = displacement32_start + byte * (displacement32_start != 0xf); - separate_buffers[i][destination_index] = displacement[byte][i]; - } - - separate_buffers[i][relative8_positions[i]] = relative[0][i]; - - u8 relative32_start = relative32_positions[i]; - for (u8 byte = 0; byte < 4; byte += 1) - { - u8 destination_index = relative32_start + byte * (relative32_start != 0xf); - separate_buffers[i][destination_index] = relative[byte][i]; - } - } - - for (u32 i = 0; i < array_length(separate_lengths); i += 1) - { - let(separate_length, separate_lengths[i]); - - if (separate_length == 0) unreachable(); - if (separate_length > 15) unreachable(); - - memcpy(destination, &separate_buffers[i], separate_length); - destination += separate_length; - } -#else - unused(destination); -#endif - } - - String result = {}; - return result; -} - -fn String assemble_file(Arena* arena, String path) -{ - String assembly_file = file_read(arena, path); - String result = assemble(assembly_file); - return result; -} - -int main(int argc, char** argv, char** envp) -{ - unused(argc); - unused(argv); - - environment_pointer = envp; - Arena* arena = arena_initialize_default(MB(2)); - assemble_file(arena, strlit("large_assembly.s")); - - int result = 0; - - if (BB_CI) - { - TestDataset dataset = construct_test_cases(); - EncodingTestOptions options = { - .scalar = 1, - .wide = 1, - }; - result = encoding_test_instruction_batches(arena, dataset, options); - } - - return result; -} diff --git a/bootstrap/bloat-buster/bb_core.c b/bootstrap/bloat-buster/bb_core.c deleted file mode 100644 index ddc00f9..0000000 --- a/bootstrap/bloat-buster/bb_core.c +++ /dev/null @@ -1,276 +0,0 @@ -#if BB_CI == 0 -#include - -#include -#include -#include -#include -#include -#include -#include - -#define default_font_height (24) -auto proportional_font_height = default_font_height; -auto monospace_font_height = default_font_height; - -fn TextureIndex white_texture_create(Arena* arena, Renderer* renderer) -{ - u32 white_texture_width = 1024; - u32 white_texture_height = white_texture_width; - auto* white_texture_buffer = arena_allocate(arena, u32, white_texture_width * white_texture_height); - memset(white_texture_buffer, 0xff, white_texture_width * white_texture_height * sizeof(u32)); - - auto white_texture = renderer_texture_create(renderer, (TextureMemory) { - .pointer = white_texture_buffer, - .width = white_texture_width, - .height = white_texture_height, - .depth = 1, - .format = TEXTURE_FORMAT_R8G8B8A8_SRGB, - }); - - return white_texture; -} - -STRUCT(BBPanel) -{ - BBPanel* first; - BBPanel* last; - BBPanel* next; - BBPanel* previous; - BBPanel* parent; - f32 parent_percentage; - Axis2 split_axis; -}; - -STRUCT(BBWindow) -{ - OSWindow os; - RenderWindow* render; - BBWindow* previous; - BBWindow* next; - BBPanel* root_panel; - UI_State* ui; -}; - -STRUCT(BBGUIState) -{ - Arena* arena; - Timestamp last_frame_timestamp; - BBWindow* first_window; - BBWindow* last_window; - Renderer* renderer; - // TODO: should this not be thread local? - OSEventQueue event_queue; -}; -global_variable BBGUIState state; - -fn void ui_top_bar() -{ - ui_push(pref_height, ui_em(1, 1)); - { - ui_push(child_layout_axis, AXIS2_X); - auto* top_bar = ui_widget_make((UI_WidgetFlags) { - }, strlit("top_bar")); - ui_push(parent, top_bar); - { - ui_button(strlit("Button 1")); - ui_button(strlit("Button 2")); - ui_button(strlit("Button 3")); - } - ui_pop(parent); - ui_pop(child_layout_axis); - } - ui_pop(pref_height); -} - -STRUCT(UI_Node) -{ - String name; - String type; - String value; - String namespace; - String function; -}; - -fn void ui_node(UI_Node node) -{ - auto* node_widget = ui_widget_make_format((UI_WidgetFlags) { - .draw_background = 1, - .draw_text = 1, - }, "{s} : {s} = {s}##{s}{s}", node.name, node.type, node.value, node.function, node.namespace); -} - -fn void app_update() -{ - auto frame_end = os_timestamp(); - os_poll_events(&state.event_queue); - auto frame_ms = os_resolve_timestamps(state.last_frame_timestamp, frame_end, TIME_UNIT_MILLISECONDS); - state.last_frame_timestamp = frame_end; - - Renderer* renderer = state.renderer; - - BBWindow* window = state.first_window; - while (likely(window)) - { - auto* previous = window->previous; - auto* next = window->next; - - auto* render_window = window->render; - renderer_window_frame_begin(renderer, render_window); - - ui_state_select(window->ui); - - if (likely(ui_build_begin(window->os, frame_ms, &state.event_queue))) - { - ui_push(font_size, default_font_height); - - ui_top_bar(); - ui_push(child_layout_axis, AXIS2_X); - auto* workspace_widget = ui_widget_make_format((UI_WidgetFlags) {}, "workspace{u64}", window->os); - ui_push(parent, workspace_widget); - { - // Node visualizer - ui_push(child_layout_axis, AXIS2_Y); - auto* node_visualizer_widget = ui_widget_make_format((UI_WidgetFlags) { - .draw_background = 1, - }, "node_visualizer{u64}", window->os); - - ui_push(parent, node_visualizer_widget); - { - ui_node((UI_Node) { - .name = strlit("a"), - .type = strlit("s32"), - .value = strlit("1"), - .namespace = strlit("foo"), - .function = strlit("main"), - }); - ui_node((UI_Node) { - .name = strlit("b"), - .type = strlit("s32"), - .value = strlit("2"), - .namespace = strlit("foo"), - .function = strlit("main"), - }); - } - ui_pop(parent); - ui_pop(child_layout_axis); - - // Side-panel stub - ui_button(strlit("Options")); - } - ui_pop(parent); - ui_pop(child_layout_axis); - - ui_build_end(); - - ui_draw(); - - ui_pop(font_size); - - renderer_window_frame_end(renderer, render_window); - } - else - { - if (previous) - { - previous->next = next; - } - - if (next) - { - next->previous = previous; - } - - if (state.first_window == window) - { - state.first_window = next; - } - - if (state.last_window == window) - { - state.last_window = previous; - } - } - - window = next; - } -} - -fn void window_refresh_callback(OSWindow window, void* context) -{ - unused(window); - unused(context); - app_update(); -} - -void run_app() -{ - state.arena = arena_init(MB(512), MB(2), MB(2)); - - os_windowing_init((OSWindowingInitializationOptions) { -#ifdef __linux__ - .should_use_x11 = 1, -#else - .should_use_x11 = 0, -#endif - }); - state.renderer = renderer_initialize(state.arena); - - state.first_window = state.last_window = arena_allocate(state.arena, BBWindow, 1); - state.first_window->os = os_window_create((OSWindowCreate) { - .name = strlit("Bloat Buster"), - .size = { - .width = 1600, - .height= 900, - }, - .refresh_callback = &window_refresh_callback, - }); - - if (!state.first_window->os) - { - failed_execution(); - } - - state.first_window->render = renderer_window_initialize(state.renderer, state.first_window->os); - state.first_window->ui = ui_state_allocate(state.renderer, state.first_window->render); - state.first_window->root_panel = arena_allocate(state.arena, BBPanel, 1); - state.first_window->root_panel->parent_percentage = 1.0f; - state.first_window->root_panel->split_axis = AXIS2_X; - - auto font_path = -#ifdef _WIN32 - strlit("C:/Users/David/Downloads/Fira_Sans/FiraSans-Regular.ttf"); -#elif defined(__linux__) - strlit("/usr/share/fonts/TTF/FiraSans-Regular.ttf"); -#elif defined(__APPLE__) -strlit("/Users/david/Library/Fonts/FiraSans-Regular.ttf"); -#else - strlit("WRONG_PATH"); -#endif - - window_rect_texture_update_begin(state.first_window->render); - - auto white_texture = white_texture_create(state.arena, state.renderer); - auto monospace_font = font_texture_atlas_create(state.arena, state.renderer, (TextureAtlasCreate) { - .font_path = font_path, - .text_height = monospace_font_height, - }); - auto proportional_font = monospace_font; - - window_queue_rect_texture_update(state.first_window->render, RECT_TEXTURE_SLOT_WHITE, white_texture); - renderer_queue_font_update(state.renderer, state.first_window->render, RENDER_FONT_TYPE_MONOSPACE, monospace_font); - renderer_queue_font_update(state.renderer, state.first_window->render, RENDER_FONT_TYPE_PROPORTIONAL, proportional_font); - - window_rect_texture_update_end(state.renderer, state.first_window->render); - - state.last_frame_timestamp = os_timestamp(); - - while (state.first_window) - { - app_update(); - } - - // TODO: deinitialization -} - -#endif diff --git a/bootstrap/bloat-buster/bb_core.h b/bootstrap/bloat-buster/bb_core.h deleted file mode 100644 index f24381e..0000000 --- a/bootstrap/bloat-buster/bb_core.h +++ /dev/null @@ -1,7 +0,0 @@ -#if BB_CI == 0 -#include -#include - -EXPORT void run_app(); - -#endif diff --git a/bootstrap/bloat-buster/data/instructions.dat b/bootstrap/bloat-buster/data/instructions.dat deleted file mode 100644 index cee89a1..0000000 --- a/bootstrap/bloat-buster/data/instructions.dat +++ /dev/null @@ -1,281 +0,0 @@ -adc: class base_arithmetic(/2, 15, 11, 13) -adcx: class unsigned_add_flag(66) -add: class base_arithmetic(/0, 05, 01, 03) -adox: class unsigned_add_flag(f3) -and: class base_arithmetic(/4, 25, 21, 23) -bsf: - r16, rm16 [rm: rex.r 0f bc /r] - r32, rm32 [rm: 0f bc /r] - r64, rm64 [rm: rex.w 0f bc /r] -bsr: - r16, rm16 [rm: rex.r 0f bd /r] - r32, rm32 [rm: 0f bd /r] - r64, rm64 [rm: rex.w 0f bd /r] -bswap: - r32 [o: 0f c8+r] - r64 [o: rex.w 0f c8+r] -bt: class bittest(/4, a3) -btc: class bittest(/7, bb) -btr: class bittest(/6, b3) -bts: class bittest(/5, ab) -call: - rel [d: e8 rel32] - rm64 [m: ff /2] -cbw: [zo: rex.r 98] -cwde: [zo: 98] -cwqe: [zo: rex.w 98] -clc: [zo: f8] -cld: [zo: fd] -clflush: m8 [m: 0f ae /7] -clflushopt: m8 [m: 66 0f ae /7] -cli: [zo: fa] -clts: [zo: 0f 06] -cmc: [zo: f5] -cmovcc: class cmov -cmp: class base_arithmetic(/7, 3d, 39, 3b) -cmpsb: [zo: a6] -cmpsw: [zo: a7] -cmpsd: [zo: a7] -cmpsq: [zo: a7] -cmpxchg: - rm8, r8 [mr: 0f b0] - rm16, r16 [mr: 0f b1] - rm32, r32 [mr: 0f b1] - rm64, r64 [mr: 0f b1] -cmpxchg8b: m64 [m: 0f c7 /1] -cmpxchg16b: m64 [m: rex.w 0f c7 /1] -cpuid: [zo: 0f a2] -crc32: - r32, rm8 [rm: f2 0f 38 f0] - r32, rm16 [rm: 66 f2 0f 38 f1] - r32, rm32 [rm: f2 0f 38 f1] - r64, rm8 [rm: f2 rex.w 0f 38 f0] - r64, rm64 [rm: f2 rex.w 0f 38 f1] -dec: - rm8 [m: fe /1] - rm16 [m: fe /1] - rm32 [m: fe /1] - rm64 [m: fe /1] -div: - rm8 [m: f6 /6] - rm16 [m: f7 /6] - rm32 [m: f7 /6] - rm64 [m: f7 /6] -hlt: [zo: f4] -idiv: - rm8 [m: f6 /7] - rm16 [m: f7 /7] - rm32 [m: f7 /7] - rm64 [m: f7 /7] -imul: - rm8 [m: f6 /5] - rm16 [m: f7 /5] - rm32 [m: f7 /5] - rm64 [m: f7 /5] - r16, rm16 [rm: 0f af] - r32, rm32 [rm: 0f af] - r64, rm64 [rm: 0f af] - r16, rm16, imm [rmi: 6b ib] - r32, rm32, imm [rmi: 6b ib] - r64, rm64, imm [rmi: 6b ib] - r16, rm16, imm16 [rmi: 69 iw] - r32, rm32, imm32 [rmi: 69 id] - r64, rm64, imm32 [rmi: 69 id] -in: - al, imm8 [-i: e4 ib] - ax, imm8 [-i: e5 ib] - eax, imm8 [-i: e5 ib] - al, dx [--: ec] - ax, dx [--: ed] - eax, dx [--: ed] -inc: - rm8 [m: fe /0] - rm16 [m: fe /0] - rm32 [m: fe /0] - rm64 [m: fe /0] -insb: [zo: 6c] -insw: [zo: 6d] -insd: [zo: 6d] -int: imm [i: cd ib] -int3: [zo: cc] -invd: [zo: 0f 08] -invlpg: m8 [m: 0f 01 /7] -iret: [zo: 66 cf] -iretd: [zo: cf] -iretq: [zo: rex.w cf] -jmp: - rel [d: eb rel8] - rel [d: e9 rel32] - rm64 [m: ff /4] -jcc: class jcc -jrcxz: rel [d: e3 rel8] -lahf: [zo: 9f] -lea: - r16, m16 [rm: 8d /r] - r32, m32 [rm: 8d /r] - r64, m64 [rm: 8d /r] -lodsb: [zo: ac] -lodsw: [zo: ad] -lodsd: [zo: ad] -lodsq: [zo: ad] -loop: rel [d: e2 rel8] -loope: rel [d: e1 rel8] -loopne: rel [d: e0 rel8] -monitor: [zo: 0f 01 c8] -mov: - rm8, r8 [mr: 88 /r] - rm16, r16 [mr: 89 /r] - rm32, r32 [mr: 89 /r] - rm64, r64 [mr: 89 /r] - r8, rm8 [rm: 8a /r] - r16, rm16 [rm: 8b /r] - r32, rm32 [rm: 8b /r] - r64, rm64 [rm: 8b /r] - r8, imm [ri: b0+r ib] - r16, imm [ri: b8+r iw] - r32, imm [ri: b8+r id] - r64, imm [ri: b8+r iq] - r8, imm [ri: c6 /0 ib] - r16, imm [ri: c7 /0 iw] - r32, imm [ri: c7 /0 id] - r64, imm [ri: c7 /0 id] -movsb: [zo: a4] -movsw: [zo: a5] -movsd: [zo: a5] -movsq: [zo: a5] -movsx: - r16, rm8 [rm: 0f be /r] - r32, rm8 [rm: 0f be /r] - r64, rm8 [rm: 0f be /r] - r32, rm16 [rm: 0f bf /r] - r64, rm16 [rm: 0f bf /r] -movsxd: r64, rm32 [rm: rex.w 63 /r] -movzx: - r16, rm8 [rm: 0f b6 /r] - r32, rm8 [rm: 0f b6 /r] - r64, rm8 [rm: 0f b6 /r] - r32, rm16 [rm: 0f b7 /r] - r64, rm16 [rm: 0f b7 /r] -mul: - rm8 [m: f6 /4] - rm16 [m: f7 /4] - rm32 [m: f7 /4] - rm64 [m: f7 /4] -mwait: [zo: 0f 01 c9] -neg: - rm8 [m: f6 /3] - rm16 [m: f7 /3] - rm32 [m: f7 /3] - rm64 [m: f7 /3] -nop: - [zo: 90] - rm16 [m: 0f 1f /0] - rm32 [m: 0f 1f /0] -not: - rm8 [m: f6 /2] - rm16 [m: f7 /2] - rm32 [m: f7 /2] - rm64 [m: f7 /2] -or: class base_arithmetic(/1, 0d, 09, 0b) -out: - imm, al [i-: e6 ib] - imm, ax [i-: e7 ib] - imm, ax [i-: e7 ib] -pause: [zo: f3 90] -pop: - rm16 [m: 8f /0] - rm64 [m: 8f /0] - r16 [o: 58+r] - r64 [o: 58+r] -popcnt: - r16, rm16 [rm: f3 0f b8 /r] - r32, rm32 [rm: f3 0f b8 /r] - r64, rm64 [rm: f3 0f b8 /r] -popf: [zo: 66 9d] -popfq: [zo: 9d] -prefetcht0: m8 [m: 0f 18 /1] -prefetcht1: m8 [m: 0f 18 /2] -prefetcht2: m8 [m: 0f 18 /3] -prefetchnta: m8 [m: 0f 18 /0] -push: - rm16 [m: ff /6] - rm64 [m: ff /6] - r16 [o: 50+r] - r64 [o: 50+r] - imm [i: 6a ib] - imm [i: 68 iw] - imm [i: 68 id] -pushf: [zo: 66 9c] -pushfq: [zo: 9c] -rol: class rotate(/0) -ror: class rotate(/1) -rcl: class rotate(/2) -rcr: class rotate(/3) -rdmsr: [zo: 0f 32] -rdpmc: [zo: 0f 33] -rdtsc: [zo: 0f 31] -rdtscp: [zo: 0f 01 f9] -ret: - [zo: c3] - imm [i: c2 iw] -retf: - [zo: cb] - imm [i: ca iw] -rsm: [zo: 0f aa] -sal: class shift(/4) -sar: class shift(/7) -shl: class shift(/4) -shr: class shift(/5) -scasb: [zo: ae] -scasw: [zo: af] -scasd: [zo: af] -scasq: [zo: af] -setcc: class setcc -stc: [zo: f9] -std: [zo: fd] -sti: [zo: fb] -stosb: [zo: aa] -stosw: [zo: ab] -stosd: [zo: ab] -stosq: [zo: ab] -sub: class base_arithmetic(/5, 2d, 29, 2b) -syscall: [zo: 0f 05] -sysenter: [zo: 0f 34] -sysexit: [zo: 0f 35] -sysret: [zo: 0f 07] -test: - al, imm8 [-i: a8 ib] - ax, imm16 [-i: a9 iw] - eax, imm32 [-i: a9 id] - rax, imm32 [-i: a9 id] - rm8, imm8 [mi: f6 /0 ib] - rm16, imm8 [mi: f7 /0 ib] - rm32, imm8 [mi: f7 /0 ib] - rm64, imm8 [mi: f7 /0 ib] - rm8, r8 [mr: 84 /r] - rm16, r16 [mr: 85 /r] - rm32, r32 [mr: 85 /r] - rm64, r64 [mr: 85 /r] -ud0: r32, rm32 [rm: 0f ff /r] -ud1: r32, rm32 [rm: 0f ff /r] -ud2: [zo: 0f 0b] -xadd: - rm8, r8 [mr: 0f c0 /r] - rm16, r16 [mr: 0f c1 /r] - rm32, r32 [mr: 0f c1 /r] - rm64, r64 [mr: 0f c1 /r] -xchg: - ax, r16 [-o: 90+r] - r16, ax [o-: 90+r] - eax, r32 [-o: 90+r] - r32, eax [o-: 90+r] - rax, r64 [-o: 90+r] - r64, rax [o-: 90+r] - rm8, r8 [mr: 86 /r] - r8, rm8 [rm: 86 /r] - rm16, r16 [mr: 87 /r] - r16, rm16 [rm: 87 /r] - rm32, r32 [mr: 87 /r] - r32, rm32 [rm: 87 /r] - rm64, r64 [mr: 87 /r] - r64, rm64 [rm: 87 /r] diff --git a/bootstrap/bloat-buster/data/x86_mnemonic.dat b/bootstrap/bloat-buster/data/x86_mnemonic.dat deleted file mode 100644 index 7e665e9..0000000 --- a/bootstrap/bloat-buster/data/x86_mnemonic.dat +++ /dev/null @@ -1,226 +0,0 @@ -adc -adcx -add -adox -and -bsf -bsr -bswap -bt -btc -btr -bts -call -cbw -cwde -cdqe -cwd -cdq -cqo -clc -cld -clflush -clflushopt -cli -clts -cmc -cmova -cmovae -cmovb -cmovbe -cmovc -cmove -cmovg -cmovge -cmovl -cmovle -cmovna -cmovnae -cmovnb -cmovnbe -cmovnc -cmovne -cmovng -cmovnge -cmovnl -cmovnle -cmovno -cmovnp -cmovns -cmovnz -cmovo -cmovp -cmovpe -cmovpo -cmovs -cmovz -cmp -cmpsb -cmpsw -cmpsd -cmpsq -cmpxchg -cmpxchg8b -cmpxchg16b -cpuid -crc32 -dec -div -hlt -idiv -imul -in -inc -insb -insw -insd -int -int3 -invd -invlpg -iret -iretd -iretq -jmp -ja -jae -jb -jbe -jc -je -jg -jge -jl -jle -jna -jnae -jnb -jnbe -jnc -jne -jng -jnge -jnl -jnle -jno -jnp -jns -jnz -jo -jp -jpe -jpo -js -jz -jrcxz -lahf -lea -lodsb -lodsw -lodsd -lodsq -loop -loope -loopne -monitor -mov -movsb -movsw -movsd -movsq -movsx -movsxd -movzx -mul -mwait -neg -nop -not -or -out -outsb -outsw -outsd -pause -pop -popcnt -popf -popfq -prefetcht0 -prefetcht1 -prefetcht2 -prefetchnta -push -pushf -pushfq -rcl -rcr -rol -ror -rdmsr -rdpmc -rdtsc -rdtscp -ret -retf -rsm -sal -sar -shl -shr -sbb -scasb -scasw -scasd -scasq -seta -setae -setb -setbe -setc -sete -setg -setge -setl -setle -setna -setnae -setnb -setnbe -setnc -setne -setng -setnge -setnl -setnle -setno -setnp -setns -setnz -seto -setp -setpe -setpo -sets -setz -stc -std -sti -stosb -stosw -stosd -stosq -sub -syscall -sysenter -sysexit -sysret -test -ud0 -ud1 -ud2 -wbinvd -wrmsr -xadd -xchg -xor diff --git a/bootstrap/bloat-buster/lld_api.cpp b/bootstrap/bloat-buster/lld_api.cpp deleted file mode 100644 index 964da71..0000000 --- a/bootstrap/bloat-buster/lld_api.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include - -#include -#include -#include -#include - -#define lld_api_function_signature(name) bool name(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput) - -#define lld_link_decl(link_name) \ -namespace link_name \ -{\ - lld_api_function_signature(link);\ -} - -typedef lld_api_function_signature(LinkerFunction); - -namespace lld -{ - lld_link_decl(coff); - lld_link_decl(elf); - lld_link_decl(mingw); - lld_link_decl(macho); - lld_link_decl(wasm); -} - -fn u8 lld_api_generic(LLDArguments args, LinkerFunction linker_function) -{ - auto arguments = llvm::ArrayRef(args.argument_pointer, args.argument_count); - std::string stdout_string; - llvm::raw_string_ostream stdout_stream(stdout_string); - - std::string stderr_string; - llvm::raw_string_ostream stderr_stream(stderr_string); - u8 result = linker_function(arguments, stdout_stream, stderr_stream, args.exit_early, args.disable_output); - // assert(result == (stdout_string.length() == 0)); - // assert(result == (stderr_string.length() == 0)); - - print_string(String{(u8*)stdout_string.data(), stdout_string.length()}); - print_string(String{(u8*)stderr_string.data(), stderr_string.length()}); - - return result; -} - -#define lld_api_function_impl(link_name) \ -lld_api_function_decl(link_name)\ -{\ - return lld_api_generic(args, lld::link_name::link);\ -} - -lld_api_function_impl(coff) -lld_api_function_impl(elf) -lld_api_function_impl(mingw) -lld_api_function_impl(macho) -lld_api_function_impl(wasm) diff --git a/bootstrap/bloat-buster/lld_api.h b/bootstrap/bloat-buster/lld_api.h deleted file mode 100644 index b27f791..0000000 --- a/bootstrap/bloat-buster/lld_api.h +++ /dev/null @@ -1,17 +0,0 @@ -#include - -STRUCT(LLDArguments) -{ - const char** argument_pointer; - u32 argument_count; - u8 exit_early; - u8 disable_output; -}; - -#define lld_api_function_decl(link_name) u8 lld_ ## link_name ## _link(LLDArguments args) - -EXPORT lld_api_function_decl(coff); -EXPORT lld_api_function_decl(elf); -EXPORT lld_api_function_decl(mingw); -EXPORT lld_api_function_decl(macho); -EXPORT lld_api_function_decl(coff); diff --git a/bootstrap/bloat-buster/lld_driver.c b/bootstrap/bloat-buster/lld_driver.c deleted file mode 100644 index 260e374..0000000 --- a/bootstrap/bloat-buster/lld_driver.c +++ /dev/null @@ -1,244 +0,0 @@ -#include -#include -#include - -fn String linux_crt_find_path() -{ - auto flags = (OSFileOpenFlags) { - .read = 1, - }; - auto permissions = (OSFilePermissions) { - .readable = 1, - .writable = 1, - }; - if (os_file_descriptor_is_valid(os_file_open(strlit("/usr/lib/crti.o"), flags, permissions))) - { - return strlit("/usr/lib"); - } - - if (os_file_descriptor_is_valid(os_file_open(strlit("/usr/lib/x86_64-linux-gnu/crti.o"), flags, permissions))) - { - return strlit("/usr/lib/x86_64-linux-gnu"); - } - - if (os_file_descriptor_is_valid(os_file_open(strlit("/usr/lib/aarch64-linux-gnu/crti.o"), flags, permissions))) - { - return strlit("/usr/lib/aarch64-linux-gnu"); - } - - todo(); -} - -fn String windows_msvc_find_path() -{ - auto flags = (OSFileOpenFlags) { - .read = 1, - .directory = 1, - }; - auto permissions = (OSFilePermissions) { - .readable = 1, - }; - String possibilities[] = { - strlit("C:/Program Files/Microsoft Visual Studio/2022/Enterprise"), - strlit("C:/Program Files/Microsoft Visual Studio/2022/Community"), - }; - for (u64 i = 0; i < array_length(possibilities); i += 1) - { - auto possibility = possibilities[i]; - auto fd = os_file_open(possibility, flags, permissions); - - if (os_file_descriptor_is_valid(fd)) - { - return possibility; - } - } - - failed_execution(); -} - -fn void linux_add_crt_item(Arena* arena, VirtualBufferP(char)* args, String crt_path, String item) -{ - String parts[] = { - crt_path, - strlit("/"), - item, - }; - *vb_add(args, 1) = string_to_c(arena_join_string(arena, (Slice(String))array_to_slice(parts))); -} - -SliceP(char) lld_driver(Arena* arena, LinkerArguments arguments) -{ - VirtualBufferP(char) args = {}; - - char* driver; - switch (arguments.target.os) - { - case OPERATING_SYSTEM_LINUX: - driver = "ld.lld"; - break; - case OPERATING_SYSTEM_MAC: - driver = "ld64.lld"; - break; - case OPERATING_SYSTEM_WINDOWS: - driver = "lld-link"; - break; - } - *vb_add(&args, 1) = driver; - - if (arguments.target.os != OPERATING_SYSTEM_WINDOWS) - { - *vb_add(&args, 1) = "--error-limit=0"; - } - - switch (arguments.target.os) - { - case OPERATING_SYSTEM_WINDOWS: - { - String parts[] = { - strlit("-out:"), - arguments.out_path, - }; - auto arg = arena_join_string(arena, (Slice(String))array_to_slice(parts)); - *vb_add(&args, 1) = string_to_c(arg); - } break; - default: - { - *vb_add(&args, 1) = "-o"; - *vb_add(&args, 1) = string_to_c(arguments.out_path); - } break; - } - - if (arguments.target.os != OPERATING_SYSTEM_WINDOWS) - { - for (u64 i = 0; i < arguments.objects.length; i += 1) - { - *vb_add(&args, 1) = string_to_c(arguments.objects.pointer[i]); - } - } - - switch (arguments.target.os) - { - case OPERATING_SYSTEM_LINUX: - { - if (arguments.link_libcpp && !arguments.link_libc) - { - failed_execution(); - } - - if (arguments.link_libc) - { - auto crt_path = linux_crt_find_path(); - - *vb_add(&args, 1) = "-dynamic-linker"; - - String dynamic_linker_filename; - switch (arguments.target.cpu) - { - case CPU_ARCH_X86_64: - dynamic_linker_filename = strlit("ld-linux-x86-64.so.2"); - break; - case CPU_ARCH_AARCH64: - dynamic_linker_filename = strlit("ld-linux-aarch64.so.1"); - break; - } - - linux_add_crt_item(arena, &args, crt_path, dynamic_linker_filename); - linux_add_crt_item(arena, &args, crt_path, strlit("crt1.o")); - - *vb_add(&args, 1) = "-L"; - *vb_add(&args, 1) = string_to_c(crt_path); - - - *vb_add(&args, 1) = "--as-needed"; - *vb_add(&args, 1) = "-lm"; - *vb_add(&args, 1) = "-lpthread"; - *vb_add(&args, 1) = "-lc"; - *vb_add(&args, 1) = "-ldl"; - *vb_add(&args, 1) = "-lrt"; - *vb_add(&args, 1) = "-lutil"; - - linux_add_crt_item(arena, &args, crt_path, strlit("crtn.o")); - - if (arguments.link_libcpp) - { - // TODO: implement better path finding - linux_add_crt_item(arena, &args, crt_path, strlit("libstdc++.so.6")); - } - } - - for (u64 i = 0; i < arguments.libraries.length; i += 1) - { - auto library = arguments.libraries.pointer[i]; - String library_pieces[] = { - strlit("-l"), - library, - }; - auto library_argument = arena_join_string(arena, (Slice(String))array_to_slice(library_pieces)); - *vb_add(&args, 1) = string_to_c(library_argument); - } - } break; - case OPERATING_SYSTEM_MAC: - { - *vb_add(&args, 1) = "-dynamic"; - *vb_add(&args, 1) = "-platform_version"; - *vb_add(&args, 1) = "macos"; - *vb_add(&args, 1) = "15.0.0"; - *vb_add(&args, 1) = "15.0.0"; - *vb_add(&args, 1) = "-arch"; - *vb_add(&args, 1) = "arm64"; - *vb_add(&args, 1) = "-syslibroot"; - *vb_add(&args, 1) = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"; - - if (string_ends_with(arguments.out_path, strlit(".dylib"))) - { - *vb_add(&args, 1) = "-e"; - *vb_add(&args, 1) = "_main"; - } - - *vb_add(&args, 1) = "-lSystem"; - - if (arguments.link_libcpp) - { - *vb_add(&args, 1) = "-lc++"; - } - } break; - case OPERATING_SYSTEM_WINDOWS: - { - if (arguments.link_libcpp && !arguments.link_libc) - { - failed_execution(); - } - - auto msvc_path = windows_msvc_find_path(); - - if (arguments.link_libc) - { - *vb_add(&args, 1) = "-defaultlib:libcmt"; - - { - // String parts[] = { - // strlit("-libpath:"), - // msvc_path, - // strlit("/"), - // strlit("VC/Tools/MSVC/14.41.34120/lib/x64"), - // }; - // auto arg = arena_join_string(arena, (Slice(String)) array_to_slice(parts)); - } - - if (arguments.link_libcpp) - { - todo(); - } - - for (u64 i = 0; i < arguments.objects.length; i += 1) - { - *vb_add(&args, 1) = string_to_c(arguments.objects.pointer[i]); - } - } - // clang -v main.c - // "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\Hostx64\\x64\\link.exe" -out:a.exe -defaultlib:libcmt -defaultlib:oldnames "-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\lib\\x64" "-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\atlmfc\\lib\\x64" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\ucrt\\x64" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\um\\x64" "-libpath:C:\\Users\\David\\scoop\\apps\\llvm\\19.1.3\\lib\\clang\\19\\lib\\windows" -nologo "C:\\Users\\David\\AppData\\Local\\Temp\\main-706820.o" - } break; - } - - return (SliceP(char)){ .pointer = args.pointer, .length = args.length }; -} diff --git a/bootstrap/bloat-buster/lld_driver.h b/bootstrap/bloat-buster/lld_driver.h deleted file mode 100644 index f23c7ec..0000000 --- a/bootstrap/bloat-buster/lld_driver.h +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include - -EXPORT SliceP(char) lld_driver(Arena* arena, LinkerArguments arguments); diff --git a/bootstrap/bloat-buster/llvm.cpp b/bootstrap/bloat-buster/llvm.cpp deleted file mode 100644 index 6fabeff..0000000 --- a/bootstrap/bloat-buster/llvm.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#define unreachable() __builtin_unreachable() -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include - -#define string_ref(lit) StringRef(lit, strlit_len(lit)) - -namespace llvm -{ -#define llvm_initialize_macro(target) \ - LLVMInitialize ## target ## Target();\ - LLVMInitialize ## target ## TargetInfo();\ - LLVMInitialize ## target ## TargetMC();\ - LLVMInitialize ## target ## AsmParser();\ - LLVMInitialize ## target ## AsmPrinter() - - fn void target_initialize(CpuArchitecture architecture) - { - // These are meant to be called globally, so if this code is ever threaded, we need to call this code only once - switch (architecture) - { - case CPU_ARCH_X86_64: - { - llvm_initialize_macro(X86); - } break; - case CPU_ARCH_AARCH64: - { - llvm_initialize_macro(AArch64); - } break; - } - } - - EXPORT void llvm_codegen(CodegenOptions options, String object_path) - { - target_initialize(options.target.cpu); - - auto context = LLVMContext(); - auto module = Module(string_ref("first"), context); - std::string error_message; - - // TODO: debug builder - // TODO: attributes - - { - u32 return_bit_count = 32; - auto* return_type = IntegerType::get(context, return_bit_count); - ArrayRef parameter_types = {}; - u8 is_var_args = 0; - auto* function_type = FunctionType::get(return_type, parameter_types, is_var_args); - auto function_name = string_ref("main"); - auto linkage = GlobalValue::LinkageTypes::ExternalLinkage; - u32 address_space = 0; - auto* function = Function::Create(function_type, linkage, address_space, function_name, &module); - - auto builder = IRBuilder<>(context); - auto entry_block_name = string_ref("entry"); - auto* basic_block = BasicBlock::Create(context, entry_block_name, function, 0); - builder.SetInsertPoint(basic_block); - u64 return_value_int = 0; - u8 is_signed = 0; - auto* return_value = ConstantInt::get(context, APInt(return_bit_count, return_value_int, is_signed)); - builder.CreateRet(return_value); - - { - raw_string_ostream message_stream(error_message); - - if (verifyModule(module, &message_stream)) - { - // Failure - auto& error_std_string = message_stream.str(); - auto error_string = String{ .pointer = (u8*)error_std_string.data(), .length = error_std_string.length() }; - print("Verification for module failed:\n{s}\n", error_string); - failed_execution(); - } - } - } - - // TODO: make a more correct logic - std::string target_triple_str; - switch (options.target.cpu) - { - case CPU_ARCH_X86_64: - target_triple_str += string_ref("x86_64-"); - break; - case CPU_ARCH_AARCH64: - target_triple_str += string_ref("aarch64-"); - break; - } - - switch (options.target.os) - { - case OPERATING_SYSTEM_LINUX: - target_triple_str += string_ref("unknown-linux-gnu"); - break; - case OPERATING_SYSTEM_MAC: - target_triple_str += string_ref("apple-macosx-none"); - break; - case OPERATING_SYSTEM_WINDOWS: - target_triple_str += string_ref("pc-windows-msvc"); - break; - } - auto target_triple = StringRef(target_triple_str); - - const Target* target = TargetRegistry::lookupTarget(target_triple, error_message); - if (!target) - { - String string = { .pointer = (u8*)error_message.data(), .length = error_message.length() }; - print("Could not find target: {s}\n", string); - failed_execution(); - } - - module.setTargetTriple(target_triple); - - // TODO: - auto cpu_model = string_ref(""); - auto cpu_features = string_ref(""); - - TargetOptions target_options; - std::optional relocation_model = std::nullopt; - std::optional code_model = std::nullopt; - auto codegen_optimization_level = CodeGenOptLevel::None; - u8 jit = 0; - - auto* target_machine = target->createTargetMachine(target_triple, cpu_model, cpu_features, target_options, relocation_model, code_model, codegen_optimization_level, jit); - auto data_layout = target_machine->createDataLayout(); - module.setDataLayout(data_layout); - - // TODO: optimizations - - SmallString<0> object_string; - raw_svector_ostream object_stream(object_string); - auto file_type = CodeGenFileType::ObjectFile; - legacy::PassManager pass; - - assert(target_machine->isCompatibleDataLayout(module.getDataLayout())); - raw_pwrite_stream* dwo_stream = 0; - if (target_machine->addPassesToEmitFile(pass, object_stream, dwo_stream, file_type)) { - failed_execution(); - } - - pass.run(module); - - assert(object_path.pointer); - assert(object_path.length); - - file_write(FileWriteOptions{ - .path = object_path, - .content = { .pointer = (u8*)object_string.str().data(), .length = object_string.str().size() }, - .executable = 1, - }); - } -} diff --git a/bootstrap/bloat-buster/llvm.h b/bootstrap/bloat-buster/llvm.h deleted file mode 100644 index 63b1a26..0000000 --- a/bootstrap/bloat-buster/llvm.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include - -EXPORT void llvm_codegen(CodegenOptions options, String object_path); diff --git a/bootstrap/bloat-buster/main.c b/bootstrap/bloat-buster/main.c deleted file mode 100644 index aa2acbd..0000000 --- a/bootstrap/bloat-buster/main.c +++ /dev/null @@ -1,25059 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#ifdef __APPLE__ -#define clang_path "/opt/homebrew/opt/llvm/bin/clang" -#else -#define clang_path "/usr/bin/clang" -#endif - -#define RawIndex(T, i) (T ## Index) { .index = (i) } -#define Index(T, i) RawIndex(T, (i) + 1) -#define geti(i) ((i).index - 1) -#define validi(i) ((i).index != 0) -#define invalidi(T) RawIndex(T, 0) - -#define InternPool(T) InternPool_ ## T -#define GetOrPut(T) T ## GetOrPut -#define declare_ip(T) \ -STRUCT(InternPool(T)) \ -{ \ - T ## Index * pointer; \ - u32 length;\ - u32 capacity;\ -}; \ -STRUCT(GetOrPut(T)) \ -{\ - T ## Index index; \ - u8 existing;\ -} - -auto compiler_name = strlit("bb"); - - -STRUCT(ElfRelocation) -{ - u64 offset; - u64 info; - u64 addend; -}; - -typedef enum ElfDynamicEntryTag : s64 -{ - DT_NULL = 0, - DT_NEEDED = 1, - DT_PLTRELSZ = 2, - DT_PLTGOT = 3, - DT_HASH = 4, - DT_STRTAB = 5, - DT_SYMTAB = 6, - DT_RELA = 7, - DT_RELASZ = 8, - DT_RELAENT = 9, - DT_STRSZ = 10, - DT_SYMENT = 11, - DT_INIT = 12, - DT_FINI = 13, - DT_SONAME = 14, - DT_RPATH = 15, - DT_SYMBOLIC = 16, - DT_REL = 17, - DT_RELSZ = 18, - DT_RELENT = 19, - DT_PLTREL = 20, - DT_DEBUG = 21, - DT_TEXTREL = 22, - DT_JMPREL = 23, - DT_BIND_NOW = 24, - DT_INIT_ARRAY = 25, - DT_FINI_ARRAY = 26, - DT_INIT_ARRAYSZ = 27, - DT_FINI_ARRAYSZ = 28, - DT_RUNPATH = 29, - DT_FLAGS = 30, - DT_ENCODING = 32, - DT_PREINIT_ARRAY = 32, - DT_PREINIT_ARRAYSZ = 33, - DT_SYMTAB_SHNDX = 34, - DT_RELRSZ = 35, - DT_RELR = 36, - DT_RELRENT = 37, - DT_NUM = 38, - DT_LOOS = 0x6000000d, - DT_HIOS = 0x6ffff000, - DT_LOPROC = 0x70000000, - DT_HIPROC = 0x7fffffff, - DT_VALRNGLO = 0x6ffffd00, - DT_GNU_PRELINKED = 0x6ffffdf5, - DT_GNU_CONFLICTSZ = 0x6ffffdf6, - DT_GNU_LIBLISTSZ = 0x6ffffdf7, - DT_CHECKSUM = 0x6ffffdf8, - DT_PLTPADSZ = 0x6ffffdf9, - DT_MOVEENT = 0x6ffffdfa, - DT_MOVESZ = 0x6ffffdfb, - DT_FEATURE_1 = 0x6ffffdfc, - DT_POSFLAG_1 = 0x6ffffdfd, - - DT_SYMINSZ = 0x6ffffdfe, - DT_SYMINENT = 0x6ffffdff, - DT_VALRNGHI = 0x6ffffdff, - DT_VALNUM = 12, - - DT_ADDRRNGLO = 0x6ffffe00, - DT_GNU_HASH = 0x6ffffef5, - DT_TLSDESC_PLT = 0x6ffffef6, - DT_TLSDESC_GOT = 0x6ffffef7, - DT_GNU_CONFLICT = 0x6ffffef8, - DT_GNU_LIBLIST = 0x6ffffef9, - DT_CONFIG = 0x6ffffefa, - DT_DEPAUDIT = 0x6ffffefb, - DT_AUDIT = 0x6ffffefc, - DT_PLTPAD = 0x6ffffefd, - DT_MOVETAB = 0x6ffffefe, - DT_SYMINFO = 0x6ffffeff, - DT_ADDRRNGHI = 0x6ffffeff, - DT_ADDRNUM = 11, - - DT_VERSYM = 0x6ffffff0, - - DT_RELACOUNT = 0x6ffffff9, - DT_RELCOUNT = 0x6ffffffa, - - DT_FLAGS_1 = 0x6ffffffb, - DT_VERDEF = 0x6ffffffc, - - DT_VERDEFNUM = 0x6ffffffd, - DT_VERNEED = 0x6ffffffe, - - DT_VERNEEDNUM = 0x6fffffff, - DT_VERSIONTAGNUM = 16, - - DT_AUXILIARY = 0x7ffffffd, - DT_FILTER = 0x7fffffff, - DT_EXTRANUM = 3, - - DT_SPARC_REGISTER = 0x70000001, - DT_SPARC_NUM = 2, - - DT_MIPS_RLD_VERSION = 0x70000001, - DT_MIPS_TIME_STAMP = 0x70000002, - DT_MIPS_ICHECKSUM = 0x70000003, - DT_MIPS_IVERSION = 0x70000004, - DT_MIPS_FLAGS = 0x70000005, - DT_MIPS_BASE_ADDRESS = 0x70000006, - DT_MIPS_MSYM = 0x70000007, - DT_MIPS_CONFLICT = 0x70000008, - DT_MIPS_LIBLIST = 0x70000009, - DT_MIPS_LOCAL_GOTNO = 0x7000000a, - DT_MIPS_CONFLICTNO = 0x7000000b, - DT_MIPS_LIBLISTNO = 0x70000010, - DT_MIPS_SYMTABNO = 0x70000011, - DT_MIPS_UNREFEXTNO = 0x70000012, - DT_MIPS_GOTSYM = 0x70000013, - DT_MIPS_HIPAGENO = 0x70000014, - DT_MIPS_RLD_MAP = 0x70000016, - DT_MIPS_DELTA_CLASS = 0x70000017, - DT_MIPS_DELTA_CLASS_NO = 0x70000018, - - DT_MIPS_DELTA_INSTANCE = 0x70000019, - DT_MIPS_DELTA_INSTANCE_NO = 0x7000001a, - - DT_MIPS_DELTA_RELOC = 0x7000001b, - DT_MIPS_DELTA_RELOC_NO = 0x7000001c, - - DT_MIPS_DELTA_SYM = 0x7000001d, - - DT_MIPS_DELTA_SYM_NO = 0x7000001e, - - DT_MIPS_DELTA_CLASSSYM = 0x70000020, - - DT_MIPS_DELTA_CLASSSYM_NO = 0x70000021, - - DT_MIPS_CXX_FLAGS = 0x70000022, - DT_MIPS_PIXIE_INIT = 0x70000023, - DT_MIPS_SYMBOL_LIB = 0x70000024, - DT_MIPS_LOCALPAGE_GOTIDX = 0x70000025, - DT_MIPS_LOCAL_GOTIDX = 0x70000026, - DT_MIPS_HIDDEN_GOTIDX = 0x70000027, - DT_MIPS_PROTECTED_GOTIDX = 0x70000028, - DT_MIPS_OPTIONS = 0x70000029, - DT_MIPS_INTERFACE = 0x7000002a, - DT_MIPS_DYNSTR_ALIGN = 0x7000002b, - DT_MIPS_INTERFACE_SIZE = 0x7000002c, - DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002d, - - DT_MIPS_PERF_SUFFIX = 0x7000002e, - - DT_MIPS_COMPACT_SIZE = 0x7000002f, - DT_MIPS_GP_VALUE = 0x70000030, - DT_MIPS_AUX_DYNAMIC = 0x70000031, - - DT_MIPS_PLTGOT = 0x70000032, - - DT_MIPS_RWPLT = 0x70000034, - DT_MIPS_RLD_MAP_REL = 0x70000035, - DT_MIPS_NUM = 0x36, - - DT_ALPHA_PLTRO = (DT_LOPROC + 0), - DT_ALPHA_NUM = 1, - - DT_PPC_GOT = (DT_LOPROC + 0), - DT_PPC_OPT = (DT_LOPROC + 1), - DT_PPC_NUM = 2, - - DT_PPC64_GLINK = (DT_LOPROC + 0), - DT_PPC64_OPD = (DT_LOPROC + 1), - DT_PPC64_OPDSZ = (DT_LOPROC + 2), - DT_PPC64_OPT = (DT_LOPROC + 3), - DT_PPC64_NUM = 4, - - DT_IA_64_PLT_RESERVE = (DT_LOPROC + 0), - DT_IA_64_NUM = 1, -} ElfDynamicEntryTag; - -STRUCT(ElfDynamicEntry) -{ - ElfDynamicEntryTag tag; - union - { - u64 address; - s64 value; - }; -}; - -typedef enum ELFSectionType : u32 -{ - ELF_SECTION_NULL = 0X00, - ELF_SECTION_PROGRAM = 0X01, - ELF_SECTION_SYMBOL_TABLE = 0X02, - ELF_SECTION_STRING_TABLE = 0X03, - ELF_SECTION_RELOCATION_WITH_ADDENDS = 0X04, - ELF_SECTION_SYMBOL_HASH_TABLE = 0X05, - ELF_SECTION_DYNAMIC = 0X06, - ELF_SECTION_NOTE = 0X07, - ELF_SECTION_BSS = 0X08, - ELF_SECTION_RELOCATION_NO_ADDENDS = 0X09, - ELF_SECTION_LIB = 0X0A, // RESERVED - ELF_SECTION_DYNAMIC_SYMBOL_TABLE = 0X0B, - ELF_SECTION_INIT_ARRAY = 0X0E, - ELF_SECTION_FINI_ARRAY = 0X0F, - ELF_SECTION_PREINIT_ARRAY = 0X10, - ELF_SECTION_GROUP = 0X11, - ELF_SECTION_SYMBOL_TABLE_SECTION_HEADER_INDEX = 0X12, - ELF_SECTION_GNU_HASH = 0x6ffffff6, - ELF_SECTION_GNU_VERDEF = 0x6ffffffd, - ELF_SECTION_GNU_VERNEED = 0x6ffffffe, - ELF_SECTION_GNU_VERSYM = 0x6fffffff, - -} ELFSectionType; - -// fn String elf_section_type_to_string(ELFSectionType type) -// { -// switch (type) -// { -// case_to_name(ELF_SECTION_, NULL); -// case_to_name(ELF_SECTION_, PROGRAM); -// case_to_name(ELF_SECTION_, SYMBOL_TABLE); -// case_to_name(ELF_SECTION_, STRING_TABLE); -// case_to_name(ELF_SECTION_, RELOCATION_WITH_ADDENDS); -// case_to_name(ELF_SECTION_, SYMBOL_HASH_TABLE); -// case_to_name(ELF_SECTION_, DYNAMIC); -// case_to_name(ELF_SECTION_, NOTE); -// case_to_name(ELF_SECTION_, BSS); -// case_to_name(ELF_SECTION_, RELOCATION_NO_ADDENDS); -// case_to_name(ELF_SECTION_, LIB); -// case_to_name(ELF_SECTION_, DYNAMIC_SYMBOL_TABLE); -// case_to_name(ELF_SECTION_, INIT_ARRAY); -// case_to_name(ELF_SECTION_, FINI_ARRAY); -// case_to_name(ELF_SECTION_, PREINIT_ARRAY); -// case_to_name(ELF_SECTION_, GROUP); -// case_to_name(ELF_SECTION_, SYMBOL_TABLE_SECTION_HEADER_INDEX); -// case_to_name(ELF_SECTION_, GNU_HASH); -// case_to_name(ELF_SECTION_, GNU_VERDEF); -// case_to_name(ELF_SECTION_, GNU_VERNEED); -// case_to_name(ELF_SECTION_, GNU_VERSYM); -// break; -// } -// } - -STRUCT(ELFSectionHeaderFlags) -{ - u64 write:1; - u64 alloc:1; - u64 executable:1; - u64 blank:1; - u64 merge:1; - u64 strings:1; - u64 info_link:1; - u64 link_order:1; - u64 os_non_conforming:1; - u64 group:1; - u64 tls:1; - u64 reserved:53; -}; -static_assert(sizeof(ELFSectionHeaderFlags) == sizeof(u64)); - -STRUCT(ELFSectionHeader) -{ - u32 name_offset; - ELFSectionType type; - ELFSectionHeaderFlags flags; - u64 address; - u64 offset; - u64 size; - u32 link; - u32 info; - u64 alignment; - u64 entry_size; -}; -static_assert(sizeof(ELFSectionHeader) == 64); -decl_vb(ELFSectionHeader); - -typedef enum ElfProgramHeaderType : u32 -{ - PT_NULL = 0, - PT_LOAD = 1, - PT_DYNAMIC = 2, - PT_INTERP = 3, - PT_NOTE = 4, - PT_SHLIB = 5, - PT_PHDR = 6, - PT_TLS = 7, - PT_GNU_EH_FRAME = 0x6474e550, /* GCC .eh_frame_hdr segment */ - PT_GNU_STACK = 0x6474e551, /* Indicates stack executability */ - PT_GNU_RELRO = 0x6474e552, /* Read-only after relocation */ - PT_GNU_PROPERTY = 0x6474e553, /* GNU property */ - PT_GNU_SFRAME = 0x6474e554, /* SFrame segment. */ -} ElfProgramHeaderType; - -STRUCT(ElfProgramHeaderFlags) -{ - u32 executable:1; - u32 writeable:1; - u32 readable:1; - u32 reserved:29; -}; - -STRUCT(ElfProgramHeader) -{ - ElfProgramHeaderType type; - ElfProgramHeaderFlags flags; - u64 offset; - u64 virtual_address; - u64 physical_address; - u64 file_size; - u64 memory_size; - u64 alignment; -}; -static_assert(sizeof(ElfProgramHeader) == 0x38); -declare_slice(ElfProgramHeader); -decl_vb(ElfProgramHeader); - -typedef enum ELFBitCount : u8 -{ - bits32 = 1, - bits64 = 2, -} ELFBitCount; - -typedef enum ELFEndianness : u8 -{ - little = 1, - big = 2, -} ELFEndianness; - -typedef enum ELFAbi : u8 -{ - ELF_ABI_SYSTEM_V = 0, - ELF_ABI_LINUX = 3, -} ELFAbi; - -typedef enum ELFType : u16 -{ - none = 0, - relocatable = 1, - executable = 2, - shared = 3, - core = 4, -} ELFType; - -typedef enum ELFMachine : u16 -{ - x86_64 = 0x3e, - aarch64 = 0xb7, -} ELFMachine; - -typedef enum ELFSectionIndex : u16 -{ - ELF_SECTION_UNDEFINED = 0, - ELF_SECTION_ABSOLUTE = 0xfff1, - ELF_SECTION_COMMON = 0xfff2, -} ELFSectionIndex; - -STRUCT(ELFVersionRequirement) -{ - u16 version; - u16 count; - u32 name_offset; - u32 aux_offset; - u32 next; -}; - -STRUCT(ELFVersionRequirementEntry) -{ - u32 hash; - u16 flags; - u16 index; - u32 name_offset; - u32 next; -}; - -STRUCT(ELFVersionDefinition) -{ - u16 version; - u16 flags; - u16 index; - u16 count; - u32 hash; - u32 aux_offset; - u32 next; -}; -static_assert(sizeof(ELFVersionDefinition) == 20); -STRUCT(ELFVersionDefinitionEntry) -{ - u32 name_offset; - u32 next; -}; - -STRUCT(ELFHeader) -{ - u8 identifier[4]; - ELFBitCount bit_count; - ELFEndianness endianness; - u8 format_version; - ELFAbi abi; - u8 abi_version; - u8 padding[7]; - ELFType type; - ELFMachine machine; - u32 version; - u64 entry_point; - u64 program_header_offset; - u64 section_header_offset; - u32 flags; - u16 elf_header_size; - u16 program_header_size; - u16 program_header_count; - u16 section_header_size; - u16 section_header_count; - u16 section_header_string_table_index; -}; -static_assert(sizeof(ELFHeader) == 0x40); - -typedef enum ELFSymbolBinding : u8 -{ - ELF_SYMBOL_BINDING_LOCAL = 0, - ELF_SYMBOL_BINDING_GLOBAL = 1, - ELF_SYMBOL_BINDING_WEAK = 2, -} ELFSymbolBinding; - -typedef enum ELFSymbolType : u8 -{ - ELF_SYMBOL_TYPE_NONE = 0, - ELF_SYMBOL_TYPE_OBJECT = 1, - ELF_SYMBOL_TYPE_FUNCTION = 2, - ELF_SYMBOL_TYPE_SECTION = 3, - ELF_SYMBOL_TYPE_FILE = 4, - ELF_SYMBOL_TYPE_COMMON = 5, - ELF_SYMBOL_TYPE_TLS = 6, -} ELFSymbolType; - -typedef enum ELFSymbolVisibility : u8 -{ - ELF_SYMBOL_VISIBILITY_DEFAULT = 0, - ELF_SYMBOL_VISIBILITY_INTERNAL = 1, - ELF_SYMBOL_VISIBILITY_HIDDEN = 2, - ELF_SYMBOL_VISIBILITY_PROTECTED = 3, -} ELFSymbolVisibility; - -STRUCT(ELFSymbol) -{ - u32 name_offset; - ELFSymbolType type:4; - ELFSymbolBinding binding:4; - ELFSymbolVisibility visibility; - u16 section_index; // In the section header table - u64 value; - u64 size; -}; -decl_vb(ELFSymbol); -static_assert(sizeof(ELFSymbol) == 24); - -STRUCT(ElfGnuHashHeader) -{ - u32 bucket_count; - u32 symbol_offset; - u32 bloom_size; - u32 bloom_shift; -}; - -typedef enum RelocationType_x86_64 : u32 -{ - R_X86_64_NONE= 0, /* No reloc */ - R_X86_64_64= 1, /* Direct 64 bit */ - R_X86_64_PC32= 2, /* PC relative 32 bit signed */ - R_X86_64_GOT32= 3, /* 32 bit GOT entry */ - R_X86_64_PLT32 = 4, /* 32 bit PLT address */ - R_X86_64_COPY = 5, /* Copy symbol at runtime */ - R_X86_64_GLOB_DAT = 6, /* Create GOT entry */ - R_X86_64_JUMP_SLOT = 7, /* Create PLT entry */ - R_X86_64_RELATIVE = 8, /* Adjust by program base */ - R_X86_64_GOTPCREL = 9, /* 32 bit signed PC relative offset to GOT */ - R_X86_64_32 = 10, /* Direct 32 bit zero extended */ - R_X86_64_32S = 11, /* Direct 32 bit sign extended */ - R_X86_64_16 = 12, /* Direct 16 bit zero extended */ - R_X86_64_PC16 = 13, /* 16 bit sign extended pc relative */ - R_X86_64_8 = 14, /* Direct 8 bit sign extended */ - R_X86_64_PC8 = 15, /* 8 bit sign extended pc relative */ - R_X86_64_DTPMOD64 = 16, /* ID of module containing symbol */ - R_X86_64_DTPOFF64 = 17, /* Offset in module's TLS block */ - R_X86_64_TPOFF64 = 18, /* Offset in initial TLS block */ - R_X86_64_TLSGD = 19, /* 32 bit signed PC relative offset to two GOT entries for GD symbol */ - R_X86_64_TLSLD = 20, /* 32 bit signed PC relative offset to two GOT entries for LD symbol */ - R_X86_64_DTPOFF32 = 21, /* Offset in TLS block */ - R_X86_64_GOTTPOFF = 22, /* 32 bit signed PC relative offset to GOT entry for IE symbol */ - R_X86_64_TPOFF32 = 23, /* Offset in initial TLS block */ - R_X86_64_PC64 = 24, /* PC relative 64 bit */ - R_X86_64_GOTOFF64 = 25, /* 64 bit offset to GOT */ - R_X86_64_GOTPC32 = 26, /* 32 bit signed pc relative offset to GOT */ - R_X86_64_GOT64 = 27, /* 64-bit GOT entry offset */ - R_X86_64_GOTPCREL64 = 28, /* 64-bit PC relative offset to GOT entry */ - R_X86_64_GOTPC64 = 29, /* 64-bit PC relative offset to GOT */ - R_X86_64_GOTPLT64 = 30 , /* like GOT64, says PLT entry needed */ - R_X86_64_PLTOFF64 = 31, /* 64-bit GOT relative offset to PLT entry */ - R_X86_64_SIZE32 = 32, /* Size of symbol plus 32-bit addend */ - R_X86_64_SIZE64 = 33, /* Size of symbol plus 64-bit addend */ - R_X86_64_GOTPC32_TLSDESC = 34, /* GOT offset for TLS descriptor. */ - R_X86_64_TLSDESC_CALL = 35, /* Marker for call through TLS descriptor. */ - R_X86_64_TLSDESC = 36, /* TLS descriptor. */ - R_X86_64_IRELATIVE = 37, /* Adjust indirectly by program base */ - R_X86_64_RELATIVE64 = 38, /* 64-bit adjust by program base */ - /* 39 Reserved was R_X86_64_PC32_BND */ - /* 40 Reserved was R_X86_64_PLT32_BND */ - R_X86_64_GOTPCRELX = 41, /* Load from 32 bit signed pc relative offset to GOT entry without REX prefix, relaxable. */ - R_X86_64_REX_GOTPCRELX = 42, /* Load from 32 bit signed pc relative offset to GOT entry with REX prefix, relaxable. */ - R_X86_64_NUM = 43, -} RelocationType_x86_64; - -typedef enum RelocationType_aarch64 : u32 -{ - // Null relocation codes - R_AARCH64_NONE = 0, // None - R_AARCH64_withdrawn = 256, // Treat as R_AARCH64_NONE - - // Static relocations - R_AARCH64_ABS64 = 257, // S + A - R_AARCH64_ABS32 = 258, // S + A - R_AARCH64_ABS16 = 259, // S + A - R_AARCH64_PREL64 = 260, // S + A - P - R_AARCH64_PREL32 = 261, // S + A - P - R_AARCH64_PREL16 = 262, // S + A - P - R_AARCH64_MOVW_UABS_G0 = 263, // S + A - R_AARCH64_MOVW_UABS_G0_NC = 264, // S + A - R_AARCH64_MOVW_UABS_G1 = 265, // S + A - R_AARCH64_MOVW_UABS_G1_NC = 266, // S + A - R_AARCH64_MOVW_UABS_G2 = 267, // S + A - R_AARCH64_MOVW_UABS_G2_NC = 268, // S + A - R_AARCH64_MOVW_UABS_G3 = 269, // S + A - R_AARCH64_MOVW_SABS_G0 = 270, // S + A - R_AARCH64_MOVW_SABS_G1 = 271, // S + A - R_AARCH64_MOVW_SABS_G2 = 272, // S + A - R_AARCH64_LD_PREL_LO19 = 273, // S + A - P - R_AARCH64_ADR_PREL_LO21 = 274, // S + A - P - R_AARCH64_ADR_PREL_PG_HI21 = 275, // Page(S+A) - Page(P) - R_AARCH64_ADR_PREL_PG_HI21_NC = 276, // Page(S+A) - Page(P) - R_AARCH64_ADD_ABS_LO12_NC = 277, // S + A - R_AARCH64_LDST8_ABS_LO12_NC = 278, // S + A - R_AARCH64_TSTBR14 = 279, // S + A - P - R_AARCH64_CONDBR19 = 280, // S + A - P - R_AARCH64_JUMP26 = 282, // S + A - P - R_AARCH64_CALL26 = 283, // S + A - P - R_AARCH64_LDST16_ABS_LO12_NC = 284, // S + A - R_AARCH64_LDST32_ABS_LO12_NC = 285, // S + A - R_AARCH64_LDST64_ABS_LO12_NC = 286, // S + A - R_AARCH64_MOVW_PREL_G0 = 287, // S + A - P - R_AARCH64_MOVW_PREL_G0_NC = 288, // S + A - P - R_AARCH64_MOVW_PREL_G1 = 289, // S + A - P - R_AARCH64_MOVW_PREL_G1_NC = 290, // S + A - P - R_AARCH64_MOVW_PREL_G2 = 291, // S + A - P - R_AARCH64_MOVW_PREL_G2_NC = 292, // S + A - P - R_AARCH64_MOVW_PREL_G3 = 293, // S + A - P - R_AARCH64_LDST128_ABS_LO12_NC = 299, // S + A - R_AARCH64_MOVW_GOTOFF_G0 = 300, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G0_NC = 301, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G1 = 302, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G1_NC = 303, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G2 = 304, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G2_NC = 305, // G(GDAT(S+A))-GOT - R_AARCH64_MOVW_GOTOFF_G3 = 306, // G(GDAT(S+A))-GOT - R_AARCH64_GOTREL64 = 307, // S + A - GOT - R_AARCH64_GOTREL32 = 308, // S + A - GOT - R_AARCH64_GOT_LD_PREL19 = 309, // G(GDAT(S+A))-P - R_AARCH64_LD64_GOTOFF_LO15 = 310, // G(GDAT(S+A))-GOT - R_AARCH64_ADR_GOT_PAGE = 311, // Page(G(GDAT(S+A)))-Page(P) - R_AARCH64_LD64_GOT_LO12_NC = 312, // G(GDAT(S+A)) - R_AARCH64_LD64_GOTPAGE_LO15 = 313, // G(GDAT(S+A))-Page(GOT) - - // Relocations for thread-local storage - R_AARCH64_TLSGD_ADR_PREL21 = 512, // G(GTLSIDX(S,A)) - P - R_AARCH64_TLSGD_ADR_PAGE21 = 513, // Page(G(GTLSIDX(S,A)))-Page(P) - R_AARCH64_TLSGD_ADD_LO12_NC = 514, // G(GTLSICX(S,A)) - R_AARCH64_TLSGD_MOVW_G1 = 515, // G(GTLSIDX(S,A)) - GOT - R_AARCH64_TLSGD_MOVW_G0_NC = 516, // G(GTLSIDX(S,A)) - GOT - - R_AARCH64_TLSLD_ADR_PREL21 = 517, // G(GLDM(S)) - P - R_AARCH64_TLSLD_ADR_PAGE21 = 518, // Page(G(GLDM(S))) - Page(P) - R_AARCH64_TLSLD_ADD_LO12_NC = 519, // G(GLDM(S)) - R_AARCH64_TLSLD_MOVW_G1 = 520, // G(GLDM(S)) - GOT - R_AARCH64_TLSLD_MOVW_G0_NC = 521, // G(GLDM(S)) - GOT - R_AARCH64_TLSLD_LD_PREL19 = 522, // G(GLDM(S)) - P - R_AARCH64_TLSLD_MOVW_DTPREL_G2 = 523, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G1 = 524, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC = 525, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G0 = 526, // DTPREL(S+A) - R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC = 527, // DTPREL(S+A) - R_AARCH64_TLSLD_ADD_DTPREL_HI12 = 528, // DTPREL(S+A) - R_AARCH64_TLSLD_ADD_DTPREL_LO12 = 529, // DTPREL(S+A) - R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC = 530, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST8_DTPREL_LO12 = 531, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC = 532, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST16_DTPREL_LO12 = 533, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 534, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST32_DTPREL_LO12 = 535, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 536, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST64_DTPREL_LO12 = 537, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 538, // DTPREL(S+A) - R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 = 539, // G(GTPREL(S+A)) - GOT - R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC = 540, // G(GTPREL(S+A)) - GOT - R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 = 541, // Page(G(GTPREL(S+A)))-Page(P) - R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 542, // G(GTPREL(S+A)) - R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 = 543, // G(GTPREL(S+A)) - P - R_AARCH64_TLSLE_MOVW_TPREL_G2 = 544, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G1 = 545, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G1_NC = 546, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G0 = 547, // TPREL(S+A) - R_AARCH64_TLSLE_MOVW_TPREL_G0_NC = 548, // TPREL(S+A) - R_AARCH64_TLSLE_ADD_TPREL_HI12 = 549, // TPREL(S+A) - R_AARCH64_TLSLE_ADD_TPREL_LO12 = 550, // TPREL(S+A) - R_AARCH64_TLSLE_ADD_TPREL_LO12_NC = 551, // TPREL(S+A) - R_AARCH64_TLSLE_LDST8_TPREL_LO12 = 552, // TPREL(S+A) - R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC = 553, // TPREL(S+A) - R_AARCH64_TLSLE_LDST16_TPREL_LO12 = 554, // TPREL(S+A) - R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC = 555, // TPREL(S+A) - R_AARCH64_TLSLE_LDST32_TPREL_LO12 = 556, // TPREL(S+A) - R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC = 557, // TPREL(S+A) - R_AARCH64_TLSLE_LDST64_TPREL_LO12 = 558, // TPREL(S+A) - R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC = 559, // TPREL(S+A) - R_AARCH64_TLSDESC_LD_PREL19 = 560, // G(GTLSDESC(S+A)) - P - R_AARCH64_TLSDESC_ADR_PREL21 = 561, // G(GTLSDESC(S+A)) - P - R_AARCH64_TLSDESC_ADR_PAGE21 = 562, // Page(G(GTLSDESC(S+A)))-Page(P) - R_AARCH64_TLSDESC_LD64_LO12 = 563, // G(GTLSDESC(S+A)) - R_AARCH64_TLSDESC_ADD_LO12 = 564, // G(GTLSDESC(S+A)) - R_AARCH64_TLSDESC_OFF_G1 = 565, // G(GTLSDESC(S+A)) - GOT - R_AARCH64_TLSDESC_OFF_G0_NC = 566, // G(GTLSDESC(S+A)) - GOT - R_AARCH64_TLSDESC_LDR = 567, // None - R_AARCH64_TLSDESC_ADD = 568, // None - R_AARCH64_TLSDESC_CALL = 569, // None - R_AARCH64_TLSLE_LDST128_TPREL_LO12 = 570, // TPREL(S+A) - R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC = 571, // TPREL(S+A) - R_AARCH64_TLSLD_LDST128_DTPREL_LO12 = 572, // DTPREL(S+A) - R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC = 573, // DTPREL(S+A) - - // Dynamic relocations - R_AARCH64_COPY = 1024, - R_AARCH64_GLOB_DAT = 1025, // S + A - R_AARCH64_JUMP_SLOT = 1026, // S + A - R_AARCH64_RELATIVE = 1027, // Delta(S) + A - // Note (shenhan): the following 2 relocs are different from elf spec from - // arm. In elf docs, TLS_DTPMOD64 is defined as 1029, TLS_DTPREL64 1028. - // While actually the bfd linker (and the dynamic linker) treates TLS_DTPMOD64 - // as 1028, TLS_DTPREL64 1029. See binutils-gdb/include/elf/aarch64.h. - R_AARCH64_TLS_DTPMOD64 = 1028, // LDM(S) - R_AARCH64_TLS_DTPREL64 = 1029, // DTPREL(S+A) - R_AARCH64_TLS_TPREL64 = 1030, // TPREL(S+A) - R_AARCH64_TLSDESC = 1031, // TLSDESC(S+A) - R_AARCH64_IRELATIVE = 1032, // Indirect(Delta(S) + A) -} RelocationType_aarch64; - -UNION(RelocationType) -{ - RelocationType_x86_64 x86_64; - RelocationType_aarch64 aarch64; -}; - -STRUCT(ElfRelocationWithAddendInfo) -{ - RelocationType type; - u32 symbol; -}; - -STRUCT(ElfRelocationWithAddend) -{ - u64 offset; - ElfRelocationWithAddendInfo info; - u64 addend; -}; - -// Custom ELF structures - -STRUCT(SymbolTable) -{ - VirtualBuffer(ELFSymbol) symbol_table; - VirtualBuffer(u8) string_table; -}; - -// DWARF - -typedef enum DwarfTag : u16 -{ - DW_TAG_array_type = 0x01, - DW_TAG_class_type = 0x02, - DW_TAG_entry_point = 0x03, - DW_TAG_enumeration_type = 0x04, - DW_TAG_formal_parameter = 0x05, - DW_TAG_imported_declaration = 0x08, - DW_TAG_label = 0x0a, - DW_TAG_lexical_block = 0x0b, - DW_TAG_member = 0x0d, - DW_TAG_pointer_type = 0x0f, - DW_TAG_reference_type = 0x10, - DW_TAG_compile_unit = 0x11, - DW_TAG_string_type = 0x12, - DW_TAG_structure_type = 0x13, - DW_TAG_subroutine_type = 0x15, - DW_TAG_typedef = 0x16, - DW_TAG_union_type = 0x17, - DW_TAG_unspecified_parameters = 0x18, - DW_TAG_variant = 0x19, - DW_TAG_common_block = 0x1a, - DW_TAG_common_inclusion = 0x1b, - DW_TAG_inheritance = 0x1c, - DW_TAG_inlined_subroutine = 0x1d, - DW_TAG_module = 0x1e, - DW_TAG_ptr_to_member_type = 0x1f, - DW_TAG_set_type = 0x20, - DW_TAG_subrange_type = 0x21, - DW_TAG_with_stmt = 0x22, - DW_TAG_access_declaration = 0x23, - DW_TAG_base_type = 0x24, - DW_TAG_catch_block = 0x25, - DW_TAG_const_type = 0x26, - DW_TAG_constant = 0x27, - DW_TAG_enumerator = 0x28, - DW_TAG_file_type = 0x29, - DW_TAG_friend = 0x2a, - DW_TAG_namelist = 0x2b, - DW_TAG_namelist_item = 0x2c, - DW_TAG_packed_type = 0x2d, - DW_TAG_subprogram = 0x2e, - DW_TAG_template_type_parameter = 0x2f, - DW_TAG_template_value_parameter = 0x30, - DW_TAG_thrown_type = 0x31, - DW_TAG_try_block = 0x32, - DW_TAG_variant_part = 0x33, - DW_TAG_variable = 0x34, - DW_TAG_volatile_type = 0x35, - DW_TAG_dwarf_procedure = 0x36, - DW_TAG_restrict_type = 0x37, - DW_TAG_interface_type = 0x38, - DW_TAG_namespace = 0x39, - DW_TAG_imported_module = 0x3a, - DW_TAG_unspecified_type = 0x3b, - DW_TAG_partial_unit = 0x3c, - DW_TAG_imported_unit = 0x3d, - DW_TAG_condition = 0x3f, - DW_TAG_shared_type = 0x40, - DW_TAG_type_unit = 0x41, - DW_TAG_rvalue_reference_type = 0x42, - DW_TAG_template_alias = 0x43, - DW_TAG_coarray_type = 0x44, - DW_TAG_generic_subrange = 0x45, - DW_TAG_dynamic_type = 0x46, - DW_TAG_atomic_type = 0x47, - DW_TAG_call_site = 0x48, - DW_TAG_call_site_parameter = 0x49, - DW_TAG_skeleton_unit = 0x4a, - DW_TAG_immutable_type = 0x4b, - DW_TAG_lo_user = 0x4080, - DW_TAG_hi_user = 0xffff, -} DwarfTag; - -typedef enum DwarfOpcode : u8 -{ - DW_LNS_copy = 1, - DW_LNS_advance_pc = 2, - DW_LNS_advance_line = 3, - DW_LNS_set_file = 4, - DW_LNS_set_column = 5, - DW_LNS_negate_stmt = 6, - DW_LNS_set_basic_block = 7, - DW_LNS_const_add_pc = 8, - DW_LNS_fixed_advance_pc = 9, - DW_LNS_set_prologue_end = 10, - DW_LNS_set_epilogue_begin = 11, - DW_LNS_set_isa = 12, -} DwarfOpcode; - -typedef enum DwarfExtendedOpcode : u8 -{ - DW_LNE_end_sequence = 1, - DW_LNE_set_address = 2, - DW_LNE_set_discriminator = 4, -} DwarfExtendedOpcode; - -fn String dwarf_tag_to_string(DwarfTag tag) -{ - switch (tag) - { - case_to_name(DW_TAG_, array_type); - case_to_name(DW_TAG_, class_type); - case_to_name(DW_TAG_, entry_point); - case_to_name(DW_TAG_, enumeration_type); - case_to_name(DW_TAG_, formal_parameter); - case_to_name(DW_TAG_, imported_declaration); - case_to_name(DW_TAG_, label); - case_to_name(DW_TAG_, lexical_block); - case_to_name(DW_TAG_, member); - case_to_name(DW_TAG_, pointer_type); - case_to_name(DW_TAG_, reference_type); - case_to_name(DW_TAG_, compile_unit); - case_to_name(DW_TAG_, string_type); - case_to_name(DW_TAG_, structure_type); - case_to_name(DW_TAG_, subroutine_type); - case_to_name(DW_TAG_, typedef); - case_to_name(DW_TAG_, union_type); - case_to_name(DW_TAG_, unspecified_parameters); - case_to_name(DW_TAG_, variant); - case_to_name(DW_TAG_, common_block); - case_to_name(DW_TAG_, common_inclusion); - case_to_name(DW_TAG_, inheritance); - case_to_name(DW_TAG_, inlined_subroutine); - case_to_name(DW_TAG_, module); - case_to_name(DW_TAG_, ptr_to_member_type); - case_to_name(DW_TAG_, set_type); - case_to_name(DW_TAG_, subrange_type); - case_to_name(DW_TAG_, with_stmt); - case_to_name(DW_TAG_, access_declaration); - case_to_name(DW_TAG_, base_type); - case_to_name(DW_TAG_, catch_block); - case_to_name(DW_TAG_, const_type); - case_to_name(DW_TAG_, constant); - case_to_name(DW_TAG_, enumerator); - case_to_name(DW_TAG_, file_type); - case_to_name(DW_TAG_, friend); - case_to_name(DW_TAG_, namelist); - case_to_name(DW_TAG_, namelist_item); - case_to_name(DW_TAG_, packed_type); - case_to_name(DW_TAG_, subprogram); - case_to_name(DW_TAG_, template_type_parameter); - case_to_name(DW_TAG_, template_value_parameter); - case_to_name(DW_TAG_, thrown_type); - case_to_name(DW_TAG_, try_block); - case_to_name(DW_TAG_, variant_part); - case_to_name(DW_TAG_, variable); - case_to_name(DW_TAG_, volatile_type); - case_to_name(DW_TAG_, dwarf_procedure); - case_to_name(DW_TAG_, restrict_type); - case_to_name(DW_TAG_, interface_type); - case_to_name(DW_TAG_, namespace); - case_to_name(DW_TAG_, imported_module); - case_to_name(DW_TAG_, unspecified_type); - case_to_name(DW_TAG_, partial_unit); - case_to_name(DW_TAG_, imported_unit); - case_to_name(DW_TAG_, condition); - case_to_name(DW_TAG_, shared_type); - case_to_name(DW_TAG_, type_unit); - case_to_name(DW_TAG_, rvalue_reference_type); - case_to_name(DW_TAG_, template_alias); - case_to_name(DW_TAG_, coarray_type); - case_to_name(DW_TAG_, generic_subrange); - case_to_name(DW_TAG_, dynamic_type); - case_to_name(DW_TAG_, atomic_type); - case_to_name(DW_TAG_, call_site); - case_to_name(DW_TAG_, call_site_parameter); - case_to_name(DW_TAG_, skeleton_unit); - case_to_name(DW_TAG_, immutable_type); - case_to_name(DW_TAG_, lo_user); - case_to_name(DW_TAG_, hi_user); - } -} - -typedef enum DwarfAttribute : u16 -{ - DW_AT_sibling = 0x01, // reference - DW_AT_location = 0x02, // exprloc, loclist - DW_AT_name = 0x03, // string - DW_AT_ordering = 0x09, // constant - DW_AT_byte_size = 0x0b, // constant, exprloc, reference - DW_AT_bit_size = 0x0d, // constant, exprloc, reference - DW_AT_stmt_list = 0x10, // lineptr - DW_AT_low_pc = 0x11, // address - DW_AT_high_pc = 0x12, // address, constant - DW_AT_language = 0x13, // constant - DW_AT_discr = 0x15, //reference - DW_AT_discr_value = 0x16, // constant - DW_AT_visibility = 0x17, // constant - DW_AT_import = 0x18, // reference - DW_AT_string_length = 0x19, // exprloc, loclist, reference - DW_AT_common_reference = 0x1a, // reference - DW_AT_comp_dir = 0x1b, // string - DW_AT_const_value = 0x1c, // block, constant, string - DW_AT_containing_type = 0x1d, // reference - DW_AT_default_value = 0x1e, // constant, reference, flag - DW_AT_inline = 0x20, // constant - DW_AT_is_optional = 0x21, // flag - DW_AT_lower_bound = 0x22, // constant, exprloc, reference - DW_AT_producer = 0x25, // string - DW_AT_prototyped = 0x27, // flag - DW_AT_return_addr = 0x2a, // exprloc, loclist - DW_AT_start_scope = 0x2c, // constant, rnglist - DW_AT_bit_stride = 0x2e, // constant, exprloc, reference - DW_AT_upper_bound = 0x2f, // constant, exprloc, reference - DW_AT_abstract_origin = 0x31, // reference - DW_AT_accessibility = 0x32, // constant - DW_AT_address_class = 0x33, // constant - DW_AT_artificial = 0x34, // flag - DW_AT_base_types = 0x35, // reference - DW_AT_calling_convention = 0x36, // constant - DW_AT_count = 0x37, // constant, exprloc, reference - DW_AT_data_member_location = 0x38, // constant, exprloc, loclist - DW_AT_decl_column = 0x39, // constant - DW_AT_decl_file = 0x3a, // constant - DW_AT_decl_line = 0x3b, // constant - DW_AT_declaration = 0x3c, // flag - DW_AT_discr_list = 0x3d, // block - DW_AT_encoding = 0x3e, // constant - DW_AT_external = 0x3f, // flag - DW_AT_frame_base = 0x40, // exprloc, loclist - DW_AT_friend = 0x41, // reference - DW_AT_identifier_case = 0x42, // constant - Reserved = 0x433, // macptr - DW_AT_namelist_item = 0x44, // reference - DW_AT_priority = 0x45, // reference - DW_AT_segment = 0x46, // exprloc, loclist - DW_AT_specification = 0x47, // reference - DW_AT_static_link = 0x48, // exprloc, loclist - DW_AT_type = 0x49, // reference - DW_AT_use_location = 0x4a, // exprloc, loclist - DW_AT_variable_parameter = 0x4b, //flag - DW_AT_virtuality = 0x4c, // constant - DW_AT_vtable_elem_location = 0x4d, // exprloc, loclist - DW_AT_allocated = 0x4e, // constant, exprloc, reference - DW_AT_associated = 0x4f, // constant, exprloc, reference - DW_AT_data_location = 0x50, // exprloc - DW_AT_byte_stride = 0x51, // constant, exprloc, reference - DW_AT_entry_pc = 0x52, // address, constant - DW_AT_use_UTF8 = 0x53, // flag - DW_AT_extension = 0x54, // reference - DW_AT_ranges = 0x55, // rnglist - DW_AT_trampoline = 0x56, // address, flag, reference, string - DW_AT_call_column = 0x57, // constant - DW_AT_call_file = 0x58, // constant - DW_AT_call_line = 0x59, // constant - DW_AT_description = 0x5a, // string - DW_AT_binary_scale = 0x5b, // constant - DW_AT_decimal_scale = 0x5c, // constant - DW_AT_small = 0x5d, // reference - DW_AT_decimal_sign = 0x5e, // constant - DW_AT_digit_count = 0x5f, // constant - DW_AT_picture_string = 0x60, // string - DW_AT_mutable = 0x61, // flag - DW_AT_threads_scaled = 0x62, // flag - DW_AT_explicit = 0x63, // flag - DW_AT_object_pointer = 0x64, // reference - DW_AT_endianity = 0x65, // constant - DW_AT_elemental = 0x66, // flag - DW_AT_pure = 0x67, // flag - DW_AT_recursive = 0x68, // flag - DW_AT_signature = 0x69, // reference - DW_AT_main_subprogram = 0x6a, // flag - DW_AT_data_bit_offset = 0x6b, // constant - DW_AT_const_expr = 0x6c, // flag - DW_AT_enum_class = 0x6d, // flag - DW_AT_linkage_name = 0x6e, // string - DW_AT_string_length_bit_size = 0x6f, //constant - DW_AT_string_length_byte_size = 0x70, //constant - DW_AT_rank = 0x71, //constant, exprloc - DW_AT_str_offsets_base = 0x72, //stroffsetsptr - DW_AT_addr_base = 0x73, //addrptr - DW_AT_rnglists_base = 0x74, //rnglistsptr - DW_AT_dwo_name = 0x76, //string - DW_AT_reference = 0x77, //flag - DW_AT_rvalue_reference = 0x78, //flag - DW_AT_macros = 0x79, //macptr - DW_AT_call_all_calls = 0x7a, //flag - DW_AT_call_all_source_calls = 0x7b, //flag - DW_AT_call_all_tail_calls = 0x7c, //flag - DW_AT_call_return_pc = 0x7d, //address - DW_AT_call_value = 0x7e, //exprloc - DW_AT_call_origin = 0x7f, //exprloc - DW_AT_call_parameter = 0x80, //reference - DW_AT_call_pc = 0x81, //address - DW_AT_call_tail_call = 0x82, //flag - DW_AT_call_target = 0x83, //exprloc - DW_AT_call_target_clobbered = 0x84, //exprloc - DW_AT_call_data_location = 0x85, //exprloc - DW_AT_call_data_value = 0x86, //exprloc - DW_AT_noreturn = 0x87, //flag - DW_AT_alignment = 0x88, //constant - DW_AT_export_symbols = 0x89, //flag - DW_AT_deleted = 0x8a, //flag - DW_AT_defaulted = 0x8b, //constant - DW_AT_loclists_base = 0x8c, //loclistsptr - DW_AT_lo_user = 0x2000, - DW_AT_hi_user = 0x3fff, -} DwarfAttribute; - -String dwarf_attribute_to_string(DwarfAttribute attribute) -{ - switch (attribute) - { - case_to_name(DW_AT_, sibling); - case_to_name(DW_AT_, location); - case_to_name(DW_AT_, name); - case_to_name(DW_AT_, ordering); - case_to_name(DW_AT_, byte_size); - case_to_name(DW_AT_, bit_size); - case_to_name(DW_AT_, stmt_list); - case_to_name(DW_AT_, low_pc); - case_to_name(DW_AT_, high_pc); - case_to_name(DW_AT_, language); - case_to_name(DW_AT_, discr); - case_to_name(DW_AT_, discr_value); - case_to_name(DW_AT_, visibility); - case_to_name(DW_AT_, import); - case_to_name(DW_AT_, string_length); - case_to_name(DW_AT_, common_reference); - case_to_name(DW_AT_, comp_dir); - case_to_name(DW_AT_, const_value); - case_to_name(DW_AT_, containing_type); - case_to_name(DW_AT_, default_value); - case_to_name(DW_AT_, inline); - case_to_name(DW_AT_, is_optional); - case_to_name(DW_AT_, lower_bound); - case_to_name(DW_AT_, producer); - case_to_name(DW_AT_, prototyped); - case_to_name(DW_AT_, return_addr); - case_to_name(DW_AT_, start_scope); - case_to_name(DW_AT_, bit_stride); - case_to_name(DW_AT_, upper_bound); - case_to_name(DW_AT_, abstract_origin); - case_to_name(DW_AT_, accessibility); - case_to_name(DW_AT_, address_class); - case_to_name(DW_AT_, artificial); - case_to_name(DW_AT_, base_types); - case_to_name(DW_AT_, calling_convention); - case_to_name(DW_AT_, count); - case_to_name(DW_AT_, data_member_location); - case_to_name(DW_AT_, decl_column); - case_to_name(DW_AT_, decl_file); - case_to_name(DW_AT_, decl_line); - case_to_name(DW_AT_, declaration); - case_to_name(DW_AT_, discr_list); - case_to_name(DW_AT_, encoding); - case_to_name(DW_AT_, external); - case_to_name(DW_AT_, frame_base); - case_to_name(DW_AT_, friend); - case_to_name(DW_AT_, identifier_case); - case_to_name(Reserv, ed); - case_to_name(DW_AT_, namelist_item); - case_to_name(DW_AT_, priority); - case_to_name(DW_AT_, segment); - case_to_name(DW_AT_, specification); - case_to_name(DW_AT_, static_link); - case_to_name(DW_AT_, type); - case_to_name(DW_AT_, use_location); - case_to_name(DW_AT_, variable_parameter); - case_to_name(DW_AT_, virtuality); - case_to_name(DW_AT_, vtable_elem_location); - case_to_name(DW_AT_, allocated); - case_to_name(DW_AT_, associated); - case_to_name(DW_AT_, data_location); - case_to_name(DW_AT_, byte_stride); - case_to_name(DW_AT_, entry_pc); - case_to_name(DW_AT_, use_UTF8); - case_to_name(DW_AT_, extension); - case_to_name(DW_AT_, ranges); - case_to_name(DW_AT_, trampoline); - case_to_name(DW_AT_, call_column); - case_to_name(DW_AT_, call_file); - case_to_name(DW_AT_, call_line); - case_to_name(DW_AT_, description); - case_to_name(DW_AT_, binary_scale); - case_to_name(DW_AT_, decimal_scale); - case_to_name(DW_AT_, small); - case_to_name(DW_AT_, decimal_sign); - case_to_name(DW_AT_, digit_count); - case_to_name(DW_AT_, picture_string); - case_to_name(DW_AT_, mutable); - case_to_name(DW_AT_, threads_scaled); - case_to_name(DW_AT_, explicit); - case_to_name(DW_AT_, object_pointer); - case_to_name(DW_AT_, endianity); - case_to_name(DW_AT_, elemental); - case_to_name(DW_AT_, pure); - case_to_name(DW_AT_, recursive); - case_to_name(DW_AT_, signature); - case_to_name(DW_AT_, main_subprogram); - case_to_name(DW_AT_, data_bit_offset); - case_to_name(DW_AT_, const_expr); - case_to_name(DW_AT_, enum_class); - case_to_name(DW_AT_, linkage_name); - case_to_name(DW_AT_, string_length_bit_size); - case_to_name(DW_AT_, string_length_byte_size); - case_to_name(DW_AT_, rank); - case_to_name(DW_AT_, str_offsets_base); - case_to_name(DW_AT_, addr_base); - case_to_name(DW_AT_, rnglists_base); - case_to_name(DW_AT_, dwo_name); - case_to_name(DW_AT_, reference); - case_to_name(DW_AT_, rvalue_reference); - case_to_name(DW_AT_, macros); - case_to_name(DW_AT_, call_all_calls); - case_to_name(DW_AT_, call_all_source_calls); - case_to_name(DW_AT_, call_all_tail_calls); - case_to_name(DW_AT_, call_return_pc); - case_to_name(DW_AT_, call_value); - case_to_name(DW_AT_, call_origin); - case_to_name(DW_AT_, call_parameter); - case_to_name(DW_AT_, call_pc); - case_to_name(DW_AT_, call_tail_call); - case_to_name(DW_AT_, call_target); - case_to_name(DW_AT_, call_target_clobbered); - case_to_name(DW_AT_, call_data_location); - case_to_name(DW_AT_, call_data_value); - case_to_name(DW_AT_, noreturn); - case_to_name(DW_AT_, alignment); - case_to_name(DW_AT_, export_symbols); - case_to_name(DW_AT_, deleted); - case_to_name(DW_AT_, defaulted); - case_to_name(DW_AT_, loclists_base); - case_to_name(DW_AT_, lo_user); - case_to_name(DW_AT_, hi_user); - } -} - -typedef enum DwarfForm : u8 -{ - DW_FORM_addr = 0x01, // address - DW_FORM_block2 = 0x03, // block - DW_FORM_block4 = 0x04, // block - DW_FORM_data2 = 0x05, // constant - DW_FORM_data4 = 0x06, // constant - DW_FORM_data8 = 0x07, // constant - DW_FORM_string = 0x08, // string - DW_FORM_block = 0x09, // block - DW_FORM_block1 = 0x0a, // block - DW_FORM_data1 = 0x0b, // constant - DW_FORM_flag = 0x0c, // flag - DW_FORM_sdata = 0x0d, // constant - DW_FORM_strp = 0x0e, // string - DW_FORM_udata = 0x0f, // constant - DW_FORM_ref_addr = 0x10, // reference - DW_FORM_ref1 = 0x11, // reference - DW_FORM_ref2 = 0x12, // reference - DW_FORM_ref4 = 0x13, // reference - DW_FORM_ref8 = 0x14, // reference - DW_FORM_ref_udata = 0x15, // reference - DW_FORM_indirect = 0x16, // (see Section 7.5.3 on page 203) - DW_FORM_sec_offset = 0x17, // addrptr, lineptr, loclist, loclistsptr, macptr, rnglist, rnglistsptr, stroffsetsptr - DW_FORM_exprloc = 0x18, // exprloc - DW_FORM_flag_present = 0x19, // flag - DW_FORM_strx = 0x1a, // string - DW_FORM_addrx = 0x1b, // address - DW_FORM_ref_sup4 = 0x1c, // reference - DW_FORM_strp_sup = 0x1d, // string - DW_FORM_data16 = 0x1e, // constant - DW_FORM_line_strp = 0x1f, // string - DW_FORM_ref_sig8 = 0x20, // reference - DW_FORM_implicit_const = 0x21, // constant - DW_FORM_loclistx = 0x22, // loclist - DW_FORM_rnglistx = 0x23, // rnglist - DW_FORM_ref_sup8 = 0x24, // reference - DW_FORM_strx1 = 0x25, // string - DW_FORM_strx2 = 0x26, // string - DW_FORM_strx3 = 0x27, // string - DW_FORM_strx4 = 0x28, // string - DW_FORM_addrx1 = 0x29, // address - DW_FORM_addrx2 = 0x2a, // address - DW_FORM_addrx3 = 0x2b, // address - DW_FORM_addrx4 = 0x2c, // address -} DwarfForm; - -fn String dwarf_form_to_string(DwarfForm form) -{ - switch (form) - { - case_to_name(DW_FORM_, addr); - case_to_name(DW_FORM_, block2); - case_to_name(DW_FORM_, block4); - case_to_name(DW_FORM_, data2); - case_to_name(DW_FORM_, data4); - case_to_name(DW_FORM_, data8); - case_to_name(DW_FORM_, string); - case_to_name(DW_FORM_, block); - case_to_name(DW_FORM_, block1); - case_to_name(DW_FORM_, data1); - case_to_name(DW_FORM_, flag); - case_to_name(DW_FORM_, sdata); - case_to_name(DW_FORM_, strp); - case_to_name(DW_FORM_, udata); - case_to_name(DW_FORM_, ref_addr); - case_to_name(DW_FORM_, ref1); - case_to_name(DW_FORM_, ref2); - case_to_name(DW_FORM_, ref4); - case_to_name(DW_FORM_, ref8); - case_to_name(DW_FORM_, ref_udata); - case_to_name(DW_FORM_, indirect); - case_to_name(DW_FORM_, sec_offset); - case_to_name(DW_FORM_, exprloc); - case_to_name(DW_FORM_, flag_present); - case_to_name(DW_FORM_, strx); - case_to_name(DW_FORM_, addrx); - case_to_name(DW_FORM_, ref_sup4); - case_to_name(DW_FORM_, strp_sup); - case_to_name(DW_FORM_, data16); - case_to_name(DW_FORM_, line_strp); - case_to_name(DW_FORM_, ref_sig8); - case_to_name(DW_FORM_, implicit_const); - case_to_name(DW_FORM_, loclistx); - case_to_name(DW_FORM_, rnglistx); - case_to_name(DW_FORM_, ref_sup8); - case_to_name(DW_FORM_, strx1); - case_to_name(DW_FORM_, strx2); - case_to_name(DW_FORM_, strx3); - case_to_name(DW_FORM_, strx4); - case_to_name(DW_FORM_, addrx1); - case_to_name(DW_FORM_, addrx2); - case_to_name(DW_FORM_, addrx3); - case_to_name(DW_FORM_, addrx4); - } -} - -typedef enum DwarfUnitType : u8 -{ - DW_UT_compile = 0x01, - DW_UT_type = 0x02, - DW_UT_partial = 0x03, - DW_UT_skeleton = 0x04, - DW_UT_split_compile = 0x05, - DW_UT_split_type = 0x06, - DW_UT_lo_user = 0x80, - DW_UT_hi_user = 0xff, -} DwarfUnitType; - -typedef enum DwarfLanguage : u16 -{ - DW_LANG_C11 = 0x001d, -} DwarfLanguage; - -typedef enum DwarfOperation : u8 -{ - DW_OP_addr = 0x03, // Operands: 1 - DW_OP_deref = 0x06, // Operands: 0 - DW_OP_const1u = 0x08, // Operands: 1 - DW_OP_const1s = 0x09, // Operands: 1 - DW_OP_const2u = 0x0a, // Operands: 1 - DW_OP_const2s = 0x0b, // Operands: 1 - DW_OP_const4u = 0x0c, // Operands: 1 - DW_OP_const4s = 0x0d, // Operands: 1 - DW_OP_const8u = 0x0e, // Operands: 1 - DW_OP_const8s = 0x0f, // Operands: 1 - DW_OP_constu = 0x10, // Operands: 1, uleb128 - DW_OP_consts = 0x11, // Operands: 1 sleb128 - DW_OP_dup = 0x12, // Operands: 0 - DW_OP_drop = 0x13, // Operands: 0 - DW_OP_over = 0x14, // Operands: 0 - DW_OP_pick = 0x15, // Operands: 1, 1-byte stack index - DW_OP_swap = 0x16, // Operands: 0 - DW_OP_rot = 0x17, // Operands: 0 - DW_OP_xderef = 0x18, // Operands: 0 - DW_OP_abs = 0x19, // Operands: 0 - DW_OP_and = 0x1a , // Operands: 0 - DW_OP_div = 0x1b, // Operands: 0 - DW_OP_minus = 0x1c, // Operands: 0 - DW_OP_mod = 0x1d, // Operands: 0 - DW_OP_mul = 0x1e, // Operands: 0 - DW_OP_neg = 0x1f, // Operands: 0 - DW_OP_not = 0x20, // Operands: 0 - DW_OP_or = 0x21, // Operands: 0 - DW_OP_plus = 0x22, // Operands: 0 - DW_OP_plus_uconst = 0x23, // Operands: 1, ULEB128 addend - DW_OP_shl = 0x24, // Operands: 0 - DW_OP_shr = 0x25, // Operands: 0 - DW_OP_shra = 0x26, // Operands: 0 - DW_OP_xor = 0x27, // Operands: 0 - DW_OP_bra = 0x28, // Operands: 1, signed 2-byte constant - DW_OP_eq = 0x29, // Operands: 0 - DW_OP_ge = 0x2a, // Operands: 0 - DW_OP_gt = 0x2b, // Operands: 0 - DW_OP_le = 0x2c, // Operands: 0 - DW_OP_lt = 0x2d, // Operands: 0 - DW_OP_ne = 0x2e, // Operands: 0 - DW_OP_skip = 0x2f, // Operands: 1, signed 2-byte constant - DW_OP_lit0 = 0x30, // Operands: 0 - DW_OP_lit1 = 0x31, // Operands: 0 - DW_OP_lit2 = 0x32, // Operands: 0 - DW_OP_lit3 = 0x33, // Operands: 0 - DW_OP_lit4 = 0x34, // Operands: 0 - DW_OP_lit5 = 0x35, // Operands: 0 - DW_OP_lit6 = 0x36, // Operands: 0 - DW_OP_lit7 = 0x37, // Operands: 0 - DW_OP_lit8 = 0x38, // Operands: 0 - DW_OP_lit9 = 0x39, // Operands: 0 - DW_OP_lit10 = 0x3a, // Operands: 0 - DW_OP_lit11 = 0x3b, // Operands: 0 - DW_OP_lit12 = 0x3c, // Operands: 0 - DW_OP_lit13 = 0x3d, // Operands: 0 - DW_OP_lit14 = 0x3e, // Operands: 0 - DW_OP_lit15 = 0x3f, // Operands: 0 - DW_OP_lit16 = 0x40, // Operands: 0 - DW_OP_lit17 = 0x41, // Operands: 0 - DW_OP_lit18 = 0x42, // Operands: 0 - DW_OP_lit19 = 0x43, // Operands: 0 - DW_OP_lit20 = 0x44, // Operands: 0 - DW_OP_lit21 = 0x45, // Operands: 0 - DW_OP_lit22 = 0x46, // Operands: 0 - DW_OP_lit23 = 0x47, // Operands: 0 - DW_OP_lit24 = 0x48, // Operands: 0 - DW_OP_lit25 = 0x49, // Operands: 0 - DW_OP_lit26 = 0x4a, // Operands: 0 - DW_OP_lit27 = 0x4b, // Operands: 0 - DW_OP_lit28 = 0x4c, // Operands: 0 - DW_OP_lit29 = 0x4d, // Operands: 0 - DW_OP_lit30 = 0x4e, // Operands: 0 - DW_OP_lit31 = 0x4f, // Operands: 0 - DW_OP_reg0 = 0x50, // Operands: 0 - DW_OP_reg1 = 0x51, // Operands: 0 - DW_OP_reg2 = 0x52, // Operands: 0 - DW_OP_reg3 = 0x53, // Operands: 0 - DW_OP_reg4 = 0x54, // Operands: 0 - DW_OP_reg5 = 0x55, // Operands: 0 - DW_OP_reg6 = 0x56, // Operands: 0 - DW_OP_reg7 = 0x57, // Operands: 0 - DW_OP_reg8 = 0x58, // Operands: 0 - DW_OP_reg9 = 0x59, // Operands: 0 - DW_OP_reg10 = 0x5a, // Operands: 0 - DW_OP_reg11 = 0x5b, // Operands: 0 - DW_OP_reg12 = 0x5c, // Operands: 0 - DW_OP_reg13 = 0x5d, // Operands: 0 - DW_OP_reg14 = 0x5e, // Operands: 0 - DW_OP_reg15 = 0x5f, // Operands: 0 - DW_OP_reg16 = 0x60, // Operands: 0 - DW_OP_reg17 = 0x61, // Operands: 0 - DW_OP_reg18 = 0x62, // Operands: 0 - DW_OP_reg19 = 0x63, // Operands: 0 - DW_OP_reg20 = 0x64, // Operands: 0 - DW_OP_reg21 = 0x65, // Operands: 0 - DW_OP_reg22 = 0x66, // Operands: 0 - DW_OP_reg23 = 0x67, // Operands: 0 - DW_OP_reg24 = 0x68, // Operands: 0 - DW_OP_reg25 = 0x69, // Operands: 0 - DW_OP_reg26 = 0x6a, // Operands: 0 - DW_OP_reg27 = 0x6b, // Operands: 0 - DW_OP_reg28 = 0x6c, // Operands: 0 - DW_OP_reg29 = 0x6d, // Operands: 0 - DW_OP_reg30 = 0x6e, // Operands: 0 - DW_OP_reg31 = 0x6f, // Operands: 0 - DW_OP_breg0 = 0x70, // Operands: 1, SLEB128 offset - DW_OP_breg1 = 0x71, // Operands: 1, SLEB128 offset - DW_OP_breg2 = 0x72, // Operands: 1, SLEB128 offset - DW_OP_breg3 = 0x73, // Operands: 1, SLEB128 offset - DW_OP_breg4 = 0x74, // Operands: 1, SLEB128 offset - DW_OP_breg5 = 0x75, // Operands: 1, SLEB128 offset - DW_OP_breg6 = 0x76, // Operands: 1, SLEB128 offset - DW_OP_breg7 = 0x77, // Operands: 1, SLEB128 offset - DW_OP_breg8 = 0x78, // Operands: 1, SLEB128 offset - DW_OP_breg9 = 0x79, // Operands: 1, SLEB128 offset - DW_OP_breg10 = 0x7a, // Operands: 1, SLEB128 offset - DW_OP_breg11 = 0x7b, // Operands: 1, SLEB128 offset - DW_OP_breg12 = 0x7c, // Operands: 1, SLEB128 offset - DW_OP_breg13 = 0x7d, // Operands: 1, SLEB128 offset - DW_OP_breg14 = 0x7e, // Operands: 1, SLEB128 offset - DW_OP_breg15 = 0x7f, // Operands: 1, SLEB128 offset - DW_OP_breg16 = 0x80, // Operands: 1, SLEB128 offset - DW_OP_breg17 = 0x81, // Operands: 1, SLEB128 offset - DW_OP_breg18 = 0x82, // Operands: 1, SLEB128 offset - DW_OP_breg19 = 0x83, // Operands: 1, SLEB128 offset - DW_OP_breg20 = 0x84, // Operands: 1, SLEB128 offset - DW_OP_breg21 = 0x85, // Operands: 1, SLEB128 offset - DW_OP_breg22 = 0x86, // Operands: 1, SLEB128 offset - DW_OP_breg23 = 0x87, // Operands: 1, SLEB128 offset - DW_OP_breg24 = 0x88, // Operands: 1, SLEB128 offset - DW_OP_breg25 = 0x89, // Operands: 1, SLEB128 offset - DW_OP_breg26 = 0x8a, // Operands: 1, SLEB128 offset - DW_OP_breg27 = 0x8b, // Operands: 1, SLEB128 offset - DW_OP_breg28 = 0x8c, // Operands: 1, SLEB128 offset - DW_OP_breg29 = 0x8d, // Operands: 1, SLEB128 offset - DW_OP_breg30 = 0x8e, // Operands: 1, SLEB128 offset - DW_OP_breg31 = 0x8f, // Operands: 1, SLEB128 offset - DW_OP_regx = 0x90, // Operands: 1, ULEB128 register - DW_OP_fbreg = 0x91, // Operands: 1, SLEB128 offset - DW_OP_bregx = 0x92, // Operands: 2 ULEB128 register, SLEB128 offset - DW_OP_piece = 0x93, // Operands: 1, ULEB128 size of piece - DW_OP_deref_size = 0x94, // Operands: 1, 1-byte size of data retrieved - DW_OP_xderef_size = 0x95, // Operands: 1, 1-byte size of data retrieved - DW_OP_nop = 0x96, // Operands: 0 - DW_OP_push_object_address = 0x97, // Operands: 0 - DW_OP_call2 = 0x98, // Operands: 1, 2-byte offset of DIE - DW_OP_call4 = 0x99, // Operands: 1, 4-byte offset of DIE - DW_OP_call_ref = 0x9a, // Operands: 1, 4- or 8-byte offset of DIE - DW_OP_form_tls_address = 0x9b, // Operands: 0 - DW_OP_call_frame_cfa = 0x9c, // Operands: 0 - DW_OP_bit_piece = 0x9d, // Operands: 2, ULEB128 size, ULEB128 offset - DW_OP_implicit_value = 0x9e, // Operands: 2, ULEB128 size, block of that size - DW_OP_stack_value = 0x9f, // Operands: 0 - DW_OP_implicit_pointer = 0xa0, // Operands: 2, 4- or 8-byte offset of DIE, SLEB128 constant offset - DW_OP_addrx = 0xa1, // Operands: 1, ULEB128 indirect address - DW_OP_constx = 0xa2, // Operands: 1, ULEB128 indirect constant - DW_OP_entry_value = 0xa3, // Operands: 2, ULEB128 size, block of that size - DW_OP_const_type = 0xa4, // Operands: 3, ULEB128 type entry offset, 1-byte size, constant value - DW_OP_regval_type = 0xa5, // Operands: 2, ULEB128 register number, ULEB128 constant offset - DW_OP_deref_type = 0xa6, // Operands: 2, 1-byte size, ULEB128 type entry offset - DW_OP_xderef_type = 0xa7, // Operands: 2, 1-byte size, ULEB128 type entry offset - DW_OP_convert = 0xa8, // Operands: 1, ULEB128 type entry offset - DW_OP_reinterpret = 0xa9, // Operands: 1, ULEB128 type entry offset - DW_OP_lo_user = 0xe0, - DW_OP_hi_user = 0xff, -} DwarfOperation; - -typedef enum DwarfCallFrame : u8 -{ - // High 2 Low 6 - // Instruction Bits Bits Operand 1 Operand 2 - // DW_CFA_advance_loc 0x1 delta - // DW_CFA_offset 0x2 register ULEB128 offset - // DW_CFA_restore 0x3 register - DW_CFA_nop = 0x00, - DW_CFA_set_loc = 0x01, // address - DW_CFA_advance_loc1 = 0x02, // 1-byte delta - DW_CFA_advance_loc2 = 0x03, // 2-byte delta - DW_CFA_advance_loc4 = 0x04, // 4-byte delta - DW_CFA_offset_extended = 0x05, // ULEB128 register ULEB128 offset - DW_CFA_restore_extended = 0x06, // ULEB128 register - DW_CFA_undefined = 0x07, // ULEB128 register - DW_CFA_same_value = 0x08, // ULEB128 register - DW_CFA_register = 0x09, // ULEB128 register ULEB128 offset - DW_CFA_remember_state = 0x0a, - DW_CFA_restore_state = 0x0b, - DW_CFA_def_cfa = 0x0c, // ULEB128 register ULEB128 offset - DW_CFA_def_cfa_register = 0x0d, // ULEB128 register - DW_CFA_def_cfa_offset = 0x0e, // ULEB128 offset - DW_CFA_def_cfa_expression = 0x0f, // BLOCK - DW_CFA_expression = 0x10, // ULEB128 register BLOCK - DW_CFA_offset_extended_sf = 0x11, // ULEB128 register SLEB128 offset - DW_CFA_def_cfa_sf = 0x12, // ULEB128 register SLEB128 offset - DW_CFA_def_cfa_offset_sf = 0x13, // SLEB128 offset - DW_CFA_val_offset = 0x14, // ULEB128 ULEB128 - DW_CFA_val_offset_sf = 0x15, // ULEB128 SLEB128 - DW_CFA_val_expression = 0x16, // ULEB128 BLOCK - DW_CFA_lo_user = 0x1c, - DW_CFA_hi_user -} DwarfCallFrame; - -String dwarf_operation_to_string(DwarfOperation operation) -{ - switch (operation) - { - case_to_name(DW_OP_, addr); - case_to_name(DW_OP_, deref); - case_to_name(DW_OP_, const1u); - case_to_name(DW_OP_, const1s); - case_to_name(DW_OP_, const2u); - case_to_name(DW_OP_, const2s); - case_to_name(DW_OP_, const4u); - case_to_name(DW_OP_, const4s); - case_to_name(DW_OP_, const8u); - case_to_name(DW_OP_, const8s); - case_to_name(DW_OP_, constu); - case_to_name(DW_OP_, consts); - case_to_name(DW_OP_, dup); - case_to_name(DW_OP_, drop); - case_to_name(DW_OP_, over); - case_to_name(DW_OP_, pick); - case_to_name(DW_OP_, swap); - case_to_name(DW_OP_, rot); - case_to_name(DW_OP_, xderef); - case_to_name(DW_OP_, abs); - case_to_name(DW_OP_, and); - case_to_name(DW_OP_, div); - case_to_name(DW_OP_, minus); - case_to_name(DW_OP_, mod); - case_to_name(DW_OP_, mul); - case_to_name(DW_OP_, neg); - case_to_name(DW_OP_, not); - case_to_name(DW_OP_, or); - case_to_name(DW_OP_, plus); - case_to_name(DW_OP_, plus_uconst); - case_to_name(DW_OP_, shl); - case_to_name(DW_OP_, shr); - case_to_name(DW_OP_, shra); - case_to_name(DW_OP_, xor); - case_to_name(DW_OP_, bra); - case_to_name(DW_OP_, eq); - case_to_name(DW_OP_, ge); - case_to_name(DW_OP_, gt); - case_to_name(DW_OP_, le); - case_to_name(DW_OP_, lt); - case_to_name(DW_OP_, ne); - case_to_name(DW_OP_, skip); - case_to_name(DW_OP_, lit0); - case_to_name(DW_OP_, lit1); - case_to_name(DW_OP_, lit2); - case_to_name(DW_OP_, lit3); - case_to_name(DW_OP_, lit4); - case_to_name(DW_OP_, lit5); - case_to_name(DW_OP_, lit6); - case_to_name(DW_OP_, lit7); - case_to_name(DW_OP_, lit8); - case_to_name(DW_OP_, lit9); - case_to_name(DW_OP_, lit10); - case_to_name(DW_OP_, lit11); - case_to_name(DW_OP_, lit12); - case_to_name(DW_OP_, lit13); - case_to_name(DW_OP_, lit14); - case_to_name(DW_OP_, lit15); - case_to_name(DW_OP_, lit16); - case_to_name(DW_OP_, lit17); - case_to_name(DW_OP_, lit18); - case_to_name(DW_OP_, lit19); - case_to_name(DW_OP_, lit20); - case_to_name(DW_OP_, lit21); - case_to_name(DW_OP_, lit22); - case_to_name(DW_OP_, lit23); - case_to_name(DW_OP_, lit24); - case_to_name(DW_OP_, lit25); - case_to_name(DW_OP_, lit26); - case_to_name(DW_OP_, lit27); - case_to_name(DW_OP_, lit28); - case_to_name(DW_OP_, lit29); - case_to_name(DW_OP_, lit30); - case_to_name(DW_OP_, lit31); - case_to_name(DW_OP_, reg0); - case_to_name(DW_OP_, reg1); - case_to_name(DW_OP_, reg2); - case_to_name(DW_OP_, reg3); - case_to_name(DW_OP_, reg4); - case_to_name(DW_OP_, reg5); - case_to_name(DW_OP_, reg6); - case_to_name(DW_OP_, reg7); - case_to_name(DW_OP_, reg8); - case_to_name(DW_OP_, reg9); - case_to_name(DW_OP_, reg10); - case_to_name(DW_OP_, reg11); - case_to_name(DW_OP_, reg12); - case_to_name(DW_OP_, reg13); - case_to_name(DW_OP_, reg14); - case_to_name(DW_OP_, reg15); - case_to_name(DW_OP_, reg16); - case_to_name(DW_OP_, reg17); - case_to_name(DW_OP_, reg18); - case_to_name(DW_OP_, reg19); - case_to_name(DW_OP_, reg20); - case_to_name(DW_OP_, reg21); - case_to_name(DW_OP_, reg22); - case_to_name(DW_OP_, reg23); - case_to_name(DW_OP_, reg24); - case_to_name(DW_OP_, reg25); - case_to_name(DW_OP_, reg26); - case_to_name(DW_OP_, reg27); - case_to_name(DW_OP_, reg28); - case_to_name(DW_OP_, reg29); - case_to_name(DW_OP_, reg30); - case_to_name(DW_OP_, reg31); - case_to_name(DW_OP_, breg0); - case_to_name(DW_OP_, breg1); - case_to_name(DW_OP_, breg2); - case_to_name(DW_OP_, breg3); - case_to_name(DW_OP_, breg4); - case_to_name(DW_OP_, breg5); - case_to_name(DW_OP_, breg6); - case_to_name(DW_OP_, breg7); - case_to_name(DW_OP_, breg8); - case_to_name(DW_OP_, breg9); - case_to_name(DW_OP_, breg10); - case_to_name(DW_OP_, breg11); - case_to_name(DW_OP_, breg12); - case_to_name(DW_OP_, breg13); - case_to_name(DW_OP_, breg14); - case_to_name(DW_OP_, breg15); - case_to_name(DW_OP_, breg16); - case_to_name(DW_OP_, breg17); - case_to_name(DW_OP_, breg18); - case_to_name(DW_OP_, breg19); - case_to_name(DW_OP_, breg20); - case_to_name(DW_OP_, breg21); - case_to_name(DW_OP_, breg22); - case_to_name(DW_OP_, breg23); - case_to_name(DW_OP_, breg24); - case_to_name(DW_OP_, breg25); - case_to_name(DW_OP_, breg26); - case_to_name(DW_OP_, breg27); - case_to_name(DW_OP_, breg28); - case_to_name(DW_OP_, breg29); - case_to_name(DW_OP_, breg30); - case_to_name(DW_OP_, breg31); - case_to_name(DW_OP_, regx); - case_to_name(DW_OP_, fbreg); - case_to_name(DW_OP_, bregx); - case_to_name(DW_OP_, piece); - case_to_name(DW_OP_, deref_size); - case_to_name(DW_OP_, xderef_size); - case_to_name(DW_OP_, nop); - case_to_name(DW_OP_, push_object_address); - case_to_name(DW_OP_, call2); - case_to_name(DW_OP_, call4); - case_to_name(DW_OP_, call_ref); - case_to_name(DW_OP_, form_tls_address); - case_to_name(DW_OP_, call_frame_cfa); - case_to_name(DW_OP_, bit_piece); - case_to_name(DW_OP_, implicit_value); - case_to_name(DW_OP_, stack_value); - case_to_name(DW_OP_, implicit_pointer); - case_to_name(DW_OP_, addrx); - case_to_name(DW_OP_, constx); - case_to_name(DW_OP_, entry_value); - case_to_name(DW_OP_, const_type); - case_to_name(DW_OP_, regval_type); - case_to_name(DW_OP_, deref_type); - case_to_name(DW_OP_, xderef_type); - case_to_name(DW_OP_, convert); - case_to_name(DW_OP_, reinterpret); - case_to_name(DW_OP_, lo_user); - case_to_name(DW_OP_, hi_user); - } -} - -// Packing is necessary due to the last fields not completing the alignment of 4 -#pragma pack(push, 1) -STRUCT(DwarfLineHeader) -{ - u32 unit_length; - u16 version; - u8 address_size; - u8 segment_selector_size; - u32 header_length; - u8 minimum_instruction_length; - u8 maximum_operations_per_instruction; - u8 default_is_stmt; - s8 line_base; - u8 line_range; - u8 opcode_base; -}; -#pragma pack(pop) - -STRUCT(DwarfCompilationUnit) -{ - u32 length; - u16 version; - DwarfUnitType type; - u8 address_size; - u32 debug_abbreviation_offset; -}; - -STRUCT(DwarfStringOffsetsTableHeader) -{ - u32 unit_length; - u16 version; - u16 reserved; -}; - -STRUCT(DwarfAddressTableHeader) -{ - u32 unit_length; - u16 version; - u8 address_size; - u8 segment_selector_size; -}; - -typedef enum DwarfType : u8 -{ - DW_ATE_void = 0x00, - DW_ATE_address = 0x01, - DW_ATE_boolean = 0x02, - DW_ATE_complex_float = 0x03, - DW_ATE_float = 0x04, - DW_ATE_signed = 0x05, - DW_ATE_signed_char = 0x06, - DW_ATE_unsigned = 0x07, - DW_ATE_unsigned_char = 0x08, -} DwarfType; - -typedef enum TypeId : u32 -{ - // Simple types - TYPE_BOTTOM = 0, - TYPE_TOP, - TYPE_LIVE_CONTROL, - TYPE_DEAD_CONTROL, - // Not simple types - TYPE_INTEGER, - TYPE_TUPLE, - - TYPE_COUNT, -} TypeId; - -STRUCT(TypeIndex) -{ - u32 index; -}; - -#define index_equal(a, b) (a.index == b.index) -static_assert(sizeof(TypeIndex) == sizeof(u32)); -declare_slice(TypeIndex); - -STRUCT(TypeInteger) -{ - u64 constant; - u8 bit_count; - u8 is_constant; - u8 is_signed; - u8 padding1; - u32 padding; -}; -static_assert(sizeof(TypeInteger) == 16); - -STRUCT(TypeTuple) -{ - Slice(TypeIndex) types; -}; - -STRUCT(Type) -{ - Hash64 hash; - union - { - TypeInteger integer; - TypeTuple tuple; - }; - TypeId id; -}; -static_assert(offsetof(Type, hash) == 0); -decl_vb(Type); - -STRUCT(DebugTypeIndex) -{ - u32 index; -}; - -STRUCT(DebugTypeInteger) -{ - u8 bit_count:7; - u8 signedness:1; -}; - -typedef enum DebugTypeId : u8 -{ - DEBUG_TYPE_VOID = 0, - DEBUG_TYPE_INTEGER, -} DebugTypeId; - -STRUCT(DebugType) -{ - union - { - DebugTypeInteger integer; - }; - DebugTypeId id; -}; -decl_vb(DebugType); -declare_ip(DebugType); - -typedef enum BackendTypeId : u8 -{ - BACKEND_TYPE_VOID = 0x00, - BACKEND_TYPE_INTEGER_8 = 0x01, - BACKEND_TYPE_INTEGER_16 = 0x02, - BACKEND_TYPE_INTEGER_32 = 0x03, - BACKEND_TYPE_INTEGER_64 = 0x03, - BACKEND_TYPE_POINTER = 0x04, - BACKEND_TYPE_SCALAR_LAST = BACKEND_TYPE_POINTER, - BACKEND_TYPE_TUPLE, - BACKEND_TYPE_MEMORY, - BACKEND_TYPE_CONTROL, - BACKEND_TYPE_REGION, -} BackendTypeId; - -STRUCT(TypePair) -{ - u32 raw; -}; -decl_vb(TypePair); -global_variable const TypePair type_pair_invalid; - -global_variable const u32 debug_mask = 0xffffff; - -fn TypePair type_pair_make(DebugTypeIndex debug_type, BackendTypeId backend_type) -{ - u32 value = backend_type; - value <<= 24; - auto debug_raw = *(u32*)&debug_type; - assert(debug_raw <= debug_mask); - value |= debug_raw; - - return (TypePair){ .raw = value }; -} - -// fn DebugTypeIndex type_pair_get_debug(TypePair type_pair) -// { -// return (DebugTypeIndex) { -// .index = type_pair.raw & debug_mask, -// }; -// } - -fn BackendTypeId type_pair_get_backend(TypePair type_pair) -{ - return type_pair.raw >> 24; -} - -STRUCT(NodeIndex) -{ - u32 index; -}; -declare_slice(NodeIndex); -decl_vb(NodeIndex); - -STRUCT(Function) -{ - String name; - NodeIndex root; - TypePair return_type; - u32 line; - u32 column; -}; -decl_vb(Function); - -typedef enum NodeId : u8 -{ - IR_ROOT, - IR_PROJECTION, - IR_RETURN, - IR_REGION, - IR_PHI, - IR_SYMBOL_TABLE, - - // Binary integer - IR_INTEGER_ADD, - IR_INTEGER_SUBSTRACT, - IR_INTEGER_MULTIPLY, - IR_INTEGER_DIVIDE, - IR_INTEGER_REMAINDER, - - IR_INTEGER_SHIFT_LEFT, - IR_INTEGER_SHIFT_RIGHT, - IR_INTEGER_AND, - IR_INTEGER_OR, - IR_INTEGER_XOR, - - IR_INTEGER_COMPARE_EQUAL, - IR_INTEGER_COMPARE_NOT_EQUAL, - - // Unary integer - IR_INTEGER_NEGATION, - - IR_INTEGER_CONSTANT, - - MACHINE_COPY, - MACHINE_MOVE, - MACHINE_JUMP, - - NODE_COUNT, -} NodeId; - -// struct NodeCFG -// { -// s32 immediate_dominator_tree_depth; -// s32 loop_depth; -// s32 anti_dependency; -// }; -// typedef struct NodeCFG NodeCFG; - -// struct NodeConstant -// { -// TypeIndex type; -// }; -// typedef struct NodeConstant NodeConstant; -// -// struct NodeStart -// { -// // NodeCFG cfg; -// TypeIndex arguments; -// Function* function; -// }; -// typedef struct NodeStart NodeStart; -// -// // struct NodeStop -// // { -// // // NodeCFG cfg; -// // }; -// // typedef struct NodeStop NodeStop; -// -// struct ScopePair -// { -// StringMap values; -// StringMap types; -// }; -// typedef struct ScopePair ScopePair; -// -// struct StackScope -// { -// ScopePair* pointer; -// u32 length; -// u32 capacity; -// }; -// typedef struct StackScope StackScope; -// -// struct NodeScope -// { -// StackScope stack; -// }; -// typedef struct NodeScope NodeScope; -// -// -// struct NodeControlProjection -// { -// NodeProjection projection; -// // NodeCFG cfg; -// }; -// typedef struct NodeControlProjection NodeControlProjection; -// -// struct NodeReturn -// { -// // NodeCFG cfg; -// }; -// typedef struct NodeReturn NodeReturn; -// -// struct NodeDeadControl -// { -// // NodeCFG cfg; -// }; -// typedef struct NodeDeadControl NodeDeadControl; -STRUCT(NodeProjection) -{ - u32 index; -}; - -STRUCT(NodeRoot) -{ - u32 function_index; -}; - -STRUCT(NodeRegion) -{ - NodeIndex in_mem; -}; - -UNION(NodeIntegerConstant) -{ - s64 signed_value; - u64 unsigned_value; -}; - -STRUCT(RegisterMaskIndex) -{ - u32 index; -}; -declare_slice(RegisterMaskIndex); - -STRUCT(NodeMachineCopy) -{ - RegisterMaskIndex use_mask; - RegisterMaskIndex def_mask; -}; - -STRUCT(Node) -{ - u32 input_offset; - u32 output_offset; - u16 output_count; - u16 input_count; - u16 input_capacity; - u16 output_capacity; - TypePair type; - NodeId id:8; - u32 interned:1; - u32 reserved:23; - NodeIndex next_free; - - union - { - NodeProjection projection; - NodeRoot root; - NodeRegion region; - NodeIntegerConstant integer_constant; - NodeMachineCopy machine_copy; - }; - // union - // { - // NodeConstant constant; - // NodeStart start; - // NodeStop stop; - // NodeScope scope; - // NodeControlProjection control_projection; - // NodeProjection projection; - // NodeReturn return_node; - // NodeDeadControl dead_control; - // }; -}; -// See above bitset -static_assert(sizeof(NodeId) == 1); - -declare_slice_p(Node); -decl_vb(Node); -decl_vbp(Node); -declare_ip(Node); - -fn u8 node_is_control_projection(Node* restrict node) -{ - return node->id == IR_PROJECTION && type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE; -} - -fn u8 node_is_cfg_fork(Node* restrict node) -{ - switch (node->id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case MACHINE_JUMP: - case NODE_COUNT: - return 0; - } -} - -STRUCT(ArrayReference) -{ - u32 offset; - u32 length; -}; -decl_vb(ArrayReference); - -STRUCT(File) -{ - String path; - String source; - // StringMap values; - // StringMap types; -}; - -STRUCT(FunctionBuilder) -{ - Function* function; - File* file; - NodeIndex current; -}; - -typedef u64 BitsetElement; -decl_vb(BitsetElement); -declare_slice(BitsetElement); - -STRUCT(Bitset) -{ - VirtualBuffer(BitsetElement) arr; - u32 length; -}; -const u64 element_bitsize = sizeof(u64) * 8; - -fn u8 bitset_get(Bitset* bitset, u64 index) -{ - auto element_index = index / element_bitsize; - if (element_index < bitset->arr.length) - { - auto bit_index = index % element_bitsize; - u8 result = (bitset->arr.pointer[element_index] & (1 << bit_index)) != 0; - return result; - } - - return 0; -} - -fn void bitset_ensure_length(Bitset* bitset, u64 max) -{ - auto length = (max / element_bitsize) + (max % element_bitsize != 0); - auto old_length = bitset->arr.length; - if (old_length < length) - { - auto new_element_count = cast_to(u32, u64, length - old_length); - unused(vb_add(&bitset->arr, new_element_count)); - } -} - -fn void bitset_set_value(Bitset* bitset, u64 index, u8 value) -{ - bitset_ensure_length(bitset, index + 1); - auto element_index = index / element_bitsize; - auto bit_index = index % element_bitsize; - auto mask = ~((u64)1 << bit_index); - bitset->arr.pointer[element_index] = (bitset->arr.pointer[element_index] & mask) | ((u64)(!!value) << bit_index); - - if (value) - { - bitset->length += 1; - } - else - { - bitset->length -= 1; - } - - assert(bitset_get(bitset, index) == value); -} - -fn void bitset_clear(Bitset* bitset) -{ - memset(bitset->arr.pointer, 0, bitset->arr.capacity); - bitset->arr.length = 0; - bitset->length = 0; -} - -STRUCT(WorkList) -{ - VirtualBuffer(NodeIndex) nodes; - Bitset visited; - Bitset bitset; - u32 mid_assert:1; -}; - -enum -{ - REGISTER_CLASS_STACK = 0, -}; - -typedef enum x86_64_RegisterClass : u8 -{ - REGISTER_CLASS_X86_64_GPR = 1, - REGISTER_CLASS_X86_64_XMM, - REGISTER_CLASS_X86_64_COUNT -} x86_64_RegisterClass; - -const global_variable u8 register_count_per_class[] = { - [0] = 0, - [REGISTER_CLASS_X86_64_GPR] = 16, - [REGISTER_CLASS_X86_64_XMM] = 16, -}; -static_assert(array_length(register_count_per_class) == REGISTER_CLASS_X86_64_COUNT); - -typedef enum GPR : u8 -{ - RAX = 0, - RCX = 1, - RDX = 2, - RBX = 3, - RSP = 4, - RBP = 5, - RSI = 6, - RDI = 7, - - R8 = 8 + 0, - R9 = 8 + 1, - R10 = 8 + 2, - R11 = 8 + 3, - R12 = 8 + 4, - R13 = 8 + 5, - R14 = 8 + 6, - R15 = 8 + 7, - - GPR_NONE = -1 -} GPR; - -typedef enum RegisterMask_x86_64: u8 -{ - REGISTER_MASK_EMPTY = 0, - REGISTER_MASK_GPR = 1, -} RegisterMask_x86_64; -const global_variable auto empty_register_mask = Index(RegisterMask, REGISTER_MASK_EMPTY); - -STRUCT(RegisterMask) -{ - u32 mask; - u32 class:3; - u32 may_spill:1; - u32 reserved:28; -}; -decl_vb(RegisterMask); -declare_ip(RegisterMask); - -STRUCT(Thread) -{ - Arena* arena; - struct - { - VirtualBuffer(Type) types; - VirtualBuffer(Node) nodes; - VirtualBuffer(DebugType) debug_types; - VirtualBuffer(NodeIndex) uses; - VirtualBuffer(ArrayReference) use_free_list; - VirtualBuffer(Function) functions; - VirtualBuffer(u8) string; - VirtualBuffer(RegisterMask) register_masks; - } buffer; - struct - { - InternPool(Node) nodes; - InternPool(DebugType) debug_types; - InternPool(RegisterMask) register_masks; - } interned; - struct - { - NodeIndex nodes; - } free_list; - struct - { - TypeIndex bottom; - TypeIndex top; - TypeIndex live_control; - TypeIndex dead_control; - struct - { - TypeIndex top; - TypeIndex bottom; - TypeIndex zero; - TypeIndex u8; - TypeIndex u16; - TypeIndex u32; - TypeIndex u64; - TypeIndex s8; - TypeIndex s16; - TypeIndex s32; - TypeIndex s64; - } integer; - struct - { - union - { - struct - { - DebugTypeIndex u8; - DebugTypeIndex u16; - DebugTypeIndex u32; - DebugTypeIndex u64; - DebugTypeIndex s8; - DebugTypeIndex s16; - DebugTypeIndex s32; - DebugTypeIndex s64; - }; - DebugTypeIndex array[8]; - } integer; - } debug; - } types; - s64 main_function; - WorkList worklists[8]; - u64 worklist_bitset:3; - u64 reserved:61; -}; - -STRUCT(WorkListHandle) -{ - u8 index:3; - u8 is_valid:1; - u8 reserved:4; -}; - -fn WorkListHandle thread_worklist_acquire(Thread* thread) -{ - u8 bitset = thread->worklist_bitset; - if (bitset) - { - auto index = cast_to(u8, s32, __builtin_ctz(~thread->worklist_bitset)); - thread->worklist_bitset |= (1 << index); - return (WorkListHandle) - { - .index = index, - .is_valid = 1, - }; - } - else - { - thread->worklist_bitset |= (1 << 0); - return (WorkListHandle) - { - .index = 0, - .is_valid = 1, - }; - } -} - -fn u32 thread_worklist_length(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - return thread->worklists[handle.index].nodes.length; -} - -fn NodeIndex thread_worklist_get(Thread* thread, WorkListHandle handle, u32 index) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto* worklist = &thread->worklists[handle.index]; - assert(index < worklist->nodes.length); - return worklist->nodes.pointer[index]; -} - -fn u8 thread_worklist_test(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - - u8 result = 0; - if (validi(node_index)) - { - WorkList* restrict worklist = &thread->worklists[handle.index]; - result = bitset_get(&worklist->bitset, geti(node_index)); - } - - return result; -} - -fn u8 thread_worklist_test_and_set(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - auto result = thread_worklist_test(thread, handle, node_index); - if (!result) - { - WorkList* restrict worklist = &thread->worklists[handle.index]; - bitset_set_value(&worklist->bitset, geti(node_index), 1); - } - - return result; -} - -fn Node* thread_node_get(Thread* thread, NodeIndex node_index) -{ - assert(validi(node_index)); - auto* node = &thread->buffer.nodes.pointer[geti(node_index)]; - return node; -} - -fn String node_id_to_string(NodeId node_id) -{ - switch (node_id) - { - case_to_name(IR_, ROOT); - case_to_name(IR_, PROJECTION); - case_to_name(IR_, RETURN); - case_to_name(IR_, REGION); - case_to_name(IR_, PHI); - case_to_name(IR_, SYMBOL_TABLE); - case_to_name(IR_, INTEGER_ADD); - case_to_name(IR_, INTEGER_SUBSTRACT); - case_to_name(IR_, INTEGER_MULTIPLY); - case_to_name(IR_, INTEGER_DIVIDE); - case_to_name(IR_, INTEGER_REMAINDER); - case_to_name(IR_, INTEGER_SHIFT_LEFT); - case_to_name(IR_, INTEGER_SHIFT_RIGHT); - case_to_name(IR_, INTEGER_AND); - case_to_name(IR_, INTEGER_OR); - case_to_name(IR_, INTEGER_XOR); - case_to_name(IR_, INTEGER_COMPARE_EQUAL); - case_to_name(IR_, INTEGER_COMPARE_NOT_EQUAL); - case_to_name(IR_, INTEGER_NEGATION); - case_to_name(IR_, INTEGER_CONSTANT); - case_to_name(MACHINE_, COPY); - case_to_name(MACHINE_, MOVE); - case_to_name(MACHINE_, JUMP); - case NODE_COUNT: unreachable(); - break; - } -} - -fn void thread_worklist_push(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - // print("Pushing node #{u32} ({s})\n", geti(node_index), node_id_to_string(thread_node_get(thread, node_index)->id)); - if (!thread_worklist_test_and_set(thread, handle, node_index)) - { - WorkList* restrict worklist = &thread->worklists[handle.index]; - *vb_add(&worklist->nodes, 1) = node_index; - } -} - -fn void thread_worklist_push_array(Thread* thread, WorkListHandle handle, NodeIndex node_index) -{ - assert(handle.is_valid); - - auto* worklist = &thread->worklists[handle.index]; - *vb_add(&worklist->nodes, 1) = node_index; -} - -fn NodeIndex thread_worklist_pop_array(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto result = invalidi(Node); - - assert(handle.is_valid); - auto* worklist = &thread->worklists[handle.index]; - auto len = worklist->nodes.length; - if (len) - { - auto index = len - 1; - result = worklist->nodes.pointer[index]; - worklist->nodes.length = index; - } - - return result; -} - -fn NodeIndex thread_worklist_pop(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto result = invalidi(Node); - - assert(handle.is_valid); - auto* worklist = &thread->worklists[handle.index]; - auto len = worklist->nodes.length; - if (len) - { - auto index = len - 1; - auto node_index = worklist->nodes.pointer[index]; - worklist->nodes.length = index; - bitset_set_value(&worklist->bitset, index, 0); - result = node_index; - } - - return result; -} - -fn void thread_worklist_clear(Thread* thread, WorkListHandle handle) -{ - assert(handle.is_valid); - assert((thread->worklist_bitset & (1 << handle.index)) != 0); - auto* restrict worklist = &thread->worklists[handle.index]; - - bitset_clear(&worklist->visited); - bitset_clear(&worklist->bitset); - worklist->nodes.length = 0; -} - -// fn void thread_worklist_release(Thread* thread, WorkListHandle* handle) -// { -// thread_worklist_clear(thread, *handle); -// handle->is_valid = 0; -// } - -fn Type* thread_type_get(Thread* thread, TypeIndex type_index) -{ - assert(validi(type_index)); - auto* type = &thread->buffer.types.pointer[geti(type_index)]; - return type; -} - -fn DebugType* thread_debug_type_get(Thread* thread, DebugTypeIndex debug_type_index) -{ - assert(validi(debug_type_index)); - auto* type = &thread->buffer.debug_types.pointer[geti(debug_type_index)]; - return type; -} - -fn RegisterMask* thread_register_mask_get(Thread* thread, RegisterMaskIndex register_mask_index) -{ - assert(validi(register_mask_index)); - auto* register_mask = &thread->buffer.register_masks.pointer[geti(register_mask_index)]; - return register_mask; -} - -fn void thread_node_set_use(Thread* thread, u32 offset, u16 index, NodeIndex new_use) -{ - thread->buffer.uses.pointer[offset + index] = new_use; -} - -// fn NodeIndex thread_node_get_use(Thread* thread, u32 offset, u16 index) -// { -// NodeIndex i = thread->buffer.uses.pointer[offset + index]; -// return i; -// } - -// fn NodeIndex node_input_get(Thread* thread, Node* node, u16 index) -// { -// assert(index < node->input_count); -// NodeIndex result = thread_node_get_use(thread, node->input_offset, index); -// return result; -// } -// -// fn NodeIndex node_output_get(Thread* thread, Node* node, u16 index) -// { -// assert(index < node->output_count); -// NodeIndex result = thread_node_get_use(thread, node->output_offset, index); -// return result; -// } - -// fn NodeIndex scope_get_control(Thread* thread, Node* node) -// { -// assert(node->id == NODE_SCOPE); -// auto control = node_input_get(thread, node, 0); -// return control; -// } - -// fn NodeIndex builder_get_control_node_index(Thread* thread, FunctionBuilder* builder) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// auto result = scope_get_control(thread, scope_node); -// return result; -// } - -STRUCT(UseReference) -{ - NodeIndex* pointer; - u32 index; -}; - -fn UseReference thread_get_node_reference_array(Thread* thread, u16 count) -{ - u32 free_list_count = thread->buffer.use_free_list.length; - for (u32 i = 0; i < free_list_count; i += 1) - { - if (thread->buffer.use_free_list.pointer[i].length >= count) - { - todo(); - } - } - - u32 index = thread->buffer.uses.length; - auto* node_indices = vb_add(&thread->buffer.uses, count); - return (UseReference) - { - .pointer = node_indices, - .index = index, - }; -} - -fn void node_ensure_capacity(Thread* thread, u32* offset, u16* capacity, u16 current_length, u16 additional) -{ - auto current_offset = *offset; - auto current_capacity = *capacity; - auto desired_capacity = cast_to(u16, u32, current_length + additional); - - if (desired_capacity > current_capacity) - { - auto* ptr = vb_add(&thread->buffer.uses, desired_capacity); - u32 new_offset = cast_to(u32, s64, ptr - thread->buffer.uses.pointer); - memcpy(ptr, &thread->buffer.uses.pointer[current_offset], current_length * sizeof(NodeIndex)); - memset(ptr + current_length, 0, (desired_capacity - current_length) * sizeof(NodeIndex)); - *offset = new_offset; - *capacity = desired_capacity; - } -} - -fn void node_add_one_assume_capacity(Thread* thread, NodeIndex node, u32 offset, u16 capacity, u16* length) -{ - auto index = *length; - assert(index < capacity); - thread->buffer.uses.pointer[offset + index] = node; - *length = index + 1; -} - -fn void node_add_one(Thread* thread, u32* offset, u16* capacity, u16* count, NodeIndex node_index) -{ - node_ensure_capacity(thread, offset, capacity, *count, 1); - node_add_one_assume_capacity(thread, node_index, *offset, *capacity, count); -} - -fn NodeIndex node_add_output(Thread* thread, NodeIndex node_index, NodeIndex output_index) -{ - auto* this_node = thread_node_get(thread, node_index); - node_add_one(thread, &this_node->output_offset, &this_node->output_capacity, &this_node->output_count, output_index); - - return node_index; -} - -// fn NodeIndex intern_pool_remove_node(Thread* thread, NodeIndex node_index); - -fn Slice(NodeIndex) node_get_inputs(Thread* thread, const Node * restrict const node) -{ - auto result = (Slice(NodeIndex)) { - .pointer = &thread->buffer.uses.pointer[node->input_offset], - .length = node->input_count, - }; - return result; -} - -fn Slice(NodeIndex) node_get_outputs(Thread* thread, Node* node) -{ - auto result = (Slice(NodeIndex)) { - .pointer = &thread->buffer.uses.pointer[node->output_offset], - .length = node->output_count, - }; - return result; -} - -fn u8 node_is_constant(const Node* const restrict node) -{ - switch (node->id) - { - case IR_INTEGER_CONSTANT: - return 1; - default: - return 0; - } -} - -fn Hash32 node_hash(Thread* thread, const Node* restrict const node) -{ - Hash32 hash = 0; - hash += node->id; - hash += sizeof(u8); - - auto inputs = node_get_inputs(thread, node); - - // Constants are allowed to live across functions - if (!node_is_constant(node)) - { - u32 valid_input_count = 0; - - for (u16 i = 0; i < inputs.length; i += 1) - { - auto input = inputs.pointer[i]; - if (validi(input)) - { - valid_input_count += 1; - hash += geti(input); - hash += sizeof(input); - } - } - - hash += valid_input_count; - hash += sizeof(u16); - } - - auto* union_start = (u8*)&node->projection; - auto* union_end = union_start + size_until_end(Node, projection); - for (auto* it = union_start; it < union_end; it += 1) - { - hash += *it; - } - hash += union_end - union_start; - - auto result = hash32_fib_end(hash); - return result; -} - -fn Hash32 node_hash_index(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto hash = node_hash(thread, node); - return hash; -} - -fn Hash32 register_mask_hash(Thread* thread, const RegisterMask* const restrict mask) -{ - unused(thread); - static_assert(sizeof(RegisterMask) == sizeof(u64)); - auto hash = *(Hash64*)mask; - - auto result = hash64_fib_end(hash); - return result; -} - -fn Hash32 register_mask_hash_index(Thread* thread, RegisterMaskIndex register_mask_index) -{ - auto* mask = thread_register_mask_get(thread, register_mask_index); - auto hash = register_mask_hash(thread, mask); - return hash; -} - -fn void node_gvn_remove(Thread* thread, NodeIndex node_index); - -fn void node_unlock(Thread* thread, NodeIndex node_index) -{ - unused(thread); - unused(node_index); - // auto* node = thread_node_get(thread, node_index); - // if (node->interned) - // { - // auto r = node_gvn_remove(thread, node_index); - // assert(index_equal(r, node_index)); - // } -} - -fn s64 node_find(Slice(NodeIndex) nodes, NodeIndex node_index) -{ - s64 result = -1; - - for (u64 i = 0; i < nodes.length; i += 1) - { - if (index_equal(nodes.pointer[i], node_index)) - { - result = cast_to(s64, u64, i); - break; - } - } - - return result; -} - -fn void thread_node_remove_use(Thread* thread, u32 offset, u16* length, u16 index) -{ - auto current_length = *length; - assert(index < current_length); - auto item_to_remove = &thread->buffer.uses.pointer[offset + index]; - auto substitute = &thread->buffer.uses.pointer[offset + current_length - 1]; - *item_to_remove = *substitute; - *length = current_length - 1; -} - -fn u8 node_remove_output(Thread* thread, NodeIndex node_index, NodeIndex use_index) -{ - auto* node = thread_node_get(thread, node_index); - auto outputs = node_get_outputs(thread, node); - auto maybe_index = node_find(outputs, use_index); - assert(maybe_index != -1); - auto index = cast_to(u16, s64, maybe_index); - thread_node_remove_use(thread, node->output_offset, &node->output_count, index); - return node->output_count == 0; -} - -// fn void move_dependencies_to_worklist(Thread* thread, Node* node) -// { -// assert(node->dependency_count == 0); -// for (u32 i = 0; i < node->dependency_count; i += 1) -// { -// unused(thread); -// todo(); -// } -// } - -// fn u8 node_is_unused(Node* node) -// { -// return node->output_count == 0; -// } - -// fn u8 node_is_dead(Node* node) -// { -// return node_is_unused(node) & ((node->input_count == 0) & (!validi(node->type))); -// } - -// fn void node_kill(Thread* thread, NodeIndex node_index) -// { -// node_unlock(thread, node_index); -// auto* node = thread_node_get(thread, node_index); -// // print("[NODE KILLING] (#{u32}, {s}) START\n", node_index.index, node_id_to_string(node)); -// assert(node_is_unused(node)); -// todo(); -// // node->type = invalidi(TypePair); -// -// auto inputs = node_get_inputs(thread, node); -// while (node->input_count > 0) -// { -// auto input_index = cast_to(u16, u32, node->input_count - 1); -// node->input_count = input_index; -// auto old_input_index = inputs.pointer[input_index]; -// -// // print("[NODE KILLING] (#{u32}, {s}) Removing input #{u32} at slot {u32}\n", node_index.index, node_id_to_string(node), old_input_index.index, input_index); -// if (validi(old_input_index)) -// { -// thread_worklist_push(thread, old_input_index); -// u8 no_more_outputs = node_remove_output(thread, old_input_index, node_index); -// if (no_more_outputs) -// { -// // print("[NODE KILLING] (#{u32}, {s}) (NO MORE OUTPUTS - KILLING) Input #{u32}\n", node_index.index, node_id_to_string(node), old_input_index.index); -// node_kill(thread, old_input_index); -// } -// } -// } -// -// assert(node_is_dead(node)); -// // print("[NODE KILLING] (#{u32}, {s}) END\n", node_index.index, node_id_to_string(node)); -// } - -fn NodeIndex node_set_input(Thread* thread, NodeIndex node_index, u16 index, NodeIndex new_input) -{ - auto* node = thread_node_get(thread, node_index); - assert(index < node->input_count); - node_unlock(thread, node_index); - auto inputs = node_get_inputs(thread, node); - auto old_input = inputs.pointer[index]; - - if (!index_equal(old_input, new_input)) - { - if (validi(new_input)) - { - node_add_output(thread, new_input, node_index); - } - - thread_node_set_use(thread, node->input_offset, index, new_input); - - if (validi(old_input)) - { - if (node_remove_output(thread, old_input, node_index)) - { - // todo(); - // node_kill(thread, old_input); - } - } - - // move_dependencies_to_worklist(thread, node); - } - - return new_input; -} - -// fn NodeIndex builder_set_control(Thread* thread, FunctionBuilder* builder, NodeIndex node_index) -// { -// return node_set_input(thread, builder->scope, 0, node_index); -// } - -fn NodeIndex node_add_input(Thread* thread, NodeIndex node_index, NodeIndex input_index) -{ - node_unlock(thread, node_index); - Node* this_node = thread_node_get(thread, node_index); - node_add_one(thread, &this_node->input_offset, &this_node->input_capacity, &this_node->input_count, input_index); - if (validi(input_index)) - { - node_add_output(thread, input_index, node_index); - } - - return input_index; -} - -STRUCT(NodeCreate) -{ - Slice(NodeIndex) inputs; - TypePair type_pair; - NodeId id; -}; - -fn NodeIndex thread_node_add(Thread* thread, NodeCreate data) -{ - auto input_count = cast_to(u16, u64, data.inputs.length); - auto input_result = thread_get_node_reference_array(thread, input_count); - memcpy(input_result.pointer, data.inputs.pointer, sizeof(NodeIndex) * input_count); - - auto* node = vb_add(&thread->buffer.nodes, 1); - auto node_index = Index(Node, cast_to(u32, s64, node - thread->buffer.nodes.pointer)); - memset(node, 0, sizeof(Node)); - node->id = data.id; - node->input_offset = input_result.index; - node->input_count = input_count; - node->input_capacity = input_count; - node->type = type_pair_invalid; - // node->type = invalidi(TypePair); - node->type = data.type_pair; - - // print("[NODE CREATION] #{u32} {s} | INPUTS: { ", node_index.index, node_id_to_string(node)); - - for (u16 i = 0; i < input_count; i += 1) - { - NodeIndex input = data.inputs.pointer[i]; - // print("{u32} ", input.index); - if (validi(input)) - { - node_add_output(thread, input, node_index); - } - } - - // print("}\n"); - - return node_index; -} - -// fn void node_pop_inputs(Thread* thread, NodeIndex node_index, u16 input_count) -// { -// node_unlock(thread, node_index); -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// for (u16 i = 0; i < input_count; i += 1) -// { -// auto old_input = inputs.pointer[node->input_count - 1]; -// node->input_count -= 1; -// if (validi(old_input)) -// { -// if (node_remove_output(thread, old_input, node_index)) -// { -// todo(); -// } -// } -// } -// } - -// fn void scope_push(Thread* thread, FunctionBuilder* builder) -// { -// auto* scope = thread_node_get(thread, builder->scope); -// auto current_length = scope->scope.stack.length; -// auto desired_length = current_length + 1; -// auto current_capacity = scope->scope.stack.capacity; -// -// if (current_capacity < desired_length) -// { -// auto optimal_capacity = MAX(round_up_to_next_power_of_2(desired_length), 8); -// auto* new_pointer = arena_allocate(thread->arena, ScopePair, optimal_capacity); -// memcpy(new_pointer, scope->scope.stack.pointer, current_length * sizeof(ScopePair)); -// scope->scope.stack.capacity = optimal_capacity; -// scope->scope.stack.pointer = new_pointer; -// } -// -// memset(&scope->scope.stack.pointer[current_length], 0, sizeof(ScopePair)); -// scope->scope.stack.length = current_length + 1; -// } - -// fn void scope_pop(Thread* thread, FunctionBuilder* builder) -// { -// auto scope_index = builder->scope; -// auto* scope = thread_node_get(thread, scope_index); -// auto index = scope->scope.stack.length - 1; -// auto popped_scope = scope->scope.stack.pointer[index]; -// scope->scope.stack.length = index; -// auto input_count = popped_scope.values.length; -// node_pop_inputs(thread, scope_index, input_count); -// } - -// fn ScopePair* scope_get_last(Node* node) -// { -// assert(node->id == NODE_SCOPE); -// return &node->scope.stack.pointer[node->scope.stack.length - 1]; -// } - -// fn NodeIndex scope_define(Thread* thread, FunctionBuilder* builder, String name, TypeIndex type_index, NodeIndex node_index) -// { -// auto scope_node_index = builder->scope; -// auto* scope_node = thread_node_get(thread, scope_node_index); -// auto* last = scope_get_last(scope_node); -// string_map_put(&last->types, thread->arena, name, geti(type_index)); -// -// auto existing = string_map_put(&last->values, thread->arena, name, scope_node->input_count).existing; -// NodeIndex result; -// -// if (existing) -// { -// result = invalidi(Node); -// } -// else -// { -// result = node_add_input(thread, scope_node_index, node_index); -// } -// -// return result; -// } - -// fn NodeIndex scope_update_extended(Thread* thread, FunctionBuilder* builder, String name, NodeIndex node_index, s32 nesting_level) -// { -// NodeIndex result = invalidi(Node); -// -// if (nesting_level >= 0) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// auto* string_map = &scope_node->scope.stack.pointer[nesting_level].values; -// auto lookup_result = string_map_get(string_map, name); -// if (lookup_result.existing) -// { -// auto index = lookup_result.value; -// auto old_index = node_input_get(thread, scope_node, index); -// auto* old_node = thread_node_get(thread, old_index); -// -// // if (old_node->id == NODE_SCOPE) -// // { -// // todo(); -// // } -// -// if (validi(node_index)) -// { -// auto result = node_set_input(thread, builder->scope, index, node_index); -// return result; -// } -// else -// { -// return old_index; -// } -// } -// else -// { -// return scope_update_extended(thread, builder, name, node_index, nesting_level - 1); -// } -// } -// -// return result; -// } - -// fn NodeIndex scope_lookup(Thread* thread, FunctionBuilder* builder, String name) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// return scope_update_extended(thread, builder, name, invalidi(Node), scope_node->scope.stack.length - 1); -// } - -// fn NodeIndex scope_update(Thread* thread, FunctionBuilder* builder, String name, NodeIndex value_node_index) -// { -// auto* scope_node = thread_node_get(thread, builder->scope); -// auto result = scope_update_extended(thread, builder, name, value_node_index, scope_node->scope.stack.length - 1); -// return result; -// } - -// fn u8 type_equal(Type* a, Type* b) -// { -// u8 result = 0; -// if (a == b) -// { -// result = 1; -// } -// else -// { -// assert(a->hash); -// assert(b->hash); -// if ((a->hash == b->hash) & (a->id == b->id)) -// { -// switch (a->id) -// { -// case TYPE_INTEGER: -// { -// result = -// ((a->integer.constant == b->integer.constant) & (a->integer.bit_count == b->integer.bit_count)) -// & -// ((a->integer.is_signed == b->integer.is_signed) & (a->integer.is_constant == b->integer.is_constant)); -// } break; -// case TYPE_TUPLE: -// { -// result = a->tuple.types.length == b->tuple.types.length; -// -// if (result) -// { -// for (u32 i = 0; i < a->tuple.types.length; i += 1) -// { -// if (!index_equal(a->tuple.types.pointer[i], b->tuple.types.pointer[i])) -// { -// todo(); -// } -// } -// } -// } break; -// default: -// todo(); -// } -// } -// } -// -// return result; -// } - -fn Hash64 node_get_hash_default(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -{ - unused(thread); - unused(node); - unused(node_index); - return hash; -} - -// fn Hash64 node_get_hash_projection(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(thread); -// unused(node_index); -// auto projection_index = node->projection.index; -// auto proj_index_bytes = scalar_to_bytes(projection_index); -// for (u32 i = 0; i < proj_index_bytes.length; i += 1) -// { -// hash = hash_byte(hash, proj_index_bytes.pointer[i]); -// } -// -// return hash; -// } - -// fn Hash64 node_get_hash_control_projection(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(thread); -// unused(node_index); -// auto projection_index = node->control_projection.projection.index; -// auto proj_index_bytes = scalar_to_bytes(projection_index); -// for (u32 i = 0; i < proj_index_bytes.length; i += 1) -// { -// hash = hash_byte(hash, proj_index_bytes.pointer[i]); -// } -// -// return hash; -// } - -// fn Hash64 node_get_hash_constant(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(node_index); -// unused(thread); -// unused(node); -// assert(hash == fnv_offset); -// todo(); -// // auto type_index = node->type; -// // auto* type = thread_type_get(thread, node->type); -// // auto type_hash = hash_type(thread, type); -// // print("Hashing node #{u32} (constant) (type: #{u32}) (hash: {u64:x})\n", node_index.index, type_index.index, type_hash); -// // return type_hash; -// } - -// fn Hash64 node_get_hash_scope(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash) -// { -// unused(thread); -// unused(node); -// unused(node_index); -// return hash; -// } - -// fn NodeIndex node_idealize_substract(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto left_node_index = inputs.pointer[1]; -// auto right_node_index = inputs.pointer[2]; -// auto* left = thread_node_get(thread, left_node_index); -// auto* right = thread_node_get(thread, right_node_index); -// if (index_equal(left_node_index, right_node_index)) -// { -// todo(); -// } -// else if (right->id == IR_INTEGER_NEGATION) -// { -// todo(); -// } -// else if (left->id == IR_INTEGER_NEGATION) -// { -// todo(); -// } -// else -// { -// return invalidi(Node); -// } -// } - -// fn NodeIndex node_idealize_compare(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto left_node_index = inputs.pointer[1]; -// auto right_node_index = inputs.pointer[2]; -// auto* left = thread_node_get(thread, left_node_index); -// auto* right = thread_node_get(thread, right_node_index); -// if (index_equal(left_node_index, right_node_index)) -// { -// todo(); -// } -// -// if (node->id == IR_INTEGER_COMPARE_EQUAL) -// { -// if (right->id != IR_CONSTANT) -// { -// if (left->id == IR_CONSTANT) -// { -// todo(); -// } -// else if (left_node_index.index > right_node_index.index) -// { -// todo(); -// } -// } -// -// // TODO: null pointer -// if (index_equal(right->type, thread->types.integer.zero)) -// { -// todo(); -// } -// } -// -// // TODO: phi constant -// -// return invalidi(Node); -// } - -fn Hash32 debug_type_hash(Thread* thread, const DebugType* const restrict type) -{ - unused(thread); - auto* start = (const u8*) type; - Hash32 hash = 0; - for (auto* it = start; it < start + sizeof(*type); it += 1) - { - hash += *it; - } - auto result = hash32_fib_end(hash); - return result; -} - -fn Hash32 debug_type_hash_index(Thread* thread, DebugTypeIndex type_index) -{ - auto* type = thread_debug_type_get(thread, type_index); - return debug_type_hash(thread, type); -} - -global_variable const u64 intern_pool_min_capacity = 64; -STRUCT(GenericInternPool) -{ - u32* pointer; - u32 length; - u32 capacity; -}; - -STRUCT(GenericInternPoolBufferResult) -{ - void* pointer; - u32 index; -}; - -STRUCT(GenericGetOrPut) -{ - u32 index; - u8 existing; -}; - -typedef s64 FindSlotCallback(GenericInternPool* pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead); -typedef GenericInternPoolBufferResult AddToBufferCallback(Thread* thread); -// typedef s64 Find - -STRUCT(InternPoolInterface) -{ - FindSlotCallback * const find_slot; - AddToBufferCallback* const add_to_buffer; -}; - -fn s64 ip_find_slot_debug_type(GenericInternPool* generic_pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead) -{ - assert(hash != 0); - auto* pool = (InternPool(DebugType)*)generic_pool; - assert(pool == &thread->interned.debug_types); - auto* ptr = pool->pointer; - - s64 result = -1; - - unused(raw_item_index); - print("[IP FIND SLOT DEBUG TYPE] Finding slot for debug type: { hash: 0x{u32:x}, raw: {u32}, saved: {u32}, slots_ahead: {u32}\n"); - - for (auto index = saved_index; index < saved_index + slots_ahead; index += 1) - { - auto typed_index = ptr[index]; - auto debug_type = thread_debug_type_get(thread, typed_index); - auto existing_hash = debug_type_hash(thread, debug_type); - print("Comparing with existing hash 0x{u32:x}\n", existing_hash); - if (existing_hash == hash) - { - todo(); - } - } - - return result; -} - -fn s64 ip_generic_find_slot(GenericInternPool* pool, Thread* thread, u32 item_index, Hash32 hash, const InternPoolInterface* restrict const interface) -{ - auto* pointer = pool->pointer; - auto existing_capacity = pool->capacity; - auto original_index = hash & (existing_capacity - 1); - auto it_index = original_index; - s64 result = -1; - - while (1) - { - auto index = it_index & (existing_capacity - 1); - auto* ptr = &pointer[index]; - if (!*ptr) - { - result = index; - break; - } - -#if (__AVX2__) -#if (__AVX512F__) - auto chunk = _mm512_loadu_epi32(ptr); - auto is_zero = _mm512_cmpeq_epi32_mask(chunk, _mm512_setzero_epi32()); -#elif (__AVX2__) - auto chunk = _mm256_loadu_si256((const __m256i_u*) ptr); - auto is_zero = _mm256_movemask_ps(_mm256_castsi256_ps(_mm256_cmpeq_epi32(chunk, _mm256_setzero_si256()))); -#endif - auto occupied_slots_ahead = cast_to(u32, s32, __builtin_ctz((u32)is_zero)); -#else - u32 occupied_slots_ahead = 0; - for (u32 fake_i = it_index; fake_i < it_index + existing_capacity; fake_i += 1) - { - auto i = fake_i & (existing_capacity - 1); - auto item = pointer[i]; - if (item == 0) - { - break; - } - occupied_slots_ahead += 1; - } -#endif - - auto cap_ahead = existing_capacity - index; - auto slots_ahead = MIN(occupied_slots_ahead, cap_ahead); - auto slot = interface->find_slot(pool, thread, hash, item_index, index, slots_ahead); - - if (slot != -1) - { - assert(pointer[slot] != 0); - result = slot; - break; - } - - if (occupied_slots_ahead < cap_ahead) - { - result = index + occupied_slots_ahead; - break; - } - - it_index += slots_ahead; - } - - return result; -} - -fn GenericInternPoolBufferResult ip_DebugType_add_to_buffer(Thread* thread) -{ - auto* result = vb_add(&thread->buffer.debug_types, 1); - auto buffer_index = cast_to(u32, s64, result - thread->buffer.debug_types.pointer); - auto type_index = Index(DebugType, buffer_index); - static_assert(sizeof(type_index) == sizeof(u32)); - return (GenericInternPoolBufferResult) { - .pointer = result, - .index = *(u32*)&type_index, - }; -} - -fn u32 ip_generic_put_new_at_assume_not_existent_assume_capacity(GenericInternPool* pool, Thread* thread, u32 item_index, const void* restrict const item_pointer, u32 item_size, u32 pool_index, const InternPoolInterface* restrict const interface) -{ - if (!item_index) - { - auto buffer_result = interface->add_to_buffer(thread); - assert(buffer_result.index); - memcpy(buffer_result.pointer, item_pointer, item_size); - item_index = buffer_result.index; - } - auto* ptr = &pool->pointer[pool_index]; - *ptr = item_index; - pool->length += 1; - return item_index; -} - -fn u32 intern_pool_put_new_assume_not_existent_assume_capacity(GenericInternPool* pool, Thread* thread, u32 item_index, const void* restrict const item_pointer, u32 item_size, Hash32 hash, const InternPoolInterface* restrict const interface) -{ - auto capacity = pool->capacity; - assert(pool->length < capacity); - assert(hash); - auto pool_index = hash & (capacity - 1); - auto result = ip_generic_put_new_at_assume_not_existent_assume_capacity(pool, thread, item_index, item_pointer, item_size, pool_index, interface); - return result; -} - -fn void ip_generic_ensure_capacity(GenericInternPool* pool, Thread* thread, u32 additional) -{ - auto current_length = pool->length; - auto current_capacity = pool->capacity; - auto half_capacity = current_capacity >> 1; - auto destination_length = current_length + additional; - - if (destination_length > half_capacity) - { - auto new_capacity = cast_to(u32, u64, MAX(round_up_to_next_power_of_2(destination_length), intern_pool_min_capacity)); - auto* new_array = arena_allocate(thread->arena, u32, new_capacity); - memset(new_array, 0, sizeof(u32) * new_capacity); - - auto old_capacity = current_capacity; - - pool->pointer = new_array; - pool->length = 0; - pool->capacity = new_capacity; - - if (old_capacity) - { - todo(); - } - } -} - -fn u32 ip_generic_put_new_assume_not_existent(GenericInternPool* pool, Thread* thread, u32 item_index, const void* item_pointer, u32 item_size, Hash32 hash, const InternPoolInterface* const restrict interface) -{ - ip_generic_ensure_capacity(pool, thread, 1); - auto result = intern_pool_put_new_assume_not_existent_assume_capacity(pool, thread, item_index, item_pointer, item_size, hash, interface); - return result; -} - -fn GenericGetOrPut ip_generic_get_or_put(GenericInternPool* pool, Thread* thread, u32 item_index, const void* const restrict item_pointer, u32 item_size, Hash32 hash, const InternPoolInterface* const restrict interface) -{ - assert(hash); - auto length = pool->length; - auto capacity = pool->capacity; - - if (capacity) - { - auto maybe_slot = ip_generic_find_slot(pool, thread, item_index, hash, interface); - if (maybe_slot != -1) - { - auto index = cast_to(u32, s64, maybe_slot); - auto element = pool->pointer[index]; - u8 is_valid_or_existing = element != 0; - if (!is_valid_or_existing) - { - element = ip_generic_put_new_at_assume_not_existent_assume_capacity(pool, thread, item_index, item_pointer, item_size, index, interface); - assert(element != 0); - } - - return (GenericGetOrPut) { - .index = element, - .existing = is_valid_or_existing, - }; - } - } - - if (length < capacity) - { - todo(); - } - else if (length == capacity) - { - auto index = ip_generic_put_new_assume_not_existent(pool, thread, item_index, item_pointer, item_size, hash, interface); - return (GenericGetOrPut) - { - .index = index, - .existing = 0, - }; - } - else - { - unreachable(); - } -} - -// This assumes the indices are not equal -fn u8 node_equal(Thread* thread, NodeIndex a_index, NodeIndex b_index) -{ - u8 result = 0; - auto a_hash = node_hash_index(thread, a_index); - auto b_hash = node_hash_index(thread, b_index); - auto* a = thread_node_get(thread, a_index); - auto* b = thread_node_get(thread, b_index); - assert(!index_equal(a_index, b_index)); - assert(a != b); - - if (((a->id == b->id) & (a_hash == b_hash)) & (a->input_count == b->input_count)) - { - auto inputs_a = node_get_inputs(thread, a); - auto inputs_b = node_get_inputs(thread, b); - result = 1; - - for (u16 i = 0; i < a->input_count; i += 1) - { - if (!index_equal(inputs_a.pointer[i], inputs_b.pointer[i])) - { - result = 0; - break; - } - } - - if (result) - { - todo(); - // switch (a->id) - // { - // case IR_CONSTANT: - // todo(); - // // result = index_equal(a->constant.type, b->constant.type); - // break; - // case IR_START: - // todo(); - // // result = a->start.function == b->start.function; - // break; - // default: - // todo(); - // } - } - } - - return result; -} - -fn u8 node_index_equal(Thread* thread, NodeIndex a, NodeIndex b) -{ - u8 result = 0; - result = index_equal(a, b) || node_equal(thread, a, b); - - return result; -} - -fn s64 ip_find_slot_node(GenericInternPool* generic_pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead) -{ - auto* pool = (InternPool(Node)*)generic_pool; - assert(pool == &thread->interned.nodes); - auto* ptr = pool->pointer; - auto item_index = *(NodeIndex*)&raw_item_index; - unused(hash); - - s64 result = -1; - - for (auto index = saved_index; index < saved_index + slots_ahead; index += 1) - { - auto typed_index = ptr[index]; - if (node_index_equal(thread, item_index, typed_index)) - { - result = index; - break; - } - } - - return result; -} - -fn s64 ip_find_slot_register_mask(GenericInternPool* generic_pool, Thread* thread, Hash32 hash, u32 raw_item_index, u32 saved_index, u32 slots_ahead) -{ - auto* pool = (InternPool(RegisterMask)*)generic_pool; - assert(pool == &thread->interned.register_masks); - auto* ptr = pool->pointer; - auto item_index = *(RegisterMaskIndex*)&raw_item_index; - unused(hash); - - s64 result = -1; - - RegisterMask rm = *thread_register_mask_get(thread, item_index); - - for (auto index = saved_index; index < saved_index + slots_ahead; index += 1) - { - auto typed_index = ptr[index]; - static_assert(sizeof(RegisterMaskIndex) == sizeof(u32)); - if (index_equal(item_index, typed_index)) - { - result = index; - break; - } - - auto register_mask = thread_register_mask_get(thread, typed_index); - static_assert(sizeof(RegisterMask) == sizeof(u64)); - if (*(u64*)register_mask == *(u64*)&rm) - { - result = index; - break; - } - } - - return result; -} - -global_variable const auto ip_interface_debug_type = (InternPoolInterface) { - .add_to_buffer = &ip_DebugType_add_to_buffer, - .find_slot = &ip_find_slot_debug_type, -}; - -global_variable const auto ip_interface_node = (InternPoolInterface) { - .find_slot = &ip_find_slot_node, -}; - -global_variable const auto ip_interface_register_mask = (InternPoolInterface) { - .find_slot = &ip_find_slot_register_mask, -}; - -#define declare_ip_functions(T, lower) \ -fn Hash32 lower ## _hash_index(Thread* thread, T ## Index item_index); \ -fn Hash32 lower ## _hash(Thread* thread, const T * const restrict item); \ -\ -fn T ## GetOrPut ip_ ## T ## _get_or_put(InternPool(T)* pool, Thread* thread, T ## Index item_index) \ -{ \ - auto hash = lower ## _hash_index(thread, item_index); \ - auto* item = thread_ ## lower ## _get(thread, item_index); \ - static_assert(sizeof(item_index) == sizeof(u32));\ - auto raw_item_index = *(u32*)&item_index;\ - auto result = ip_generic_get_or_put((GenericInternPool*)pool, thread, raw_item_index, (void*)item, sizeof(T), hash, &ip_interface_ ## lower); \ - return (T ## GetOrPut)\ - {\ - .index = *(T ## Index*)&result.index,\ - .existing = result.existing,\ - };\ -}\ -fn T ## GetOrPut ip_ ## T ## _get_or_put_new(InternPool(T)* pool, Thread* thread, const T* item) \ -{ \ - auto hash = lower ## _hash(thread, item); \ - auto result = ip_generic_get_or_put((GenericInternPool*)pool, thread, 0, (void*)item, sizeof(T), hash, &ip_interface_ ## lower); \ - return (T ## GetOrPut)\ - {\ - .index = *(T ## Index*)&result.index,\ - .existing = result.existing,\ - };\ -}\ -fn T ## Index ip_ ## T ## _remove(InternPool(T)* pool, Thread* thread, T ## Index item_index)\ -{\ - auto existing_capacity = pool->capacity;\ - auto* item = thread_ ## lower ## _get(thread, item_index);\ - auto hash = lower ## _hash(thread, item);\ - static_assert(sizeof(item_index) == sizeof(u32));\ - auto raw_item_index = *(u32*)&item_index;\ - auto maybe_slot = ip_generic_find_slot((GenericInternPool*)pool, thread, raw_item_index, hash, &ip_interface_ ## lower);\ - \ - if (maybe_slot != -1)\ - {\ - auto i = cast_to(u32, s64, maybe_slot);\ - auto* slot_pointer = &pool->pointer[i];\ - auto old_item_index = *slot_pointer;\ - assert(validi(old_item_index));\ - pool->length -= 1;\ - *slot_pointer = invalidi(T);\ - auto j = i;\ - \ - while (1)\ - {\ - j = (j + 1) & (existing_capacity - 1);\ -\ - auto existing = pool->pointer[j];\ - if (!validi(existing))\ - {\ - break;\ - }\ -\ - auto existing_item_index = *(T ## Index*)&existing;\ - auto* existing_item = thread_ ## lower ## _get(thread, existing_item_index);\ - auto existing_item_hash = lower ## _hash(thread, existing_item);\ - auto k = existing_item_hash & (existing_capacity - 1);\ -\ - if (i <= j)\ - {\ - if ((i < k) & (k <= j))\ - {\ - continue;\ - }\ - }\ - else\ - {\ - if ((k <= j) | (i < k))\ - {\ - continue;\ - }\ - }\ -\ - pool->pointer[i] = pool->pointer[j];\ - pool->pointer[j] = invalidi(T);\ -\ - i = j;\ - }\ -\ - \ - return old_item_index;\ - }\ - else\ - {\ - todo();\ - }\ -} - -STRUCT(TypeGetOrPut) -{ - TypeIndex index; - u8 existing; -}; - -// fn TypeGetOrPut intern_pool_get_or_put_new_type(Thread* thread, Type* type); - -typedef NodeIndex NodeIdealize(Thread* thread, NodeIndex node_index); -typedef TypeIndex NodeComputeType(Thread* thread, NodeIndex node_index); -typedef Hash64 TypeGetHash(Thread* thread, Type* type); -typedef Hash64 NodeGetHash(Thread* thread, Node* node, NodeIndex node_index, Hash64 hash); - -// fn TypeIndex thread_get_integer_type(Thread* thread, TypeInteger type_integer) -// { -// Type type; -// memset(&type, 0, sizeof(Type)); -// type.integer = type_integer; -// type.id = TYPE_INTEGER; -// -// auto result = intern_pool_get_or_put_new_type(thread, &type); -// return result.index; -// } - -fn NodeIndex peephole(Thread* thread, Function* function, NodeIndex node_index); -// fn NodeIndex constant_int_create_with_type(Thread* thread, Function* function, TypeIndex type_index) -// { -// auto node_index = thread_node_add(thread, (NodeCreate){ -// .id = IR_CONSTANT, -// .inputs = array_to_slice(((NodeIndex []) { -// // function->start, -// })) -// }); -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// unused(type_index); -// -// todo(); -// -// // node->constant = (NodeConstant) { -// // .type = type_index, -// // }; -// // -// // // print("Creating constant integer node #{u32} with value: {u64:x}\n", node_index.index, thread_type_get(thread, type_index)->integer.constant); -// // -// // auto result = peephole(thread, function, node_index); -// // return result; -// } - -// fn NodeIndex constant_int_create(Thread* thread, Function* function, u64 value) -// { -// auto type_index = thread_get_integer_type(thread, (TypeInteger){ -// .constant = value, -// .bit_count = 0, -// .is_constant = 1, -// .is_signed = 0, -// }); -// -// auto constant_int = constant_int_create_with_type(thread, function, type_index); -// return constant_int; -// } - -STRUCT(NodeVirtualTable) -{ - NodeComputeType* const compute_type; - NodeIdealize* const idealize; - NodeGetHash* const get_hash; -}; - -STRUCT(TypeVirtualTable) -{ - TypeGetHash* const get_hash; -}; -fn Hash64 hash_type(Thread* thread, Type* type); - -// fn NodeIndex idealize_null(Thread* thread, NodeIndex node_index) -// { -// unused(thread); -// unused(node_index); -// return invalidi(Node); -// } - -// fn TypeIndex compute_type_constant(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// assert(node->id == IR_CONSTANT); -// todo(); -// // return node->constant.type; -// } - -fn Hash64 type_get_hash_default(Thread* thread, Type* type) -{ - unused(thread); - assert(!type->hash); - Hash64 hash = fnv_offset; - - // u32 i = 0; - for (auto* it = (u8*)type; it < (u8*)(type + 1); it += 1) - { - hash = hash_byte(hash, *it); - if (type->id == TYPE_INTEGER) - { - // print("Byte [{u32}] = 0x{u32:x}\n", i, (u32)*it); - // i += 1; - } - } - - return hash; -} - -fn Hash64 type_get_hash_tuple(Thread* thread, Type* type) -{ - Hash64 hash = fnv_offset; - for (u64 i = 0; i < type->tuple.types.length; i += 1) - { - auto* tuple_type = thread_type_get(thread,type->tuple.types.pointer[i]); - auto type_hash = hash_type(thread, tuple_type); - for (u8* it = (u8*)&type_hash; it < (u8*)(&type_hash + 1); it += 1) - { - hash = hash_byte(hash, *it); - } - } - - return hash; -} - -// fn void intern_pool_ensure_capacity(InternPool(T)* pool, Thread* thread, u32 additional) \ -// {\ -// auto current_capacity = pool->capacity; \ -// auto current_length = pool->length; \ -// assert(current_capacity % 2 == 0); \ -// auto half_capacity = current_capacity >> 1; \ -// auto destination_length = current_length + additional; \ -// \ -// if (destination_length > half_capacity) \ -// {\ -// auto new_capacity = cast_to(u32, u64, MAX(round_up_to_next_power_of_2(destination_length), 32)); \ -// auto* new_array = arena_allocate(thread->arena, u32, new_capacity); \ -// memset(new_array, 0, sizeof(u32) * new_capacity); \ -// \ -// auto* old_pointer = pool->pointer;\ -// auto old_capacity = current_capacity;\ -// auto old_length = current_length;\ -// \ -// pool->length = 0; -// pool->pointer = new_array; -// pool->capacity = new_capacity; -// -// u8* buffer; -// u64 stride; -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// buffer = (u8*)thread->buffer.types.pointer; -// stride = sizeof(Type); -// assert(pool == &thread->interned.types); -// break; -// case INTERN_POOL_KIND_NODE: -// buffer = (u8*)thread->buffer.nodes.pointer; -// stride = sizeof(Node); -// assert(pool == &thread->interned.nodes); -// break; -// } -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// auto* type = thread_type_get(thread, type_index); -// assert(type->hash == hash); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // intern_pool_put_node_assume_not_existent_assume_capacity(thread, hash, node_index); -// } break; -// } -// -// } -// } -// -// assert(old_length == pool->length); -// assert(pool->capacity == new_capacity); -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// unused(type_index); -// todo(); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // auto result = intern_pool_get_node(thread, node_index, hash); -// // assert(validi(node_index)); -// // assert(index_equal(node_index, result)); -// } break; -// } -// } -// } -// } -// } -// fn u8 node_is_projection(Node* n) -// { -// return (n->id == IR_CONTROL_PROJECTION) | (n->id == IR_PROJECTION); -// } - -// fn NodeIndex projection_get_control(Thread* thread, Node* node) -// { -// assert(node_is_projection(node)); -// auto node_index = node_input_get(thread, node, 0); -// return node_index; -// } - -// fn s32 projection_get_index(Node* node) -// { -// assert(node_is_projection(node)); -// -// switch (node->id) -// { -// case IR_CONTROL_PROJECTION: -// return node->control_projection.projection.index; -// case IR_PROJECTION: -// return node->projection.index; -// default: -// todo(); -// } -// } - -// fn TypeIndex compute_type_projection(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// assert(node_is_projection(node)); -// auto control_node_index = projection_get_control(thread, node); -// auto* control_node = thread_node_get(thread, control_node_index); -// auto* control_type = thread_type_get(thread, control_node->type); -// -// if (control_type->id == TYPE_TUPLE) -// { -// auto index = projection_get_index(node); -// auto type_index = control_type->tuple.types.pointer[index]; -// return type_index; -// } -// else -// { -// return thread->types.bottom; -// } -// } - -// fn NodeIndex idealize_control_projection(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// assert(node->id == IR_CONTROL_PROJECTION); -// auto control_node_index = projection_get_control(thread, node); -// auto* control_node = thread_node_get(thread, control_node_index); -// auto* control_type = thread_type_get(thread, control_node->type); -// auto index = node->control_projection.projection.index; -// -// if (control_type->id == TYPE_TUPLE) -// { -// if (index_equal(control_type->tuple.types.pointer[index], thread->types.dead_control)) -// { -// todo(); -// } -// if (control_node->id == IR_IF) -// { -// todo(); -// } -// } -// -// if (control_node->id == IR_IF) -// { -// todo(); -// } -// -// return invalidi(Node); -// } - -fn NodeIndex return_get_control(Thread* thread, Node* node) -{ - return node_get_inputs(thread, node).pointer[0]; -} - -fn NodeIndex return_get_value(Thread* thread, Node* node) -{ - return node_get_inputs(thread, node).pointer[1]; -} - -// fn TypeIndex intern_pool_put_new_type_at_assume_not_existent_assume_capacity(Thread* thread, Type* type, u32 index) -// { -// auto* result = vb_add(&thread->buffer.types, 1); -// auto buffer_index = cast_to(u32, s64, result - thread->buffer.types.pointer); -// auto type_index = Index(Type, buffer_index); -// *result = *type; -// -// u32 raw_type = *(u32*)&type_index; -// thread->interned.types.pointer[index] = raw_type; -// assert(raw_type); -// thread->interned.types.length += 1; -// -// return type_index; -// } - -// fn TypeIndex intern_pool_put_new_type_assume_not_existent_assume_capacity(Thread* thread, Type* type) -// { -// assert(thread->interned.types.length < thread->interned.types.capacity); -// Hash64 hash = type->hash; -// assert(hash); -// auto index = cast_to(u32, u64, hash & (thread->interned.types.capacity - 1)); -// -// return intern_pool_put_new_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } -// -// typedef enum InternPoolKind -// { -// INTERN_POOL_KIND_TYPE, -// INTERN_POOL_KIND_NODE, -// } InternPoolKind; - -// [[gnu::hot]] fn s64 intern_pool_find_node_slot(Thread* thread, u32 original_index, NodeIndex node_index) -// { -// assert(validi(node_index)); -// auto it_index = original_index; -// auto existing_capacity = thread->interned.nodes.capacity; -// s64 result = -1; -// // auto* node = thread_node_get(thread, node_index); -// -// for (u32 i = 0; i < existing_capacity; i += 1) -// { -// auto index = it_index & (existing_capacity - 1); -// u32 key = thread->interned.nodes.pointer[index]; -// -// if (key == 0) -// { -// assert(thread->interned.nodes.length < thread->interned.nodes.capacity); -// result = index; -// break; -// } -// else -// { -// NodeIndex existing_node_index = *(NodeIndex*)&key; -// // Exhaustive comparation, shortcircuit when possible -// if (node_index_equal(thread, existing_node_index, node_index)) -// { -// result = index; -// break; -// } -// } -// -// it_index += 1; -// } -// -// return result; -// } - -// fn NodeIndex intern_pool_get_node(Thread* thread, NodeIndex key, Hash64 hash) -// { -// auto original_index = cast_to(u32, u64, hash & (thread->interned.nodes.capacity - 1)); -// auto maybe_slot = intern_pool_find_node_slot(thread, original_index, key); -// auto node_index = invalidi(Node); -// -// if (maybe_slot != -1) -// { -// auto slot = cast_to(u32, s64, maybe_slot); -// auto* pointer_to_slot = &thread->interned.nodes.pointer[slot]; -// node_index = *(NodeIndex*)pointer_to_slot; -// } -// -// return node_index; -// } - -// fn NodeIndex intern_pool_put_node_at_assume_not_existent_assume_capacity(Thread* thread, NodeIndex node, u32 index) -// { -// u32 raw_node = *(u32*)&node; -// assert(raw_node); -// thread->interned.nodes.pointer[index] = raw_node; -// thread->interned.nodes.length += 1; -// -// return node; -// } - -// fn NodeIndex intern_pool_put_node_assume_not_existent_assume_capacity(Thread* thread, Hash64 hash, NodeIndex node) -// { -// auto capacity = thread->interned.nodes.capacity; -// assert(thread->interned.nodes.length < capacity); -// auto original_index = cast_to(u32, u64, hash & (capacity - 1)); -// -// auto slot = intern_pool_find_node_slot(thread, original_index, node); -// if (slot == -1) -// { -// failed_execution(); -// } -// auto index = (u32)slot; -// -// return intern_pool_put_node_at_assume_not_existent_assume_capacity(thread, node, index); -// } - -// fn void intern_pool_ensure_capacity(InternPool* pool, Thread* thread, u32 additional, InternPoolKind kind) -// { -// auto current_capacity = pool->capacity; -// auto current_length = pool->length; -// auto half_capacity = current_capacity >> 1; -// auto destination_length = current_length + additional; -// -// if (destination_length > half_capacity) -// { -// auto new_capacity = cast_to(u32, u64, MAX(round_up_to_next_power_of_2(destination_length), 32)); -// auto* new_array = arena_allocate(thread->arena, u32, new_capacity); -// memset(new_array, 0, sizeof(u32) * new_capacity); -// -// auto* old_pointer = pool->pointer; -// auto old_capacity = current_capacity; -// auto old_length = current_length; -// -// pool->length = 0; -// pool->pointer = new_array; -// pool->capacity = new_capacity; -// -// u8* buffer; -// u64 stride; -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// buffer = (u8*)thread->buffer.types.pointer; -// stride = sizeof(Type); -// assert(pool == &thread->interned.types); -// break; -// case INTERN_POOL_KIND_NODE: -// buffer = (u8*)thread->buffer.nodes.pointer; -// stride = sizeof(Node); -// assert(pool == &thread->interned.nodes); -// break; -// } -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// auto* type = thread_type_get(thread, type_index); -// assert(type->hash == hash); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // intern_pool_put_node_assume_not_existent_assume_capacity(thread, hash, node_index); -// } break; -// } -// -// } -// } -// -// assert(old_length == pool->length); -// assert(pool->capacity == new_capacity); -// -// for (u32 i = 0; i < old_capacity; i += 1) -// { -// auto key = old_pointer[i]; -// if (key) -// { -// auto hash = *(Hash64*)(buffer + (stride * (key - 1))); -// assert(hash); -// switch (kind) -// { -// case INTERN_POOL_KIND_TYPE: -// { -// auto type_index = *(TypeIndex*)&key; -// unused(type_index); -// todo(); -// } break; -// case INTERN_POOL_KIND_NODE: -// { -// auto node_index = *(NodeIndex*)&key; -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // assert(node->hash == hash); -// // auto result = intern_pool_get_node(thread, node_index, hash); -// // assert(validi(node_index)); -// // assert(index_equal(node_index, result)); -// } break; -// } -// } -// } -// } -// } -// -// fn TypeIndex intern_pool_put_new_type_assume_not_existent(Thread* thread, Type* type) -// { -// intern_pool_ensure_capacity(&thread->interned.types, thread, 1, INTERN_POOL_KIND_TYPE); -// return intern_pool_put_new_type_assume_not_existent_assume_capacity(thread, type); -// } -// -// fn s64 intern_pool_find_type_slot(Thread* thread, u32 original_index, Type* type) -// { -// auto it_index = original_index; -// auto existing_capacity = thread->interned.types.capacity; -// s64 result = -1; -// -// for (u32 i = 0; i < existing_capacity; i += 1) -// { -// auto index = it_index & (existing_capacity - 1); -// u32 key = thread->interned.types.pointer[index]; -// -// // Not set -// if (key == 0) -// { -// result = index; -// break; -// } -// else -// { -// TypeIndex existing_type_index = *(TypeIndex*)&key; -// Type* existing_type = thread_type_get(thread, existing_type_index); -// if (type_equal(existing_type, type)) -// { -// result = index; -// break; -// } -// } -// -// it_index += 1; -// } -// -// return result; -// } - -// fn s64 intern_pool_find_debug_type_slot(Thread* thread, const DebugType* type, Hash32 hash) -// { -// auto it_index = original_index; -// auto existing_capacity = thread->interned.types.capacity; -// s64 result = -1; -// -// for (u32 i = 0; i < existing_capacity; i += 1) -// { -// auto index = it_index & (existing_capacity - 1); -// u32 key = thread->interned.types.pointer[index]; -// -// // Not set -// if (key == 0) -// { -// result = index; -// break; -// } -// else -// { -// auto existing_type_index = *(DebugTypeIndex*)&key; -// DebugType* existing_type = thread_debug_type_get(thread, existing_type_index); -// auto existing_hash = hash_debug_type(existing_type); -// todo(); -// // if (type_equal(existing_type, type)) -// // { -// // result = index; -// // break; -// // } -// } -// -// it_index += 1; -// } -// -// return result; -// } - -// fn DebugTypeIndex intern_pool_put_new_debug_type_at_assume_not_existent_assume_capacity(Thread* thread, const DebugType* type, u32 index) -// { -// auto* result = vb_add(&thread->buffer.debug_types, 1); -// auto buffer_index = cast_to(u32, s64, result - thread->buffer.debug_types.pointer); -// auto type_index = Index(DebugType, buffer_index); -// *result = *type; -// -// u32 raw_type = *(u32*)&type_index; -// thread->interned.types.pointer[index] = raw_type; -// assert(raw_type); -// thread->interned.types.length += 1; -// -// return type_index; -// } - -// fn DebugTypeIndex intern_pool_put_new_debug_type_assume_not_existent_assume_capacity(Thread* thread, const DebugType* type, Hash32 hash) -// { -// assert(thread->interned.types.length < thread->interned.types.capacity); -// assert(hash); -// auto index = hash & (thread->interned.types.capacity - 1); -// -// return intern_pool_put_new_debug_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } - -// fn DebugTypeIndex intern_pool_put_new_debug_type_assume_not_existent(Thread* thread, const DebugType* type, Hash32 hash) -// { -// intern_pool_ensure_capacity(&thread->interned.types, thread, 1, INTERN_POOL_KIND_TYPE); -// return intern_pool_put_new_debug_type_assume_not_existent_assume_capacity(thread, type, hash); -// } - -// fn DebugTypeGetOrPut intern_pool_get_or_put_new_debug_type(Thread* thread, const DebugType* type) -// { -// auto existing_capacity = thread->interned.types.capacity; -// auto hash = hash_debug_type(type); -// auto original_index = cast_to(u32, u64, hash & (existing_capacity - 1)); -// -// auto maybe_slot = intern_pool_find_debug_type_slot(thread, original_index, type); -// if (maybe_slot != -1) -// { -// auto index = cast_to(u32, s64, maybe_slot); -// auto type_index = *(DebugTypeIndex*)&thread->interned.types.pointer[index]; -// u8 existing = validi(type_index); -// if (!existing) -// { -// type_index = intern_pool_put_new_debug_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } -// -// return (DebugTypeGetOrPut) { -// .index = type_index, -// .existing = existing, -// }; -// } -// else -// { -// if (thread->interned.types.length < existing_capacity) -// { -// todo(); -// } -// else if (thread->interned.types.length == existing_capacity) -// { -// auto result = intern_pool_put_new_debug_type_assume_not_existent(thread, type, hash); -// return (DebugTypeGetOrPut) { -// .index = result, -// .existing = 0, -// }; -// } -// else -// { -// todo(); -// } -// } -// } - -// fn TypeGetOrPut intern_pool_get_or_put_new_type(Thread* thread, Type* type) -// { -// auto existing_capacity = thread->interned.types.capacity; -// auto hash = hash_type(thread, type); -// auto original_index = cast_to(u32, u64, hash & (existing_capacity - 1)); -// -// auto maybe_slot = intern_pool_find_type_slot(thread, original_index, type); -// if (maybe_slot != -1) -// { -// auto index = cast_to(u32, s64, maybe_slot); -// TypeIndex type_index = *(TypeIndex*)&thread->interned.types.pointer[index]; -// u8 existing = validi(type_index); -// if (!existing) -// { -// type_index = intern_pool_put_new_type_at_assume_not_existent_assume_capacity(thread, type, index); -// } -// -// return (TypeGetOrPut) { -// .index = type_index, -// .existing = existing, -// }; -// } -// else -// { -// if (thread->interned.types.length < existing_capacity) -// { -// todo(); -// } -// else if (thread->interned.types.length == existing_capacity) -// { -// auto result = intern_pool_put_new_type_assume_not_existent(thread, type); -// return (TypeGetOrPut) { -// .index = result, -// .existing = 0, -// }; -// } -// else -// { -// todo(); -// } -// } -// } - -// fn TypeGetOrPut type_make_tuple(Thread* thread, Slice(TypeIndex) types) -// { -// Type type; -// memset(&type, 0, sizeof(Type)); -// type.tuple = (TypeTuple){ -// .types = types, -// }; -// type.id = TYPE_TUPLE; -// auto result = intern_pool_get_or_put_new_type(thread, &type); -// return result; -// } - -// fn TypeIndex type_make_tuple_allocate(Thread* thread, Slice(TypeIndex) types) -// { -// auto gop = type_make_tuple(thread, types); -// // Need to reallocate the type array -// if (!gop.existing) -// { -// auto* type = thread_type_get(thread, gop.index); -// assert(type->tuple.types.pointer == types.pointer); -// assert(type->tuple.types.length == types.length); -// type->tuple.types = arena_allocate_slice(thread->arena, TypeIndex, types.length); -// memcpy(type->tuple.types.pointer, types.pointer, sizeof(TypeIndex) * types.length); -// } -// -// return gop.index; -// } - -fn TypeIndex compute_type_return(Thread* thread, NodeIndex node_index) -{ - Node* node = thread_node_get(thread, node_index); - auto control_type = thread_node_get(thread, return_get_control(thread, node))->type; - unused(control_type); - auto return_type = thread_node_get(thread, return_get_value(thread, node))->type; - unused(return_type); - todo(); - // Slice(TypeIndex) types = array_to_slice(((TypeIndex[]) { - // control_type, - // return_type, - // })); - // auto result = type_make_tuple_allocate(thread, types); - // return result; -} - -fn NodeIndex idealize_return(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto control_node_index = return_get_control(thread, node); - auto* control_node = thread_node_get(thread, control_node_index); - unused(control_node); - // if (index_equal(control_node->type, thread->types.dead_control)) - // { - // return control_node_index; - // } - // else - // { - // return invalidi(Node); - // } - - todo(); -} - -// fn TypeIndex compute_type_dead_control(Thread* thread, NodeIndex node_index) -// { -// unused(node_index); -// return thread->types.dead_control; -// } - -// fn TypeIndex compute_type_bottom(Thread* thread, NodeIndex node_index) -// { -// unused(node_index); -// return thread->types.bottom; -// } - -// fn NodeIndex idealize_stop(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto original_input_count = node->input_count; -// for (u16 i = 0; i < node->input_count; i += 1) -// { -// auto input_node_index = node_input_get(thread, node, i); -// auto* input_node = thread_node_get(thread, input_node_index); -// if (index_equal(input_node->type, thread->types.dead_control)) -// { -// todo(); -// } -// } -// -// if (node->input_count != original_input_count) -// { -// return node_index; -// } -// else -// { -// return invalidi(Node); -// } -// } - -// fn TypeIndex compute_type_start(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// todo(); -// // return node->start.arguments; -// } - -// fn u8 type_is_constant(Type* type) -// { -// switch (type->id) -// { -// case TYPE_INTEGER: -// return type->integer.is_constant; -// default: -// return 0; -// } -// } - -// fn u8 type_is_simple(Type* type) -// { -// return type->id <= TYPE_DEAD_CONTROL; -// } - -// fn TypeIndex type_meet(Thread* thread, TypeIndex a, TypeIndex b) -// { -// TypeIndex result = invalidi(Type); -// if (index_equal(a, b)) -// { -// result = a; -// } -// else -// { -// Type* a_type = thread_type_get(thread, a); -// Type* b_type = thread_type_get(thread, b); -// TypeIndex left = invalidi(Type); -// TypeIndex right = invalidi(Type); -// -// assert(a_type != b_type); -// if (a_type->id == b_type->id) -// { -// left = a; -// right = b; -// } -// else if (type_is_simple(a_type)) -// { -// left = a; -// right = b; -// } -// else if (type_is_simple(b_type)) -// { -// todo(); -// } -// else -// { -// result = thread->types.bottom; -// } -// -// assert(!!validi(left) == !!validi(right)); -// assert((validi(left) & validi(right)) | (validi(result))); -// -// if (validi(left)) -// { -// assert(!validi(result)); -// auto* left_type = thread_type_get(thread, left); -// auto* right_type = thread_type_get(thread, right); -// -// switch (left_type->id) -// { -// case TYPE_INTEGER: -// { -// // auto integer_bot = thread->types.integer.bottom; -// // auto integer_top = thread->types.integer.top; -// // if (index_equal(left, integer_bot)) -// // { -// // result = left; -// // } -// // else if (index_equal(right, integer_bot)) -// // { -// // result = right; -// // } -// // else if (index_equal(right, integer_top)) -// // { -// // result = left; -// // } -// // else if (index_equal(left, integer_top)) -// // { -// // result = right; -// // } -// // else -// // { -// // result = integer_bot; -// // } -// if (left_type->integer.bit_count == right_type->integer.bit_count) -// { -// todo(); -// } -// else -// { -// if ((!left_type->integer.is_constant & !!left_type->integer.bit_count) & (right_type->integer.is_constant & !right_type->integer.bit_count)) -// { -// result = left; -// } -// else if ((left_type->integer.is_constant & !left_type->integer.bit_count) & (!right_type->integer.is_constant & !!right_type->integer.bit_count)) -// { -// todo(); -// } -// } -// } break; -// case TYPE_BOTTOM: -// { -// assert(type_is_simple(left_type)); -// if ((left_type->id == TYPE_BOTTOM) | (right_type->id == TYPE_TOP)) -// { -// result = left; -// } -// else if ((left_type->id == TYPE_TOP) | (right_type->id == TYPE_BOTTOM)) -// { -// result = right; -// } -// else if (!type_is_simple(right_type)) -// { -// result = thread->types.bottom; -// } -// else if (left_type->id == TYPE_LIVE_CONTROL) -// { -// result = thread->types.live_control; -// } -// else -// { -// result = thread->types.dead_control; -// } -// } break; -// default: -// todo(); -// } -// } -// } -// -// assert(validi(result)); -// -// return result; -// } - -// fn u8 type_is_a(Thread* thread, TypeIndex a, TypeIndex b) -// { -// auto m = type_meet(thread, a, b); -// return index_equal(m, b); -// } - -// fn TypeIndex compute_type_integer_binary(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto* left = thread_node_get(thread, inputs.pointer[1]); -// auto* right = thread_node_get(thread, inputs.pointer[2]); -// assert(!node_is_dead(left)); -// assert(!node_is_dead(right)); -// auto* left_type = thread_type_get(thread, left->type); -// auto* right_type = thread_type_get(thread, right->type); -// -// if (((left_type->id == TYPE_INTEGER) & (right_type->id == TYPE_INTEGER)) & (type_is_constant(left_type) & type_is_constant(right_type))) -// { -// auto left_value = left_type->integer.constant; -// auto right_value = right_type->integer.constant; -// assert(left_type->integer.bit_count == 0); -// assert(right_type->integer.bit_count == 0); -// assert(!left_type->integer.is_signed); -// assert(!right_type->integer.is_signed); -// -// u64 result; -// TypeInteger type_integer = left_type->integer; -// -// switch (node->id) -// { -// case IR_INTEGER_ADD: -// result = left_value + right_value; -// break; -// case IR_INTEGER_SUBSTRACT: -// result = left_value - right_value; -// break; -// case IR_INTEGER_MULTIPLY: -// result = left_value * right_value; -// break; -// case IR_INTEGER_SIGNED_DIVIDE: -// result = left_value * right_value; -// break; -// case IR_INTEGER_AND: -// result = left_value & right_value; -// break; -// case IR_INTEGER_OR: -// result = left_value | right_value; -// break; -// case IR_INTEGER_XOR: -// result = left_value ^ right_value; -// break; -// case IR_INTEGER_SIGNED_SHIFT_LEFT: -// result = left_value << right_value; -// break; -// case IR_INTEGER_SIGNED_SHIFT_RIGHT: -// result = left_value >> right_value; -// break; -// default: -// todo(); -// } -// -// type_integer.constant = result; -// -// auto new_type = thread_get_integer_type(thread, type_integer); -// return new_type; -// } -// else -// { -// auto result = type_meet(thread, left->type, right->type); -// return result; -// } -// } - -global_variable const TypeVirtualTable type_functions[TYPE_COUNT] = { - [TYPE_BOTTOM] = { .get_hash = &type_get_hash_default }, - [TYPE_TOP] = { .get_hash = &type_get_hash_default }, - [TYPE_LIVE_CONTROL] = { .get_hash = &type_get_hash_default }, - [TYPE_DEAD_CONTROL] = { .get_hash = &type_get_hash_default }, - [TYPE_INTEGER] = { .get_hash = &type_get_hash_default }, - [TYPE_TUPLE] = { .get_hash = &type_get_hash_tuple }, -}; - -global_variable const NodeVirtualTable node_functions[NODE_COUNT] = { - // [NODE_START] = { - // .compute_type = &compute_type_start, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_STOP] = { - // .compute_type = &compute_type_bottom, - // .idealize = &idealize_stop, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_CONTROL_PROJECTION] = { - // .compute_type = &compute_type_projection, - // .idealize = &idealize_control_projection, - // .get_hash = &node_get_hash_control_projection, - // }, - // [NODE_DEAD_CONTROL] = { - // .compute_type = &compute_type_dead_control, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_default, - // }, - [IR_RETURN] = { - .compute_type = &compute_type_return, - .idealize = &idealize_return, - .get_hash = &node_get_hash_default, - }, - // [NODE_PROJECTION] = { - // .compute_type = &compute_type_projection, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_projection, - // }, - // [NODE_SCOPE] = { - // .compute_type = &compute_type_bottom, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_scope, - // }, - - // Integer operations - // [NODE_INTEGER_ADD] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_SUBSTRACT] = { - // .compute_type = &compute_type_integer_binary, - // .idealize = &node_idealize_substract, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_INTEGER_SIGNED_DIVIDE] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_MULTIPLY] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_AND] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_OR] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_XOR] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_SIGNED_SHIFT_LEFT] = { - // .compute_type = &compute_type_integer_binary, - // }, - // [NODE_INTEGER_SIGNED_SHIFT_RIGHT] = { - // .compute_type = &compute_type_integer_binary, - // }, - // - // [NODE_INTEGER_COMPARE_EQUAL] = { - // .compute_type = &compute_type_integer_binary, - // .idealize = &node_idealize_compare, - // .get_hash = &node_get_hash_default, - // }, - // [NODE_INTEGER_COMPARE_NOT_EQUAL] = { - // .compute_type = &compute_type_integer_binary, - // .idealize = &node_idealize_compare, - // .get_hash = &node_get_hash_default, - // }, - // - // // Constant - // [NODE_CONSTANT] = { - // .compute_type = &compute_type_constant, - // .idealize = &idealize_null, - // .get_hash = &node_get_hash_constant, - // }, -}; - -fn String type_id_to_string(Type* type) -{ - switch (type->id) - { - case_to_name(TYPE_, BOTTOM); - case_to_name(TYPE_, TOP); - case_to_name(TYPE_, LIVE_CONTROL); - case_to_name(TYPE_, DEAD_CONTROL); - case_to_name(TYPE_, INTEGER); - case_to_name(TYPE_, TUPLE); - case_to_name(TYPE_, COUNT); - } -} - -fn Hash64 hash_type(Thread* thread, Type* type) -{ - Hash64 hash = type->hash; - - if (!hash) - { - hash = type_functions[type->id].get_hash(thread, type); - // print("Hashing type id {s}: {u64:x}\n", type_id_to_string(type), hash); - } - - assert(hash != 0); - type->hash = hash; - - return hash; -} - -// fn NodeIndex intern_pool_put_node_assume_not_existent(Thread* thread, Hash64 hash, NodeIndex node) -// { -// intern_pool_ensure_capacity(&thread->interned.nodes, thread, 1, INTERN_POOL_KIND_NODE); -// return intern_pool_put_node_assume_not_existent_assume_capacity(thread, hash, node); -// } - -// fn Hash64 hash_node(Thread* thread, Node* node, NodeIndex node_index) -// { -// auto hash = node->hash; -// if (!hash) -// { -// hash = fnv_offset; -// hash = node_functions[node->id].get_hash(thread, node, node_index, hash); -// // print("[HASH #{u32}] Received hash from callback: {u64:x}\n", node_index.index, hash); -// -// hash = hash_byte(hash, node->id); -// -// auto inputs = node_get_inputs(thread, node); -// for (u32 i = 0; i < inputs.length; i += 1) -// { -// auto input_index = inputs.pointer[i]; -// if (validi(input_index)) -// { -// for (u8* it = (u8*)&input_index; it < (u8*)(&input_index + 1); it += 1) -// { -// hash = hash_byte(hash, *it); -// } -// } -// } -// -// // print("[HASH] Node #{u32}, {s}: {u64:x}\n", node_index.index, node_id_to_string(node), hash); -// -// node->hash = hash; -// } -// -// assert(hash); -// -// return hash; -// } - -// fn NodeGetOrPut intern_pool_get_or_put_node(Thread* thread, NodeIndex node_index) -// { -// assert(thread->interned.nodes.length <= thread->interned.nodes.capacity); -// auto existing_capacity = thread->interned.nodes.capacity; -// auto* node = &thread->buffer.nodes.pointer[geti(node_index)]; -// auto hash = hash_node(thread, node, node_index); -// auto original_index = hash & (existing_capacity - 1); -// -// auto slot = intern_pool_find_node_slot(thread, original_index, node_index); -// if (slot != -1) -// { -// u32 index = slot; -// auto* existing_ptr = &thread->interned.nodes.pointer[index]; -// NodeIndex existing_value = *(NodeIndex*)existing_ptr; -// u8 existing = validi(existing_value); -// NodeIndex new_value = existing_value; -// if (!existing) -// { -// assert(thread->interned.nodes.length < thread->interned.nodes.capacity); -// new_value = intern_pool_put_node_at_assume_not_existent_assume_capacity(thread, node_index, index); -// assert(!index_equal(new_value, existing_value)); -// assert(index_equal(new_value, node_index)); -// } -// return (NodeGetOrPut) { -// .index = new_value, -// .existing = existing, -// }; -// } -// else -// { -// if (thread->interned.nodes.length < existing_capacity) -// { -// todo(); -// } -// else if (thread->interned.nodes.length == existing_capacity) -// { -// auto result = intern_pool_put_node_assume_not_existent(thread, hash, node_index); -// return (NodeGetOrPut) { -// .index = result, -// .existing = 0, -// }; -// } -// else -// { -// todo(); -// } -// } -// } - -// fn NodeIndex intern_pool_remove_node(Thread* thread, NodeIndex node_index) -// { -// auto existing_capacity = thread->interned.nodes.capacity; -// auto* node = thread_node_get(thread, node_index); -// auto hash = hash_node(thread, node, node_index); -// -// auto original_index = hash & (existing_capacity - 1); -// auto slot = intern_pool_find_node_slot(thread, cast_to(u32, u64, original_index), node_index); -// -// if (slot != -1) -// { -// auto i = (u32)slot; -// auto* slot_pointer = &thread->interned.nodes.pointer[i]; -// auto old_node_index = *(NodeIndex*)slot_pointer; -// assert(validi(old_node_index)); -// thread->interned.nodes.length -= 1; -// *slot_pointer = 0; -// -// auto j = i; -// -// while (1) -// { -// j = (j + 1) & (existing_capacity - 1); -// -// auto existing = thread->interned.nodes.pointer[j]; -// if (existing == 0) -// { -// break; -// } -// -// auto existing_node_index = *(NodeIndex*)&existing; -// auto* existing_node = thread_node_get(thread, existing_node_index); -// auto existing_node_hash = hash_node(thread, existing_node, existing_node_index); -// auto k = existing_node_hash & (existing_capacity - 1); -// -// if (i <= j) -// { -// if ((i < k) & (k <= j)) -// { -// continue; -// } -// } -// else -// { -// if ((k <= j) | (i < k)) -// { -// continue; -// } -// } -// -// thread->interned.nodes.pointer[i] = thread->interned.nodes.pointer[j]; -// thread->interned.nodes.pointer[j] = 0; -// -// i = j; -// } -// -// return old_node_index; -// } -// else -// { -// todo(); -// } -// } - -STRUCT(Parser) -{ - u64 i; - u32 line; - u32 column; -}; - -[[gnu::hot]] fn void skip_space(Parser* parser, String src) -{ - u64 original_i = parser->i; - - if (original_i != src.length) - { - if (is_space(src.pointer[original_i], get_next_ch_safe(src, original_i))) - { - while (parser->i < src.length) - { - u64 index = parser->i; - u8 ch = src.pointer[index]; - u64 new_line = ch == '\n'; - parser->line += new_line; - - if (new_line) - { - // TODO: is this a bug? - parser->column = cast_to(u32, u64, index + 1); - } - - if (!is_space(ch, get_next_ch_safe(src, parser->i))) - { - break; - } - - u32 is_comment = src.pointer[index] == '/'; - parser->i += is_comment + is_comment; - if (is_comment) - { - while (parser->i < src.length) - { - if (src.pointer[parser->i] == '\n') - { - break; - } - - parser->i += 1; - } - - continue; - } - - parser->i += 1; - } - } - } -} - -[[gnu::hot]] fn void expect_character(Parser* parser, String src, u8 expected_ch) -{ - u64 index = parser->i; - if (likely(index < src.length)) - { - u8 ch = src.pointer[index]; - auto matches = cast_to(u64, s64, likely(ch == expected_ch)); - parser->i += matches; - if (!matches) - { - print_string(strlit("expected character '")); - print_string(ch_to_str(expected_ch)); - print_string(strlit("', but found '")); - print_string(ch_to_str(ch)); - print_string(strlit("'\n")); - failed_execution(); - } - } - else - { - print_string(strlit("expected character '")); - print_string(ch_to_str(expected_ch)); - print_string(strlit("', but found end of file\n")); - failed_execution(); - } -} - -[[gnu::hot]] fn String parse_identifier(Parser* parser, String src) -{ - u64 identifier_start_index = parser->i; - u64 is_string_literal = src.pointer[identifier_start_index] == '"'; - parser->i += is_string_literal; - u8 identifier_start_ch = src.pointer[parser->i]; - u64 is_valid_identifier_start = is_identifier_start(identifier_start_ch); - parser->i += is_valid_identifier_start; - - if (likely(is_valid_identifier_start)) - { - while (parser->i < src.length) - { - u8 ch = src.pointer[parser->i]; - auto is_identifier = cast_to(u64, s64, likely(is_identifier_ch(ch))); - parser->i += is_identifier; - - if (!is_identifier) - { - if (unlikely(is_string_literal)) - { - expect_character(parser, src, '"'); - } - - String result = s_get_slice(u8, src, identifier_start_index, parser->i - is_string_literal); - return result; - } - } - - failed_execution(); - } - else - { - failed_execution(); - } -} - -#define array_start '[' -#define array_end ']' - -#define argument_start '(' -#define argument_end ')' - -#define block_start '{' -#define block_end '}' - -#define pointer_sign '*' - -// fn void thread_add_job(Thread* thread, NodeIndex node_index) -// { -// unused(thread); -// unused(node_index); -// todo(); -// } - -// fn void thread_add_jobs(Thread* thread, Slice(NodeIndex) nodes) -// { -// for (u32 i = 0; i < nodes.length; i += 1) -// { -// NodeIndex node_index = nodes.pointer[i]; -// thread_add_job(thread, node_index); -// } -// } - -union NodePair -{ - struct - { - NodeIndex old; - NodeIndex new; - }; - NodeIndex nodes[2]; -}; -typedef union NodePair NodePair; - -// fn NodeIndex node_keep(Thread* thread, NodeIndex node_index) -// { -// return node_add_output(thread, node_index, invalidi(Node)); -// } - -// fn NodeIndex node_unkeep(Thread* thread, NodeIndex node_index) -// { -// node_remove_output(thread, node_index, invalidi(Node)); -// return node_index; -// } - -fn NodeIndex dead_code_elimination(Thread* thread, NodePair nodes) -{ - NodeIndex old = nodes.old; - NodeIndex new = nodes.new; - - if (!index_equal(old, new)) - { - // print("[DCE] old: #{u32} != new: #{u32}. Proceeding to eliminate\n", old.index, new.index); - auto* old_node = thread_node_get(thread, old); - unused(old_node); - todo(); - // if (node_is_unused(old_node) & !node_is_dead(old_node)) - // { - // node_keep(thread, new); - // todo(); - // // node_kill(thread, old); - // // node_unkeep(thread, new); - // } - } - - return new; -} - -// fn u8 type_is_high_or_const(Thread* thread, TypeIndex type_index) -// { -// u8 result = index_equal(type_index, thread->types.top) | index_equal(type_index, thread->types.dead_control); -// if (!result) -// { -// Type* type = thread_type_get(thread, type_index); -// switch (type->id) -// { -// case TYPE_INTEGER: -// result = type->integer.is_constant | ((type->integer.constant == 0) & (type->integer.bit_count == 0)); -// break; -// default: -// break; -// } -// } -// -// return result; -// } - -// fn TypeIndex type_join(Thread* thread, TypeIndex a, TypeIndex b) -// { -// TypeIndex result; -// if (index_equal(a, b)) -// { -// result = a; -// } -// else -// { -// unused(thread); -// todo(); -// } -// -// return result; -// } - -// fn void node_set_type(Thread* thread, Node* node, TypeIndex new_type) -// { -// todo(); -// // auto old_type = node->type; -// // assert(!validi(old_type) || type_is_a(thread, new_type, old_type)); -// // if (!index_equal(old_type, new_type)) -// // { -// // node->type = new_type; -// // auto outputs = node_get_outputs(thread, node); -// // thread_add_jobs(thread, outputs); -// // // move_dependencies_to_worklist(thread, node); -// // } -// } - -global_variable auto enable_peephole = 1; - -fn NodeIndex peephole_optimize(Thread* thread, Function* function, NodeIndex node_index) -{ - assert(enable_peephole); - auto result = node_index; - auto* node = thread_node_get(thread, node_index); - // print("Peepholing node #{u32} ({s})\n", node_index.index, node_id_to_string(node)); - auto old_type = node->type; - auto new_type = node_functions[node->id].compute_type(thread, node_index); - unused(new_type); - unused(old_type); - - if (enable_peephole) - { - unused(function); - // thread->iteration.total += 1; - // node_set_type(thread, node, new_type); - // - // if (node->id != NODE_CONSTANT && node->id != NODE_DEAD_CONTROL && type_is_high_or_const(thread, node->type)) - // { - // if (index_equal(node->type, thread->types.dead_control)) - // { - // todo(); - // } - // else - // { - // auto constant_node = constant_int_create_with_type(thread, function, node->type); - // return constant_node; - // } - // } - // - // auto idealize = 1; - // if (!node->hash) - // { - // auto gop = intern_pool_get_or_put_node(thread, node_index); - // idealize = !gop.existing; - // - // if (gop.existing) - // { - // auto interned_node_index = gop.index; - // auto* interned_node = thread_node_get(thread, interned_node_index); - // auto new_type = type_join(thread, interned_node->type, node->type); - // node_set_type(thread, interned_node, new_type); - // node->hash = 0; - // // print("[peephole_optimize] Eliminating #{u32} because an existing node was found: #{u32}\n", node_index.index, interned_node_index.index); - // auto dce_node = dead_code_elimination(thread, (NodePair) { - // .old = node_index, - // .new = interned_node_index, - // }); - // - // result = dce_node; - // } - // } - // - // if (idealize) - // { - // auto idealized_node = node_functions[node->id].idealize(thread, node_index); - // if (validi(idealized_node)) - // { - // result = idealized_node; - // } - // else - // { - // u64 are_types_equal = index_equal(new_type, old_type); - // thread->iteration.nop += are_types_equal; - // - // result = are_types_equal ? invalidi(Node) : node_index; - // } - // } - todo(); - } - else - { - todo(); - // node->type = new_type; - } - - return result; -} - -fn NodeIndex peephole(Thread* thread, Function* function, NodeIndex node_index) -{ - NodeIndex result; - if (enable_peephole) - { - NodeIndex new_node = peephole_optimize(thread, function, node_index); - if (validi(new_node)) - { - NodeIndex peephole_new_node = peephole(thread, function, new_node); - // print("[peephole] Eliminating #{u32} because a better node was found: #{u32}\n", node_index.index, new_node.index); - auto dce_node = dead_code_elimination(thread, (NodePair) - { - .old = node_index, - .new = peephole_new_node, - }); - - result = dce_node; - } - else - { - result = node_index; - } - } - else - { - auto* node = thread_node_get(thread, node_index); - auto new_type = node_functions[node->id].compute_type(thread, node_index); - unused(new_type); - todo(); - // node->type = new_type; - // result = node_index; - } - - return result; -} - -fn NodeIndex node_project(Thread* thread, NodeIndex node_index, TypePair type, u32 index) -{ - auto* node = thread_node_get(thread, node_index); - assert(type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE); - auto projection_node_index = thread_node_add(thread, (NodeCreate) - { - .id = IR_PROJECTION, - .inputs = array_to_slice(((NodeIndex[]) { node_index })), - .type_pair = type, - }); - auto* projection = thread_node_get(thread, projection_node_index); - projection->projection = (NodeProjection) - { - .index = index, - }; - return projection_node_index; -} - -fn TypePair analyze_type(Thread* thread, Parser* parser, String src) -{ - u64 start_index = parser->i; - u8 start_ch = src.pointer[start_index]; - u32 is_array_start = start_ch == array_start; - u32 u_start = start_ch == 'u'; - u32 s_start = start_ch == 's'; - u32 float_start = start_ch == 'f'; - u32 void_start = start_ch == 'v'; - u32 pointer_start = start_ch == pointer_sign; - u32 integer_start = u_start | s_start; - u32 number_start = integer_start | float_start; - - if (void_start) - { - todo(); - } - else if (is_array_start) - { - todo(); - } - else if (pointer_start) - { - todo(); - } - else if (number_start) - { - u64 expected_digit_start = start_index + 1; - u64 i = expected_digit_start; - u32 decimal_digit_count = 0; - u64 top = i + 5; - - while (i < top) - { - u8 ch = src.pointer[i]; - auto is_digit = is_decimal_digit(ch); - decimal_digit_count += is_digit; - if (!is_digit) - { - auto is_alpha = is_alphabetic(ch); - if (is_alpha) - { - decimal_digit_count = 0; - } - break; - } - - i += 1; - } - - if (decimal_digit_count) - { - parser->i += 1; - - if (integer_start) - { - auto signedness = cast_to(u8, u64, s_start); - u64 bit_size; - u64 current_i = parser->i; - assert(src.pointer[current_i] >= '0' & src.pointer[current_i] <= '9'); - switch (decimal_digit_count) { - case 0: - failed_execution(); - case 1: - bit_size = src.pointer[current_i] - '0'; - break; - case 2: - bit_size = (src.pointer[current_i] - '0') * 10 + (src.pointer[current_i + 1] - '0'); - break; - default: - failed_execution(); - } - parser->i += decimal_digit_count; - - assert(!is_decimal_digit(src.pointer[parser->i])); - - if (bit_size) - { - auto bit_count = cast_to(u8, u64, bit_size); - auto valid = MIN(MAX(8, round_up_to_next_power_of_2(MAX(bit_count, 1))), 64); - if (bit_count != valid) - { - failed_execution(); - } - auto bit_index = cast_to(u32, s32, __builtin_ctz(bit_count >> 3)); - static_assert(array_length(thread->types.debug.integer.array) == 8); - auto index = signedness * 4 + bit_index; - auto debug_type_index = thread->types.debug.integer.array[index]; - BackendTypeId backend_type = cast_to(u8, u32, bit_index + 1); - auto type_pair = type_pair_make(debug_type_index, backend_type); - return type_pair; - } - else - { - failed_execution(); - } - } - else if (float_start) - { - todo(); - } - else - { - todo(); - } - } - else - { - failed_execution(); - } - } - - todo(); -} - -declare_ip_functions(Node, node) - -// TODO: -fn NodeIndex node_gvn_intern(Thread* thread, NodeIndex node_index) -{ - auto result = ip_Node_get_or_put(&thread->interned.nodes, thread, node_index); - if (result.existing) - { - assert(thread_node_get(thread, result.index)->interned); - } - else - { - thread_node_get(thread, node_index)->interned = 1; - } - return result.index; -} - -fn void node_gvn_remove(Thread* thread, NodeIndex node_index) -{ - auto result = ip_Node_remove(&thread->interned.nodes, thread, node_index); - assert(index_equal(result, node_index)); - thread_node_get(thread, node_index)->interned = 0; -} - -fn NodeIndex analyze_primary_expression(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - u8 starting_ch = src.pointer[parser->i]; - u64 is_digit = is_decimal_digit(starting_ch); - u64 is_identifier = is_identifier_start(starting_ch); - - if (is_identifier) - { - String identifier = parse_identifier(parser, src); - unused(identifier); - todo(); - // auto node_index = scope_lookup(thread, builder, identifier); - // if (validi(node_index)) - // { - // return node_index; - // } - // else - // { - // failed_execution(); - // } - } - else if (is_digit) - { - typedef enum IntegerPrefix { - INTEGER_PREFIX_HEXADECIMAL, - INTEGER_PREFIX_DECIMAL, - INTEGER_PREFIX_OCTAL, - INTEGER_PREFIX_BINARY, - } IntegerPrefix; - IntegerPrefix prefix = INTEGER_PREFIX_DECIMAL; - u64 value = 0; - - if (starting_ch == '0') - { - auto follow_up_character = src.pointer[parser->i + 1]; - auto is_hex_start = follow_up_character == 'x'; - auto is_octal_start = follow_up_character == 'o'; - auto is_bin_start = follow_up_character == 'b'; - auto is_prefixed_start = is_hex_start | is_octal_start | is_bin_start; - auto follow_up_alpha = is_alphabetic(follow_up_character); - auto follow_up_digit = is_decimal_digit(follow_up_character); - auto is_valid_after_zero = is_space(follow_up_character, get_next_ch_safe(src, follow_up_character)) | (!follow_up_digit & !follow_up_alpha); - - if (is_prefixed_start) { - switch (follow_up_character) { - case 'x': prefix = INTEGER_PREFIX_HEXADECIMAL; break; - case 'o': prefix = INTEGER_PREFIX_OCTAL; break; - case 'd': prefix = INTEGER_PREFIX_DECIMAL; break; - case 'b': prefix = INTEGER_PREFIX_BINARY; break; - default: failed_execution(); - }; - - parser->i += 2; - - } else if (!is_valid_after_zero) { - failed_execution(); - } - } - - auto start = parser->i; - - switch (prefix) - { - case INTEGER_PREFIX_HEXADECIMAL: - { - // while (is_hex_digit(src[parser->i])) { - // parser->i += 1; - // } - - todo(); - // auto slice = src.slice(start, parser->i); - // value = parse_hex(slice); - } break; - case INTEGER_PREFIX_DECIMAL: - { - while (is_decimal_digit(src.pointer[parser->i])) - { - parser->i += 1; - } - - value = parse_decimal(s_get_slice(u8, src, start, parser->i)); - } break; - case INTEGER_PREFIX_OCTAL: - { - todo(); - } break; - case INTEGER_PREFIX_BINARY: - { - todo(); - } break; - } - - auto node_index = thread_node_add(thread, (NodeCreate){ - .inputs = array_to_slice(((NodeIndex []) { - builder->function->root, - })), - .type_pair = type_pair_make(thread->types.debug.integer.u64, BACKEND_TYPE_INTEGER_64), - .id = IR_INTEGER_CONSTANT, - }); - - auto* node = thread_node_get(thread, node_index); - node->integer_constant = (NodeIntegerConstant) { - .unsigned_value = value, - }; - - auto new_node_index = node_gvn_intern(thread, node_index); - - return new_node_index; - } - else - { - todo(); - } -} - -fn NodeIndex analyze_unary(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - typedef enum PrefixOperator - { - PREFIX_OPERATOR_NONE = 0, - PREFIX_OPERATOR_NEGATION, - PREFIX_OPERATOR_LOGICAL_NOT, - PREFIX_OPERATOR_BITWISE_NOT, - PREFIX_OPERATOR_ADDRESS_OF, - } PrefixOperator; - - PrefixOperator prefix_operator; - NodeIndex node_index; - - switch (src.pointer[parser->i]) - { - case '-': - todo(); - case '!': - todo(); - case '~': - todo(); - case '&': - todo(); - default: - { - node_index = analyze_primary_expression(thread, parser, builder, src); - prefix_operator = PREFIX_OPERATOR_NONE; - } break; - } - - // typedef enum SuffixOperator - // { - // SUFFIX_OPERATOR_NONE = 0, - // SUFFIX_OPERATOR_CALL, - // SUFFIX_OPERATOR_ARRAY, - // SUFFIX_OPERATOR_FIELD, - // SUFFIX_OPERATOR_POINTER_DEREFERENCE, - // } SuffixOperator; - // - // SuffixOperator suffix_operator; - - skip_space(parser, src); - - switch (src.pointer[parser->i]) - { - case argument_start: - todo(); - case array_start: - todo(); - case '.': - todo(); - default: - break; - } - - if (prefix_operator != PREFIX_OPERATOR_NONE) - { - todo(); - } - - return node_index; -} - -fn NodeIndex analyze_multiplication(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_unary(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - u64 skip_count = 1; - - switch (src.pointer[parser->i]) - { - case '*': - node_id = IR_INTEGER_MULTIPLY; - break; - case '/': - node_id = IR_INTEGER_DIVIDE; - break; - case '%': - todo(); - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += skip_count; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_multiplication(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - todo(); - // node_set_input(thread, new_node_index, 2, right); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - // print("Analyze addition returned node #{u32}\n", left.index); - - return left; -} - -fn NodeIndex analyze_addition(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_multiplication(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - - switch (src.pointer[parser->i]) - { - case '+': - node_id = IR_INTEGER_ADD; - break; - case '-': - node_id = IR_INTEGER_SUBSTRACT; - break; - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += 1; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_multiplication(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - // print("Analyze addition returned node #{u32}\n", left.index); - - return left; -} - -fn NodeIndex analyze_shift(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_addition(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - - if ((src.pointer[parser->i] == '<') & (src.pointer[parser->i + 1] == '<')) - { - node_id = IR_INTEGER_SHIFT_LEFT; - } - else if ((src.pointer[parser->i] == '>') & (src.pointer[parser->i + 1] == '>')) - { - node_id = IR_INTEGER_SHIFT_RIGHT; - } - else - { - break; - } - - parser->i += 2; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_addition(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - return left; -} - -fn NodeIndex analyze_bitwise_binary(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_shift(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - u64 skip_count = 1; - - switch (src.pointer[parser->i]) - { - case '&': - node_id = IR_INTEGER_AND; - break; - case '|': - node_id = IR_INTEGER_OR; - break; - case '^': - node_id = IR_INTEGER_XOR; - break; - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += skip_count; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_shift(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - return left; -} - -fn NodeIndex analyze_comparison(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - auto left = analyze_bitwise_binary(thread, parser, builder, src); - - while (1) - { - skip_space(parser, src); - - NodeId node_id; - u64 skip_count = 1; - - switch (src.pointer[parser->i]) - { - case '=': - todo(); - case '!': - if (src.pointer[parser->i + 1] == '=') - { - skip_count = 2; - node_id = IR_INTEGER_COMPARE_NOT_EQUAL; - } - else - { - failed_execution(); - } - break; - case '<': - todo(); - case '>': - todo(); - default: - node_id = NODE_COUNT; - break; - } - - if (node_id == NODE_COUNT) - { - break; - } - - parser->i += skip_count; - skip_space(parser, src); - - auto new_node_index = thread_node_add(thread, (NodeCreate) { - .id = node_id, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - left, - invalidi(Node), - })), - }); - - // print("Before right: LEFT is #{u32}\n", left.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - auto right = analyze_bitwise_binary(thread, parser, builder, src); - unused(right); - // print("Addition: left: #{u32}, right: #{u32}\n", left.index, right.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - // node_set_input(thread, new_node_index, 2, right); - todo(); - - // print("Addition new node #{u32}\n", new_node_index.index); - // print("Left code:\n```\n{s}\n```\n", s_get_slice(u8, src, parser->i, src.length)); - - left = peephole(thread, builder->function, new_node_index); - } - - return left; -} - -fn NodeIndex analyze_expression(Thread* thread, Parser* parser, FunctionBuilder* builder, String src, TypePair result_type) -{ - NodeIndex result = analyze_comparison(thread, parser, builder, src); - // TODO: typecheck - unused(result_type); - return result; -} - -fn void analyze_block(Thread* thread, Parser* parser, FunctionBuilder* builder, String src) -{ - expect_character(parser, src, block_start); - - // TODO - // scope_push(thread, builder); - - Function* function = builder->function; - - while (1) - { - skip_space(parser, src); - - if (s_get(src, parser->i) == block_end) - { - break; - } - - u8 statement_start_ch = src.pointer[parser->i]; - - if (is_identifier_start(statement_start_ch)) - { - String statement_start_identifier = parse_identifier(parser, src); - if (s_equal(statement_start_identifier, (strlit("return")))) - { - skip_space(parser, src); - NodeIndex return_value = analyze_expression(thread, parser, builder, src, function->return_type); - skip_space(parser, src); - expect_character(parser, src, ';'); - - auto* current_node = thread_node_get(thread, builder->current); - auto current_inputs = node_get_inputs(thread, current_node); - auto mem_state = current_inputs.pointer[2]; - - auto return_node_index = node_get_inputs(thread, thread_node_get(thread, builder->function->root)).pointer[1]; - auto* return_node = thread_node_get(thread, return_node_index); - assert(return_node->input_count >= 4); - auto return_inputs = node_get_inputs(thread, return_node); - - node_add_input(thread, return_inputs.pointer[1], mem_state); - - node_add_input(thread, return_inputs.pointer[3], return_value); - - auto control = return_inputs.pointer[0]; - assert(thread_node_get(thread, control)->id == IR_REGION); - - assert(validi(current_inputs.pointer[0])); - node_add_input(thread, control, current_inputs.pointer[0]); - - builder->current = invalidi(Node); - continue; - } - - String left_name = statement_start_identifier; - unused(left_name); - - skip_space(parser, src); - - typedef enum AssignmentOperator - { - ASSIGNMENT_OPERATOR_NONE, - } AssignmentOperator; - - AssignmentOperator assignment_operator; - switch (src.pointer[parser->i]) - { - case '=': - assignment_operator = ASSIGNMENT_OPERATOR_NONE; - parser->i += 1; - break; - default: - todo(); - } - unused(assignment_operator); - - skip_space(parser, src); - - NodeIndex initial_right = analyze_expression(thread, parser, builder, src, type_pair_invalid); - unused(initial_right); - - expect_character(parser, src, ';'); - - todo(); - - // auto left = scope_lookup(thread, builder, left_name); - // if (!validi(left)) - // { - // failed_execution(); - // } - // - // NodeIndex right; - // switch (assignment_operator) - // { - // case ASSIGNMENT_OPERATOR_NONE: - // right = initial_right; - // break; - // } - // - // scope_update(thread, builder, left_name, right); - } - else - { - switch (statement_start_ch) - { - case '>': - { - parser->i += 1; - skip_space(parser, src); - - String local_name = parse_identifier(parser, src); - unused(local_name); - - skip_space(parser, src); - - auto type = type_pair_invalid; - - u8 has_type_declaration = src.pointer[parser->i] == ':'; - if (has_type_declaration) - { - parser->i += 1; - - skip_space(parser, src); - - type = analyze_type(thread, parser, src); - - skip_space(parser, src); - } - - expect_character(parser, src, '='); - - skip_space(parser, src); - - auto initial_value_node_index = analyze_expression(thread, parser, builder, src, type); - skip_space(parser, src); - expect_character(parser, src, ';'); - - auto* initial_value_node = thread_node_get(thread, initial_value_node_index); - unused(initial_value_node); - - // TODO: typecheck - todo(); - - // auto result = scope_define(thread, builder, local_name, initial_value_node->type, initial_value_node_index); - // if (!validi(result)) - // { - // failed_execution(); - // } - } break; - case block_start: - analyze_block(thread, parser, builder, src); - break; - default: - todo(); - break; - } - } - } - - expect_character(parser, src, block_end); - - // scope_pop(thread, builder); -} - -fn void analyze_file(Thread* thread, File* file) -{ - Parser p = {}; - Parser* restrict parser = &p; - String src = file->source; - - while (1) - { - skip_space(parser, src); - - if (parser->i == src.length) - { - break; - } - - // Parse top level declaration - u64 start_ch_index = parser->i; - auto start_line = parser->line; - auto start_column = parser->column; - u8 start_ch = s_get(src, start_ch_index); - - u64 is_identifier = is_identifier_start(start_ch); - - if (is_identifier) - { - u8 next_ch = get_next_ch_safe(src, start_ch_index); - u64 is_fn = (start_ch == 'f') & (next_ch == 'n'); - - if (is_fn) - { - parser->i += 2; - - FunctionBuilder function_builder = {}; - FunctionBuilder* builder = &function_builder; - builder->file = file; - - skip_space(parser, src); - - Function* restrict function = vb_add(&thread->buffer.functions, 1); - auto function_index = cast_to(u32, s64, function - thread->buffer.functions.pointer); - memset(function, 0, sizeof(Function)); - builder->function = function; - function->line = start_line; - function->column = start_column; - function->name = parse_identifier(parser, src); - if (s_equal(function->name, strlit("main"))) - { - thread->main_function = function_index; - } - - skip_space(parser, src); - - // Parse arguments - expect_character(parser, src, argument_start); - - u32 argument_i = 0; - String argument_names[255]; - - while (1) - { - skip_space(parser, src); - if (src.pointer[parser->i] == argument_end) - { - break; - } - - if (argument_i == 255) - { - // Maximum arguments reached - failed_execution(); - } - - auto argument_name = parse_identifier(parser, src); - argument_names[argument_i] = argument_name; - - skip_space(parser, src); - expect_character(parser, src, ':'); - skip_space(parser, src); - - auto type_index = analyze_type(thread, parser, src); - unused(type_index); - // start_argument_type_buffer[argument_i] = type_index; - argument_i += 1; - - skip_space(parser, src); - - switch (src.pointer[parser->i]) - { - case argument_end: - break; - default: - todo(); - } - } - - expect_character(parser, src, argument_end); - skip_space(parser, src); - - function->return_type = analyze_type(thread, parser, src); - - function->root = thread_node_add(thread, (NodeCreate) - { - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_TUPLE), - .id = IR_ROOT, - .inputs = array_to_slice(((NodeIndex[]){ - invalidi(Node), // TODO: add callgraph node - invalidi(Node), // return node - })), - }); - - auto* root_node = thread_node_get(thread, function->root); - root_node->root = (NodeRoot) - { - .function_index = function_index, - }; - - auto control = node_project(thread, function->root, type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), 0); - auto memory = node_project(thread, function->root, type_pair_make(invalidi(DebugType), BACKEND_TYPE_MEMORY), 1); - auto pointer = node_project(thread, function->root, type_pair_make(invalidi(DebugType), BACKEND_TYPE_POINTER), 2); - - if (argument_i > 0) - { - // TODO: project arguments - todo(); - } - - NodeIndex fake[256] = {}; - auto slice = (Slice(NodeIndex)) array_to_slice(fake); - slice.length = 4; - auto return_node_index = thread_node_add(thread, (NodeCreate) - { - .id = IR_RETURN, - .inputs = slice, - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), - }); - - node_set_input(thread, function->root, 1, return_node_index); - - auto region = thread_node_add(thread, (NodeCreate) - { - .id = IR_REGION, - .inputs = {}, - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), - }); - - auto memory_phi = thread_node_add(thread, (NodeCreate) - { - .id = IR_PHI, - .inputs = array_to_slice(((NodeIndex[]) { - region, - })), - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_MEMORY), - }); - - node_set_input(thread, return_node_index, 0, region); - node_set_input(thread, return_node_index, 1, memory_phi); - node_set_input(thread, return_node_index, 2, pointer); - - auto ret_phi = thread_node_add(thread, (NodeCreate) - { - .id = IR_PHI, - .inputs = array_to_slice(((NodeIndex[]) { - region, - })), - .type_pair = function->return_type, - }); - node_set_input(thread, ret_phi, 0, region); - node_set_input(thread, return_node_index, 3, ret_phi); - - thread_node_get(thread, region)->region = (NodeRegion) - { - .in_mem = memory_phi, - }; - - node_gvn_intern(thread, function->root); - node_gvn_intern(thread, control); - node_gvn_intern(thread, memory); - node_gvn_intern(thread, pointer); - - skip_space(parser, src); - - auto symbol_table = thread_node_add(thread, (NodeCreate) - { - .id = IR_SYMBOL_TABLE, - .inputs = array_to_slice(((NodeIndex[]) - { - control, - control, - memory, - pointer, - })), - }); - builder->current = symbol_table; - - analyze_block(thread, parser, builder, src); - - node_gvn_intern(thread, return_node_index); - node_gvn_intern(thread, region); - node_gvn_intern(thread, memory_phi); - node_gvn_intern(thread, ret_phi); - node_gvn_intern(thread, symbol_table); - } - else - { - todo(); - } - } - else - { - todo(); - } - } -} - -// typedef NodeIndex NodeCallback(Thread* thread, Function* function, NodeIndex node_index); -// -// fn NodeIndex node_walk_internal(Thread* thread, Function* function, NodeIndex node_index, NodeCallback* callback) -// { -// if (bitset_get(&thread->worklist.visited, geti(node_index))) -// { -// return invalidi(Node); -// } -// else -// { -// bitset_set_value(&thread->worklist.visited, geti(node_index), 1); -// auto callback_result = callback(thread, function, node_index); -// if (validi(callback_result)) -// { -// return callback_result; -// } -// -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// auto outputs = node_get_outputs(thread, node); -// -// for (u64 i = 0; i < inputs.length; i += 1) -// { -// auto n = inputs.pointer[i]; -// if (validi(n)) -// { -// auto n_result = node_walk_internal(thread, function, n, callback); -// if (validi(n_result)) -// { -// return n_result; -// } -// } -// } -// -// for (u64 i = 0; i < outputs.length; i += 1) -// { -// auto n = outputs.pointer[i]; -// if (validi(n)) -// { -// auto n_result = node_walk_internal(thread, function, n, callback); -// if (validi(n_result)) -// { -// return n_result; -// } -// } -// } -// -// return invalidi(Node); -// } -// } -// -// fn NodeIndex node_walk(Thread* thread, Function* function, NodeIndex node_index, NodeCallback* callback) -// { -// assert(thread->worklist.visited.length == 0); -// NodeIndex result = node_walk_internal(thread, function, node_index, callback); -// bitset_clear(&thread->worklist.visited); -// return result; -// } -// -// fn NodeIndex progress_on_list_callback(Thread* thread, Function* function, NodeIndex node_index) -// { -// if (bitset_get(&thread->worklist.bitset, geti(node_index))) -// { -// return invalidi(Node); -// } -// else -// { -// NodeIndex new_node = peephole_optimize(thread, function, node_index); -// return new_node; -// } -// } -// -// fn u8 progress_on_list(Thread* thread, Function* function, NodeIndex stop_node_index) -// { -// thread->worklist.mid_assert = 1; -// -// NodeIndex changed = node_walk(thread, function, stop_node_index, &progress_on_list_callback); -// -// thread->worklist.mid_assert = 0; -// -// return !validi(changed); -// } -// -// fn void iterate_peepholes(Thread* thread, Function* function, NodeIndex stop_node_index) -// { -// assert(progress_on_list(thread, function, stop_node_index)); -// if (thread->worklist.nodes.length > 0) -// { -// while (1) -// { -// auto node_index = thread_worklist_pop(thread); -// if (!validi(node_index)) -// { -// break; -// } -// -// auto* node = thread_node_get(thread, node_index); -// todo(); -// // if (!node_is_dead(node)) -// // { -// // auto new_node_index = peephole_optimize(thread, function, node_index); -// // if (validi(new_node_index)) -// // { -// // todo(); -// // } -// // } -// } -// } -// -// thread_worklist_clear(thread); -// } - -// fn u8 node_is_cfg(Node* node) -// { -// switch (node->id) -// { -// case IR_START: -// case IR_DEAD_CONTROL: -// case IR_CONTROL_PROJECTION: -// case IR_RETURN: -// case IR_STOP: -// return 1; -// case IR_SCOPE: -// case IR_CONSTANT: -// case IR_PROJECTION: -// return 0; -// default: -// todo(); -// } -// } - -// fn void rpo_cfg(Thread* thread, NodeIndex node_index) -// { -// auto* node = thread_node_get(thread, node_index); -// if (node_is_cfg(node) && !bitset_get(&thread->worklist.visited, geti(node_index))) -// { -// bitset_set_value(&thread->worklist.visited, geti(node_index), 1); -// auto outputs = node_get_outputs(thread, node); -// for (u64 i = 0; i < outputs.length; i += 1) -// { -// auto output = outputs.pointer[i]; -// if (validi(output)) -// { -// rpo_cfg(thread, output); -// } -// } -// -// *vb_add(&thread->worklist.nodes, 1) = node_index; -// } -// } - -// fn s32 node_loop_depth(Thread* thread, Node* node) -// { -// assert(node_is_cfg(node)); -// s32 loop_depth; -// -// switch (node->id) -// { -// case IR_START: -// { -// loop_depth = node->start.cfg.loop_depth; -// if (!loop_depth) -// { -// loop_depth = node->start.cfg.loop_depth = 1; -// } -// } break; -// case IR_STOP: -// { -// loop_depth = node->stop.cfg.loop_depth; -// if (!loop_depth) -// { -// loop_depth = node->stop.cfg.loop_depth = 1; -// } -// } break; -// case IR_RETURN: -// { -// loop_depth = node->return_node.cfg.loop_depth; -// if (!loop_depth) -// { -// auto input_index = node_input_get(thread, node, 0); -// auto input = thread_node_get(thread, input_index); -// node->return_node.cfg.loop_depth = loop_depth = node_loop_depth(thread, input); -// } -// } break; -// case IR_CONTROL_PROJECTION: -// { -// loop_depth = node->control_projection.cfg.loop_depth; -// if (!loop_depth) -// { -// auto input_index = node_input_get(thread, node, 0); -// auto input = thread_node_get(thread, input_index); -// node->control_projection.cfg.loop_depth = loop_depth = node_loop_depth(thread, input); -// } -// } break; -// case IR_DEAD_CONTROL: -// { -// loop_depth = node->dead_control.cfg.loop_depth; -// if (!loop_depth) -// { -// auto input_index = node_input_get(thread, node, 0); -// auto input = thread_node_get(thread, input_index); -// node->dead_control.cfg.loop_depth = loop_depth = node_loop_depth(thread, input); -// } -// } break; -// default: -// todo(); -// } -// -// return loop_depth; -// } - -// fn u8 node_is_region(Node* node) -// { -// return (node->id == IR_REGION) | (node->id == IR_REGION_LOOP); -// } -// -// fn u8 node_is_pinned(Node* node) -// { -// switch (node->id) -// { -// case IR_PROJECTION: -// case IR_START: -// return 1; -// case IR_CONSTANT: -// case IR_INTEGER_SUBSTRACT: -// case IR_INTEGER_COMPARE_EQUAL: -// case IR_INTEGER_COMPARE_NOT_EQUAL: -// return 0; -// default: -// todo(); -// } -// } - -// fn s32 node_cfg_get_immediate_dominator_tree_depth(Node* node) -// { -// assert(node_is_cfg(node)); -// switch (node->id) -// { -// case IR_START: -// return 0; -// case IR_DEAD_CONTROL: -// todo(); -// case IR_CONTROL_PROJECTION: -// todo(); -// case IR_RETURN: -// todo(); -// case IR_STOP: -// todo(); -// default: -// todo(); -// } -// } - -// fn void schedule_early(Thread* thread, NodeIndex node_index, NodeIndex start_node) -// { -// if (validi(node_index) && !bitset_get(&thread->worklist.visited, geti(node_index))) -// { -// bitset_set_value(&thread->worklist.visited, geti(node_index), 1); -// -// auto* node = thread_node_get(thread, node_index); -// auto inputs = node_get_inputs(thread, node); -// -// for (u64 i = 0; i < inputs.length; i += 1) -// { -// auto input = inputs.pointer[i]; -// -// if (validi(input)) -// { -// auto* input_node = thread_node_get(thread, input); -// if (!node_is_pinned(input_node)) -// { -// schedule_early(thread, node_index, start_node); -// } -// } -// } -// -// if (!node_is_pinned(node)) -// { -// auto early = start_node; -// -// for (u64 i = 1; i < inputs.length; i += 1) -// { -// auto input_index = inputs.pointer[i]; -// auto input_node = thread_node_get(thread, input_index); -// auto control_input_index = node_input_get(thread, input_node, 0); -// auto* control_input_node = thread_node_get(thread, control_input_index); -// auto* early_node = thread_node_get(thread, early); -// auto input_depth = node_cfg_get_immediate_dominator_tree_depth(control_input_node); -// auto early_depth = node_cfg_get_immediate_dominator_tree_depth(early_node); -// if (input_depth > early_depth) -// { -// early = control_input_index; -// todo(); -// } -// } -// -// node_set_input(thread, node_index, 0, early); -// } -// } -// } -// -// fn u8 node_cfg_block_head(Node* node) -// { -// assert(node_is_cfg(node)); -// switch (node->id) -// { -// case IR_START: -// return 1; -// default: -// todo(); -// } -// } -// -// fn u8 is_forwards_edge(Thread* thread, NodeIndex output_index, NodeIndex input_index) -// { -// u8 result = validi(output_index) & validi(input_index); -// if (result) -// { -// auto* output = thread_node_get(thread, output_index); -// result = output->input_count > 2; -// if (result) -// { -// auto input_index2 = node_input_get(thread, output, 2); -// -// result = index_equal(input_index2, input_index); -// -// if (result) -// { -// todo(); -// } -// } -// } -// -// return result; -// } -// -// fn void schedule_late(Thread* thread, NodeIndex node_index, Slice(NodeIndex) nodes, Slice(NodeIndex) late) -// { -// if (!validi(late.pointer[geti(node_index)])) -// { -// auto* node = thread_node_get(thread, node_index); -// -// if (node_is_cfg(node)) -// { -// late.pointer[geti(node_index)] = node_cfg_block_head(node) ? node_index : node_input_get(thread, node, 0); -// } -// -// if (node->id == IR_PHI) -// { -// todo(); -// } -// -// auto outputs = node_get_outputs(thread, node); -// -// for (u32 i = 0; i < outputs.length; i += 1) -// { -// NodeIndex output = outputs.pointer[i]; -// if (is_forwards_edge(thread, output, node_index)) -// { -// todo(); -// } -// } -// -// for (u32 i = 0; i < outputs.length; i += 1) -// { -// NodeIndex output = outputs.pointer[i]; -// if (is_forwards_edge(thread, output, node_index)) -// { -// todo(); -// } -// } -// -// if (!node_is_pinned(node)) -// { -// unused(nodes); -// todo(); -// } -// } -// } - -// fn void gcm_build_cfg(Thread* thread, NodeIndex start_node_index, NodeIndex stop_node_index) -// { -// unused(stop_node_index); -// // Fix loops -// { -// // TODO: -// } -// -// // Schedule early -// rpo_cfg(thread, start_node_index); -// -// u32 i = thread->worklist.nodes.length; -// while (i > 0) -// { -// i -= 1; -// auto node_index = thread->worklist.nodes.pointer[i]; -// auto* node = thread_node_get(thread, node_index); -// node_loop_depth(thread, node); -// auto inputs = node_get_inputs(thread, node); -// for (u64 i = 0; i < inputs.length; i += 1) -// { -// auto input = inputs.pointer[i]; -// schedule_early(thread, input, start_node_index); -// } -// -// if (node_is_region(node)) -// { -// todo(); -// } -// } -// -// // Schedule late -// -// auto max_node_count = thread->buffer.nodes.length; -// auto* alloc = arena_allocate(thread->arena, NodeIndex, max_node_count * 2); -// auto late = (Slice(NodeIndex)) { -// .pointer = alloc, -// .length = max_node_count, -// }; -// auto nodes = (Slice(NodeIndex)) { -// .pointer = alloc + max_node_count, -// .length = max_node_count, -// }; -// -// schedule_late(thread, start_node_index, nodes, late); -// -// for (u32 i = 0; i < late.length; i += 1) -// { -// auto node_index = nodes.pointer[i]; -// if (validi(node_index)) -// { -// todo(); -// auto late_node_index = late.pointer[i]; -// node_set_input(thread, node_index, 0, late_node_index); -// } -// } -// } - -// fn void print_function(Thread* thread, Function* function) -// { -// print("fn {s}\n====\n", function->name); -// VirtualBuffer(NodeIndex) nodes = {}; -// *vb_add(&nodes, 1) = function->stop; -// -// while (1) -// { -// auto node_index = nodes.pointer[nodes.length - 1]; -// auto* node = thread_node_get(thread, node_index); -// -// if (node->input_count) -// { -// for (u32 i = 1; i < node->input_count; i += 1) -// { -// *vb_add(&nodes, 1) = node_input_get(thread, node, 1); -// } -// *vb_add(&nodes, 1) = node_input_get(thread, node, 0); -// } -// else -// { -// break; -// } -// } -// -// u32 i = nodes.length; -// while (i > 0) -// { -// i -= 1; -// -// auto node_index = nodes.pointer[i]; -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// todo(); -// // auto* type = thread_type_get(thread, node->type); -// // print("%{u32} - {s} - {s} ", geti(node_index), type_id_to_string(type), node_id_to_string(node)); -// // auto inputs = node_get_inputs(thread, node); -// // auto outputs = node_get_outputs(thread, node); -// // -// // print("(INPUTS: { "); -// // for (u32 i = 0; i < inputs.length; i += 1) -// // { -// // auto input_index = inputs.pointer[i]; -// // print("%{u32} ", geti(input_index)); -// // } -// // print("} OUTPUTS: { "); -// // for (u32 i = 0; i < outputs.length; i += 1) -// // { -// // auto output_index = outputs.pointer[i]; -// // print("%{u32} ", geti(output_index)); -// // } -// // print_string(strlit("})\n")); -// } -// -// -// print("====\n", function->name); -// } - -// struct CBackend -// { -// VirtualBuffer(u8) buffer; -// Function* function; -// }; -// -// typedef struct CBackend CBackend; -// -// fn void c_lower_append_string(CBackend* backend, String string) -// { -// vb_append_bytes(&backend->buffer, string); -// } -// -// fn void c_lower_append_ch(CBackend* backend, u8 ch) -// { -// *vb_add(&backend->buffer, 1) = ch; -// } -// -// fn void c_lower_append_ch_repeated(CBackend* backend, u8 ch, u32 times) -// { -// u8* pointer = vb_add(&backend->buffer, times); -// memset(pointer, ch, times); -// } -// -// fn void c_lower_append_space(CBackend* backend) -// { -// c_lower_append_ch(backend, ' '); -// } -// -// fn void c_lower_append_space_margin(CBackend* backend, u32 times) -// { -// c_lower_append_ch_repeated(backend, ' ', times * 4); -// } - -// fn void c_lower_type(CBackend* backend, Thread* thread, TypeIndex type_index) -// { -// Type* type = thread_type_get(thread, type_index); -// switch (type->id) -// { -// case TYPE_INTEGER: -// { -// u8 ch[] = { 'u', 's' }; -// auto integer = &type->integer; -// u8 signedness_ch = ch[type->integer.is_signed]; -// c_lower_append_ch(backend, signedness_ch); -// u8 upper_digit = integer->bit_count / 10; -// u8 lower_digit = integer->bit_count % 10; -// if (upper_digit) -// { -// c_lower_append_ch(backend, upper_digit + '0'); -// } -// c_lower_append_ch(backend, lower_digit + '0'); -// } break; -// default: -// todo(); -// } -// } - -// fn void c_lower_node(CBackend* backend, Thread* thread, NodeIndex node_index) -// { -// unused(backend); -// auto* node = thread_node_get(thread, node_index); -// unused(node); -// // auto* type = thread_type_get(thread, node->type); -// // auto inputs = node_get_inputs(thread, node); -// // -// // switch (node->id) -// // { -// // case IR_CONSTANT: -// // { -// // switch (type->id) -// // { -// // case TYPE_INTEGER: -// // { -// // assert(type->integer.bit_count == 0); -// // assert(type->integer.is_constant); -// // assert(!type->integer.is_signed); -// // vb_generic_ensure_capacity(&backend->buffer, 1, 64); -// // auto current_length = backend->buffer.length; -// // auto buffer_slice = (String){ .pointer = backend->buffer.pointer + current_length, .length = backend->buffer.capacity - current_length, }; -// // auto written_characters = format_hexadecimal(buffer_slice, type->integer.constant); -// // backend->buffer.length = current_length + written_characters; -// // } break; -// // todo(); -// // default: -// // todo(); -// // } -// // } break; -// // case IR_INTEGER_SUBSTRACT: -// // { -// // auto left = inputs.pointer[1]; -// // auto right = inputs.pointer[2]; -// // c_lower_node(backend, thread, left); -// // c_lower_append_string(backend, strlit(" - ")); -// // c_lower_node(backend, thread, right); -// // } break; -// // case IR_INTEGER_COMPARE_EQUAL: -// // { -// // auto left = inputs.pointer[1]; -// // auto right = inputs.pointer[2]; -// // c_lower_node(backend, thread, left); -// // c_lower_append_string(backend, strlit(" == ")); -// // c_lower_node(backend, thread, right); -// // } break; -// // case IR_INTEGER_COMPARE_NOT_EQUAL: -// // { -// // auto left = inputs.pointer[1]; -// // auto right = inputs.pointer[2]; -// // c_lower_node(backend, thread, left); -// // c_lower_append_string(backend, strlit(" != ")); -// // c_lower_node(backend, thread, right); -// // } break; -// // // case IR_PROJECTION: -// // // { -// // // auto projected_node_index = inputs.pointer[0]; -// // // auto projection_index = node->projection.index; -// // // -// // // if (index_equal(projected_node_index, backend->function->start)) -// // // { -// // // if (projection_index == 0) -// // // { -// // // failed_execution(); -// // // } -// // // // if (projection_index > interpreter->arguments.length + 1) -// // // // { -// // // // failed_execution(); -// // // // } -// // // -// // // switch (projection_index) -// // // { -// // // case 1: -// // // c_lower_append_string(backend, strlit("argc")); -// // // break; -// // // // return interpreter->arguments.length; -// // // case 2: -// // // todo(); -// // // default: -// // // todo(); -// // // } -// // // } -// // // else -// // // { -// // // todo(); -// // // } -// // // } break; -// // default: -// // todo(); -// // } -// todo(); -// } - -// fn String c_lower(Thread* thread) -// { -// CBackend backend_stack = {}; -// CBackend* backend = &backend_stack; -// auto program_epilogue = strlit("#include \n" -// "typedef uint8_t u8;\n" -// "typedef uint16_t u16;\n" -// "typedef uint32_t u32;\n" -// "typedef uint64_t u64;\n" -// "typedef int8_t s8;\n" -// "typedef int16_t s16;\n" -// "typedef int32_t s32;\n" -// "typedef int64_t s64;\n" -// ); -// c_lower_append_string(backend, program_epilogue); -// -// for (u32 function_i = 0; function_i < thread->buffer.functions.length; function_i += 1) -// { -// auto* function = &thread->buffer.functions.pointer[function_i]; -// backend->function = function; -// c_lower_type(backend, thread, function->return_type); -// c_lower_append_space(backend); -// -// c_lower_append_string(backend, function->name); -// c_lower_append_ch(backend, argument_start); -// if (s_equal(function->name, strlit("main"))) -// { -// c_lower_append_string(backend, strlit("int argc, char* argv[]")); -// } -// -// c_lower_append_ch(backend, argument_end); -// c_lower_append_ch(backend, '\n'); -// c_lower_append_ch(backend, block_start); -// c_lower_append_ch(backend, '\n'); -// -// auto start_node_index = function->start; -// auto* start_node = thread_node_get(thread, start_node_index); -// assert(start_node->output_count > 0); -// auto stop_node_index = function->stop; -// -// auto proj_node_index = node_output_get(thread, start_node, 1); -// auto it_node_index = proj_node_index; -// u32 current_statement_margin = 1; -// -// while (!index_equal(it_node_index, stop_node_index)) -// { -// auto* it_node = thread_node_get(thread, it_node_index); -// auto outputs = node_get_outputs(thread, it_node); -// auto inputs = node_get_inputs(thread, it_node); -// -// switch (it_node->id) -// { -// // case IR_CONTROL_PROJECTION: -// // break; -// case IR_RETURN: -// { -// c_lower_append_space_margin(backend, current_statement_margin); -// c_lower_append_string(backend, strlit("return ")); -// assert(inputs.length > 1); -// assert(inputs.length == 2); -// auto input = inputs.pointer[1]; -// c_lower_node(backend, thread, input); -// c_lower_append_ch(backend, ';'); -// c_lower_append_ch(backend, '\n'); -// } break; -// // case IR_STOP: -// // break; -// default: -// todo(); -// } -// -// assert(outputs.length == 1); -// it_node_index = outputs.pointer[0]; -// } -// -// c_lower_append_ch(backend, block_end); -// } -// -// return (String) { .pointer = backend->buffer.pointer, .length = backend->buffer.length }; -// } - -declare_ip_functions(DebugType, debug_type) - -fn void thread_init(Thread* thread) -{ - memset(thread, 0, sizeof(Thread)); - thread->arena = arena_init_default(KB(64)); - thread->main_function = -1; - - // This assertion is here to make the pertinent changes in the reserve syscall - - // UINT32_MAX so they can be indexed via an unsigned integer of 32 bits - const u64 offsets[] = { - align_forward(sizeof(Type) * UINT32_MAX, page_size), - align_forward(sizeof(Node) * UINT32_MAX, page_size), - align_forward(sizeof(DebugType) * UINT32_MAX, page_size), - align_forward(sizeof(NodeIndex) * UINT32_MAX, page_size), - align_forward(sizeof(ArrayReference) * UINT32_MAX, page_size), - align_forward(sizeof(Function) * UINT32_MAX, page_size), - align_forward(sizeof(u8) * UINT32_MAX, page_size), - align_forward(sizeof(RegisterMask) * UINT32_MAX, page_size), - }; - static_assert(sizeof(thread->buffer) / sizeof(VirtualBuffer(u8)) == array_length(offsets)); - - // Compute the total size (this is optimized out into a constant - u64 total_size = 0; - for (u32 i = 0; i < array_length(offsets); i += 1) - { - total_size += offsets[i]; - } - - // Actually make the syscall - auto* ptr = os_reserve(0, total_size, (OSReserveProtectionFlags) {}, (OSReserveMapFlags) { .priv = 1, .anon = 1, .noreserve = 1 }); - assert(ptr); - - auto* buffer_it = (VirtualBuffer(u8)*)&thread->buffer; - for (u32 i = 0; i < array_length(offsets); i += 1) - { - buffer_it->pointer = ptr; - ptr += offsets[i]; - } - - DebugType integer_type; - memset(&integer_type, 0, sizeof(integer_type)); - auto* it = &thread->types.debug.integer.array[0]; - - for (u8 signedness = 0; signedness <= 1; signedness += 1) - { - integer_type.integer.signedness = signedness; - - for (u8 bit_count = 8; bit_count <= 64; bit_count *= 2, it += 1) - { - integer_type.integer.bit_count = bit_count; - auto put_result = ip_DebugType_get_or_put_new(&thread->interned.debug_types, thread, &integer_type); - assert(!put_result.existing); - assert(validi(put_result.index)); - *it = put_result.index; - } - } - - // Type top, bot, live_control, dead_control; - // memset(&top, 0, sizeof(Type)); - // top.id = TYPE_TOP; - // memset(&bot, 0, sizeof(Type)); - // bot.id = TYPE_BOTTOM; - // memset(&live_control, 0, sizeof(Type)); - // live_control.id = TYPE_LIVE_CONTROL; - // memset(&dead_control, 0, sizeof(Type)); - // dead_control.id = TYPE_DEAD_CONTROL; - // - // thread->types.top = intern_pool_get_or_put_new_type(thread, &top).index; - // thread->types.bottom = intern_pool_get_or_put_new_type(thread, &bot).index; - // thread->types.live_control = intern_pool_get_or_put_new_type(thread, &live_control).index; - // thread->types.dead_control = intern_pool_get_or_put_new_type(thread, &dead_control).index; - // - // thread->types.integer.top = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 0, - // }); - // thread->types.integer.bottom = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 1, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 0, - // }); - // thread->types.integer.zero = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 1, - // .is_signed = 0, - // .bit_count = 0, - // }); - // thread->types.integer.u8 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 8, - // }); - // thread->types.integer.u16 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 16, - // }); - // thread->types.integer.u32 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 32, - // }); - // thread->types.integer.u64 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 0, - // .bit_count = 64, - // }); - // thread->types.integer.s8 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 8, - // }); - // thread->types.integer.s16 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 16, - // }); - // thread->types.integer.s32 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 32, - // }); - // thread->types.integer.s64 = thread_get_integer_type(thread, (TypeInteger) { - // .constant = 0, - // .is_constant = 0, - // .is_signed = 1, - // .bit_count = 64, - // }); - - *vb_add(&thread->buffer.register_masks, 1) = (RegisterMask) { - .class = 1, - .may_spill = 0, - .mask = 0, - }; - *vb_add(&thread->buffer.register_masks, 1) = (RegisterMask) { - .class = REGISTER_CLASS_X86_64_GPR, - .may_spill = 0, - .mask = ((u16)0xffff & ~((u16)1 << RSP)), // & ~((u16)1 << RBP), - }; - -// global_variable RegisterMask register_masks[] = { -// { -// }, -// { -// }, -// }; - -} - -fn void thread_clear(Thread* thread) -{ - arena_reset(thread->arena); -} - -#define DO_UNIT_TESTS 1 -#if DO_UNIT_TESTS -fn void unit_tests() -{ - for (u64 power = 1, log2_i = 0; log2_i < 64; power <<= 1, log2_i += 1) - { - assert(log2_alignment(power) == log2_i); - } -} -#endif - -Slice(String) arguments; - -STRUCT(ObjectOptions) -{ - String object_path; - String exe_path; - Slice(u8) code; - u64 dynamic:1; - u64 reserved:63; -}; - -STRUCT(ELFBuilder) -{ - VirtualBuffer(u8) file; - VirtualBuffer(ELFSectionHeader) section_headers; - VirtualBuffer(u8) section_string_table; - VirtualBuffer(ElfProgramHeader) program_headers; - SymbolTable static_st; - SymbolTable dynamic_st; -}; - -// fn void elf_ph_init(ELFBuilder* restrict builder) -// { -// builder->program_headers.length = 6; -// auto program_header_size = sizeof(ElfProgramHeader) * builder->program_headers.length; -// builder->program_headers.pointer = (ElfProgramHeader*)vb_add(&builder->file, program_header_size); -// builder->program_header_i = 0; -// } -// -// fn void elf_ph_end(ELFBuilder* restrict builder) -// { -// assert(builder->program_header_i == builder->program_headers.length); -// } - -STRUCT(ELFSectionCreate) -{ - String name; - ELFSectionType type; - ELFSectionHeaderFlags flags; - u32 link; - u32 info; - u64 size; - u64 alignment; - u64 entry_size; -}; - -fn void vb_align(VirtualBuffer(u8)* buffer, u64 alignment) -{ - auto current_length = buffer->length; - auto target_len = align_forward(current_length, alignment); - auto count = cast_to(u32, u64, target_len - current_length); - auto* pointer = vb_add(buffer, count); - memset(pointer, 0, count); -} - -STRUCT(ELFSegmentCreate) -{ - ElfProgramHeaderType type; - ElfProgramHeaderFlags flags; - u64 size; - u64 alignment; - u64 offset; -}; - -STRUCT(ELFSegmentSectionCreate) -{ - ELFSectionCreate section; - ElfProgramHeaderType ph_type; - ElfProgramHeaderFlags ph_flags; - String content; -}; - -typedef enum SymbolKind : u8 -{ - SYMBOL_TABLE_STATIC, - SYMBOL_TABLE_DYNAMIC, -} SymbolKind; - -fn void st_init(SymbolTable* restrict section) -{ - *vb_add(§ion->string_table, 1) = 0; - *vb_add(§ion->symbol_table, 1) = (ELFSymbol) {}; -} - -typedef enum SymbolTableKind -{ - SYMBOL_TABLE_KIND_STATIC, - SYMBOL_TABLE_KIND_DYNAMIC, -} SymbolTableKind; - -STRUCT(SymbolTableOutput) -{ - u64 symbol_table_offset; - u64 string_table_offset; -}; - -fn u32 elf_get_string(VirtualBuffer(u8)* restrict buffer, String string) -{ - assert(buffer->length > 0); - - if (string.length == 0) - { - return 0; - } - - u32 i = 0; - - while (i < buffer->length) - { - auto* ptr = &buffer->pointer[i]; - auto length = strlen((char*)ptr); - auto existing = (String) { - .pointer = ptr, - .length = length, - }; - - while (existing.length) - { - if (s_equal(existing, string)) - { - return cast_to(u32, s64, existing.pointer - buffer->pointer); - } - - existing.pointer += 1; - existing.length -= 1; - } - - i += length + 1; - } - - auto length = buffer->length; - auto* ptr = vb_add(buffer, cast_to(u32, u64, string.length + 1)); - memcpy(ptr, string.pointer, string.length); - *(ptr + string.length) = 0; - - return length; -} - -fn u32 st_get_string(SymbolTable* restrict section, String string) -{ - return elf_get_string(§ion->string_table, string); -} - -STRUCT(StringOffsetAndHash) -{ - u32 hash; - u32 offset; -}; - -fn u32 string_sysv_hash(String string) -{ - u32 hash = 0; - for (u32 i = 0; i < string.length; i += 1) - { - hash *= 16; - auto ch = string.pointer[i]; - hash += ch; - hash ^= (hash >> 24) & 0xf0; - } - - hash &= 0x0fffffff; - - return hash; -} - -fn StringOffsetAndHash st_get_string_and_hash(SymbolTable* restrict section, String string) -{ - auto offset = st_get_string(section, string); - auto hash = string_sysv_hash(string); - - return (StringOffsetAndHash){ - .offset = offset, - .hash = hash, - }; -} - -fn u32 elf_get_section_name(ELFBuilder* builder, String name) -{ - return elf_get_string(&builder->section_string_table, name); -} - -typedef enum ELFNoteType : u32 -{ - NT_GNU_ABI_TAG = 1, - NT_GNU_HWCAP = 2, - NT_GNU_BUILD_ID = 3, - NT_GNU_GOLD_VERSION = 4, - NT_GNU_PROPERTY_TYPE_0 = 5, -} ELFNoteType; - -STRUCT(ELFNoteHeader) -{ - u32 name_size; - u32 descriptor_size; - ELFNoteType type; -}; -static_assert(sizeof(ELFNoteHeader) == 12); - -#define elf_eh_frame_absptr 0x00 -#define elf_eh_frame_udata4 0x03 -#define elf_eh_frame_sdata4 0x0b -#define elf_eh_frame_pcrel 0x10 -#define elf_eh_frame_datarel 0x30 - -STRUCT(EhFrameHeader) -{ - u8 version; - u8 pointer_encoding; - u8 count_encoding; - u8 table_encoding; - u32 frame_start; - u32 entry_count; -}; - -STRUCT(EhFrameHeaderEntry) -{ - s32 pc; - u32 fde; -}; - -STRUCT(Uleb128) -{ - u64 number; - u64 i; -}; - -fn Uleb128 uleb128_decode(String input) -{ - assert(input.length); - Uleb128 result = {}; - u16 shift = 0; - - while (result.i < input.length) - { - auto byte = input.pointer[result.i]; - assert(shift < 64); - result.number |= (u64)(byte & 0b01111111) << shift; - shift += 7; - result.i += 1; - - if ((byte & 0b10000000) == 0) - { - break; - } - } - - return result; -} - -fn void sleb128_encode(VirtualBuffer(u8)* buffer, s32 value) -{ - auto extra_bits = (u32)(value ^ (value >> 31)) >> 6; - u8 out = value & 0b01111111; - while (extra_bits) - { - *vb_add(buffer, 1) = out | 0x80; - value >>= 7; - out = value & 0b01111111; - extra_bits >>= 7; - } - *vb_add(buffer, 1) = out; -} - -fn void uleb128_encode(VirtualBuffer(u8)* buffer, u32 value) -{ - u8 out = value & 0b01111111; - value >>= 7; - while (value) - { - *vb_add(buffer, 1) = out | 0x80; - out = value & 0b01111111; - value >>= 7; - } - *vb_add(buffer, 1) = out; -} - -fn void dwarf_playground(Thread* thread) -{ - auto file = file_read(thread->arena, -#ifdef __APPLE__ - strlit("/Users/david/minimal/main") -#else - strlit("/home/david/minimal/main") -#endif - ); - auto* elf_header = (ELFHeader*)file.pointer; - auto section_count = elf_header->section_header_count; - auto section_header_offset = elf_header->section_header_offset; - auto string_table_section_index = elf_header->section_header_string_table_index; - - auto debug_abbrev_section_index = -1; - auto debug_info_section_index = -1; - auto debug_addr_section_index = -1; - auto debug_str_section_index = -1; - auto debug_str_offsets_section_index = -1; - auto rela_debug_str_offsets_section_index = -1; - auto rela_debug_addr_section_index = -1; - - auto section_headers = (ELFSectionHeader*)(file.pointer + section_header_offset); - auto* string_table_section_header = (ELFSectionHeader*)(file.pointer + section_header_offset) + string_table_section_index; - auto string_table_offset = string_table_section_header->offset; - - for (u16 i = 0; i < section_count; i += 1) - { - auto* section_header = section_headers + i; - auto name_offset = string_table_offset + section_header->name_offset; - auto* name = (char*)(file.pointer + name_offset); - - if (strcmp(".debug_abbrev", name) == 0) - { - debug_abbrev_section_index = i; - } - else if (strcmp(".debug_info", name) == 0) - { - debug_info_section_index = i; - } - else if (strcmp(".debug_addr", name) == 0) - { - debug_addr_section_index = i; - } - else if (strcmp(".debug_str", name) == 0) - { - debug_str_section_index = i; - } - else if (strcmp(".debug_str_offsets", name) == 0) - { - debug_str_offsets_section_index = i; - } - else if (strcmp(".rela.debug_addr", name) == 0) - { - rela_debug_addr_section_index = i; - } - else if (strcmp(".rela.debug_str_offsets", name) == 0) - { - rela_debug_str_offsets_section_index = i; - } - } - - assert(debug_info_section_index != -1); - assert(debug_abbrev_section_index != -1); - assert(debug_addr_section_index != -1); - assert(debug_str_section_index != -1); - assert(debug_str_offsets_section_index != -1); - - auto* debug_abbrev_section_header = section_headers + debug_abbrev_section_index; - auto* debug_info_section_header = section_headers + debug_info_section_index; - auto* debug_addr_section_header = section_headers + debug_addr_section_index; - auto* debug_str_section_header = section_headers + debug_str_section_index; - auto* debug_str_offsets_section_header = section_headers + debug_str_offsets_section_index; - auto* rela_debug_str_offsets_section_header = section_headers + rela_debug_str_offsets_section_index; - auto* rela_debug_addr_section_header = section_headers + rela_debug_addr_section_index; - - auto* rela_debug_str_offsets = (ElfRelocation*)(file.pointer + rela_debug_str_offsets_section_header->offset); - auto* rela_debug_addresses = (ElfRelocation*)(file.pointer + rela_debug_addr_section_header->offset); - - auto original_debug_info_bytes = (String) { - .pointer = file.pointer + debug_info_section_header->offset, - .length = debug_info_section_header->size, - }; - auto debug_info_bytes = original_debug_info_bytes; - - // auto* compile_unit_header = (DwarfCompilationUnit*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(DwarfCompilationUnit); - debug_info_bytes.length -= sizeof(DwarfCompilationUnit); - - auto debug_abbrev_bytes = (String) { - .pointer = file.pointer + debug_abbrev_section_header->offset, - .length = debug_abbrev_section_header->size, - }; - auto* debug_addr_header = (DwarfAddressTableHeader*)(file.pointer + debug_addr_section_header->offset); - assert(debug_addr_header->unit_length == debug_addr_section_header->size - sizeof(debug_addr_header->unit_length)); - assert(debug_addr_header->version == 5); - assert(debug_addr_header->address_size == 8); - auto* debug_addresses = (u64*)debug_addr_header + 1; - auto* debug_str_offsets_header = (DwarfStringOffsetsTableHeader*)(file.pointer + debug_str_offsets_section_header->offset); - assert(debug_str_offsets_header->unit_length == debug_str_offsets_section_header->size - sizeof(debug_str_offsets_header->unit_length)); - // auto string_count = (debug_str_offsets_section_header->size - sizeof(DwarfStringOffsetsTableHeader)) / sizeof(u32); - // auto* string_index_offset_map = (u32*)(debug_str_offsets_header + 1); - auto* string_table = file.pointer + debug_str_section_header->offset; - - // auto debug_str_offset_base_guess = 8; - - while (debug_abbrev_bytes.length > 0) - { - auto first = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += first.i; - debug_abbrev_bytes.length -= first.i; - - if (first.number != 0) - { - auto second = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += second.i; - debug_abbrev_bytes.length -= second.i; - // auto children = debug_abbrev_bytes.pointer[0]; - debug_abbrev_bytes.pointer += 1; - debug_abbrev_bytes.length -= 1; - - auto di_abbrev_code = uleb128_decode(debug_info_bytes); - debug_info_bytes.pointer += di_abbrev_code.i; - debug_info_bytes.length -= di_abbrev_code.i; - assert(di_abbrev_code.number == first.number); - - print("======\nAbbreviation entry #{u64}: \"{s}\", (0x{u64:x})\n======\n", first.number, dwarf_tag_to_string((DwarfTag)second.number), second.number); - - while (1) - { - auto first = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += first.i; - debug_abbrev_bytes.length -= first.i; - - auto second = uleb128_decode(debug_abbrev_bytes); - debug_abbrev_bytes.pointer += second.i; - debug_abbrev_bytes.length -= second.i; - - if (first.number == 0 && second.number == 0) - { - break; - } - - auto attribute = (DwarfAttribute)first.number; - auto form = (DwarfForm)second.number; - print("{u32}: Attribute: \"{s}\" (0x{u64:x}). Form: \"{s}\" (0x{u64:x})\n", (u32)(debug_info_bytes.pointer - original_debug_info_bytes.pointer), dwarf_attribute_to_string(attribute), (u64)attribute, dwarf_form_to_string(form), (u64)form); - - switch (form) - { - // .debug_str_offsets - case DW_FORM_strx1: - { - auto index = debug_info_bytes.pointer[0]; - debug_info_bytes.pointer += 1; - debug_info_bytes.length -= 1; - - if (rela_debug_str_offsets_section_index != -1) - { - auto* relocation = &rela_debug_str_offsets[index]; - auto offset = relocation->addend; - auto* c_string = &string_table[offset]; - print("Index: {u32}. Offset: {u32}. String: \"{cstr}\"\n", (u32)index, offset, c_string); - } - } break; - case DW_FORM_data1: - { - auto data = *debug_info_bytes.pointer; - debug_info_bytes.pointer += 1; - debug_info_bytes.length -= 1; - print("Data1: 0x{u32:x}\n", (u32)data); - } break; - case DW_FORM_data2: - { - auto data = *(u16*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u16); - debug_info_bytes.length -= sizeof(u16); - print("Data2: 0x{u32:x}\n", (u32)data); - } break; - case DW_FORM_data4: - { - auto data = *(u32*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u32); - debug_info_bytes.length -= sizeof(u32); - print("Data4: 0x{u32:x}\n", data); - } break; - case DW_FORM_sec_offset: - { - auto sec_offset = *(u32*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u32); - debug_info_bytes.length -= sizeof(u32); - print("Sec offset: 0x{u32:x}\n", sec_offset); - } break; - case DW_FORM_addrx: - { - auto addrx = uleb128_decode(debug_info_bytes); - debug_info_bytes.pointer += addrx.i; - debug_info_bytes.length -= addrx.i; - auto relocation_index = addrx.number; - - if (rela_debug_addr_section_index != -1) - { - auto* relocation = &rela_debug_addresses[relocation_index]; - auto index = relocation->addend; - - switch (attribute) - { - case DW_AT_low_pc: - { - auto address = debug_addresses[index]; - print("Address: 0x{u64:x}\n", address); - } break; - default: - todo(); - } - } - } break; - case DW_FORM_exprloc: - { - auto length = uleb128_decode(debug_info_bytes); - print("Length: {u64}\n", length.number); - debug_info_bytes.pointer += length.i; - debug_info_bytes.length -= length.i; - - switch (length.number) - { - case 1: - { - switch (attribute) - { - case DW_AT_frame_base: - { - auto b = *debug_info_bytes.pointer; - debug_info_bytes.pointer += 1; - debug_info_bytes.length -= 1; - auto operation = (DwarfOperation)b; - - print("Operation: {s}\n", dwarf_operation_to_string(operation)); - } break; - default: - todo(); - } - } break; - default: - todo(); - } - } break; - case DW_FORM_flag_present: - { - print("Flag present\n"); - } break; - case DW_FORM_ref4: - { - auto ref4 = *(u32*)debug_info_bytes.pointer; - debug_info_bytes.pointer += sizeof(u32); - debug_info_bytes.length -= sizeof(u32); - print("Ref4: {u32:x}\n", ref4); - } break; - default: - todo(); - } - } - } - } - - assert(debug_abbrev_bytes.length == 0); - assert(debug_info_bytes.length == 1); - assert(*debug_info_bytes.pointer == 0); -} - -STRUCT(DwarfAttributeFormPair) -{ - DwarfAttribute attribute; - DwarfForm form; -}; -declare_slice(DwarfAttributeFormPair); - -fn void encode_attribute_abbreviations(ELFBuilder* restrict builder, Slice(DwarfAttributeFormPair) attributes) -{ - auto* restrict buffer = &builder->file; - - for (u64 i = 0; i < attributes.length; i += 1) - { - auto pair = attributes.pointer[i]; - uleb128_encode(buffer, pair.attribute); - uleb128_encode(buffer, pair.form); - } - - uleb128_encode(buffer, 0); - uleb128_encode(buffer, 0); -} - -STRUCT(SymbolRelocation) -{ - String name; - u32 offset; - u8 extra_bytes; -}; -decl_vb(SymbolRelocation); - -STRUCT(FileBuffer) -{ - VirtualBuffer(u8) buffer; -}; - -fn String write_elf(Thread* thread, ObjectOptions options) -{ - ELFBuilder builder_stack = {}; - ELFBuilder* restrict builder = &builder_stack; - // Initialization - { - if (options.dynamic) - { - st_init(&builder->dynamic_st); - } - - st_init(&builder->static_st); - // Init section table - *vb_add(&builder->section_string_table, 1) = 0; - *vb_add(&builder->section_headers, 1) = (ELFSectionHeader){}; - } - - auto symtab_section_name = elf_get_section_name(builder, strlit(".symtab")); - auto strtab_section_name = elf_get_section_name(builder, strlit(".strtab")); - auto shstrtab_section_name = elf_get_section_name(builder, strlit(".shstrtab")); - unused(symtab_section_name); - unused(strtab_section_name); - unused(shstrtab_section_name); - - auto* elf_header = vb_add_scalar(&builder->file, ELFHeader); - - // TODO: precompute properly how many program segments we are going to need - u16 program_header_count = 13; - auto* program_headers = vb_add(&builder->file, sizeof(ElfProgramHeader) * program_header_count); - - { - // Add program header segment - auto offset = sizeof(ELFHeader); - auto size = sizeof(ElfProgramHeader) * program_header_count; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_PHDR, - .flags = { .readable = 1 }, - .offset = offset, - .virtual_address = offset, - .physical_address = offset, - .file_size = size, - .memory_size = size, - .alignment = alignof(ElfProgramHeader), - }; - } - - { - // .interp - // Section #1 - auto* section_header = vb_add(&builder->section_headers, 1); - auto interp_section_name = elf_get_section_name(builder, strlit(".interp")); - - u64 alignment = 1; - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto interpreter_path = -#ifdef __x86_64__ - strlit("/lib64/ld-linux-x86-64.so.2"); -#else - strlit("/lib/ld-linux-aarch64.so.1"); -#endif - auto size = vb_copy_string_zero_terminated(&builder->file, interpreter_path); - - *section_header = (ELFSectionHeader) - { - .name_offset = interp_section_name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_INTERP, - .flags = {.readable = 1,}, - .offset = offset, - .virtual_address = offset, - .physical_address = offset, - .file_size = size, - .memory_size = size, - .alignment = alignment, - }; - } - - u32 gnu_property_offset = 0; - u32 gnu_property_size = 0; - u32 gnu_property_alignment = 0; - auto gnu_string = strlit("GNU"); - { - // .note.gnu.property - // Section #2 - // This note tells the dynamic linker to use baseline CPU features - auto* gnu_property_section_header = vb_add(&builder->section_headers, 1); - u32 alignment = 8; - gnu_property_alignment = alignment; - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_property_offset = offset; - auto gnu_property_section_name = elf_get_section_name(builder, strlit(".note.gnu.property")); - - auto* ptr = vb_add_scalar(&builder->file, ELFNoteHeader); - *ptr = (ELFNoteHeader) - { - .name_size = cast_to(u32, u64, vb_copy_string_zero_terminated(&builder->file, gnu_string)), - .descriptor_size = 16, - .type = NT_GNU_PROPERTY_TYPE_0, - }; - u8 gnu_property_blob[] = { 0x02, 0x80, 0x00, 0xC0, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - static_assert(array_length(gnu_property_blob) == 16); - - vb_copy_any_array(&builder->file, gnu_property_blob); - - gnu_property_size = builder->file.length - offset; - - *gnu_property_section_header = (ELFSectionHeader) - { - .name_offset = gnu_property_section_name, - .type = ELF_SECTION_NOTE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = gnu_property_size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - // u32 gnu_build_id_offset = 0; - // u32 gnu_build_id_alignment = 0; - // ELFNoteHeader* gnu_build_id_header = 0; - // u8* gnu_build_id_string = 0; - // u8* gnu_build_id_blob = 0; - // u32 gnu_build_id_blob_size = 20; - // { - // // .note.gnu.build-id - // // Section #3 - // auto* section_header = vb_add(&builder->section_headers, 1); - // u64 alignment = 4; - // gnu_build_id_alignment = alignment; - // auto name = elf_get_section_name(builder, strlit(".note.gnu.build-id")); - // vb_align(&builder->file, alignment); - // auto offset = builder->file.length; - // gnu_build_id_offset = offset; - // - // gnu_build_id_header = vb_add_scalar(&builder->file, ELFNoteHeader); - // gnu_build_id_string = vb_add(&builder->file, gnu_string_size); - // gnu_build_id_blob = vb_add(&builder->file, gnu_build_id_blob_size); - // - // auto size = builder->file.length - offset; - // memset(builder->file.pointer + offset, 0, size); - // - // *section_header = (ELFSectionHeader) - // { - // .name_offset = name, - // .type = ELF_SECTION_NOTE, - // .flags = { - // .alloc = 1, - // }, - // .address = offset, - // .offset = offset, - // .size = size, - // .link = 0, - // .info = 0, - // .alignment = alignment, - // .entry_size = 0, - // }; - // } - - u32 gnu_build_id_abi_note_offset = 0; - u32 gnu_build_id_abi_alignment = 0; - { - // .note.ABI-tag - // Section #4 - auto* section_header = vb_add(&builder->section_headers, 1); - u32 alignment = 4; - gnu_build_id_abi_alignment = alignment; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_build_id_abi_note_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".note.ABI-tag")); - - auto* note_header = vb_add_scalar(&builder->file, ELFNoteHeader); - *note_header = (ELFNoteHeader) { - .name_size = cast_to(u32, u64, vb_copy_string_zero_terminated(&builder->file, gnu_string)), - .descriptor_size = 16, - .type = NT_GNU_ABI_TAG, - }; - - u32 abi = ELF_ABI_SYSTEM_V; - u32 major = 4; - u32 minor = 4; - u32 patch = 0; - u32 abi_content[] = { abi, major, minor, patch }; - - vb_copy_any_array(&builder->file, abi_content); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) - { - .name_offset = name, - .type = ELF_SECTION_NOTE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - auto gnu_build_id_abi_note_size = builder->file.length - gnu_build_id_abi_note_offset; - - auto preliminar_section_count = cast_to(u16, u32, builder->section_headers.length + 1); - auto dynamic_symbol_table_index = preliminar_section_count; - auto dynamic_string_table_index = cast_to(u16, u32, dynamic_symbol_table_index + 1); - - u32 gnu_hash_offset = 0; - { - // .gnu.hash - // Section #5 - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_hash_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".gnu.hash")); - - *vb_add_scalar(&builder->file, ElfGnuHashHeader) = (ElfGnuHashHeader) { - .bucket_count = 1, - .symbol_offset = 1, - .bloom_size = 1, - .bloom_shift = 0, - }; - - u64 bloom_filters[] = {0}; - vb_copy_any_array(&builder->file, bloom_filters); - - u32 buckets[] = {0}; - vb_copy_any_array(&builder->file, buckets); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_GNU_HASH, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_symbol_table_index, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - auto libc_start_main = st_get_string(&builder->dynamic_st, strlit("__libc_start_main")); - auto cxa_finalize = st_get_string(&builder->dynamic_st, strlit("__cxa_finalize")); - auto libcso6 = st_get_string(&builder->dynamic_st, strlit("libc.so.6")); -#ifdef __x86_64 -#define glibc_min_version_string "GLIBC_2.2.5" -#else -#define glibc_min_version_string "GLIBC_2.17" -#endif -#define glibc_max_version_string "GLIBC_2.34" - auto glibc_min = st_get_string_and_hash(&builder->dynamic_st, strlit(glibc_min_version_string)); - auto glibc_max = st_get_string_and_hash(&builder->dynamic_st, strlit(glibc_max_version_string)); - auto itm_deregister = st_get_string(&builder->dynamic_st, strlit("_ITM_deregisterTMCloneTable")); - auto gmon_start = st_get_string(&builder->dynamic_st, strlit("__gmon_start__")); - auto itm_register = st_get_string(&builder->dynamic_st, strlit("_ITM_registerTMCloneTable")); - - u32 dynsym_offset = 0; - // u32 dynsym_size; - { - // .dynsym - // Section #6 - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ELFSymbol); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - dynsym_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".dynsym")); - - ELFSymbol expected_symbols[] = { - // 1 - { - .name_offset = libc_start_main, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 2 - { - .name_offset = itm_deregister, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 3 - { - .name_offset = gmon_start, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 4 - { - .name_offset = itm_register, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - // 5 - { - .name_offset = cxa_finalize, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = 0, - .value = 0, - .size = 0, - }, - }; - vb_copy_array(&builder->dynamic_st.symbol_table, expected_symbols); - u32 size = builder->dynamic_st.symbol_table.length * sizeof(ELFSymbol); - vb_copy_any_slice(&builder->file, builder->dynamic_st.symbol_table); - - u64 entry_size = sizeof(ELFSymbol); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_DYNAMIC_SYMBOL_TABLE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_string_table_index, - .info = 1, // TODO: figure out - .alignment = alignment, - .entry_size = entry_size, - }; - } - - u32 dynstr_offset = 0; - u32 dynstr_size = 0; - { - // .dynstr - // Section #7 - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - dynstr_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".dynstr")); - - auto size = builder->dynamic_st.string_table.length; - dynstr_size = size; - vb_copy_string(&builder->file, (String) { builder->dynamic_st.string_table.pointer, builder->dynamic_st.string_table.length }); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_STRING_TABLE, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - u32 gnu_version_offset = 0; - { - // .gnu.version - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u16); - assert(alignment == 2); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_version_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".gnu.version")); - - // 0: means local symbol (not versioned) - // 1: indicates base version (nothing specific) - // >1: refers to an index into the .gnu.version_r - u16 symbol_versions[] = { - 0, - 2, // .gnu.version_r - 1, - 1, - 1, - 3 // .gnu.version_r - }; - - u32 size = sizeof(symbol_versions); - vb_copy_any_array(&builder->file, symbol_versions); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_GNU_VERSYM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_symbol_table_index, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(u16), - }; - } - - u32 gnu_version_r_offset = 0; - { - // .gnu.version_r - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - gnu_version_r_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".gnu.version_r")); - - STRUCT(Requirement) - { - ELFVersionRequirement req; - ELFVersionRequirementEntry* entry_pointer; - u16 entry_count; - }; - - ELFVersionRequirementEntry entries[] = { - { - .hash = glibc_min.hash, - .flags = 0, - .index = 3, - .name_offset = glibc_min.offset, - .next = sizeof(ELFVersionRequirementEntry), - }, - { - .hash = glibc_max.hash, - .flags = 0, - .index = 2, - .name_offset = glibc_max.offset, - .next = 0, - }, - }; - - Requirement requirements[] = { - { - .req = { - .version = 1, - .name_offset = libcso6, - .aux_offset = sizeof(ELFVersionRequirement), - .next = 0, - }, - .entry_pointer = entries, - .entry_count = array_length(entries), - } - }; - - for (u32 i = 0; i < array_length(requirements); i += 1) - { - auto req = &requirements[i]; - auto requirement = req->req; - requirement.count = req->entry_count; - *vb_add_scalar(&builder->file, ELFVersionRequirement) = requirement; - - u32 entry_size = req->entry_count * sizeof(*req->entry_pointer); - memcpy(vb_add(&builder->file, entry_size), req->entry_pointer, entry_size); - } - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_GNU_VERNEED, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_string_table_index, - .info = array_length(requirements), - .alignment = alignment, - .entry_size = 0, - }; - } - - ElfRelocationWithAddend* dynamic_relocations = {}; - u32 dynamic_relocation_count = 0; - // * The symbol indices make mention to the .dynsym table (where 0 means a special case: none) - // * The addend is related to the (virtual) address - // ElfRelocationWithAddend expected_relocations[] = { - // { .offset = 15888, .info = { .type = { .x86_64 = R_X86_64_RELATIVE }, .symbol = 0}, .addend = 4368 }, // .fini_array content in .text - // { .offset = 15896, .info = { .type = { .x86_64 = R_X86_64_RELATIVE }, .symbol = 0}, .addend = 4288 }, // .init_array content in .text - // { .offset = 16392, .info = { .type = { .x86_64 = R_X86_64_RELATIVE }, .symbol = 0}, .addend = 16392 }, // something in .data - // - // { .offset = 16320, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 1}, .addend = 0 }, // libc_start_main - // { .offset = 16328, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 2}, .addend = 0 }, // itm_deregister - // { .offset = 16336, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 3}, .addend = 0 }, // gmon_start - // { .offset = 16344, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 4}, .addend = 0 }, // itm_register - // { .offset = 16352, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 5}, .addend = 0 }, // cxa_finalize - // }; - - u32 expected_dynamic_relocation_count = 8; - u32 rela_count = 3; - u32 rela_dyn_offset = 0; - u32 rela_dyn_size = 0; - { - // .rela.dyn - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ElfRelocationWithAddend); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - rela_dyn_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".rela.dyn")); - - u32 size = sizeof(ElfRelocationWithAddend) * expected_dynamic_relocation_count; - rela_dyn_size = size; - dynamic_relocations = (ElfRelocationWithAddend*)vb_add(&builder->file, size); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_RELOCATION_WITH_ADDENDS, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = dynamic_symbol_table_index, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(ElfRelocationWithAddend), - }; - } - - // Add read-only program segment - { - auto offset = builder->file.length; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) - { - .type = PT_LOAD, - .flags = {.readable = 1}, - .offset = 0, - .virtual_address = 0, - .physical_address = 0, - .file_size = offset, - .memory_size = offset, - .alignment = 0x1000, - }; - } - - vb_align(&builder->file, 0x1000); - - auto code_offset = builder->file.length; - auto init_offset = code_offset; - auto init_section_index = cast_to(u16, u32, builder->section_headers.length); - VirtualBuffer(SymbolRelocation) symbol_relocations = {}; - String init_section_content = {}; - { - // .init - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".init")); - - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x48, 0x83, 0xEC, 0x08, - 0x48, 0x8B, 0x05, 0xC1, 0x2F, 0x00, 0x00, - 0x48, 0x85, 0xC0, - 0x74, 0x02, - 0xFF, 0xD0, - 0x48, 0x83, 0xC4, 0x08, - 0xC3, - }; - // 1000: f3 0f 1e fa endbr64 - // 1004: 48 83 ec 08 sub rsp,0x8 - // 1008: 48 8b 05 c1 2f 00 00 mov rax,QWORD PTR [rip+0x2fc1] # 3fd0 <__gmon_start__@Base> - // 100f: 48 85 c0 test rax,rax - // 1012: 74 02 je 1016 <_init+0x16> - // 1014: ff d0 call rax - // 1016: 48 83 c4 08 add rsp,0x8 - // 101a: c3 ret - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation){ - .name = strlit("__gmon_start__"), - .offset = offset + 11, - }; - - init_section_content.length = sizeof(data); - init_section_content.pointer = vb_add(&builder->file, cast_to(u32, u64, init_section_content.length)); - - memcpy(init_section_content.pointer, data, init_section_content.length); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .executable = 1, - }, - .address = offset, - .offset = offset, - .size = init_section_content.length, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - u32 text_init_array_offset = 0; - u32 text_fini_array_offset = 0; - u32 _start_offset = 0; - u32 _start_size = 0; - u32 main_offset = 0; - u32 main_size; - - auto text_section_index = cast_to(u16, u32, builder->section_headers.length); - { - //.text - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 16; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".text")); - - _start_offset = builder->file.length; - { - { - { - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x31, 0xED, - 0x49, 0x89, 0xD1, - 0x5E, - 0x48, 0x89, 0xE2, - 0x48, 0x83, 0xE4, 0xF0, - 0x50, - 0x54, - 0x45, 0x31, 0xC0, - 0x31, 0xC9, - 0x48, 0x8D, 0x3D, 0xDD, 0x00, 0x00, 0x00, - 0xFF, 0x15, 0x7B, 0x2F, 0x00, 0x00, - 0xF4, - }; - - // 0x1020 - 0x1000 = 0x20 - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("main"), - .offset = offset + 0x18 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__libc_start_main@" glibc_max_version_string), - .offset = offset + 0x1f + 2, - }; - - // 1020: f3 0f 1e fa endbr64 - // 1024: 31 ed xor ebp,ebp - // 1026: 49 89 d1 mov r9,rdx - // 1029: 5e pop rsi - // 102a: 48 89 e2 mov rdx,rsp - // 102d: 48 83 e4 f0 and rsp,0xfffffffffffffff0 - // 1031: 50 push rax - // 1032: 54 push rsp - // 1033: 45 31 c0 xor r8d,r8d - // 1036: 31 c9 xor ecx,ecx - // 1038: 48 8d 3d dd 00 00 00 lea rdi,[rip+0xdd] # 111c
- // 103f: ff 15 7b 2f 00 00 call QWORD PTR [rip+0x2f7b] # 3fc0 <__libc_start_main@GLIBC_2.34> - // 1045: f4 hlt - - _start_size = sizeof(data); - vb_copy_array(&builder->file, data); - } - // padding after _start (not counting for _start size) - { - u8 data[] = { - 0x66, 0x2E, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - vb_copy_array(&builder->file, data); - } - } - } - - { - u8 data[] = { - 0x48, 0x8D, 0x3D, 0xB9, 0x2F, 0x00, 0x00, - 0x48, 0x8D, 0x05, 0xB2, 0x2F, 0x00, 0x00, - 0x48, 0x39, 0xF8, - 0x74, 0x15, - 0x48, 0x8B, 0x05, 0x5E, 0x2F, 0x00, 0x00, - 0x48, 0x85, 0xC0, - 0x74, 0x09, - 0xFF, 0xE0, - 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, - 0xC3, - 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, - }; - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x50 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x57 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("_ITM_deregisterTMCloneTable"), - .offset = offset + 0x63 - 0x20 + 3, - }; - - // 1050: 48 8d 3d b9 2f 00 00 lea rdi,[rip+0x2fb9] # 4010 <__TMC_END__> - // 1057: 48 8d 05 b2 2f 00 00 lea rax,[rip+0x2fb2] # 4010 <__TMC_END__> - // 105e: 48 39 f8 cmp rax,rdi - // 1061: 74 15 je 1078 <_start+0x58> - // 1063: 48 8b 05 5e 2f 00 00 mov rax,QWORD PTR [rip+0x2f5e] # 3fc8 <_ITM_deregisterTMCloneTable@Base> - // 106a: 48 85 c0 test rax,rax - // 106d: 74 09 je 1078 <_start+0x58> - // 106f: ff e0 jmp rax - // 1071: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0] - // 1078: c3 ret - // 1079: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0] - - vb_copy_array(&builder->file, data); - } - - { - u8 data[] = { - 0x48, 0x8D, 0x3D, 0x89, 0x2F, 0x00, 0x00, 0x48, 0x8D, 0x35, 0x82, 0x2F, 0x00, 0x00, 0x48, 0x29, - 0xFE, 0x48, 0x89, 0xF0, 0x48, 0xC1, 0xEE, 0x3F, 0x48, 0xC1, 0xF8, 0x03, 0x48, 0x01, 0xC6, 0x48, - 0xD1, 0xFE, 0x74, 0x14, 0x48, 0x8B, 0x05, 0x2D, 0x2F, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x08, - 0xFF, 0xE0, 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00, 0xC3, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, - }; - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x80 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0x87 - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("_ITM_registerTMCloneTable"), - .offset = offset + 0xa4 - 0x20 + 3, - }; - - // 1080: 48 8d 3d 89 2f 00 00 lea rdi,[rip+0x2f89] # 4010 <__TMC_END__> - // 1087: 48 8d 35 82 2f 00 00 lea rsi,[rip+0x2f82] # 4010 <__TMC_END__> - // 108e: 48 29 fe sub rsi,rdi - // 1091: 48 89 f0 mov rax,rsi - // 1094: 48 c1 ee 3f shr rsi,0x3f - // 1098: 48 c1 f8 03 sar rax,0x3 - // 109c: 48 01 c6 add rsi,rax - // 109f: 48 d1 fe sar rsi,1 - // 10a2: 74 14 je 10b8 <_start+0x98> - // 10a4: 48 8b 05 2d 2f 00 00 mov rax,QWORD PTR [rip+0x2f2d] # 3fd8 <_ITM_registerTMCloneTable@Base> - // 10ab: 48 85 c0 test rax,rax - // 10ae: 74 08 je 10b8 <_start+0x98> - // 10b0: ff e0 jmp rax - // 10b2: 66 0f 1f 44 00 00 nop WORD PTR [rax+rax*1+0x0] - // 10b8: c3 ret - // 10b9: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0] - - vb_copy_array(&builder->file, data); - } - - text_fini_array_offset = builder->file.length; - { - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x80, 0x3D, 0x45, 0x2F, 0x00, 0x00, 0x00, - 0x75, 0x33, - 0x55, - 0x48, 0x83, 0x3D, 0x0A, 0x2F, 0x00, 0x00, 0x00, - 0x48, 0x89, 0xE5, - 0x74, 0x0D, - 0x48, 0x8B, 0x3D, 0x26, 0x2F, 0x00, 0x00, - 0xFF, 0x15, 0xF8, 0x2E, 0x00, 0x00, - 0xE8, 0x63, 0xFF, 0xFF, 0xFF, - 0xC6, 0x05, 0x1C, 0x2F, 0x00, 0x00, 0x01, - 0x5D, - 0xC3, - 0x66, 0x2E, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xC3, - 0x66, 0x66, 0x2E, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0F, 0x1F, 0x40, 0x00, - }; - - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0xc4 - 0x20 + 2, - .extra_bytes = 1, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__cxa_finalize@" glibc_min_version_string), - .offset = offset + 0xce - 0x20 + 3, - .extra_bytes = 1, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__dso_handle"), - .offset = offset + 0xdb - 0x20 + 3, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__cxa_finalize@" glibc_min_version_string), - .offset = offset + 0xe2 - 0x20 + 2, - }; - *vb_add(&symbol_relocations, 1) = (SymbolRelocation) { - .name = strlit("__TMC_END__"), - .offset = offset + 0xed - 0x20 + 2, - .extra_bytes = 1, - }; - - // 10c0: f3 0f 1e fa endbr64 - // 10c4: 80 3d 45 2f 00 00 00 cmp BYTE PTR [rip+0x2f45],0x0 # 4010 <__TMC_END__> - // 10cb: 75 33 jne 1100 <_start+0xe0> - // 10cd: 55 push rbp - // 10ce: 48 83 3d 0a 2f 00 00 cmp QWORD PTR [rip+0x2f0a],0x0 # 3fe0 <__cxa_finalize@GLIBC_2.2.5> - // 10d5: 00 - // 10d6: 48 89 e5 mov rbp,rsp - // 10d9: 74 0d je 10e8 <_start+0xc8> - // 10db: 48 8b 3d 26 2f 00 00 mov rdi,QWORD PTR [rip+0x2f26] # 4008 <__dso_handle> - // 10e2: ff 15 f8 2e 00 00 call QWORD PTR [rip+0x2ef8] # 3fe0 <__cxa_finalize@GLIBC_2.2.5> - // 10e8: e8 63 ff ff ff call 1050 <_start+0x30> - // 10ed: c6 05 1c 2f 00 00 01 mov BYTE PTR [rip+0x2f1c],0x1 # 4010 <__TMC_END__> - // 10f4: 5d pop rbp - // 10f5: c3 ret - // 10f6: 66 2e 0f 1f 84 00 00 cs nop WORD PTR [rax+rax*1+0x0] - // 10fd: 00 00 00 - // 1100: c3 ret - // 1101: 66 66 2e 0f 1f 84 00 data16 cs nop WORD PTR [rax+rax*1+0x0] - // 1108: 00 00 00 00 - // 110c: 0f 1f 40 00 nop DWORD PTR [rax+0x0] - - vb_copy_array(&builder->file, data); - } - - text_init_array_offset = builder->file.length; - { - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0xE9, 0x67, 0xFF, 0xFF, 0xFF, - 0x0F, 0x1F, 0x00, - }; - - // 1110: f3 0f 1e fa endbr64 - // 1114: e9 67 ff ff ff jmp 1080 <_start+0x60> - // 1119: 0f 1f 00 nop DWORD PTR [rax] - - vb_copy_array(&builder->file, data); - } - - // TODO: fix this - main_offset = builder->file.length; - main_size = cast_to(u32, u64, options.code.length); - - vb_copy_string(&builder->file, options.code); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .executable = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - u32 fini_offset = 0; - auto fini_section_index = cast_to(u16, u32, builder->section_headers.length); - { - // .fini - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - fini_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".fini")); - - u8 data[] = { - 0xF3, 0x0F, 0x1E, 0xFA, - 0x48, 0x83, 0xEC, 0x08, - 0x48, 0x83, 0xC4, 0x08, - 0xC3, - }; - - // 1120: f3 0f 1e fa endbr64 - // 1124: 48 83 ec 08 sub rsp,0x8 - // 1128: 48 83 c4 08 add rsp,0x8 - // 112c: c3 ret - - u32 size = sizeof(data); - vb_copy_any_array(&builder->file, data); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .executable = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - // Add code segment (read, execute) - { - auto current_offset = builder->file.length; - auto length = current_offset - code_offset; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) - { - .type = PT_LOAD, - .flags = { .executable = 1, .readable = 1}, - .offset = code_offset, - .virtual_address = code_offset, - .physical_address = code_offset, - .file_size = length, - .memory_size = length, - .alignment = 0x1000, - }; - } - - vb_align(&builder->file, 0x1000); - - auto read_only_offset = builder->file.length; - - auto rodata_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 _IO_stdin_used_size = 0; - u32 rodata_va = 0; - { - // .rodata - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - rodata_va = offset; - - auto name = elf_get_section_name(builder, strlit(".rodata")); - - u32 _IO_stdin_used = 0x20001; - u32 data[] = {_IO_stdin_used}; - _IO_stdin_used_size = sizeof(_IO_stdin_used); - - u32 size = sizeof(data); - vb_copy_any_array(&builder->file, data); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .merge = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(data[0]), - }; - } - - u32 eh_frame_offset = 0; - u32 eh_frame_size = 0; - u64 eh_frame_alignment = 0; - auto eh_frame_hdr_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 eh_frame_header_entries = 0; - EhFrameHeader* eh_frame_header = 0; - { - // .eh_frame_hdr - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 4; - eh_frame_alignment = alignment; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - eh_frame_offset = offset; - - auto name = elf_get_section_name(builder, strlit(".eh_frame_hdr")); - - // TODO: figure out a link between this and the code - EhFrameHeaderEntry entries[] = { - { .pc = cast_to(s32, s64, (s64)_start_offset - (s64)offset), .fde = 0x34 }, - { .pc = cast_to(s32, s64, (s64)main_offset - (s64)offset), .fde = 0x4c }, - }; - - eh_frame_header_entries = array_length(entries); - - u32 size = sizeof(EhFrameHeader) + sizeof(entries); - eh_frame_size = size; - auto* dst = vb_add(&builder->file, size); - eh_frame_header = (EhFrameHeader*)dst; - - memcpy(dst + sizeof(EhFrameHeader), entries, sizeof(entries)); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .eh_frame - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - *eh_frame_header = (EhFrameHeader){ - .version = 1, - .pointer_encoding = elf_eh_frame_sdata4 | elf_eh_frame_pcrel, - .count_encoding = elf_eh_frame_udata4 | elf_eh_frame_absptr, - .table_encoding = elf_eh_frame_sdata4 | elf_eh_frame_datarel, - .frame_start = cast_to(u32, u64, offset - (cast_to(u64, s64, ((u8*)eh_frame_header - builder->file.pointer)) + offsetof(EhFrameHeader, frame_start))), - .entry_count = eh_frame_header_entries, - }; - - auto name = elf_get_section_name(builder, strlit(".eh_frame")); - - // Start of CIE - u32 length = 0x14; - *(u32*)vb_add(&builder->file, sizeof(u32)) = length; - u32 id = 0; - *(u32*)vb_add(&builder->file, sizeof(u32)) = id; - u8 version = 1; - *vb_add(&builder->file, 1) = version; - - auto augmentation = strlit("zR"); - vb_copy_string_zero_terminated(&builder->file, augmentation); - - u32 code_alignment_factor = 1; - uleb128_encode(&builder->file, code_alignment_factor); - - s32 data_alignment_factor = -8; - sleb128_encode(&builder->file, data_alignment_factor); - - u32 return_address_coumn = 0x10; - uleb128_encode(&builder->file, return_address_coumn); - - *vb_add(&builder->file, 1) = 0x01; // TODO: figure out what this is - - u8 augmentation_data = 0x1b; - *vb_add(&builder->file, 1) = augmentation_data; - - { - *vb_add(&builder->file, 1) = DW_CFA_def_cfa; - *vb_add(&builder->file, 1) = 7; // RSP - *vb_add(&builder->file, 1) = 8; - - // figure out DW_CFA_offset: RIP -8 - *vb_add(&builder->file, 1) = (0x02 << 6) | 0x10; // -8 in 6-bit => 0b010000 ?? - *vb_add(&builder->file, 1) = 0x01; - - *vb_add(&builder->file, 1) = DW_CFA_nop; - - *vb_add(&builder->file, 1) = DW_CFA_nop; - } - // End of CIE - - STRUCT(FrameDescriptorEntryHeader) - { - u32 length; - u32 pointer; - }; - - // Start of FDE - { - *vb_add_scalar(&builder->file, FrameDescriptorEntryHeader) = (FrameDescriptorEntryHeader) { - .length = 0x14, - .pointer = 0x1c, - }; - - // _start - s32 initial_location = cast_to(s32, s64, (s64)_start_offset - (s64)builder->file.length); - *(s32*)(vb_add(&builder->file, sizeof(s32))) = initial_location; - - *(u32*)(vb_add(&builder->file, sizeof(u32))) = _start_size; - - *vb_add(&builder->file, 1) = 0; // TODO: ??? - - *vb_add(&builder->file, 1) = (0x01 << 6) | 0x04; // DW_CFA_advance_loc (4) - - *vb_add(&builder->file, 1) = DW_CFA_undefined; - *vb_add(&builder->file, 1) = 0x10; // RIP - - *(u32*)vb_add(&builder->file, sizeof(u32)) = 0; - // End of FDE - } - - // Start of FDE - { - *vb_add_scalar(&builder->file, FrameDescriptorEntryHeader) = (FrameDescriptorEntryHeader) { - .length = 0x10, - .pointer = 0x34, - }; - s32 initial_location = cast_to(s32, s64, (s64)main_offset - (s64)builder->file.length); - *(s32*)(vb_add(&builder->file, sizeof(s32))) = initial_location; - - *(u32*)(vb_add(&builder->file, sizeof(u32))) = main_size; - - *(u32*)(vb_add(&builder->file, sizeof(u32))) = 0; // TODO: ??? - *(u32*)(vb_add(&builder->file, sizeof(u32))) = 0; // TODO: ??? - // End of FDE - } - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - }, - .address = offset, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - auto current_offset = builder->file.length; - auto size = current_offset - read_only_offset; - // Add ro program header - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_LOAD, - .flags = {.readable = 1}, - .offset = read_only_offset, - .virtual_address = read_only_offset, - .physical_address = read_only_offset, - .file_size = size, - .memory_size = size, - .alignment = 0x1000, - }; - } - - // TODO: do a more thorough precomputation - u64 init_array_size = 8; - u64 fini_array_size = 8; - u64 dynamic_size = 416; - u64 got_size = 40; - u64 got_plt_size = 24; - - auto total_size = init_array_size + fini_array_size + dynamic_size + got_size + got_plt_size; - - auto old_length = builder->file.length; - vb_align(&builder->file, 0x1000); - builder->file.length -= total_size; - assert(old_length < builder->file.length); - - // TODO: figure out why a virtual address offset is needed here - u32 virtual_address_offset = 0x1000; - - auto* data_program_header = vb_add(&builder->program_headers, 1); - auto data_offset = builder->file.length; - - u32 init_array_va = 0; - { - // .init_array - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto virtual_address = offset + virtual_address_offset; - init_array_va = virtual_address; - - assert((virtual_address - offset) % 0x1000 == 0); - - auto name = elf_get_section_name(builder, strlit(".init_array")); - - u64 content[] = { text_init_array_offset }; - - u32 size = sizeof(content); - assert(init_array_size == size); - - vb_copy_any_array(&builder->file, content); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_INIT_ARRAY, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(content[0]), - }; - - dynamic_relocations[dynamic_relocation_count] = (ElfRelocationWithAddend) { - .offset = virtual_address, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_RELATIVE -#else - .x86_64 = R_AARCH64_RELATIVE -#endif - }, - .symbol = 0, - }, - .addend = text_init_array_offset, - }; - dynamic_relocation_count += 1; - } - - u32 fini_array_va = 0; - { - // .fini_array - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - fini_array_va = virtual_address; - - assert((virtual_address - offset) % 0x1000 == 0); - - auto name = elf_get_section_name(builder, strlit(".fini_array")); - - u64 content[] = { text_fini_array_offset }; - u32 size = sizeof(content); - assert(size == fini_array_size); - vb_copy_any_array(&builder->file, content); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_FINI_ARRAY, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(content[0]), - }; - - dynamic_relocations[dynamic_relocation_count] = (ElfRelocationWithAddend) { - .offset = virtual_address, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_RELATIVE -#else - .aarch64 = R_AARCH64_RELATIVE -#endif - }, - .symbol = 0, - }, - .addend = text_fini_array_offset, - }; - dynamic_relocation_count += 1; - } - - auto* __dso_handle_relocation = &dynamic_relocations[dynamic_relocation_count]; - dynamic_relocation_count += 1; - - auto dynamic_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 dynamic_va = 0; - { - // .dynamic - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ElfDynamicEntry); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - dynamic_va = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".dynamic")); - - ElfDynamicEntry dynamic_entries[] = { - { .tag = DT_NEEDED, { .address = libcso6 }}, - { .tag = DT_INIT, { .address = init_offset }}, - { .tag = DT_FINI, { .address = fini_offset }}, - { .tag = DT_INIT_ARRAY, { .address = init_array_va }}, - { .tag = DT_INIT_ARRAYSZ, { .address = init_array_size }}, - { .tag = DT_FINI_ARRAY, { .address = fini_array_va }}, - { .tag = DT_FINI_ARRAYSZ, { .address = fini_array_size }}, - { .tag = DT_GNU_HASH, { .address = gnu_hash_offset }}, - { .tag = DT_STRTAB, { .address = dynstr_offset }}, - { .tag = DT_SYMTAB, { .address = dynsym_offset }}, - { .tag = DT_STRSZ, { .address = dynstr_size }}, - { .tag = DT_SYMENT, { .address = sizeof(ELFSymbol) }}, - // TODO - { .tag = DT_DEBUG, { .address = 0}}, - { .tag = DT_RELA, { .address = rela_dyn_offset }}, - { .tag = DT_RELASZ, { .address = rela_dyn_size }}, - { .tag = DT_RELAENT, { .address = sizeof(ElfRelocationWithAddend) }}, - // TODO - { .tag = DT_FLAGS_1, { .address = 134217728}}, - { .tag = DT_VERNEED, { .address = gnu_version_r_offset }}, - // TODO: - { .tag = DT_VERNEEDNUM, { .address = 1 }}, - { .tag = DT_VERSYM, { .address = gnu_version_offset }}, - { .tag = DT_RELACOUNT, { .address = rela_count }}, - // TODO: figure out if these are needed - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - { .tag = DT_NULL, { .address = 0}}, - }; - - u32 size = sizeof(dynamic_entries); - - vb_copy_any_array(&builder->file, dynamic_entries); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_DYNAMIC, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = dynamic_string_table_index, - .info = 0, - .alignment = alignment, - .entry_size = sizeof(ElfDynamicEntry), - }; - - // Add dynamic program header - { - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_DYNAMIC, - .flags = {.writeable = 1, .readable = 1}, - .offset = offset, - .virtual_address = virtual_address, - .physical_address = virtual_address, - .file_size = size, - .memory_size = size, - .alignment = alignof(ElfDynamicEntry), - }; - } - } - - auto dynamic_relocation_offset = dynamic_relocation_count; - { - // .got - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 8; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - - auto name = elf_get_section_name(builder, strlit(".got")); - - // { .offset = 16320, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 1}, .addend = 0 }, // libc_start_main - // { .offset = 16328, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 2}, .addend = 0 }, // itm_deregister - // { .offset = 16336, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 3}, .addend = 0 }, // gmon_start - // { .offset = 16344, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 4}, .addend = 0 }, // itm_register - // { .offset = 16352, .info = { .type = { .x86_64 = R_X86_64_GLOB_DAT }, .symbol = 5}, .addend = 0 }, // cxa_finalize - - // TODO: unify these entries with code before - u64 entries[] = { 0, 0, 0, 0, 0 }; - assert(builder->dynamic_st.symbol_table.length - 1 == array_length(entries)); - - for (u32 i = 0; i < array_length(entries); i += 1) - { - auto* relocation = &dynamic_relocations[dynamic_relocation_count]; - dynamic_relocation_count += 1; - auto offset = virtual_address + (i * sizeof(u64)); - *relocation = (ElfRelocationWithAddend) { - .offset = offset, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_GLOB_DAT -#else - .aarch64 = R_AARCH64_GLOB_DAT -#endif - }, - .symbol = i + 1, - }, - .addend = 0, - }; - } - - u32 size = sizeof(entries); - - vb_copy_any_array(&builder->file, entries); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = alignof(u64), - }; - } - - auto got_plt_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 got_plt_va = 0; - { - // .got.plt - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - got_plt_va = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".got.plt")); - - // TODO: figure out why there are three entries here - u64 entries[] = { dynamic_va, 0, 0 }; - - u32 size = sizeof(entries); - - vb_copy_any_array(&builder->file, entries); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 8, - }; - } - - // Add several program headers - { - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_NOTE, - .flags = {.readable = 1}, - .offset = gnu_property_offset, - .virtual_address = gnu_property_offset, - .physical_address = gnu_property_offset, - .file_size = gnu_property_size, - .memory_size = gnu_property_size, - .alignment = gnu_property_alignment, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_NOTE, - .flags = {.readable = 1}, - .offset = gnu_build_id_abi_note_offset, - .virtual_address = gnu_build_id_abi_note_offset, - .physical_address = gnu_build_id_abi_note_offset, - .file_size = gnu_build_id_abi_note_size, - .memory_size = gnu_build_id_abi_note_size, - .alignment = gnu_build_id_abi_alignment, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_PROPERTY, - .flags = {.readable = 1}, - .offset = gnu_property_offset, - .virtual_address = gnu_property_offset, - .physical_address = gnu_property_offset, - .file_size = gnu_property_size, - .memory_size = gnu_property_size, - .alignment = gnu_property_alignment, - }; - - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_EH_FRAME, - .flags = {.readable = 1}, - .offset = eh_frame_offset, - .virtual_address = eh_frame_offset, - .physical_address = eh_frame_offset, - .file_size = eh_frame_size, - .memory_size = eh_frame_size, - .alignment = eh_frame_alignment, - }; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_STACK, - .flags = { .writeable = 1, .readable = 1}, - .offset = 0, - .virtual_address = 0, - .physical_address = 0, - .file_size = 0, - .memory_size = 0, - .alignment = 16, - }; - - auto relro_end = builder->file.length; - auto size = relro_end - data_offset; - auto virtual_address = data_offset + virtual_address_offset; - *vb_add(&builder->program_headers, 1) = (ElfProgramHeader) { - .type = PT_GNU_RELRO, - .flags = { .readable = 1}, - .offset = data_offset, - .virtual_address = virtual_address, - .physical_address = virtual_address, - .file_size = size, - .memory_size = size, - .alignment = 1 - }; - } - - vb_align(&builder->file, 0x1000); - - u32 data_va_start = 0; - u32 data_va_end = 0; - auto data_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 __dso_handle_va; - { - // .data - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(u64); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - data_va_start = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".data")); - - // TODO: figure out what's this - __dso_handle_va = virtual_address + sizeof(u64); - u64 entries[] = { 0, __dso_handle_va }; - u32 size = sizeof(entries); - - vb_copy_any_array(&builder->file, entries); - data_va_end = cast_to(u32, u64, data_va_start + size); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - - *__dso_handle_relocation = (ElfRelocationWithAddend) { - .offset = __dso_handle_va, - .info = { - .type = { -#ifdef __x86_64__ - .x86_64 = R_X86_64_RELATIVE -#else - .aarch64 = R_AARCH64_RELATIVE -#endif - }, - .symbol = 0 - }, - .addend = __dso_handle_va, - }; - } - - u32 bss_size; - auto bss_section_index = cast_to(u16, u32, builder->section_headers.length); - u32 bss_end; - u32 bss_start; - { - // .bss - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - auto virtual_address = offset + virtual_address_offset; - bss_start = virtual_address; - - auto name = elf_get_section_name(builder, strlit(".bss")); - - bss_size = 8; - bss_end = virtual_address + bss_size; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_BSS, - .flags = { - .alloc = 1, - .write = 1, - }, - .address = virtual_address, - .offset = offset, - .size = bss_size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - // Fill data program header (writeable, readable) - { - auto current_offset = builder->file.length; - auto file_size = current_offset - data_offset; - auto virtual_address = data_offset + virtual_address_offset; - *data_program_header = (ElfProgramHeader) { - .type = PT_LOAD, - .flags = {.writeable = 1, .readable = 1}, - .offset = data_offset, - .virtual_address = virtual_address, - .physical_address = virtual_address, - .file_size = file_size, - .memory_size = file_size + bss_size, - .alignment = 0x1000, - }; - } - - const u64 virtual_address = 0; - - // { - // // .comment - // auto* section_header = vb_add(&builder->section_headers, 1); - // u64 alignment = 1; - // - // vb_align(&builder->file, alignment); - // auto offset = builder->file.length; - // - // auto name = elf_get_section_name(builder, strlit(".comment")); - // - // String strings[] = { - // strlit("GCC: (GNU) 14.2.1 20240805"), - // strlit("GCC: (GNU) 14.2.1 20240910"), - // strlit("clang version 18.1.8"), - // }; - // - // for (u32 i = 0; i < array_length(strings); i += 1) - // { - // String string = strings[i]; - // vb_copy_string_zero_terminated(&builder->file, string); - // } - // - // auto size = builder->file.length - offset; - // - // *section_header = (ELFSectionHeader) { - // .name_offset = name, - // .type = ELF_SECTION_PROGRAM, - // .flags = { - // .merge = 1, - // .strings = 1, - // }, - // .address = virtual_address, - // .offset = offset, - // .size = size, - // .link = 0, - // .info = 0, - // .alignment = alignment, - // .entry_size = 1, - // }; - // } - - for (u32 i = 0, dynamic_relocation_i = dynamic_relocation_offset; dynamic_relocation_i < dynamic_relocation_count; dynamic_relocation_i += 1, i += 1) - { - auto* dynamic_relocation = &dynamic_relocations[dynamic_relocation_i]; - - auto* symbol = &builder->dynamic_st.symbol_table.pointer[i + 1]; - auto* c_string = &builder->dynamic_st.string_table.pointer[symbol->name_offset]; - auto c_length = strlen((char*)c_string); - auto name = (String) { c_string, c_length }; - auto target_symbol_address = dynamic_relocation->offset; - - for (u32 i = 0; i < symbol_relocations.length; i += 1) - { - auto* symbol_relocation = &symbol_relocations.pointer[i]; - if (s_equal(symbol_relocation->name, name)) - { - auto source_instruction_end = symbol_relocation->offset + sizeof(s32) + symbol_relocation->extra_bytes; - auto result = (s32)((s64)target_symbol_address - (s64)source_instruction_end); - *(s32*)&builder->file.pointer[symbol_relocation->offset] = result; - } - } - } - - VirtualBuffer(u8) debug_str = {}; - VirtualBuffer(u32) debug_str_offsets = {}; - { - // .debug_info - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_info")); - - auto* compilation_unit = vb_add_scalar(&builder->file, typeof(DwarfCompilationUnit)); - - // COMPILATION UNIT - { - u32 abbrev_code = 1; - uleb128_encode(&builder->file, abbrev_code); - - { - // producer: strx1 - auto string = compiler_name; - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&debug_str, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // language: data2 - *(u16*)vb_add(&builder->file, sizeof(u16)) = DW_LANG_C11; - - { - // file: strx1 - auto string = strlit("first.nat"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&debug_str, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // str_offsets_base: sec_offset - *(u32*)vb_add(&builder->file, sizeof(u32)) = 8; // TODO: figure out what this number means - - // stmt_list: sec_offset - *(u32*)vb_add(&builder->file, sizeof(u32)) = 0; // TODO: figure out what this number means - - // comp_dir: strx1 - { - auto string = strlit("/home/david/dev/bb/tests"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&debug_str, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // low_pc: addrx - uleb128_encode(&builder->file, 0); - - // high_pc: data4 - *(u32*)vb_add(&builder->file, sizeof(u32)) = 3; - - // addr_base: sec_offset - *(u32*)vb_add(&builder->file, sizeof(u32)) = 8; - } - - // SUBPROGRAM (main) - { - u32 abbrev_code = 2; - uleb128_encode(&builder->file, abbrev_code); - - // low_pc: addrx - uleb128_encode(&builder->file, 0); - - // high_pc: data4 - *(u32*)vb_add(&builder->file, sizeof(u32)) = 3; - - // frame_base: exprloc - uleb128_encode(&builder->file, 1); - *vb_add(&builder->file, 1) = DW_OP_reg7; - - // call_all_calls: flag_present - // not present in the debug_info section - - { - // name: strx1 - auto string = strlit("main"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&builder->file, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // file: data1 - *vb_add(&builder->file, 1) = 0; - - // line: data1 - *vb_add(&builder->file, 1) = 1; - - // type: ref4 - *(u32*)vb_add(&builder->file, sizeof(u32)) = 0x32; - - // external: flag_present - // not present in the debug_info section - } - - // base_type (s32) - { - u32 abbrev_code = 3; - uleb128_encode(&builder->file, abbrev_code); - - { - // name: strx1 - auto string = strlit("s32"); - auto string_offset = debug_str.length; - vb_copy_string_zero_terminated(&builder->file, string); - auto string_offset_index = debug_str_offsets.length; - *vb_add(&debug_str_offsets, 1) = string_offset; - *vb_add(&builder->file, 1) = cast_to(u8, u32, string_offset_index); - } - - // encoding: data1 - *vb_add(&builder->file, 1) = DW_ATE_signed; - - // byte_size: data1 - *vb_add(&builder->file, 1) = sizeof(s32); // sizeof(int); - } - - *vb_add(&builder->file, 1) = 0; - - auto size = builder->file.length - offset; - - auto length_size = sizeof(compilation_unit->length); - *compilation_unit = (DwarfCompilationUnit) { - .length = cast_to(u32, u64, size - length_size), - .version = 5, - .type = DW_UT_compile, - .address_size = 8, - .debug_abbreviation_offset = 0, - }; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .debug_abbrev - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_abbrev")); - - // Abbreviation entry - uleb128_encode(&builder->file, 1); - // Abbreviation kind - uleb128_encode(&builder->file, DW_TAG_compile_unit); - // Has children - *vb_add(&builder->file, 1) = 1; - - DwarfAttributeFormPair compile_unit[] = { - { DW_AT_producer, DW_FORM_strx1, }, - { DW_AT_language, DW_FORM_data2, }, - { DW_AT_name, DW_FORM_strx1, }, - { DW_AT_str_offsets_base, DW_FORM_sec_offset, }, - { DW_AT_stmt_list, DW_FORM_sec_offset, }, - { DW_AT_comp_dir, DW_FORM_strx1, }, - { DW_AT_low_pc, DW_FORM_addrx, }, - { DW_AT_high_pc, DW_FORM_data4, }, - { DW_AT_addr_base, DW_FORM_sec_offset, }, - }; - encode_attribute_abbreviations(builder, (Slice(DwarfAttributeFormPair)) array_to_slice(compile_unit)); - - // Abbreviation entry - uleb128_encode(&builder->file, 2); - // Abbreviation kind - uleb128_encode(&builder->file, DW_TAG_subprogram); - // Has children - *vb_add(&builder->file, 1) = 0; - - DwarfAttributeFormPair subprogram[] = { - { DW_AT_low_pc, DW_FORM_addrx, }, - { DW_AT_high_pc, DW_FORM_data4, }, - { DW_AT_frame_base, DW_FORM_exprloc, }, - { DW_AT_call_all_calls, DW_FORM_flag_present, }, - { DW_AT_name, DW_FORM_strx1, }, - { DW_AT_decl_file, DW_FORM_data1, }, - { DW_AT_decl_line, DW_FORM_data1, }, - { DW_AT_type, DW_FORM_ref4, }, - { DW_AT_external, DW_FORM_flag_present, }, - }; - encode_attribute_abbreviations(builder, (Slice(DwarfAttributeFormPair)) array_to_slice(subprogram)); - - // Abbreviation entry - uleb128_encode(&builder->file, 3); - // Abbreviation kind - uleb128_encode(&builder->file, DW_TAG_base_type); - // Has children - *vb_add(&builder->file, 1) = 0; // has children - - DwarfAttributeFormPair base_type[] = { - { DW_AT_name, DW_FORM_strx1, }, - { DW_AT_encoding, DW_FORM_data1, }, - { DW_AT_byte_size, DW_FORM_data1, }, - }; - encode_attribute_abbreviations(builder, (Slice(DwarfAttributeFormPair)) array_to_slice(base_type)); - - // End with a null entry - *vb_add(&builder->file, 1) = 0; - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - VirtualBuffer(u8) debug_line_str = {}; - { - // .debug_line - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_line")); - - auto* header = vb_add_scalar(&builder->file, DwarfLineHeader); - auto after_header_length = offset + offsetof(DwarfLineHeader, header_length) + sizeof(header->header_length); - - // standard opcode lengths - u8 opcode_length_lookup[] = { - [DW_LNS_copy - 1] = 0, - [DW_LNS_advance_pc - 1] = 1, - [DW_LNS_advance_line - 1] = 1, - [DW_LNS_set_file - 1] = 1, - [DW_LNS_set_column - 1] = 1, - [DW_LNS_set_basic_block - 1] = 0, - [DW_LNS_negate_stmt - 1] = 0, - [DW_LNS_const_add_pc - 1] = 0, - [DW_LNS_fixed_advance_pc - 1] = 1, - [DW_LNS_set_prologue_end - 1] = 0, - [DW_LNS_set_epilogue_begin - 1] = 0, - [DW_LNS_set_isa - 1] = 1, - }; - - // TODO: this is just one-byte binary integers. Turn into memcpy? - for (u32 i = 0; i < array_length(opcode_length_lookup); i += 1) - { - uleb128_encode(&builder->file, opcode_length_lookup[i]); - } - - { - typedef enum LineNumberHeaderEntryFormat : u8 - { - DW_LCNT_path = 0x01, - DW_LCNT_directory_index = 0x02, - DW_LCNT_timestamp = 0x03, - DW_LCNT_size = 0x04, - DW_LCNT_MD5 = 0x05, - } LineNumberHeaderEntryFormat; - - STRUCT(FormatDescriptor) - { - LineNumberHeaderEntryFormat format; - DwarfForm form; - }; - - FormatDescriptor directory_entry_formats[] = { - { DW_LCNT_path, DW_FORM_line_strp }, - }; - - auto directory_entry_format_count = cast_to(u8, u32, array_length(directory_entry_formats)); - *vb_add(&builder->file, 1) = directory_entry_format_count; - - for (u8 i = 0; i < array_length(directory_entry_formats); i += 1) - { - FormatDescriptor descriptor = directory_entry_formats[i]; - uleb128_encode(&builder->file, descriptor.format); - uleb128_encode(&builder->file, descriptor.form); - } - - // TODO: - u8 directory_index = 0; - auto directory_string_offset = debug_line_str.length; - { - auto string = strlit("/home/david/dev/bloat-buster/tests"); - vb_copy_string_zero_terminated(&debug_line_str, string); - } - u32 paths[] = { directory_string_offset }; - - u32 directory_count = array_length(paths); - uleb128_encode(&builder->file, directory_count); - - for (u32 i = 0; i < directory_count; i += 1) - { - auto directory_offset = paths[i]; - vb_copy_scalar(&builder->file, directory_offset); - } - - FormatDescriptor filename_entry_formats[] = { - { DW_LCNT_path, DW_FORM_line_strp }, - { DW_LCNT_directory_index, DW_FORM_udata }, - { DW_LCNT_MD5, DW_FORM_data16 }, - }; - - auto filename_entry_format_count = cast_to(u8, u32, array_length(filename_entry_formats)); - *vb_add(&builder->file, 1) = filename_entry_format_count; - - for (u8 i = 0; i < filename_entry_format_count; i += 1) - { - FormatDescriptor descriptor = filename_entry_formats[i]; - uleb128_encode(&builder->file, descriptor.format); - uleb128_encode(&builder->file, descriptor.form); - } - - STRUCT(FilenameEntry) - { - u32 filename; - u8 directory_index; - MD5Result hash; - }; - // MD5Result md5_hash = { { 0x05, 0xAB, 0x89, 0xF5, 0x48, 0x1B, 0xC9, 0xF2, 0xD0, 0x37, 0xE7, 0x88, 0x66, 0x41, 0xE9, 0x19 } }; - String dummy_file = file_read(thread->arena, strlit("/home/david/dev/bloat-buster/tests/first.nat")); - auto md5_hash = md5_string(dummy_file); - - auto filename_string_offset = debug_line_str.length; - { - auto string = strlit("first.nat"); - vb_copy_string_zero_terminated(&debug_line_str, string); - } - - FilenameEntry filenames[] = { - { - filename_string_offset, - directory_index, - md5_hash, - }, - }; - u32 filename_count = array_length(filenames); - uleb128_encode(&builder->file, filename_count); - - for (typeof(filename_count) i = 0; i < filename_count; i += 1) - { - auto filename = filenames[i]; - *(u32*)vb_add(&builder->file, sizeof(u32)) = filename.filename; - uleb128_encode(&builder->file, filename.directory_index); - vb_copy_array(&builder->file, filename.hash.hash); - } - } - - auto line_program_start_offset = builder->file.length; - { - *vb_add(&builder->file, 1) = DW_LNS_set_file; - *vb_add(&builder->file, 1) = 0; - - *vb_add(&builder->file, 1) = DW_LNS_set_column; - *vb_add(&builder->file, 1) = 5; - - *vb_add(&builder->file, 1) = DW_LNS_set_prologue_end; - - { - // TODO: confirm this is the encoding of special opcodes? - *vb_add(&builder->file, 1) = 0; // Special opcode - *vb_add(&builder->file, 1) = 9; // Bytes ahead - *vb_add(&builder->file, 1) = DW_LNE_set_address; // Bytes ahead - *(u64*)vb_add(&builder->file, sizeof(u64)) = main_offset; - } - - // TODO: does this have to do with "main.c"? - *vb_add(&builder->file, 1) = 0x14; // 14, address += 0, line += 2, op-index += 0 - - // Advance PC by 3 - *vb_add(&builder->file, 1) = DW_LNS_advance_pc; - *vb_add(&builder->file, 1) = cast_to(u8, u32, main_size); - - { - // TODO: confirm this is the encoding of special opcodes? - *vb_add(&builder->file, 1) = 0; // Special opcode - *vb_add(&builder->file, 1) = 1; // Bytes ahead - *vb_add(&builder->file, 1) = DW_LNE_end_sequence; - } - } - - auto size = builder->file.length - offset; - - *header = (DwarfLineHeader) { - .unit_length = size - sizeof(header->unit_length), - .version = 5, - .address_size = 8, - .segment_selector_size = 0, - .header_length = cast_to(u32, u64, line_program_start_offset - after_header_length), - .minimum_instruction_length = 1, - .maximum_operations_per_instruction = 1, - .default_is_stmt = 1, - .line_base = -5, - .line_range = 14, - .opcode_base = 13, - }; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .debug_str - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_str")); - - vb_copy_string(&builder->file, (String) { debug_str.pointer, debug_str.length }); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .merge = 1, - .strings = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 1, - }; - } - - { - // .debug_addr - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_addr")); - auto length_size = offsetof(DwarfAddressTableHeader, version) - offsetof(DwarfAddressTableHeader, unit_length); - u64 addresses[] = { main_offset }; - - auto header = (DwarfAddressTableHeader) { - .unit_length = cast_to(u32, u64, sizeof(DwarfAddressTableHeader) - length_size + sizeof(addresses)), - .version = 5, - .address_size = 8, - .segment_selector_size = 0, - }; - *vb_add_scalar(&builder->file, typeof(header)) = header; - - vb_copy_any_array(&builder->file, addresses); - - auto size = builder->file.length - offset; - assert(size == header.unit_length + length_size); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .debug_line_str - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_line_str")); - - auto size = debug_line_str.length; - vb_copy_string(&builder->file, (String) { debug_line_str.pointer, debug_line_str.length }); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = { - .merge = 1, - .strings = 1, - }, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 1, - }; - } - - { - // .debug_str_offsets - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".debug_str_offsets")); - - STRUCT(DwarfDebugStrOffsetsHeader) - { - u32 length; - u16 version; - u8 padding[2]; - }; - static_assert(alignof(DwarfDebugStrOffsetsHeader) == 4); - - auto length_size = offsetof(DwarfDebugStrOffsetsHeader, version) - offsetof(DwarfDebugStrOffsetsHeader, length); - u32 offset_array_size = debug_str_offsets.length * sizeof(*debug_str_offsets.pointer); - auto header = (DwarfDebugStrOffsetsHeader) { - - .length = cast_to(u32, u64, sizeof(DwarfDebugStrOffsetsHeader) - length_size + offset_array_size), - .version = 5, - }; - *vb_add_scalar(&builder->file, DwarfDebugStrOffsetsHeader) = header; - - memcpy(vb_add(&builder->file, offset_array_size), debug_str_offsets.pointer, offset_array_size); - - auto size = builder->file.length - offset; - assert(header.length == (size - length_size)); - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_PROGRAM, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .symtab - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = alignof(ELFSymbol); - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".symtab")); - - auto main_c_string = st_get_string(&builder->static_st, strlit("first.nat")); - auto _dynamic_string = st_get_string(&builder->static_st, strlit("_DYNAMIC")); - auto eh_frame_hdr_string = st_get_string(&builder->static_st, strlit("__GNU_EH_FRAME_HDR")); - auto got_string = st_get_string(&builder->static_st, strlit("_GLOBAL_OFFSET_TABLE_")); - auto libc_start_main_string = st_get_string(&builder->static_st, strlit("__libc_start_main@" glibc_max_version_string)); - auto deregister_string = st_get_string(&builder->static_st, strlit("_ITM_deregisterTMCloneTable")); - auto edata_string = st_get_string(&builder->static_st, strlit("_edata")); - auto fini_string = st_get_string(&builder->static_st, strlit("_fini")); - auto __data_start_string = st_get_string(&builder->static_st, strlit("__data_start")); - auto data_start_string = st_get_string(&builder->static_st, strlit("data_start")); - - ELFSymbol symbols[] = { - { - .name_offset = main_c_string, - .type = ELF_SYMBOL_TYPE_FILE, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_ABSOLUTE, - .value = 0, - .size = 0, - }, - { - .name_offset = 0, - .type = ELF_SYMBOL_TYPE_FILE, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_ABSOLUTE, - .value = 0, - .size = 0 - }, - { - .name_offset = _dynamic_string, - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = dynamic_section_index, - .value = dynamic_va, - .size = 0, - }, - { - .name_offset = eh_frame_hdr_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = eh_frame_hdr_section_index, - .value = eh_frame_offset, - .size = 0, - }, - { - .name_offset = got_string, - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_LOCAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = got_plt_section_index, - .value = got_plt_va, - .size = 0, - }, - { - .name_offset = libc_start_main_string, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = deregister_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = data_start_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = data_section_index, - .value = data_va_start, - .size = 0, - }, - { - .name_offset = edata_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = data_section_index, - .value = data_va_end, - .size = 0, - }, - { - .name_offset = fini_string, - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = fini_section_index, - .value = fini_offset, - .size = 0, - }, - { - .name_offset = __data_start_string, - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = data_section_index, - .value = data_va_start, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__gmon_start__")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__dso_handle")), - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = data_section_index, - .value = __dso_handle_va, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_IO_stdin_used")), - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = rodata_section_index, - .value = rodata_va, - .size = _IO_stdin_used_size, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_end")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = bss_section_index, - .value = bss_end, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_start")), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = text_section_index, - .value = _start_offset, - .size = _start_size, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__bss_start")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = bss_section_index, - .value = bss_start, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("main")), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = text_section_index, - .value = main_offset, - .size = main_size, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__TMC_END__")), - .type = ELF_SYMBOL_TYPE_OBJECT, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = data_section_index, - .value = data_va_end, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_ITM_registerTMCloneTable")), - .type = ELF_SYMBOL_TYPE_NONE, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("__cxa_finalize@" glibc_min_version_string)), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_WEAK, - .visibility = ELF_SYMBOL_VISIBILITY_DEFAULT, - .section_index = ELF_SECTION_UNDEFINED, - .value = 0, - .size = 0, - }, - { - .name_offset = st_get_string(&builder->static_st, strlit("_init")), - .type = ELF_SYMBOL_TYPE_FUNCTION, - .binding = ELF_SYMBOL_BINDING_GLOBAL, - .visibility = ELF_SYMBOL_VISIBILITY_HIDDEN, - .section_index = init_section_index, - .value = init_offset, - .size = 0, - } - }; - - for (u32 i = 0; i < array_length(symbols); i += 1) - { - ELFSymbol* symbol = &symbols[i]; - auto target_symbol_address = symbol->value; - - if (target_symbol_address) - { - auto* c_str = &builder->static_st.string_table.pointer[symbol->name_offset]; - auto c_str_len = strlen((char*)c_str); - String symbol_name = { .pointer = c_str, .length = c_str_len }; - - for (u32 i = 0; i < symbol_relocations.length; i += 1) - { - SymbolRelocation* relocation = &symbol_relocations.pointer[i]; - if (s_equal(relocation->name, symbol_name)) - { - auto source_instruction_end = relocation->offset + sizeof(s32) + relocation->extra_bytes; - auto result = (s32)((s64)target_symbol_address - (s64)source_instruction_end); - *(s32*)&builder->file.pointer[relocation->offset] = result; - } - } - } - } - - vb_copy_array(&builder->static_st.symbol_table, symbols); - - memcpy(vb_add(&builder->file, builder->static_st.symbol_table.length * sizeof(ELFSymbol)), builder->static_st.symbol_table.pointer, builder->static_st.symbol_table.length * sizeof(ELFSymbol)); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_SYMBOL_TABLE, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = builder->section_headers.length, // Symtab is already added, so the length is actually the index of the .strtab section - .info = 6, // TODO: figure out - .alignment = alignment, - .entry_size = sizeof(ELFSymbol), - }; - } - - { - // .strtab - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".strtab")); - - memcpy(vb_add(&builder->file, builder->static_st.string_table.length), builder->static_st.string_table.pointer, builder->static_st.string_table.length); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_STRING_TABLE, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - { - // .shstrtab - auto* section_header = vb_add(&builder->section_headers, 1); - u64 alignment = 1; - - vb_align(&builder->file, alignment); - auto offset = builder->file.length; - - auto name = elf_get_section_name(builder, strlit(".shstrtab")); - - memcpy(vb_add(&builder->file, builder->section_string_table.length), builder->section_string_table.pointer, builder->section_string_table.length); - - auto size = builder->file.length - offset; - - *section_header = (ELFSectionHeader) { - .name_offset = name, - .type = ELF_SECTION_STRING_TABLE, - .flags = {}, - .address = virtual_address, - .offset = offset, - .size = size, - .link = 0, - .info = 0, - .alignment = alignment, - .entry_size = 0, - }; - } - - vb_align(&builder->file, alignof(ELFSectionHeader)); - auto section_header_offset = builder->file.length; - auto section_header_count = cast_to(u16, u32, builder->section_headers.length); - memcpy(vb_add(&builder->file, sizeof(ELFSectionHeader) * section_header_count), builder->section_headers.pointer, builder->section_headers.length * sizeof(ELFSectionHeader)); - - *elf_header = (ELFHeader) - { - .identifier = { 0x7f, 'E', 'L', 'F' }, - .bit_count = bits64, - .endianness = little, - .format_version = 1, - .abi = ELF_ABI_SYSTEM_V, - .abi_version = 0, - .padding = {}, - .type = shared, -#ifdef __x86_64__ - .machine = x86_64, -#else - .machine = aarch64, -#endif - .version = 1, - .entry_point = _start_offset, - .program_header_offset = sizeof(ELFHeader), - .section_header_offset = section_header_offset, - .flags = 0, - .elf_header_size = sizeof(ELFHeader), - .program_header_size = sizeof(ElfProgramHeader), - .program_header_count = program_header_count, - .section_header_size = sizeof(ELFSectionHeader), - .section_header_count = section_header_count, - .section_header_string_table_index = section_header_count - 1, - }; - - assert(builder->program_headers.length == program_header_count); - memcpy(program_headers, builder->program_headers.pointer, sizeof(ElfProgramHeader) * builder->program_headers.length); - - assert(dynamic_relocation_count == expected_dynamic_relocation_count); - - return (String) { builder->file.pointer, builder->file.length }; -} - -STRUCT(DOSHeader) -{ - u8 signature[2]; - u16 extra_page_size; - u16 page_count; - u16 relocations; - u16 header_size_in_paragraphs; - u16 minimum_allocated_paragraphs; - u16 maximum_allocated_paragraphs; - u16 initial_ss_value; - u16 initial_relative_sp_value; - u16 checksum; - u16 initial_relative_ip_value; - u16 initial_cs_value; - u16 relocation_table_pointer; - u16 overlay_number; - u16 reserved_words[4]; - u16 oem_identifier; - u16 oem_information; - u16 other_reserved_words[10]; - u32 coff_header_pointer; -}; - -static_assert(sizeof(DOSHeader) == 0x40); - -typedef enum COFFArchitecture : u16 -{ - COFF_ARCH_UNKNOWN = 0x0000, - COFF_ARCH_AMD64 = 0x8664, - COFF_ARCH_ARM64 = 0xAA64, -} COFFArchitecture; - -STRUCT(COFFCharacteristics) -{ - u16 base_relocations_stripped:1; - u16 executable_image:1; - u16 line_numbers_stripped:1; - u16 symbols_stripped:1; - u16 aggressively_trim_working_set:1; - u16 large_address_aware:1; - u16 padding:1; - u16 bytes_reversed_low:1; - u16 machine_32_bit:1; - u16 debug_info_stripped:1; - u16 removable_run_from_swap:1; - u16 net_run_from_swap:1; - u16 system_file:1; - u16 dll:1; - u16 uniprocessor_machine_only:1; - u16 bytes_reversed_high:1; -}; - -static_assert(sizeof(COFFCharacteristics) == sizeof(u16)); - -typedef enum COFFOptionalHeaderFormat : u16 -{ - COFF_FORMAT_ROM = 0x107, - COFF_FORMAT_PE32 = 0x10b, - COFF_FORMAT_PE32_PLUS = 0x20b, -} COFFOptionalHeaderFormat; - -typedef enum COFFSubsystem : u16 -{ - COFF_SUBSYSTEM_UNKNOWN = 0x0000, - COFF_SUBSYSTEM_NATIVE = 0x0001, - COFF_SUBSYSTEM_WINDOWS_GUI = 0x0002, - COFF_SUBSYSTEM_WINDOWS_CUI = 0x0003, - COFF_SUBSYSTEM_OS_2_CUI = 0x0005, - COFF_SUBSYSTEM_POSIX_CUI = 0x0007, - COFF_SUBSYSTEM_WINDOWS_9X_NATIVE = 0x0008, - COFF_SUBSYSTEM_WINDOWS_CE_GUI = 0x0009, - COFF_SUBSYSTEM_EFI_APPLICATION = 0x000a, - COFF_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 0x000b, - COFF_SUBSYSTEM_EFI_RUNTIME_DRIVER = 0x000c, - COFF_SUBSYSTEM_EFI_ROM = 0x000d, - COFF_SUBSYSTEM_XBOX = 0x000e, - COFF_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 0x0010, -} COFFSubsystem; - -STRUCT(COFFDllCharacteristics) -{ - u16 call_when_loaded:1; - u16 call_when_thread_terminates:1; - u16 call_when_thread_starts:1; - u16 call_when_exiting:1; - u16 padding:1; - u16 high_entropy_va:1; - u16 dynamic_base:1; - u16 force_integrity:1; - u16 nx_compatible:1; - u16 no_isolation:1; - u16 no_seh:1; - u16 do_not_bind:1; - u16 app_container:1; - u16 is_wdm_driver:1; - u16 supports_control_flow_guard:1; - u16 terminal_server_aware:1; -}; - -static_assert(sizeof(COFFDllCharacteristics) == sizeof(u16)); - -STRUCT(COFFLoaderFlags) -{ - u32 prestart_breakpoint:1; - u32 postloading_debugger:1; - u32 padding:30; -}; - -static_assert(sizeof(COFFLoaderFlags) == sizeof(u32)); - -STRUCT(COFFHeader) -{ - u8 signature[4]; - COFFArchitecture architecture; - u16 section_count; - u32 time_date_stamp; - u32 symbol_table_pointer; - u32 symbol_count; - u16 optional_header_size; - COFFCharacteristics characteristics; -}; - -static_assert(sizeof(COFFHeader) == 24); - -typedef enum COFFDataDirectoryIndex { - COFF_EXPORT_DIRECTORY_INDEX, - COFF_IMPORT_DIRECTORY_INDEX, - COFF_RESOURCE_DIRECTORY_INDEX, - COFF_EXCEPTION_DIRECTORY_INDEX, - COFF_SECURITY_DIRECTORY_INDEX, - COFF_RELOCATION_DIRECTORY_INDEX, - COFF_DEBUG_DIRECTORY_INDEX, - COFF_ARCHITECTURE_DIRECTORY_INDEX, - COFF_GLOBAL_PTR_DIRECTORY_INDEX, - COFF_TLS_DIRECTORY_INDEX, - COFF_LOAD_CONFIG_DIRECTORY_INDEX, - COFF_BOUND_IMPORT_DIRECTORY_INDEX, - COFF_IAT_DIRECTORY_INDEX, - COFF_DELAY_IMPORT_DIRECTORY_INDEX, - COFF_CLR_DIRECTORY_INDEX, - COFF_DATA_DIRECTORY_LAST, // TODO: ?? - COFF_DATA_DIRECTORY_COUNT -} COFFDataDirectoryIndex; - -static_assert(COFF_DATA_DIRECTORY_COUNT == 16); - -STRUCT(COFFDataDirectory) -{ - u32 rva; - u32 size; -}; - -STRUCT(COFFOptionalHeader) -{ - COFFOptionalHeaderFormat format; - u8 major_linker_version; - u8 minor_linker_version; - u32 code_size; - u32 initialized_data_size; - u32 uninitialized_data_size; - u32 entry_point_address; - u32 code_offset; - u64 image_offset; - u32 virtual_section_alignment; - u32 file_section_alignment; - u16 major_operating_system_version; - u16 minor_operating_system_version; - u16 major_image_version; - u16 minor_image_version; - u16 major_subsystem_version; - u16 minor_subsystem_version; - u32 win32_version_value; - u32 image_size; - u32 headers_size; - u32 checksum; - COFFSubsystem subsystem; - COFFDllCharacteristics dll_characteristics; - u64 stack_reserve_size; - u64 stack_commit_size; - u64 heap_reserve_size; - u64 heap_commit_size; - COFFLoaderFlags loader_flags; - u32 directory_count; - COFFDataDirectory directories[COFF_DATA_DIRECTORY_COUNT]; -}; - -STRUCT(COFFSectionFlags) -{ - u32 padding:3; - u32 do_not_pad:1; - u32 padding1:1; - u32 contains_code:1; - u32 contains_initialized_data:1; - u32 contains_uninitialized_data:1; - u32 link_other:1; - u32 link_has_information:1; - u32 padding2:1; - u32 link_remove:1; - u32 link_has_comdat:1; - u32 padding3:1; - u32 reset_speculative_exceptions:1; - u32 global_pointer_relocations:1; - u32 purgeable:1; - u32 is_16_bit:1; - u32 locked:1; - u32 preloaded:1; - u32 data_alignment:4; - u32 link_extended_relocations:1; - u32 discardable:1; - u32 not_cached:1; - u32 not_pageable:1; - u32 shared:1; - u32 execute:1; - u32 read:1; - u32 writte:1; -}; - -static_assert(sizeof(COFFSectionFlags) == sizeof(u32)); - -STRUCT(COFFSectionName) -{ - u8 name[8]; -}; - -STRUCT(COFFSectionHeader) -{ - COFFSectionName name; - u32 virtual_size; - u32 rva; - u32 file_size; - u32 file_offset; - u32 relocation_offset; - u32 line_number_offset; - u16 relocation_count; - u16 line_number_count; - COFFSectionFlags flags; -}; - -static_assert(sizeof(COFFSectionHeader) == 40); - -fn COFFSectionName coff_section_name(String name) -{ - COFFSectionName result = {}; - assert(name.length <= array_length(result.name)); - memcpy(result.name, name.pointer, name.length); - - return result; -} - -STRUCT(COFFExceptionTableEntry_x86_64) -{ - u32 start_rva; - u32 end_rva; - u32 unwind_information_rva; -}; - -typedef enum COFFDebugType : u32 -{ - COFF_DEBUG_UNKNOWN = 0, - COFF_DEBUG_COFF = 1, - COFF_DEBUG_CODEVIEW = 2, - COFF_DEBUG_FPO = 3, - COFF_DEBUG_MISC = 4, - COFF_DEBUG_EXCEPTION = 5, - COFF_DEBUG_FIXUP = 6, - COFF_DEBUG_OMAP_TO_SRC = 7, - COFF_DEBUG_OMAP_FROM_SRC = 8, - COFF_DEBUG_BORLAND = 9, - COFF_DEBUG_RESERVED10 = 10, - COFF_DEBUG_BBT = 10, - COFF_DEBUG_CLSID = 11, - COFF_DEBUG_VC_FEATURE = 12, - COFF_DEBUG_POGO = 13, - COFF_DEBUG_ILTCG = 14, - COFF_DEBUG_MPX = 15, - COFF_DEBUG_REPRO = 16, - COFF_DEBUG_SPGO = 18, - COFF_DEBUG_EXTENDED_DLL_CHARACTERISTICS = 20, -} COFFDebugType; - -STRUCT(COFFDebugDirectory) -{ - u32 characteristics; - u32 timestamp; - u16 major_version; - u16 minor_version; - COFFDebugType type; - u32 size; - u32 rva; - u32 file_offset; -}; - -static_assert(sizeof(COFFDebugDirectory) == 28); - -STRUCT(COFFGUID) -{ - u8 data[16]; -}; - -STRUCT(COFFRSDS) -{ - u8 signature[4]; - COFFGUID guid; - u32 age; - u8 path[]; -}; - -static_assert(sizeof(COFFRSDS) == 4 + 16 + 4); - -fn void file_write_coff_rsds(VirtualBuffer(u8)* file, String guid, u32 age, String path) -{ - assert(guid.length == 16); - assert(path.pointer[path.length] == 0); - - COFFRSDS rsds = { - .signature = { 'R', 'S', 'D', 'S' }, - .age = age, - }; - memcpy(rsds.guid.data, guid.pointer, sizeof(COFFGUID)); - - vb_copy_scalar(file, rsds); - - vb_copy_string_zero_terminated(file, path); -} - -STRUCT(COFFImportDirectory) -{ - u32 lookup_table_rva; - u32 time_date_stamp; - u32 forwarder_chain; - u32 dll_name_rva; - u32 address_table_rva; -}; - -STRUCT(COFFImportLookup) -{ - u32 name_table_rva; - u8 padding[4]; -}; - -STRUCT(COFFImportAddress) -{ - u32 name_table_rva; - u8 padding[4]; -}; - -STRUCT(COFFImportName) -{ - u16 hint; - u8 name[]; -}; - -fn void coff_import_name(VirtualBuffer(u8)* file, u16 hint, String name) -{ - vb_copy_scalar(file, hint); - vb_copy_string_zero_terminated(file, name); -} - -typedef enum COFFUnwindOperation : u8 -{ - UNW_OP_PUSH_NONVOL = 0, // Save a non-volatile register on the stack. - UNW_OP_ALLOC_LARGE = 1, // Allocate a large stack frame. - UNW_OP_ALLOC_SMALL = 2, // Allocate a small stack frame. - UNW_OP_SET_FPREG = 3, // Establish the frame pointer register. - UNW_OP_SAVE_NONVOL = 4, // Save a non-volatile register at a specified offset. - UNW_OP_SAVE_NONVOL_FAR = 5, // Save a non-volatile register at a far offset. - UNW_OP_SAVE_XMM128 = 8, // Save a 128-bit XMM register. - UNW_OP_SAVE_XMM128_FAR = 9, // Save a 128-bit XMM register at a far offset. - UNW_OP_PUSH_MACHFRAME = 10, // Push a machine frame (used for interrupts and system exceptions). -} COFFUnwindOperation; - -STRUCT(COFFUnwindCode) -{ - u8 code_offset; - COFFUnwindOperation operation:4; - u8 operation_info:4; -}; - -static_assert(sizeof(COFFUnwindCode) == 2); - -STRUCT(COFFUnwindInformation) -{ - u8 version:3; - u8 exception_handler:1; - u8 user_exception_handler:1; - u8 chain_info:1; - u8 reserved:2; - u8 prologue_size; - u8 code_count; - u8 frame_register_and_offset; - COFFUnwindCode code[]; -}; - -STRUCT(PDBHeader) -{ - u8 magic[32]; - u32 block_size; - u32 free_block_map_index; - u32 block_count; - u32 directory_size; - u32 reserved; - u32 directory_block_indices[]; -}; - -static_assert(sizeof(PDBHeader) == 52); - -fn u32 pdb_size_to_block_count(u32 bytes, u32 block_size) -{ - return cast_to(u32, u64, ((u64)bytes + block_size - 1) / block_size); -} - -fn u64 pdb_block_index_to_file_offset(u32 block_index, u32 block_size) -{ - return (u64)block_index * (u64)block_size; -} - -fn u8 pdb_are_block_indices_contiguous(Slice(u32) block_indices) -{ - assert(block_indices.length); - u32 expected_index = block_indices.pointer[0]; - u8 result = 1; - for (u64 i = 1; i < block_indices.length; i += 1) - { - expected_index += 1; - if (block_indices.pointer[i] != expected_index) - { - result = 0; - break; - } - } - - return result; -} - -fn u8 pdb_are_block_indices_contiguous_ex(u32* block_indices, u32 block_size, u32 stream_size) -{ - auto block_count = pdb_size_to_block_count(stream_size, block_size); - - return pdb_are_block_indices_contiguous((Slice(u32)) { block_indices, block_count }); -} - -STRUCT(PDBStreamCreate) -{ - u8* data; - u32* block_indices; - u32 block_size; - u32 size; -}; - -global_variable const u32 nil_page_size = 0xffffffff; -global_variable const u16 nil_stream_index = 0xffff; -global_variable const u32 info_stream_index = 1; -global_variable const u32 tpi_stream_index = 2; -global_variable const u16 dbi_stream_index = 3; -global_variable const u16 ipi_stream_index = 4; - -STRUCT(PDBCoalescedMSFStream) -{ - u8* data; - u64 size; -}; - -typedef PDBStreamCreate PDBDirectMSFStream; - -STRUCT(PDBFile) -{ - String content; - PDBHeader* header; - PDBCoalescedMSFStream directory_stream; - u32 stream_count; - u32* stream_sizes; - u32** stream_blocks; -}; - - -typedef enum PDBStreamIndexValidation -{ - PDB_STREAM_INDEX_VALIDATION_SUCCESS, - PDB_STREAM_INDEX_VALIDATION_NULL, - PDB_STREAM_INDEX_VALIDATION_OUT_OF_BOUNDS, -} PDBStreamIndexValidation; - -fn PDBStreamIndexValidation pdb_validate_stream_index(PDBFile pdb, u32 stream_index) -{ - PDBStreamIndexValidation result = {}; - if (stream_index == nil_stream_index) - { - result = PDB_STREAM_INDEX_VALIDATION_NULL; - } - else if (stream_index >= pdb.stream_count) - { - result = PDB_STREAM_INDEX_VALIDATION_OUT_OF_BOUNDS; - } - - return result; -} - -fn u32 pdb_get_stream_size(PDBFile pdb, u32 index) -{ - auto stream_size = pdb.stream_sizes[index]; - - u32 result = 0; - if (likely(stream_size != nil_page_size)) - { - result = stream_size; - } - - return result; -} - -fn PDBStreamCreate pdb_setup_stream_creation(PDBFile pdb, u32 stream_index) -{ - if (pdb_validate_stream_index(pdb, stream_index) != PDB_STREAM_INDEX_VALIDATION_SUCCESS) - { - failed_execution(); - } - - return (PDBStreamCreate) - { - .data = pdb.content.pointer, - .block_size = pdb.header->block_size, - .block_indices = pdb.stream_blocks[stream_index], - .size = pdb_get_stream_size(pdb, stream_index), - }; -} - -fn PDBCoalescedMSFStream pdb_coalesced_msf_stream(PDBStreamCreate create) -{ - PDBCoalescedMSFStream result = {}; - - if (pdb_are_block_indices_contiguous_ex(create.block_indices, create.block_size, create.size)) - { - auto index = create.block_indices[0]; - auto file_offset = pdb_block_index_to_file_offset(index, create.block_size); - print("Creating stream from block #{u32}, file offset 0x{u64:x}\n", index, file_offset); - result.data = create.data + file_offset; - result.size = create.size; - } - else - { - todo(); - // VirtualBuffer(u8) bytes = {}; - // vb_ensure_capacity(&bytes, stream_size); - // bytes.length += stream_size; - // - // u32 full_block_count = stream_size / block_size; - // auto* destination = data; - // - // for (u32 i = 0; i < full_block_count; i += 1) - // { - // auto index = block_indices[i]; - // auto file_offset = pdb_block_index_to_file_offset(index, block_size); - // memcpy(destination, data + file_offset, block_size); - // - // destination += block_size; - // } - // - // auto remaining_bytes = stream_size - (full_block_count * block_size); - // if (remaining_bytes != 0) - // { - // auto index = block_indices[full_block_count]; - // auto file_offset = pdb_block_index_to_file_offset(index, block_size); - // memcpy(destination, data + file_offset, remaining_bytes); - // } - // - // result.data = bytes.pointer; - } - - return result; -} - -fn u32 pdb_direct_msf_stream_block_size_log_2(PDBDirectMSFStream stream) -{ - return first_bit_set_32(stream.block_size); -} - -STRUCT(PDBIndexAndOffset) -{ - u32 index; - u32 offset_within_block; -}; - -fn PDBIndexAndOffset pdb_direct_msf_stream_block_index_for_offset(PDBDirectMSFStream stream, u32 offset) -{ - auto block_size_log2 = pdb_direct_msf_stream_block_size_log_2(stream); - u32 block_index = offset >> block_size_log2; - u32 offset_within_block = offset & (stream.block_size - 1); - - return (PDBIndexAndOffset) { - .index = block_index, - .offset_within_block = offset_within_block, - }; -} - -fn u64 pdb_direct_msf_stream_data_offset_for_index_and_offset(PDBDirectMSFStream stream, PDBIndexAndOffset index_and_offset) -{ - auto block_size_log2 = pdb_direct_msf_stream_block_size_log_2(stream); - auto offset_within_data = ((u64)(stream.block_indices[index_and_offset.index]) << block_size_log2) + index_and_offset.offset_within_block; - return offset_within_data; -} - -fn PDBCoalescedMSFStream pdb_coalesced_msf_stream_from_direct(PDBDirectMSFStream direct, u64 size, u32 offset) -{ - PDBCoalescedMSFStream result = {}; - result.size = size; - - auto index_and_offset = pdb_direct_msf_stream_block_index_for_offset(direct, offset); - - auto block_count = pdb_size_to_block_count(index_and_offset.offset_within_block + size, direct.block_size); - if (pdb_are_block_indices_contiguous((Slice(u32)) { direct.block_indices + index_and_offset.index, block_count })) - { - auto offset_within_data = pdb_direct_msf_stream_data_offset_for_index_and_offset(direct, index_and_offset); - result.data = direct.data + offset_within_data; - } - else - { - todo(); - } - - return result; -} - - -typedef enum PDBValidationResult -{ - PDB_VALIDATION_SUCCESS, - PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCK, - PDB_VALIDATION_BAD_SIGNATURE, - PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCKS, - PDB_VALIDATION_BAD_FREE_BLOCK_MAP_INDEX, -} PDBValidationResult; - -#define pdb_magic_literal "Microsoft C/C++ MSF 7.00\r\n\x1a" "DS\x00\x00\x00" -u8 pdb_magic[32] = pdb_magic_literal; - -fn PDBValidationResult pdb_validate(String pdb) -{ - PDBValidationResult result = {}; - assert(pdb.pointer); - assert(pdb.length); - if (pdb.length < sizeof(PDBHeader)) - { - result = PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCK; - } - else - { - auto* header = (PDBHeader*)pdb.pointer; - - if (memcmp(header->magic, pdb_magic, sizeof(header->magic)) != 0) - { - result = PDB_VALIDATION_BAD_SIGNATURE; - } - else if (pdb.length < header->block_count * header->block_size) - { - result = PDB_VALIDATION_SIZE_CANNOT_CONTAIN_BLOCKS; - } - else if (header->free_block_map_index != 1 && header->free_block_map_index != 2) - { - result = PDB_VALIDATION_BAD_FREE_BLOCK_MAP_INDEX; - } - } - - return result; -} - -fn PDBDirectMSFStream pdb_direct_msf_stream_create(PDBStreamCreate create) -{ - if (!is_power_of_two(create.block_size)) - { - failed_execution(); - } - - return create; -} - -fn void pdb_direct_msf_stream_read_at_offset(PDBDirectMSFStream stream, String buffer, u64 offset) -{ - assert(buffer.pointer); - assert(buffer.length); - assert(offset + buffer.length <= stream.size); - - auto block_size_log2 = pdb_direct_msf_stream_block_size_log_2(stream); - auto block_index = offset >> block_size_log2; - auto offset_within_block = offset & (stream.block_size - 1); - - auto offset_within_data = (u64)(stream.block_indices[block_index] << block_size_log2) + offset_within_block; - auto bytes_left_in_block = stream.block_size - offset_within_block; - - if (bytes_left_in_block >= buffer.length) - { - memcpy(buffer.pointer, stream.data + offset_within_data, buffer.length); - } - else - { - todo(); - } -} - -typedef enum PDBDBIVersion : u32 -{ - PDB_DBI_VERSION_VC41 = 930803, - PDB_DBI_VERSION_V50 = 19960307, - PDB_DBI_VERSION_V60 = 19970606, - PDB_DBI_VERSION_V70 = 19990903, - PDB_DBI_VERSION_V110 = 20091201, -} PDBDBIVersion; - -STRUCT(PDBDBIStreamHeader) -{ - u32 signature; - PDBDBIVersion version; - u32 age; - u16 global_stream_index; - u16 toolchain; - u16 public_stream_index; - u16 pdb_dll_version; - u16 symbol_record_stream_index; - u16 pdb_dll_rbld; - u32 module_info_size; - u32 section_contribution_size; - u32 section_map_size; - u32 source_info_size; - u32 type_server_map_size; - u32 mcf_type_server_index; - u32 optional_debug_header_size; - u32 ec_size; - u16 flags; - u16 machine; - u32 padding; -}; - -global_variable const u32 dbi_stream_header_signature = 0xffffffff; - -STRUCT(PDBDBIStream) -{ - PDBDirectMSFStream stream; - PDBDBIStreamHeader header; -}; - -fn PDBDBIStream pdb_dbi_stream_create(PDBFile pdb) -{ - PDBDBIStream result = {}; - result.stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, dbi_stream_index)); - - if (result.stream.size < sizeof(PDBDBIStreamHeader)) - { - failed_execution(); - } - - pdb_direct_msf_stream_read_at_offset(result.stream, scalar_to_bytes(result.header), 0); - - if (result.header.signature != dbi_stream_header_signature) - { - failed_execution(); - } - else if (result.header.version != PDB_DBI_VERSION_V70) - { - failed_execution(); - } - - return result; -} - -typedef enum PDBStreamVersion : u32 -{ - PDB_STREAM_VERSION_VC2 = 19941610, - PDB_STREAM_VERSION_VC4 = 19950623, - PDB_STREAM_VERSION_VC41 = 19950814, - PDB_STREAM_VERSION_VC50 = 19960307, - PDB_STREAM_VERSION_VC98 = 19970604, - PDB_STREAM_VERSION_VC70Dep = 19990604, - PDB_STREAM_VERSION_VC70 = 20000404, - PDB_STREAM_VERSION_VC80 = 20030901, - PDB_STREAM_VERSION_VC110 = 20091201, - PDB_STREAM_VERSION_VC140 = 20140508, -} PDBStreamVersion; - -STRUCT(PDBStreamHeader) -{ - PDBStreamVersion version; - u32 signature; - u32 age; - COFFGUID guid; -}; - -STRUCT(PDBNamedStreamMap) -{ - u32 length; - u8 string_table[]; -}; - -STRUCT(PDBNamedStreamMapEntry) -{ - u32 offset; - u32 stream_index; -}; - -STRUCT(PDBSerializedHashTableHeader) -{ - u32 length; - u32 capacity; -}; - -STRUCT(PDBSerializedHashTableBitArray) -{ - u32 word_count; - u32 words[]; -}; - -typedef enum PDBFeatureCode : u32 -{ - PDB_FEATURE_CODE_VC110 = 20091201, - PDB_FEATURE_CODE_VC140 = 20140508, - // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/include/pdbcommon.h#L23 - PDB_FEATURE_CODE_NO_TYPE_MERGE = 0x4D544F4E, // "NOTM" - PDB_FEATURE_CODE_MINIMAL_DEBUG_INFO = 0x494E494D // "MINI", i.e. executable was linked with /DEBUG:FASTLINK -} PDBFeatureCode; - -STRUCT(PDBInfoStream) -{ - PDBStreamHeader* header; - u8 uses_debug_fast_link; -}; - -fn PDBInfoStream pdb_info_stream_create(PDBFile pdb) -{ - PDBInfoStream result = {}; - - auto stream = pdb_coalesced_msf_stream(pdb_setup_stream_creation(pdb, info_stream_index)); - result.header = (PDBStreamHeader*)stream.data; - u32 names_stream_index = 0; - - u64 stream_offset = sizeof(PDBStreamHeader); - auto* named_stream_map = (PDBNamedStreamMap*)(stream.data + stream_offset); - stream_offset += sizeof(*named_stream_map) + named_stream_map->length; - - auto* serialized_hash_table_header = (PDBSerializedHashTableHeader*)(stream.data + stream_offset); - stream_offset += sizeof(*serialized_hash_table_header); - - auto* present_bit_array = (PDBSerializedHashTableBitArray*)(stream.data + stream_offset); - stream_offset += sizeof(*present_bit_array) + present_bit_array->word_count * sizeof(present_bit_array->words[0]); - - auto* deleted_bit_array = (PDBSerializedHashTableBitArray*)(stream.data + stream_offset); - stream_offset += sizeof(*deleted_bit_array) + deleted_bit_array->word_count * sizeof(deleted_bit_array->words[0]); - - auto* named_stream_map_entries = (PDBNamedStreamMapEntry*)(stream.data + stream_offset); - - for (u32 i = 0, length = serialized_hash_table_header->length; i < length; i += 1) - { - auto* entry = &named_stream_map_entries[i]; - auto stream_name = cstr(&named_stream_map->string_table[entry->offset]); - - if (s_equal(strlit("/names"), stream_name)) - { - names_stream_index = entry->stream_index; - break; - } - } - - stream_offset += sizeof(named_stream_map_entries[0]) * serialized_hash_table_header->length; - - auto* feature_codes = (PDBFeatureCode*)(stream.data + stream_offset); - auto remaining_bytes = stream.size - stream_offset; - auto count = remaining_bytes / sizeof(feature_codes[0]); - - for (u32 i = 0; i < count; i += 1) - { - if (feature_codes[i] == PDB_FEATURE_CODE_MINIMAL_DEBUG_INFO) - { - result.uses_debug_fast_link = 1; - break; - } - } - - return result; -} - -STRUCT(PDBPublicStreamHeader) -{ - u32 symbol_hash; - u32 address_map; - u32 thunk_count; - u32 thunk_size; - u16 isect_thunk_table; - u16 padding; - u32 offset_thunk_table; - u16 section_count; - u16 padding2; -}; - -STRUCT(PDBHashTableHeader) -{ - u32 signature; - u32 version; - u32 size; - u32 bucket_count; -}; - -global_variable const u32 pdb_hash_table_signature = 0xffffffff; -global_variable const u32 pdb_hash_table_version = 0xeffe0000 + 19990810; - -typedef enum PDBSectionContributionVersion : u32 -{ - PDB_SECTION_CONTRIBUTION_V60 = 0xeffe0000 + 19970605, - PDB_SECTION_CONTRIBUTION_V2 = 0xeffe0000 + 20140516, -} PDBSectionContributionVersion; - -STRUCT(PDBSectionContribution) -{ - u16 section; - u16 padding; - u32 offset; - u32 size; - u32 characteristics; - u16 module_index; - u16 padding2; - u32 data_crc; - u32 relocation_crc; -}; - -fn u32 pdb_module_info_substream_offset() -{ - return sizeof(PDBDBIStreamHeader); -} - -fn u32 pdb_section_contribution_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_module_info_substream_offset() + header.module_info_size; -} - -fn u32 pdb_section_map_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_section_contribution_substream_offset(header) + header.section_contribution_size; -} - -fn u32 pdb_source_info_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_section_map_substream_offset(header) + header.section_map_size; -} - -fn u32 pdb_type_server_map_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_source_info_substream_offset(header) + header.source_info_size; -} - -fn u32 pdb_ec_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_type_server_map_substream_offset(header) + header.type_server_map_size; -} - -fn u32 pdb_debug_header_substream_offset(PDBDBIStreamHeader header) -{ - return pdb_ec_substream_offset(header) + header.ec_size; -} - -STRUCT(PDBDebugHeader) -{ - u16 fpo_data_stream_index; - u16 exception_data_stream_index; - u16 fixup_data_stream_index; - u16 omap_to_src_data_stream_index; - u16 omap_from_src_data_stream_index; - u16 section_header_stream_index; - u16 token_data_stream_index; - u16 xdata_stream_index; - u16 pdata_stream_index; - u16 new_fpo_data_stream_index; - u16 original_section_header_data_stream_index; -}; - -typedef enum TPIStreamVersion : u32 -{ - TPI_STREAM_V40 = 19950410, - TPI_STREAM_V41 = 19951122, - TPI_STREAM_V50 = 19961031, - TPI_STREAM_V70 = 19990903, - TPI_STREAM_V80 = 20040203, -} TPIStreamVersion; - -STRUCT(TPIStreamHeader) -{ - TPIStreamVersion version; - u32 header_size; - u32 type_index_begin; - u32 type_index_end; - u32 type_record_bytes; - u16 hash_stream_index; - u16 hash_aux_stream_index; - u32 hash_key_size; - u32 hash_bucket_count; - s32 hash_value_buffer_offset; - u32 hash_value_buffer_length; - s32 index_offset_buffer_offset; - u32 index_offset_buffer_length; - s32 hash_adj_buffer_offset; - u32 hash_adj_buffer_length; -}; - -typedef enum CodeviewBasicType : u8 -{ - CODEVIEW_BASIC_TYPE_NONE = 0x00, - CODEVIEW_BASIC_TYPE_ABS = 0x01, - CODEVIEW_BASIC_TYPE_SEGMENT = 0x02, - CODEVIEW_BASIC_TYPE_VOID = 0x03, - CODEVIEW_BASIC_TYPE_CURRENT = 0x04, - CODEVIEW_BASIC_TYPE_NBASICSTR = 0x05, - CODEVIEW_BASIC_TYPE_FBASICSTR = 0x06, - CODEVIEW_BASIC_TYPE_NOTTRANS = 0x07, - CODEVIEW_BASIC_TYPE_HRESULT = 0x08, - CODEVIEW_BASIC_TYPE_CHAR = 0x10, - CODEVIEW_BASIC_TYPE_SHORT = 0x11, - CODEVIEW_BASIC_TYPE_LONG = 0x12, - CODEVIEW_BASIC_TYPE_QUAD = 0x13, - CODEVIEW_BASIC_TYPE_OCT = 0x14, - CODEVIEW_BASIC_TYPE_UCHAR = 0x20, - CODEVIEW_BASIC_TYPE_USHORT = 0x21, - CODEVIEW_BASIC_TYPE_ULONG = 0x22, - CODEVIEW_BASIC_TYPE_UQUAD = 0x23, - CODEVIEW_BASIC_TYPE_UOCT = 0x24, - CODEVIEW_BASIC_TYPE_BOOL8 = 0x30, - CODEVIEW_BASIC_TYPE_BOOL16 = 0x31, - CODEVIEW_BASIC_TYPE_BOOL32 = 0x32, - CODEVIEW_BASIC_TYPE_BOOL64 = 0x33, - CODEVIEW_BASIC_TYPE_FLOAT32 = 0x40, - CODEVIEW_BASIC_TYPE_FLOAT64 = 0x41, - CODEVIEW_BASIC_TYPE_FLOAT80 = 0x42, - CODEVIEW_BASIC_TYPE_FLOAT128 = 0x43, - CODEVIEW_BASIC_TYPE_FLOAT48 = 0x44, - CODEVIEW_BASIC_TYPE_FLOAT32PP = 0x45, - CODEVIEW_BASIC_TYPE_FLOAT16 = 0x46, - CODEVIEW_BASIC_TYPE_COMPLEX32 = 0x50, - CODEVIEW_BASIC_TYPE_COMPLEX64 = 0x51, - CODEVIEW_BASIC_TYPE_COMPLEX80 = 0x52, - CODEVIEW_BASIC_TYPE_COMPLEX128 = 0x53, - CODEVIEW_BASIC_TYPE_BIT = 0x60, - CODEVIEW_BASIC_TYPE_PASCHAR = 0x61, - CODEVIEW_BASIC_TYPE_BOOL32F = 0x62, - CODEVIEW_BASIC_TYPE_INT8 = 0x68, - CODEVIEW_BASIC_TYPE_UINT8 = 0x69, - CODEVIEW_BASIC_TYPE_RCHAR = 0x70, - CODEVIEW_BASIC_TYPE_WCHAR = 0x71, - CODEVIEW_BASIC_TYPE_INT16 = 0x72, - CODEVIEW_BASIC_TYPE_UINT16 = 0x73, - CODEVIEW_BASIC_TYPE_INT32 = 0x74, - CODEVIEW_BASIC_TYPE_UINT32 = 0x75, - CODEVIEW_BASIC_TYPE_INT64 = 0x76, - CODEVIEW_BASIC_TYPE_UINT64 = 0x77, - CODEVIEW_BASIC_TYPE_INT128 = 0x78, - CODEVIEW_BASIC_TYPE_UINT128 = 0x79, - CODEVIEW_BASIC_TYPE_CHAR16 = 0x7a, - CODEVIEW_BASIC_TYPE_CHAR32 = 0x7b, - CODEVIEW_BASIC_TYPE_CHAR8 = 0x7c, - CODEVIEW_BASIC_TYPE_PTR = 0xf0, -} CodeviewBasicType; - -STRUCT(PDBStreamDescriptor) -{ - String name; - u32 size; -}; - -fn void print_sep() -{ - print("=====================\n"); -} - -STRUCT(PDBModuleInfo) -{ - u32 unused; - PDBSectionContribution section_contribution; - u16 flags; - u16 module_symbol_stream_index; - u32 symbol_size; - u32 c11_size; - u32 c13_size; - u16 source_file_count; - u16 padding; - u32 unused2; - u32 source_file_name_index; - u32 pdb_file_path_name_index; -}; - -fn u64 pdb_estimate_module_count(u64 stream_size) -{ - return stream_size / sizeof(PDBModuleInfo); -} - -fn void pdb_print_sizes(PDBFile pdb, PDBDBIStream dbi) -{ - print("General\n"); - print_sep(); - - { - print("PDB page size (block size): 0x{u32:x}\n", pdb.header->block_size); - print("PDB block count: {u32}\n", pdb.header->block_count); - - auto raw_size = (u64)(pdb.header->block_size) * pdb.header->block_count; - print("Raw size: {u64}, 0x{u64:x} bytes\n", raw_size, raw_size); - } - - print("\n"); - print("Size of known streams\n"); - print_sep(); - - { - auto stream_count = pdb.stream_count; - assert(stream_count > 4); - auto tpi_stream_size = pdb_get_stream_size(pdb, tpi_stream_index); - auto dbi_stream_size = pdb_get_stream_size(pdb, dbi_stream_index); - auto ipi_stream_size = pdb_get_stream_size(pdb, ipi_stream_index); - - auto global_symbol_stream_size = pdb_get_stream_size(pdb, dbi.header.global_stream_index); - auto public_symbol_stream_size = pdb_get_stream_size(pdb, dbi.header.public_stream_index); - auto symbol_record_stream_size = pdb_get_stream_size(pdb, dbi.header.symbol_record_stream_index); - } - - { - auto stream_size = dbi.header.module_info_size; - auto stream = pdb_coalesced_msf_stream_from_direct(dbi.stream, stream_size, pdb_module_info_substream_offset()); - auto estimated_module_count = pdb_estimate_module_count(pdb_module_info_substream_offset()); - - u64 stream_offset = 0; - - while (stream_offset < stream_size) - { - auto* module_info = (PDBModuleInfo*)(stream.data + stream_offset); - stream_offset += sizeof(*module_info); - - auto name = cstr(stream.data + stream_offset); - stream_offset += name.length + 1; - - auto object_name = cstr(stream.data + stream_offset); - stream_offset += object_name.length + 1; - print("Module \"{s}\": \"{s}\"\n", name, object_name); - - stream_offset = align_forward(stream_offset, 4); - } - } -} - -fn void pdb_playground(Thread* thread) -{ - PDBFile pdb = {}; - print("PDB image: {u64}\n", (u64)array_length(pdb_image)); - - pdb.content = (String)array_to_slice(pdb_image); - - if (pdb_validate(pdb.content) != PDB_VALIDATION_SUCCESS) - { - failed_execution(); - } - - pdb.header = (PDBHeader*)(pdb.content.pointer + 0); - auto directory_block_count = pdb_size_to_block_count(pdb.header->directory_size, pdb.header->block_size); - print("Directory block count: {u32}\n", directory_block_count); - - print("Creating directory indices stream...\n"); - auto directory_indices_stream = pdb_coalesced_msf_stream((PDBStreamCreate){ - .data = pdb.content.pointer, - .block_size = pdb.header->block_size, - .block_indices = pdb.header->directory_block_indices, - .size = directory_block_count * sizeof(u32), - }); - auto* directory_indices = (u32*)directory_indices_stream.data; - - print("Creating directory stream...\n"); - pdb.directory_stream = pdb_coalesced_msf_stream((PDBStreamCreate) { - .data = pdb.content.pointer, - .block_size = pdb.header->block_size, - .block_indices = directory_indices, - .size = pdb.header->directory_size, - }); - - pdb.stream_count = *(u32*)(pdb.directory_stream.data + 0); - pdb.stream_sizes = (u32*)(pdb.directory_stream.data + sizeof(u32)); - print("Stream count: {u32}\n", pdb.stream_count); - auto* directory_stream_blocks = (u32*)(pdb.directory_stream.data + (sizeof(u32) + (sizeof(u32) * pdb.stream_count))); - - { - VirtualBufferP(u32) stream_blocks = {}; - vb_ensure_capacity(&stream_blocks, pdb.stream_count); - pdb.stream_blocks = stream_blocks.pointer; - } - - auto* indices_for_current_block = directory_stream_blocks; - for (u32 i = 0; i < pdb.stream_count; i += 1) - { - auto byte_size = pdb_get_stream_size(pdb, i); - auto block_count = pdb_size_to_block_count(byte_size, pdb.header->block_size); - - pdb.stream_blocks[i] = indices_for_current_block; - print("Stream #{u32} 0x{u32} bytes ({u32} blocks)\n", i, byte_size, block_count); - - indices_for_current_block += block_count; - } - - auto dbi = pdb_dbi_stream_create(pdb); - auto info_stream = pdb_info_stream_create(pdb); - if (info_stream.uses_debug_fast_link) - { - failed_execution(); - } - - // Symbol record stream validation - if (dbi.header.symbol_record_stream_index == nil_stream_index) - { - failed_execution(); - } - - // Public stream validation - if (dbi.header.public_stream_index == nil_stream_index) - { - failed_execution(); - } - - auto public_stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, dbi.header.public_stream_index)); - { - PDBHashTableHeader hash_header; - pdb_direct_msf_stream_read_at_offset(public_stream, scalar_to_bytes(hash_header), sizeof(PDBPublicStreamHeader)); - - if (hash_header.signature != pdb_hash_table_signature) - { - failed_execution(); - } - - if (hash_header.version != pdb_hash_table_version) - { - failed_execution(); - } - } - - // Global stream validation - if (dbi.header.global_stream_index == nil_stream_index) - { - failed_execution(); - } - - auto global_stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, dbi.header.global_stream_index)); - { - PDBHashTableHeader hash_header; - pdb_direct_msf_stream_read_at_offset(global_stream, scalar_to_bytes(hash_header), 0); - - if (hash_header.signature != pdb_hash_table_signature) - { - failed_execution(); - } - - if (hash_header.version != pdb_hash_table_version) - { - failed_execution(); - } - } - - if (dbi.header.section_contribution_size < sizeof(PDBSectionContributionVersion)) - { - failed_execution(); - } - - auto stream_offset = pdb_section_contribution_substream_offset(dbi.header); - - PDBSectionContributionVersion version; - pdb_direct_msf_stream_read_at_offset(dbi.stream, scalar_to_bytes(version), stream_offset); - - if (version != PDB_SECTION_CONTRIBUTION_V60) - { - failed_execution(); - } - - if (dbi.header.optional_debug_header_size == 0) - { - failed_execution(); - } - - auto debug_header_offset = pdb_debug_header_substream_offset(dbi.header); - - PDBDebugHeader debug_header; - pdb_direct_msf_stream_read_at_offset(dbi.stream, scalar_to_bytes(debug_header), debug_header_offset); - - if (debug_header.section_header_stream_index == nil_stream_index) - { - failed_execution(); - } - - auto tpi_stream = pdb_direct_msf_stream_create(pdb_setup_stream_creation(pdb, tpi_stream_index)); - - TPIStreamHeader header; - pdb_direct_msf_stream_read_at_offset(tpi_stream, scalar_to_bytes(header), 0); - - if (header.version != TPI_STREAM_V80) - { - failed_execution(); - } - - pdb_print_sizes(pdb, dbi); - -// STRUCT(PDBHeader) -// { -// u8 magic[32]; -// u32 block_size; -// u32 free_block_map_index; -// u32 block_count; -// u32 directory_size; -// u32 reserved; -// u32 directory_block_indices[]; -// }; - - // VirtualBuffer(u8) pdb = {}; - // auto* header = vb_add_scalar(&pdb, PDBHeader); - // *header = (PDBHeader) { - // .magic = "Microsoft C/C++ MSF 7.00\r\n\x1a" "DS\x00\x00\x00", - // .block_size = page_size, - // .free_block_map_index = 1, - // .block_count = 35, - // .directory_size = 184, - // .reserved = 0, - // }; - // - // vb_align(&pdb, page_size); -} - - -fn String pdb_build(Thread* thread) -{ - pdb_playground(thread); - - const u32 block_size = 0x1000; - VirtualBuffer(u8) pdb_file = {}; - - // First block - { - auto header = (PDBHeader) { - .magic = pdb_magic_literal, - .block_size = page_size, - .free_block_map_index = 1, - .block_count = 35, - .directory_size = 184, - .reserved = 0, - }; - vb_copy_scalar(&pdb_file, header); - - auto directory_block_count = pdb_size_to_block_count(header.directory_size, header.block_size); - assert(directory_block_count == 1); - u32 directory_block_indices[] = { 0x1d }; - vb_copy_any_array(&pdb_file, directory_block_indices); - - vb_align(&pdb_file, block_size); - } - - u8 rest_of_chunks[] = { - 0x78, 0x00, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0xFF, 0xE7, 0x2E, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, - 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, - 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, - 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, - 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, - 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, 0x07, 0x00, 0x00, 0x00, - 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x3D, 0x11, 0x00, 0x63, 0x77, 0x64, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, - 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, - 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, - 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, - 0x3A, 0x00, 0x3C, 0x11, 0x00, 0x40, 0x00, 0x00, 0xD0, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4F, 0x70, 0x74, 0x69, 0x6D, 0x69, 0x7A, 0x69, - 0x6E, 0x67, 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x65, 0x72, 0x00, 0x2E, 0x00, 0x10, 0x11, - 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x12, 0x10, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x39, 0x11, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x4C, 0x11, 0x10, 0x10, 0x00, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x80, - 0xF4, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x03, 0x2C, 0x8A, - 0x49, 0x32, 0x20, 0x5B, 0x4D, 0x41, 0xA0, 0x3A, 0x81, 0x12, 0xE6, 0xF9, 0x5D, 0x5A, 0x33, 0x70, - 0x44, 0xA3, 0x93, 0x51, 0x1E, 0x17, 0xA3, 0x32, 0x4E, 0xA9, 0x6E, 0x80, 0x1C, 0xCE, 0x00, 0x00, - 0x91, 0x00, 0x00, 0x00, 0x20, 0x03, 0x6A, 0x10, 0xE9, 0xF0, 0x50, 0x5B, 0x89, 0x6D, 0x35, 0x6D, - 0x98, 0x6D, 0x67, 0x1C, 0x93, 0x9B, 0x7F, 0xB0, 0x60, 0x20, 0x12, 0xE4, 0x63, 0x31, 0x4F, 0xF7, - 0xBF, 0xD0, 0x18, 0x2A, 0x86, 0x1F, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x20, 0x03, 0xDD, 0xB4, - 0xF8, 0xA4, 0xB4, 0xA7, 0xB3, 0x0D, 0x4F, 0xF1, 0x59, 0x39, 0x41, 0xF5, 0x92, 0x79, 0x60, 0x6C, - 0x76, 0xB6, 0xD9, 0x58, 0xEB, 0x4C, 0x30, 0xEC, 0xC7, 0xDC, 0xA0, 0x1D, 0x9F, 0x07, 0x00, 0x00, - 0x25, 0x01, 0x00, 0x00, 0x20, 0x03, 0xC7, 0x6A, 0xB8, 0xA5, 0x63, 0x1A, 0x32, 0x3E, 0xB0, 0xB1, - 0x9D, 0xEE, 0x4B, 0xDA, 0xD1, 0xC5, 0xF7, 0x5D, 0xB1, 0x3C, 0x2D, 0xF4, 0x9A, 0x22, 0x91, 0x77, - 0x66, 0xFE, 0xD8, 0x5B, 0x3F, 0x41, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x20, 0x03, 0xE0, 0xF9, - 0x9E, 0x5F, 0x43, 0x19, 0x42, 0x63, 0x25, 0xDD, 0xBF, 0x4A, 0x6D, 0x4E, 0x23, 0x29, 0x8E, 0xED, - 0x9B, 0x08, 0x06, 0xEF, 0x49, 0xED, 0x6C, 0x95, 0xAD, 0x9D, 0xEC, 0xE7, 0x0D, 0x82, 0x00, 0x00, - 0xBE, 0x01, 0x00, 0x00, 0x20, 0x03, 0x36, 0xFD, 0x04, 0xBA, 0x37, 0xAA, 0xCF, 0x40, 0x4C, 0xB8, - 0x2E, 0xFF, 0xB9, 0xA3, 0x86, 0x34, 0xB5, 0x02, 0x99, 0x6F, 0x07, 0x9A, 0x01, 0x21, 0xAE, 0xEA, - 0x51, 0x91, 0xF5, 0xF4, 0x24, 0xFB, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x20, 0x03, 0x79, 0x6B, - 0x22, 0x26, 0x80, 0x97, 0x90, 0x07, 0x89, 0x84, 0xB9, 0x19, 0x54, 0x2D, 0x81, 0x8C, 0xE7, 0x41, - 0x90, 0xD2, 0x11, 0x0B, 0x11, 0x9F, 0x93, 0xC2, 0xA7, 0xC3, 0x88, 0x2B, 0x5D, 0xE5, 0x00, 0x00, - 0x52, 0x02, 0x00, 0x00, 0x20, 0x03, 0x8D, 0x76, 0x13, 0x5F, 0xF4, 0x01, 0x40, 0xC6, 0xD6, 0x4A, - 0x09, 0xD1, 0x73, 0xE1, 0x27, 0x6F, 0xEF, 0xB9, 0x6A, 0x2D, 0xB9, 0x07, 0x3B, 0x5A, 0xB2, 0x6F, - 0x25, 0x0C, 0x47, 0x33, 0xF9, 0x99, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0x20, 0x03, 0x18, 0xCA, - 0x52, 0x04, 0x16, 0x57, 0x91, 0x83, 0xBC, 0x36, 0x9C, 0x0A, 0x8E, 0x55, 0x59, 0x14, 0xDB, 0x5C, - 0x75, 0x77, 0x07, 0x5B, 0x93, 0x59, 0x17, 0x3F, 0xC6, 0xBC, 0x45, 0x59, 0x55, 0x60, 0x00, 0x00, - 0xF0, 0x02, 0x00, 0x00, 0x20, 0x03, 0x27, 0x90, 0x4E, 0x90, 0x09, 0x38, 0x74, 0x9C, 0x12, 0xA4, - 0xD1, 0xE7, 0x41, 0xAF, 0xD5, 0x64, 0x19, 0x8A, 0x57, 0xA2, 0x47, 0x24, 0xC1, 0xDD, 0xD3, 0x6C, - 0xD3, 0x30, 0x22, 0x24, 0xDF, 0x26, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x20, 0x03, 0xF2, 0xE0, - 0x91, 0x84, 0x1C, 0x3E, 0xFE, 0x2F, 0x18, 0x7F, 0xE7, 0x03, 0xA0, 0xF5, 0x62, 0xCC, 0xE6, 0x54, - 0xCA, 0x82, 0xE6, 0x8C, 0x34, 0x36, 0x98, 0xB0, 0x6E, 0xC6, 0x7F, 0x9B, 0xA0, 0x39, 0x00, 0x00, - 0x90, 0x03, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x4E, 0x8D, 0xF9, 0x6F, 0x05, 0x7F, 0xDE, 0xBC, 0x04, - 0x74, 0xBD, 0x76, 0x5C, 0xEE, 0x3A, 0xE1, 0x7D, 0xE3, 0x4A, 0x2B, 0x1F, 0xC9, 0xD1, 0x97, 0x59, - 0x73, 0x21, 0xF2, 0xD1, 0xE4, 0x47, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x20, 0x03, 0x72, 0x95, - 0x69, 0x9A, 0x85, 0xD8, 0x9A, 0xC3, 0x8B, 0xF0, 0xC3, 0xC2, 0xBB, 0x13, 0xCE, 0xBB, 0x7D, 0xE9, - 0x23, 0x8A, 0xEF, 0x87, 0x89, 0x6F, 0xF8, 0xD1, 0xC7, 0x80, 0x96, 0xE9, 0x70, 0x91, 0x00, 0x00, - 0xFB, 0x03, 0x00, 0x00, 0x20, 0x03, 0xDE, 0xE2, 0x7F, 0x27, 0x12, 0xB9, 0xE7, 0x2C, 0xA7, 0x8A, - 0x40, 0x48, 0x34, 0x73, 0x53, 0x03, 0xD1, 0x6B, 0xDB, 0x21, 0xC8, 0xAA, 0x3A, 0xDD, 0xAC, 0xA7, - 0xDB, 0xCA, 0x22, 0x66, 0x45, 0x29, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x20, 0x03, 0xD0, 0x71, - 0x10, 0xE7, 0xF7, 0x98, 0x9A, 0xEE, 0xF7, 0xEE, 0xD7, 0x7D, 0x5F, 0x58, 0x4F, 0x3E, 0xE6, 0x0F, - 0xF2, 0xCE, 0x58, 0xBC, 0x1A, 0x37, 0x4D, 0x70, 0x15, 0x1A, 0x18, 0xB4, 0xA6, 0x64, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x74, 0x12, 0xDF, 0x50, 0x2F, 0xB6, 0xEA, 0x39, 0x0C, - 0x96, 0xD7, 0xC9, 0xF8, 0x05, 0xA2, 0xA2, 0x11, 0x60, 0x9B, 0x95, 0xB8, 0xFD, 0xB4, 0x74, 0x05, - 0x40, 0xF7, 0x89, 0xD9, 0xC4, 0xCE, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x20, 0x03, 0x83, 0x18, - 0x07, 0x66, 0x77, 0xFB, 0xA2, 0x76, 0xE4, 0x94, 0xED, 0xC3, 0x9A, 0xAA, 0xC1, 0x1F, 0xBD, 0x9B, - 0xC6, 0x1C, 0xA2, 0xD3, 0x6B, 0xB6, 0x8B, 0xDC, 0xCC, 0xD2, 0x60, 0xEC, 0xE9, 0x77, 0x00, 0x00, - 0x2C, 0x05, 0x00, 0x00, 0x20, 0x03, 0xFB, 0x3A, 0xAE, 0xEF, 0x32, 0x4B, 0x5D, 0x00, 0xCE, 0x0A, - 0x6A, 0xE1, 0x17, 0x02, 0xDC, 0xC3, 0xC1, 0xDE, 0x65, 0xFA, 0x0A, 0x10, 0xCA, 0xAA, 0xB4, 0x33, - 0x6B, 0x97, 0xD3, 0xAD, 0xF4, 0x93, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x20, 0x03, 0xA5, 0x0D, - 0x0E, 0xF5, 0xCF, 0xE9, 0x6D, 0x63, 0x4A, 0x41, 0xEE, 0x9A, 0x97, 0x74, 0x9C, 0x14, 0x71, 0x65, - 0xF8, 0x65, 0x6C, 0xDF, 0xED, 0x5D, 0xF5, 0x3B, 0xC2, 0x4C, 0x8A, 0xDB, 0x12, 0x10, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x3F, 0x65, 0x9F, 0x98, 0xB3, 0xF1, 0x74, 0x8A, 0x31, - 0x4B, 0xD6, 0x41, 0x06, 0x58, 0x3D, 0x01, 0x64, 0x93, 0x33, 0xE0, 0x41, 0x9B, 0x66, 0x23, 0x2B, - 0x4F, 0x64, 0xB3, 0xF8, 0x5B, 0x0C, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x84, - 0xE2, 0x06, 0x81, 0xFD, 0x3D, 0xE7, 0x3C, 0xE1, 0x4A, 0xB0, 0x9D, 0x75, 0x9D, 0x5B, 0x4F, 0xAF, - 0x03, 0xF7, 0xD6, 0x6A, 0x78, 0x60, 0x2D, 0xA2, 0xAC, 0x92, 0x34, 0xB2, 0x4D, 0xF4, 0x00, 0x00, - 0x59, 0x06, 0x00, 0x00, 0x20, 0x03, 0xB0, 0x52, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x36, 0xD0, 0xC1, 0x0D, 0x2A, 0x7E, 0x10, 0x9D, 0x7F, 0xD1, 0xA7, 0x26, 0x59, 0x81, 0xCB, 0xB6, - 0xAD, 0x11, 0xB8, 0xCE, 0xE9, 0x26, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, - 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, - 0xC4, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, - 0x60, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0xA8, 0x02, 0x00, 0x00, - 0xBC, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xE0, 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, - 0x40, 0x03, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, - 0x84, 0x03, 0x00, 0x00, 0xA4, 0x03, 0x00, 0x00, 0xB4, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, - 0xD4, 0x03, 0x00, 0x00, 0xE4, 0x03, 0x00, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, - 0x14, 0x04, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, - 0x54, 0x04, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, - 0x98, 0x04, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, 0xB8, 0x04, 0x00, 0x00, 0xC8, 0x04, 0x00, 0x00, - 0xD8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0x09, 0x2F, 0xF1, 0x90, 0x01, 0x00, 0x00, 0xC8, 0x02, 0x00, 0x00, - 0xE1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x89, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x15, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x79, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x21, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x7D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x41, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x51, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x31, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x81, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x99, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0D, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xAD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x45, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xBD, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xD1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x55, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x25, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, - 0x84, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, - 0xB4, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, - 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, - 0x20, 0x01, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, - 0x50, 0x01, 0x00, 0x00, 0x5C, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, - 0x80, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, - 0xB0, 0x01, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0xC8, 0x01, 0x00, 0x00, 0xD4, 0x01, 0x00, 0x00, - 0xE0, 0x01, 0x00, 0x00, 0xEC, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, - 0x10, 0x02, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, - 0x40, 0x02, 0x00, 0x00, 0x4C, 0x02, 0x00, 0x00, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x16, 0x00, 0x25, 0x11, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x42, 0x41, 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x2E, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, 0x41, 0x47, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x36, 0x00, 0x07, 0x11, - 0x08, 0x10, 0x00, 0x00, 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x53, 0x54, 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, - 0x4D, 0x45, 0x00, 0x00, 0x3A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0x00, - 0x42, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x08, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, - 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, 0x46, 0x54, 0x5F, 0x43, - 0x41, 0x50, 0x00, 0x00, 0x1A, 0x00, 0x07, 0x11, 0x0A, 0x10, 0x00, 0x00, 0x03, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0x00, - 0x1E, 0x00, 0x07, 0x11, 0x0C, 0x10, 0x00, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0x00, - 0x36, 0x00, 0x07, 0x11, 0x0E, 0x10, 0x00, 0x00, 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, - 0x41, 0x43, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x49, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, - 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, - 0x1E, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, - 0x69, 0x6D, 0x70, 0x5F, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, - 0x16, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, - 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, - 0x33, 0x32, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x7F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, - 0x5F, 0x54, 0x48, 0x55, 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x50, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1A, 0x09, 0x2F, 0xF1, 0x28, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x04, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, - 0x10, 0x05, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0xE8, 0x04, 0x00, 0x00, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, - 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, 0x1E, 0x00, 0x0E, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x69, 0x6D, 0x70, 0x5F, - 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x0E, 0x11, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, - 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x00, 0x00, - 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x29, 0x8E, - 0x0E, 0x00, 0x48, 0x85, 0x0F, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0xA8, 0x01, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0A, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0F, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, - 0x6F, 0x62, 0x6A, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, - 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, - 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, - 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, 0x69, 0x62, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, 0x6C, 0x69, 0x62, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x49, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x4B, 0x45, 0x52, 0x4E, 0x45, - 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, - 0x69, 0x62, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, - 0x6C, 0x69, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, - 0x2D, 0xBA, 0x2E, 0xF1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xC0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xDC, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x88, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, - 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, - 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, - 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, - 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, - 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, - 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, - 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, - 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, - 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, - 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, - 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, - 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, - 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, - 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, - 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, - 0x65, 0x73, 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, - 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, - 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, - 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6D, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x69, 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, - 0x70, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, - 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x5C, 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, - 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, - 0x5F, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, - 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, - 0x65, 0x72, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, - 0x70, 0x69, 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x00, 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, - 0x2E, 0x70, 0x64, 0x62, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x23, 0x1E, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, - 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, - 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, - 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, - 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, - 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, - 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, - 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, - 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, - 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, - 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, - 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, - 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, - 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, - 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, - 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, - 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, - 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, - 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, - 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, - 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, - 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, - 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, - 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, - 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, - 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, 0x68, 0x61, - 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x66, - 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x69, - 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, 0x70, 0x61, - 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, 0x6F, 0x6E, - 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x75, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, - 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, - 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, - 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, 0x65, 0x72, - 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, - 0x47, 0x53, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, - 0x41, 0x47, 0x53, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x52, 0x65, 0x70, 0x6C, - 0x61, 0x63, 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, - 0x63, 0x44, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, - 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, - 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x8B, - 0x00, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x97, 0x1D, 0x00, 0x00, 0xA5, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x06, 0x00, 0x00, 0xE1, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xF7, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, - 0x0D, 0x00, 0x00, 0x75, 0x1D, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, - 0x10, 0x00, 0x00, 0x5D, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0xD4, - 0x0E, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0xCC, 0x1A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x0D, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x2C, - 0x05, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0xAC, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x1D, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0xDB, - 0x1C, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xA8, 0x0C, 0x00, 0x00, 0x29, - 0x0E, 0x00, 0x00, 0x0C, 0x17, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x0D, - 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1A, 0x00, 0x00, 0xED, - 0x1D, 0x00, 0x00, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFC, - 0x17, 0x00, 0x00, 0xF3, 0x18, 0x00, 0x00, 0x83, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, - 0x0A, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0xFA, 0x1B, 0x00, 0x00, 0x74, - 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x28, 0x1D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, - 0x09, 0x00, 0x00, 0xC3, 0x05, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x91, - 0x00, 0x00, 0x00, 0xAB, 0x17, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0xC7, - 0x09, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0xC0, - 0x16, 0x00, 0x00, 0x92, 0x11, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x90, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0xA1, - 0x13, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0xED, 0x13, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x55, - 0x13, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x30, 0x12, 0x00, 0x00, 0x19, 0x15, 0x00, 0x00, 0x90, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x71, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, - 0x01, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x99, - 0x19, 0x00, 0x00, 0xB5, 0x15, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x6D, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x07, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xD9, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0xAC, 0x07, 0x00, 0x00, 0x67, - 0x00, 0x00, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, 0x01, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xAD, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x10, 0x00, 0x00, - 0x68, 0x04, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, - 0x9C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1B, 0x00, 0x00, 0x00, 0xA2, 0x5E, 0xFD, 0x66, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xC9, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xE4, 0x10, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - vb_copy_array(&pdb_file, rest_of_chunks); - - if (pdb_file.length != array_length(pdb_image)) - { - failed_execution(); - } - - for (u32 i = 0; i < pdb_file.length; i += 1) - { - auto mine = pdb_file.pointer[i]; - auto original = pdb_image[i]; - - if (mine != original) - { - print("Diff at position {u32}\n", i); - failed_execution(); - } - } - - return (String) { pdb_file.pointer, pdb_file.length }; -} - -fn String write_pe(Thread* thread, ObjectOptions options) -{ - VirtualBuffer(u8) file = {}; - - auto* dos_header = vb_add_scalar(&file, DOSHeader); - *dos_header = (DOSHeader){ - .signature = { 'M', 'Z' }, - .relocation_table_pointer = sizeof(DOSHeader), - }; - vb_copy_scalar(&file, dos_header); - - u32 data_directory_count = 16; - - const u32 virtual_section_alignment = 0x1000; - const u32 file_section_alignment = 0x200; - const u32 timestamp = 0x66fd6370; - - u16 section_count = 3; - auto coff_header = (COFFHeader) { - .signature = { 'P', 'E', 0, 0 }, - .architecture = COFF_ARCH_AMD64, - .section_count = section_count, - .time_date_stamp = timestamp, - .symbol_table_pointer = 0, - .symbol_count = 0, - .optional_header_size = sizeof(COFFOptionalHeader), - .characteristics = { - .executable_image = 1, - .large_address_aware = 1, - }, - }; - - dos_header->coff_header_pointer = file.length; - *vb_add_scalar(&file, COFFHeader) = coff_header; - auto optional_header_offset = file.length; - auto* coff_optional_header = vb_add_scalar(&file, COFFOptionalHeader); - - auto* section_headers = vb_add_any_array(&file, COFFSectionHeader, section_count); - u16 section_i = 0; - auto headers_size = cast_to(u32, u64, align_forward(file.length, file_section_alignment)); - u32 rva = file.length; - - // .text - auto* text_section_header = §ion_headers[section_i]; - u32 entry_point_rva; - section_i += 1; - { - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - vb_align(&file, file_section_alignment); - auto file_offset = file.length; - u8 text_content[] = { 0x48, 0x83, 0xEC, 0x28, 0x33, 0xC9, 0xFF, 0x15, 0xF4, 0x0F, 0x00, 0x00, 0x90, 0x48, 0x83, 0xC4, 0x28, 0xC3, }; - entry_point_rva = rva; - vb_copy_any_array(&file, text_content); - auto virtual_size = file.length - file_offset; - vb_align(&file, file_section_alignment); - auto file_size = file.length - file_offset; - - auto current_rva = rva; - rva += virtual_size; - - *text_section_header = (COFFSectionHeader) { - .name = coff_section_name(strlit(".text")), - .virtual_size = virtual_size, - .rva = current_rva, - .file_size = file_size, - .file_offset = file_offset, - .flags = { - .contains_code = 1, - .execute = 1, - .read = 1, - }, - }; - } - - auto* rdata_section_header = §ion_headers[section_i]; - section_i += 1; - u32 iat_rva; - u32 iat_size; - u32 import_directory_rva; - u32 import_directory_size; - u32 debug_directory_rva; - u32 debug_directory_size; - u32 unwind_information_rva; - { - // .rdata - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - assert(rva == 0x2000); - vb_align(&file, file_section_alignment); - auto file_offset = file.length; - - auto iat_file_offset = file.length; - auto iat_section_offset = iat_file_offset - file_offset; - iat_rva = rva + iat_section_offset; - - const u32 import_address_count = 2; - auto* import_address_table = vb_add_any_array(&file, COFFImportAddress, import_address_count); - iat_size = file.length - iat_file_offset; - - auto debug_directory_file_offset = file.length; - auto debug_directory_section_offset = debug_directory_file_offset - file_offset; - debug_directory_rva = rva + debug_directory_section_offset; - - const u32 debug_directory_count = 1; - auto* debug_directories = vb_add_any_array(&file, COFFDebugDirectory, debug_directory_count); - debug_directory_size = file.length - debug_directory_file_offset; - - auto debug_directory_data_file_offset = file.length; - auto debug_directory_data_section_offset = debug_directory_data_file_offset - file_offset; - auto debug_directory_data_rva = rva + debug_directory_section_offset; - - u8 rsds_guid[] = { 0x3D, 0x15, 0x84, 0x0A, 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, }; - u32 rsds_age = 3; - file_write_coff_rsds(&file, (String)array_to_slice(rsds_guid), rsds_age, strlit("C:\\Users\\David\\dev\\minimal\\main.pdb")); - auto debug_directory_data_size = file.length - debug_directory_data_file_offset; - - auto unwind_information_file_offset = file.length; - auto unwind_information_section_offset = unwind_information_file_offset - file_offset; - unwind_information_rva = rva + unwind_information_section_offset; - auto* unwind_information = vb_add_scalar(&file, COFFUnwindInformation); - - auto unwind_information_prologue_offset = file.length; - - COFFUnwindCode unwind_codes[] = { - { - .code_offset = 4, - .operation = UNW_OP_ALLOC_SMALL, - .operation_info = 4, // 4 * 8 = 32 bytes of stack - }, - }; - vb_copy_any_array(&file, unwind_codes); - vb_align(&file, sizeof(u32)); - - *unwind_information = (COFFUnwindInformation) { - .version = 1, - .prologue_size = file.length - unwind_information_prologue_offset, - .code_count = array_length(unwind_codes), - .frame_register_and_offset = 0, - }; - - COFFDebugDirectory sample_debug_directories[] = { - { - .characteristics = 0, - .timestamp = timestamp, - .major_version = 0, - .minor_version = 0, - .type = COFF_DEBUG_CODEVIEW, - .size = debug_directory_data_size, - .rva = debug_directory_data_rva, - .file_offset = debug_directory_data_file_offset, - }, - }; - - memcpy(debug_directories, sample_debug_directories, sizeof(sample_debug_directories)); - - auto import_directory_file_offset = file.length; - auto import_directory_section_offset = file.length - file_offset; - import_directory_rva = rva + import_directory_section_offset; - - // IAT - const u32 import_directory_count = 2; - auto* import_directories = vb_add_any_array(&file, COFFImportDirectory, import_directory_count); - - import_directory_size = file.length - import_directory_file_offset; - - auto import_lookup_file_offset = file.length; - auto import_lookup_section_offset = file.length - file_offset; - auto import_lookup_rva = rva + import_lookup_section_offset; - const u32 import_lookup_count = import_directory_count; - auto* import_lookups = vb_add_any_array(&file, COFFImportLookup, import_lookup_count); - assert(import_lookup_count == import_directory_count); - - auto name_table_file_offset = file.length; - auto name_table_section_offset = name_table_file_offset - file_offset; - auto name_table_rva = rva + name_table_section_offset; - // TODO: compute hints - u16 hint = 0; - coff_import_name(&file, hint, strlit("ExitProcess")); - - auto dll_name_file_offset = file.length; - auto dll_name_section_offset = dll_name_file_offset - file_offset; - auto dll_name_rva = rva + dll_name_section_offset; - auto dll_name = strlit("KERNEL32.dll"); - vb_copy_string_zero_terminated(&file, dll_name); - - *vb_add(&file, 1) = 0; - - assert(import_lookup_count == 2); - import_lookups[0] = (COFFImportLookup) { - .name_table_rva = name_table_rva, - }; - import_lookups[1] = (COFFImportLookup) {}; - - assert(import_directory_count == 2); - import_directories[0] = (COFFImportDirectory) { - .lookup_table_rva = import_lookup_rva, - .time_date_stamp = 0, - .forwarder_chain = 0, - .dll_name_rva = dll_name_rva, - .address_table_rva = iat_rva, - }; - - import_directories[1] = (COFFImportDirectory) {}; - assert(import_directories[import_directory_count - 1].forwarder_chain == 0); - - assert(import_address_count == 2); - import_address_table[0] = (COFFImportAddress) { - .name_table_rva = name_table_rva, - }; - import_address_table[1] = (COFFImportAddress) {}; - - auto virtual_size = file.length - file_offset; - vb_align(&file, file_section_alignment); - auto file_size = file.length - file_offset; - - auto current_rva = rva; - rva += virtual_size; - - *rdata_section_header = (COFFSectionHeader) { - .name = coff_section_name(strlit(".rdata")), - .virtual_size = virtual_size, - .rva = current_rva, - .file_size = file_size, - .file_offset = file_offset, - .flags = { - .contains_initialized_data = 1, - .read = 1, - }, - }; - } - - auto* pdata_section_header = §ion_headers[section_i]; - section_i += 1; - u32 exception_table_rva; - u32 exception_table_size; - { - // .pdata content - vb_align(&file, file_section_alignment); - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - - auto file_offset = file.length; - - COFFExceptionTableEntry_x86_64 exception_entries[] = { - { - .start_rva = text_section_header->rva, - .end_rva = text_section_header->rva + text_section_header->virtual_size, - .unwind_information_rva = unwind_information_rva, - }, - }; - exception_table_rva = rva; - exception_table_size = sizeof(exception_entries); - vb_copy_any_array(&file, exception_entries); - - auto virtual_size = file.length - file_offset; - vb_align(&file, file_section_alignment); - auto file_size = file.length - file_offset; - - auto section_rva = rva; - rva += virtual_size; - - *pdata_section_header = (COFFSectionHeader) { - .name = coff_section_name(strlit(".pdata")), - .virtual_size = virtual_size, - .rva = section_rva, - .file_size = file_size, - .file_offset = file_offset, - .flags = { - .contains_initialized_data = 1, - .read = 1, - }, - }; - } - - vb_align(&file, file_section_alignment); - rva = cast_to(u32, u64, align_forward(rva, virtual_section_alignment)); - - assert(section_i == section_count); - - u32 code_size = 0; - u32 initialized_data_size = 0; - u32 uninitialized_data_size = 0; - - for (u16 i = 0; i < section_count; i += 1) - { - auto* section_header = §ion_headers[i]; - - code_size += section_header->file_size * section_header->flags.contains_code; - initialized_data_size += section_header->file_size * section_header->flags.contains_initialized_data; - uninitialized_data_size += section_header->file_size * section_header->flags.contains_uninitialized_data; - } - - assert(debug_directory_size % sizeof(COFFDebugDirectory) == 0); - assert(iat_size % sizeof(COFFImportAddress) == 0); - - *coff_optional_header = (COFFOptionalHeader) { - .format = COFF_FORMAT_PE32_PLUS, - .major_linker_version = 14, - .minor_linker_version = 41, - .code_size = code_size, - .initialized_data_size = initialized_data_size, - .uninitialized_data_size = uninitialized_data_size, - .entry_point_address = entry_point_rva, - .code_offset = text_section_header->rva, - .image_offset = 0x140000000, - .virtual_section_alignment = virtual_section_alignment, - .file_section_alignment = file_section_alignment, - .major_operating_system_version = 6, - .minor_operating_system_version = 0, - .major_image_version = 0, - .minor_image_version = 0, - .major_subsystem_version = 6, - .minor_subsystem_version = 0, - .win32_version_value = 0, - .image_size = rva, - .headers_size = headers_size, - .checksum = 0, - .subsystem = COFF_SUBSYSTEM_WINDOWS_CUI, - .dll_characteristics = { - .high_entropy_va = 1, - .dynamic_base = 1, - .nx_compatible = 1, - .terminal_server_aware = 1, - }, - .stack_reserve_size = MB(1), - .stack_commit_size = 0x1000, - .heap_reserve_size = MB(1), - .heap_commit_size = 0x1000, - .loader_flags = {}, - .directory_count = array_length(coff_optional_header->directories), - .directories = { - [COFF_IMPORT_DIRECTORY_INDEX] = { .rva = import_directory_rva, .size = import_directory_size, }, - [COFF_EXCEPTION_DIRECTORY_INDEX] = { .rva = exception_table_rva, .size = exception_table_size, }, - [COFF_DEBUG_DIRECTORY_INDEX] = { .rva = debug_directory_rva, .size = debug_directory_size, }, - [COFF_IAT_DIRECTORY_INDEX] = { .rva = iat_rva, .size = iat_size, }, - }, - }; - - auto dot_index = string_last_ch(options.exe_path, '.'); - dot_index = dot_index == -1 ? options.exe_path.length : dot_index; - auto path_without_extension = s_get_slice(u8, options.exe_path, 0, dot_index); - assert(path_without_extension.length <= options.exe_path.length); - - String to_join[] = { - path_without_extension, - strlit(".pdb"), - }; - - auto pdb = pdb_build(thread); - - // TODO: -// #if _WIN32 -// auto pdb_path = arena_join_string(thread->arena, (Slice(String))array_to_slice(to_join)); -// auto fd = os_file_open(strlit("mydbg.pdb"), (OSFileOpenFlags) { -// .write = 1, -// .truncate = 1, -// .create = 1, -// }, (OSFilePermissions) { -// .readable = 1, -// .writable = 1, -// }); -// -// os_file_write(fd, pdb); -// -// os_file_close(fd); -// #endif - - // Check if file matches -#define CHECK_PE_MATCH 0 -#if CHECK_PE_MATCH - auto minimal = file_read(thread->arena, strlit("C:/Users/David/dev/minimal/main.exe")); - assert(file.length == minimal.length); - - u32 diff_count = 0; - for (u32 i = 0; i < minimal.length; i += 1) - { - auto mine = file.pointer[i]; - auto original = minimal.pointer[i]; - if (mine != original) - { - print("Diff at {u32}\n", i); - diff_count += 1; - } - } - - assert(diff_count == 0); -#else - unused(thread); -#endif - - return (String){ file.pointer, file.length }; -} - -fn void subsume_node_without_killing(Thread* thread, NodeIndex old_node_index, NodeIndex new_node_index) -{ - assert(!index_equal(old_node_index, new_node_index)); - auto* old = thread_node_get(thread, old_node_index); - auto* new = thread_node_get(thread, new_node_index); - auto old_node_outputs = node_get_outputs(thread, old); - - u8 allow_cycle = old->id == IR_PHI || old->id == IR_REGION || new->id == IR_REGION; - - for (auto i = old->output_count; i > 0; i -= 1) - { - auto output = old_node_outputs.pointer[i - 1]; - old->output_count -= 1; - if (!allow_cycle && index_equal(output, new_node_index)) - { - continue; - } - - auto* output_node = thread_node_get(thread, output); - auto output_inputs = node_get_inputs(thread, output_node); - - u16 output_input_index; - for (output_input_index = 0; output_input_index < output_inputs.length; output_input_index += 1) - { - auto output_input = output_inputs.pointer[output_input_index]; - if (index_equal(output_input, old_node_index)) - { - output_inputs.pointer[output_input_index] = new_node_index; - node_add_output(thread, new_node_index, output); - break; - } - } - - assert(output_input_index < output_inputs.length); - } -} - -fn NodeIndex function_get_control_start(Thread* thread, Function* function) -{ - auto* root = thread_node_get(thread, function->root); - auto outputs = node_get_outputs(thread, root); - auto result = outputs.pointer[0]; - return result; -} - -fn u8 cfg_is_control(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto backend_type = type_pair_get_backend(node->type); - if (backend_type == BACKEND_TYPE_CONTROL) - { - return 1; - } - else if (backend_type == BACKEND_TYPE_TUPLE) - { - if (node->id == IR_ROOT) - { - return 1; - } - else - { - todo(); - } - } - - return 0; -} - -fn u8 cfg_node_terminator(Node* node) -{ - u8 is_terminator; - switch (node->id) - { - case IR_PROJECTION: - case IR_REGION: - is_terminator = 0; - break; - case IR_RETURN: - case IR_ROOT: - is_terminator = 1; - break; - default: - todo(); - } - - return is_terminator; -} - -fn NodeIndex basic_block_end(Thread* thread, NodeIndex start_index) -{ - auto node_index = start_index; - while (1) - { - auto* node = thread_node_get(thread, node_index); - u8 is_terminator = cfg_node_terminator(node); - - if (is_terminator) - { - break; - } - - auto outputs = node_get_outputs(thread, node); - auto new_node_index = node_index; - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - auto output_inputs = node_get_inputs(thread, output); - if (index_equal(output_inputs.pointer[0], node_index) && cfg_is_control(thread, output_index)) - { - if (output->id == IR_REGION) - { - return node_index; - } - - new_node_index = output_index; - break; - } - } - - if (index_equal(node_index, new_node_index)) - { - break; - } - - node_index = new_node_index; - } - - return node_index; -} - -STRUCT(Block) -{ - NodeIndex start; - NodeIndex end; - NodeIndex successors[2]; - u32 successor_count; - struct Block* parent; -}; - -fn NodeIndex cfg_next_control(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto outputs = node_get_outputs(thread, node); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - if (cfg_is_control(thread, output_index)) - { - return output_index; - } - } - - return invalidi(Node); -} - -fn NodeIndex cfg_next_user(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - auto outputs = node_get_outputs(thread, node); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - if (cfg_is_control(thread, output_index)) - { - return output_index; - } - } - - return invalidi(Node); -} - -fn u8 cfg_is_endpoint(Thread* thread, Node* node) -{ - unused(thread); - switch (node->id) - { - case IR_ROOT: - case IR_RETURN: - return 1; - default: - return 0; - } -} - -fn Block* create_block(Thread* thread, NodeIndex node_index) -{ - auto end_of_basic_block_index = basic_block_end(thread, node_index); - auto* end_node = thread_node_get(thread, end_of_basic_block_index); - - u32 successor_count = 0; - // Branch - auto is_endpoint = cfg_is_endpoint(thread, end_node); - auto is_branch = 0; - if (is_branch) - { - todo(); - } - else if (type_pair_get_backend(end_node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - else if (!is_endpoint) - { - successor_count = 1; - } - - auto* block = arena_allocate(thread->arena, Block, 1); - *block = (Block) - { - .start = node_index, - .end = end_of_basic_block_index, - .successor_count = successor_count, - }; - - if (node_is_cfg_fork(end_node)) - { - todo(); - } - else if (!is_endpoint) - { - block->successors[0] = cfg_next_user(thread, end_of_basic_block_index); - } - - return block; -} - -fn NodeIndex node_select_instruction(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - switch (node->id) - { - case IR_PROJECTION: - return node_index; - case IR_ROOT: - return node_index; - case IR_PHI: - { - auto backend_type = type_pair_get_backend(node->type); - if (backend_type <= BACKEND_TYPE_SCALAR_LAST) - { - { - auto copy_index = thread_node_add(thread, (NodeCreate) - { - .id = MACHINE_COPY, - .type_pair = node->type, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - invalidi(Node), - })), - }); - thread_node_get(thread, copy_index)->machine_copy = (NodeMachineCopy) { - .use_mask = Index(RegisterMask, REGISTER_MASK_GPR), - .def_mask = Index(RegisterMask, REGISTER_MASK_GPR), - }; - subsume_node_without_killing(thread, node_index, copy_index); - node_set_input(thread, copy_index, 1, node_index); - node_gvn_intern(thread, copy_index); - } - - { - auto inputs = node_get_inputs(thread, node); - - for (u16 i = 1; i < inputs.length; i += 1) - { - auto input_index = inputs.pointer[i]; - auto input = thread_node_get(thread, input_index); - assert(input->id != MACHINE_MOVE); - auto move_index = thread_node_add(thread, (NodeCreate) - { - .id = MACHINE_MOVE, - .type_pair = input->type, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - invalidi(Node), - })), - }); - node_set_input(thread, move_index, 1, input_index); - node_set_input(thread, node_index, i, move_index); - node_gvn_intern(thread, move_index); - } - } - } - - return node_index; - } break; - case IR_RETURN: - case IR_REGION: - case IR_INTEGER_CONSTANT: - - case MACHINE_MOVE: - case MACHINE_COPY: - return invalidi(Node); - default: - todo(); - } -} - -STRUCT(BasicBlockIndex) -{ - u32 index; -}; -decl_vb(BasicBlockIndex); - -STRUCT(BasicBlock) -{ - VirtualBuffer(NodeIndex) items; - Bitset gen; - Bitset kill; - Bitset live_in; - Bitset live_out; - NodeIndex start; - NodeIndex end; - s32 dominator_depth; - BasicBlockIndex dominator; - s32 forward; -}; -decl_vb(BasicBlock); -decl_vbp(BasicBlock); - -fn u8 node_is_pinned(Node* node) -{ - switch (node->id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - return 1; - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -fn u8 node_has_memory_out(NodeId id) -{ - switch (id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -fn u8 node_has_memory_in(NodeId id) -{ - switch (id) - { - case IR_ROOT: - case IR_RETURN: - return 1; - case IR_PROJECTION: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -fn NodeIndex node_memory_in(Thread* thread, Node* node) -{ - auto result = invalidi(Node); - if (node_has_memory_in(node->id)) - { - result = node_get_inputs(thread, node).pointer[1]; - } - - return result; -} - -fn s32 node_last_use_in_block(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, Slice(s32) order, Node* node, BasicBlockIndex basic_block_index) -{ - auto outputs = node_get_outputs(thread, node); - s32 result = 0; - for (u16 i = 0; i < node->output_count; i += 1) - { - auto output_index = outputs.pointer[i]; - if (index_equal(basic_block_index, scheduled.pointer[geti(output_index)]) && result < order.pointer[geti(output_index)]) - { - result = order.pointer[geti(output_index)]; - } - } - - return result; -} - -fn BasicBlockIndex find_use_block(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, NodeIndex node_index, NodeIndex actual_node_index, NodeIndex use_index) -{ - auto use_block_index = scheduled.pointer[geti(use_index)]; - if (!validi(use_block_index)) - { - return use_block_index; - } - - Node* use = thread_node_get(thread, use_index); - auto use_inputs = node_get_inputs(thread, use); - - if (use->id == IR_PHI) - { - auto use_first_input_index = use_inputs.pointer[0]; - auto use_first_input = thread_node_get(thread, use_first_input_index); - assert(use_first_input->id == IR_REGION); - assert(use->input_count == use_first_input->input_count + 1); - - auto use_first_input_inputs = node_get_inputs(thread, use_first_input); - - u16 i; - for (i = 0; i < use_inputs.length; i += 1) - { - auto use_input_index = use_inputs.pointer[i]; - if (index_equal(use_input_index, actual_node_index)) - { - // TODO: this assertion is mine for debugging when this function is only called from a single code path, - // it's not absolutely valid in other contexts - assert(index_equal(actual_node_index, node_index)); - auto input_index = use_first_input_inputs.pointer[i - 1]; - auto bb_index = scheduled.pointer[geti(input_index)]; - if (validi(bb_index)) - { - use_block_index = bb_index; - } - break; - } - } - - assert(i < use_inputs.length); - } - - return use_block_index; -} - -fn BasicBlockIndex find_lca(BasicBlockIndex a, BasicBlockIndex b) -{ - unused(a); - unused(b); - // TODO: dominators - return invalidi(BasicBlock); -} - -fn u8 node_is_ready(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, WorkListHandle handle, Node* node, BasicBlockIndex basic_block_index) -{ - // TODO: this is my assert and might not be true after all - assert(node->input_capacity == node->input_count); - auto inputs = node_get_inputs(thread, node); - for (u16 i = 0; i < node->input_capacity; i += 1) - { - auto input = inputs.pointer[i]; - if (validi(input) && index_equal(scheduled.pointer[geti(input)], basic_block_index) && !thread_worklist_test(thread, handle, input)) - { - return 0; - } - } - - return 1; -} - -fn u64 node_get_latency(Thread* thread, Node* node, Node* end) -{ - unused(end); - unused(thread); - switch (node->id) - { - case IR_INTEGER_CONSTANT: - case IR_RETURN: - case MACHINE_COPY: - return 1; - case MACHINE_MOVE: - return 0; - default: - todo(); - } -} - -fn u64 node_get_unit_mask(Thread* thread, Node* node) -{ - unused(thread); - unused(node); - return 1; -} - -STRUCT(ReadyNode) -{ - u64 unit_mask; - NodeIndex node_index; - s32 priority; -}; -decl_vb(ReadyNode); - -STRUCT(InFlightNode) -{ - NodeIndex node_index; - u32 end; - s32 unit_i; -}; -decl_vb(InFlightNode); - -STRUCT(Scheduler) -{ - Bitset ready_set; - VirtualBuffer(ReadyNode) ready; - NodeIndex cmp; -}; - -fn s32 node_best_ready(Scheduler* restrict scheduler, u64 in_use_mask) -{ - auto length = scheduler->ready.length; - if (length == 1) - { - u64 available = scheduler->ready.pointer[0].unit_mask & ~in_use_mask; - return available ? 0 : -1; - } - - while (length--) - { - auto node_index = scheduler->ready.pointer[length].node_index; - if (index_equal(node_index, scheduler->cmp)) - { - continue; - } - - auto available = scheduler->ready.pointer[length].unit_mask & ~in_use_mask; - if (available == 0) - { - continue; - } - - return cast_to(s32, u32, length); - } - - return -1; -} - -declare_ip_functions(RegisterMask, register_mask) - -fn RegisterMaskIndex register_mask_intern(Thread* thread, RegisterMask register_mask) -{ - auto* new_rm = vb_add(&thread->buffer.register_masks, 1); - *new_rm = register_mask; - auto candidate_index = Index(RegisterMask, cast_to(u32, s64, new_rm - thread->buffer.register_masks.pointer)); - auto result = ip_RegisterMask_get_or_put(&thread->interned.register_masks, thread, candidate_index); - auto final_index = result.index; - assert((!index_equal(candidate_index, final_index)) == result.existing); - thread->buffer.register_masks.length -= result.existing; - - return final_index; -} - -fn RegisterMaskIndex node_constraint(Thread* thread, Node* node, Slice(RegisterMaskIndex) ins) -{ - switch (node->id) - { - case IR_PROJECTION: - { - auto backend_type = type_pair_get_backend(node->type); - if (backend_type == BACKEND_TYPE_MEMORY || backend_type == BACKEND_TYPE_CONTROL) - { - return empty_register_mask; - } - - auto index = node->projection.index; - auto inputs = node_get_inputs(thread, node); - - auto* first_input = thread_node_get(thread, inputs.pointer[0]); - if (first_input->id == IR_ROOT) - { - assert(index >= 2); - if (index == 2) - { - return empty_register_mask; - } - else - { - todo(); - } - todo(); - } - else - { - todo(); - } - } break; - case IR_INTEGER_CONSTANT: - return Index(RegisterMask, REGISTER_MASK_GPR); - case MACHINE_MOVE: - { - // TODO: float - auto mask = Index(RegisterMask, REGISTER_MASK_GPR); - if (ins.length) - { - ins.pointer[1] = mask; - } - return mask; - } break; - case MACHINE_COPY: - { - if (ins.length) - { - ins.pointer[1] = node->machine_copy.use_mask; - } - - return node->machine_copy.def_mask; - } break; - case IR_REGION: - { - if (ins.length) - { - for (u16 i = 1; i < node->input_count; i += 1) - { - ins.pointer[i] = empty_register_mask; - } - } - - return empty_register_mask; - } break; - case IR_PHI: - { - if (ins.length) - { - for (u16 i = 1; i < node->input_count; i += 1) - { - ins.pointer[i] = empty_register_mask; - } - } - - auto backend_type = type_pair_get_backend(node->type); - RegisterMaskIndex mask; - if (backend_type == BACKEND_TYPE_MEMORY) - { - mask = empty_register_mask; - } - // TODO: float - else - { - mask = Index(RegisterMask, REGISTER_MASK_GPR); - } - - return mask; - } break; - case IR_RETURN: - { - if (ins.length) - { - const global_variable s32 ret_gprs[] = { RAX, RDX }; - - ins.pointer[1] = empty_register_mask; - ins.pointer[2] = empty_register_mask; - - // TODO: returns - auto index = 3; - ins.pointer[index] = register_mask_intern(thread, (RegisterMask) { - .class = REGISTER_CLASS_X86_64_GPR, - .may_spill = 0, - .mask = ((u32)1 << ret_gprs[index - 3]), - }); - - auto gpr_caller_saved = ((1u << RAX) | (1u << RDI) | (1u << RSI) | (1u << RCX) | (1u << RDX) | (1u << R8) | (1u << R9) | (1u << R10) | (1u << R11)); - auto gpr_callee_saved = ~gpr_caller_saved; - gpr_callee_saved &= ~(1u << RSP); - gpr_callee_saved &= ~(1u << RBP); - - auto j = 3 + 1; - - for (u32 i = 0; i < register_count_per_class[REGISTER_CLASS_X86_64_GPR]; i += 1) - { - if ((gpr_callee_saved >> i) & 1) - { - ins.pointer[j++] = register_mask_intern(thread, (RegisterMask) { - .class = REGISTER_CLASS_X86_64_GPR, - .mask = (u32)1 << i, - .may_spill = 0, - }); - } - } - - // TODO: float - } - - return empty_register_mask; - } break; - default: - todo(); - } -} - -fn u32 node_tmp_count(Node* node) -{ - switch (node->id) - { - case IR_ROOT: - case IR_PROJECTION: - case IR_RETURN: - case IR_REGION: - case IR_PHI: - case IR_SYMBOL_TABLE: - case IR_INTEGER_ADD: - case IR_INTEGER_SUBSTRACT: - case IR_INTEGER_MULTIPLY: - case IR_INTEGER_DIVIDE: - case IR_INTEGER_REMAINDER: - case IR_INTEGER_SHIFT_LEFT: - case IR_INTEGER_SHIFT_RIGHT: - case IR_INTEGER_AND: - case IR_INTEGER_OR: - case IR_INTEGER_XOR: - case IR_INTEGER_COMPARE_EQUAL: - case IR_INTEGER_COMPARE_NOT_EQUAL: - case IR_INTEGER_NEGATION: - case IR_INTEGER_CONSTANT: - case MACHINE_COPY: - case MACHINE_MOVE: - case NODE_COUNT: - return 0; - case MACHINE_JUMP: - todo(); - } -} - -STRUCT(VirtualRegister) -{ - RegisterMaskIndex mask; - NodeIndex node_index; - f32 spill_cost; - f32 spill_bias; - s16 class; - s16 assigned; - s32 hint_vreg; -}; -decl_vb(VirtualRegister); - -fn s32 fixed_register_mask(RegisterMask mask) -{ - if (mask.class == REGISTER_CLASS_STACK) - { - todo(); - } - else - { - s32 set = -1; - // TODO: count? - for (s32 i = 0; i < 1; i += 1) - { - u32 m = mask.mask; - s32 found = 32 - __builtin_clz(m); - if (m == ((u32)1 << found)) - { - if (set >= 0) - { - return -1; - } - - set = i * 64 + found; - } - } - - return set; - } -} - -fn RegisterMaskIndex register_mask_meet(Thread* thread, RegisterMaskIndex a_index, RegisterMaskIndex b_index) -{ - if (index_equal(a_index, b_index)) - { - return a_index; - } - - if (!validi(a_index)) - { - return b_index; - } - if (!validi(b_index)) - { - return a_index; - } - - auto* a = thread_register_mask_get(thread, a_index); - auto* b = thread_register_mask_get(thread, b_index); - - u32 may_spill = a->may_spill && b->may_spill; - if (!may_spill && a->class != b->class) - { - return empty_register_mask; - } - - auto a_mask = a->mask; - auto b_mask = b->mask; - auto mask = a_mask & b_mask; - - auto result = register_mask_intern(thread, (RegisterMask) { - .class = mask == 0 ? 1 : a->class, - .may_spill = may_spill, - .mask = mask, - }); - - return result; -} - -fn s32 node_to_address(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - switch (node->id) - { - case IR_PHI: - case IR_INTEGER_CONSTANT: - return -1; - case MACHINE_COPY: - return 1; - default: - todo(); - } -} - -fn u8 interfere_in_block(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, VirtualBuffer(BasicBlock) bb, Slice(s32) order, NodeIndex left, NodeIndex right, BasicBlockIndex block_index) -{ - assert(!index_equal(left, right)); - auto* block = &bb.pointer[geti(block_index)]; - auto left_live_out = bitset_get(&block->live_out, geti(left)); - auto right_live_out = bitset_get(&block->live_out, geti(right)); - auto* left_node = thread_node_get(thread, left); - auto* right_node = thread_node_get(thread, right); - - if (left_node->id == IR_PHI || right_node->id == IR_PHI) - { - auto phi = right; - auto other = left; - - if (left_node->id == IR_PHI && right_node->id != IR_PHI) - { - phi = left; - other = right; - } - - unused(other); - - block_index = scheduled.pointer[geti(phi)]; - block = &bb.pointer[geti(block_index)]; - if (bitset_get(&block->live_out, geti(phi))) - { - todo(); - } - } - - if (left_live_out && right_live_out) - { - todo(); - } - else if (!left_live_out && !right_live_out) - { - auto first = left; - auto last = right; - - if (order.pointer[geti(left)] > order.pointer[geti(right)]) - { - first = right; - last = left; - } - - block_index = scheduled.pointer[geti(last)]; - block = &bb.pointer[geti(block_index)]; - - auto* first_node = thread_node_get(thread, first); - auto outputs = node_get_outputs(thread, first_node); - - for (u16 i = 0; i < first_node->output_count; i += 1) - { - auto output_index = outputs.pointer[i]; - assert(validi(output_index)); - auto* output_node = thread_node_get(thread, output_index); - auto output_inputs = node_get_inputs(thread, output_node); - - u16 i; - for (i = 0; i < output_node->input_count; i += 1) - { - auto input_index = output_inputs.pointer[i]; - if (index_equal(input_index, first)) - { - if (index_equal(block_index, scheduled.pointer[geti( output_index)])) - { - if (order.pointer[geti(output_index)] > order.pointer[geti(last)]) - { - return 1; - } - } - break; - } - } - assert(i < output_node->input_count); - } - } - else - { - todo(); - } - - return 0; -} - -fn u8 interfere(Thread* thread, VirtualBuffer(BasicBlockIndex) scheduled, VirtualBuffer(BasicBlock) bb, Slice(s32) order, NodeIndex left, NodeIndex right) -{ - auto left_block = scheduled.pointer[geti(left)]; - auto right_block = scheduled.pointer[geti(right)]; - // These asserts are mine, they might not be valid - assert(validi(left_block)); - assert(validi(right_block)); - - auto result = interfere_in_block(thread, scheduled, bb, order, left, right, left_block); - - if (!index_equal(left_block, right_block)) - { - result = result || interfere_in_block(thread, scheduled, bb, order, right, left, right_block); - } - - return result; -} - -fn Slice(s32) compute_ordinals(Thread* thread, VirtualBuffer(BasicBlock) bb, u32 node_count) -{ - auto order_cap = round_up_to_next_power_of_2(node_count); - auto order = arena_allocate(thread->arena, s32, order_cap); - - for (u32 i = 0; i < bb.length; i += 1) - { - auto* basic_block = & bb.pointer[i]; - s32 timeline = 1; - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - order[geti(node_index)] = timeline; - timeline += 1; - } - } - - return (Slice(s32)) { .pointer = order, .length = order_cap, }; -} - -fn u8 can_remat(Thread* thread, NodeIndex node_index) -{ - auto* node = thread_node_get(thread, node_index); - switch (node->id) - { - case MACHINE_COPY: - return 1; - default: - todo(); - } -} - -fn f32 get_spill_cost(Thread* thread, VirtualRegister* virtual_register) -{ - auto spill_cost = virtual_register->spill_cost; - if (__builtin_isnan(spill_cost)) - { - if (can_remat(thread, virtual_register->node_index)) - { - spill_cost = virtual_register->spill_bias - 1.0f; - } - else - { - todo(); - } - - virtual_register->spill_cost = spill_cost; - } - - return spill_cost; -} - -fn u8 register_mask_not_empty(RegisterMask mask) -{ - return mask.mask != 0; -} - -fn u8 register_mask_spill(RegisterMask mask) -{ - return mask.class != REGISTER_CLASS_STACK && (!register_mask_not_empty(mask) && mask.may_spill); -} - -fn void dataflow(Thread* thread, WorkListHandle worker, VirtualBuffer(BasicBlock) bb, VirtualBuffer(BasicBlockIndex) scheduled, u32 node_count) -{ - // Dataflow analysis - thread_worklist_clear(thread, worker); - - // TODO: separate per function - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - bitset_clear(&basic_block->gen); - bitset_clear(&basic_block->kill); - - bitset_ensure_length(&basic_block->gen, node_count); - bitset_ensure_length(&basic_block->kill, node_count); - } - - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - NodeIndex node_index = basic_block->items.pointer[i]; - Node* node = thread_node_get(thread, node_index); - - if (node->id == IR_PHI) - { - auto phi_inputs = node_get_inputs(thread, node); - for (u16 i = 1; i < phi_inputs.length; i += 1) - { - auto input = phi_inputs.pointer[i]; - if (validi(input)) - { - auto input_bb_index = scheduled.pointer[geti(input)]; - bitset_set_value(&bb.pointer[geti(input_bb_index)].kill, geti(node_index), 1); - } - } - } - else - { - bitset_set_value(&basic_block->kill, geti(node_index), 1); - } - } - } - - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - NodeIndex node_index = basic_block->items.pointer[i]; - Node* node = thread_node_get(thread, node_index); - - if (node->id != IR_PHI) - { - auto inputs = node_get_inputs(thread, node); - for (u16 i = 1; i < inputs.length; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - auto* input = thread_node_get(thread, input_index); - if (input->id == IR_PHI || !bitset_get(&basic_block->kill, geti(input_index))) - { - bitset_set_value(&basic_block->gen, geti(input_index), 1); - } - } - } - } - } - } - - thread_worklist_clear(thread, worker); - - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - assert(basic_block->gen.arr.length == basic_block->live_in.arr.length); - assert(basic_block->gen.arr.capacity == basic_block->live_in.arr.capacity); - memcpy(basic_block->live_in.arr.pointer, basic_block->gen.arr.pointer, sizeof(basic_block->gen.arr.pointer[0]) * basic_block->gen.arr.length); - basic_block->live_in.length = basic_block->gen.length; - thread_worklist_push(thread, worker, basic_block->start); - } - - while (thread_worklist_length(thread, worker) > 0) - { - auto bb_node_index = thread_worklist_pop(thread, worker); - auto basic_block_index = scheduled.pointer[geti(bb_node_index)]; - BasicBlock* basic_block = &bb.pointer[geti(basic_block_index)]; - - auto* live_out = &basic_block->live_out; - auto* live_in = &basic_block->live_in; - bitset_clear(live_out); - - auto end_index = basic_block->end; - auto* end = thread_node_get(thread, end_index); - auto cfg_is_fork = 0; - if (cfg_is_fork) - { - todo(); - } - else if (!cfg_is_endpoint(thread, end)) - { - auto succ_index = cfg_next_control(thread, end_index); - auto succ_bb_index = scheduled.pointer[geti(succ_index)]; - auto succ_bb = &bb.pointer[geti(succ_bb_index)]; - assert(live_out->arr.capacity == live_in->arr.capacity); - u64 changes = 0; - for (u32 i = 0; i < succ_bb->live_in.arr.capacity; i += 1) - { - auto old = live_out->arr.pointer[i]; - auto new = old | succ_bb->live_in.arr.pointer[i]; - - live_out->arr.pointer[i] = new; - changes |= (old ^ new); - } - unused(changes); - } - - auto* gen = &basic_block->gen; - auto* kill = &basic_block->kill; - - auto changes = 0; - - for (u32 i = 0; i < kill->arr.length; i += 1) - { - u64 new_in = (live_out->arr.pointer[i] & ~kill->arr.pointer[i]) | gen->arr.pointer[i]; - changes |= live_in->arr.pointer[i] != new_in; - live_in->arr.pointer[i] = new_in; - } - - if (changes) - { - todo(); - } - } -} - -fn void redo_dataflow(Thread* thread, WorkListHandle worker, VirtualBuffer(BasicBlock) bb, VirtualBuffer(BasicBlockIndex) scheduled, u32 node_count) -{ - for (u32 i = 0; i < bb.length; i += 1) - { - BasicBlock* basic_block = &bb.pointer[i]; - - bitset_clear(&basic_block->gen); - bitset_clear(&basic_block->kill); - - bitset_ensure_length(&basic_block->gen, node_count); - bitset_ensure_length(&basic_block->kill, node_count); - } - - dataflow(thread, worker, bb, scheduled, node_count); -} - -fn String gpr_to_string(GPR gpr) -{ - switch (gpr) - { - case_to_name(, RAX); - case_to_name(, RCX); - case_to_name(, RDX); - case_to_name(, RBX); - case_to_name(, RSP); - case_to_name(, RBP); - case_to_name(, RSI); - case_to_name(, RDI); - case_to_name(, R8); - case_to_name(, R9); - case_to_name(, R10); - case_to_name(, R11); - case_to_name(, R12); - case_to_name(, R13); - case_to_name(, R14); - case_to_name(, R15); - case_to_name(, GPR_NONE); - } -} - -fn u8 register_allocate(Thread* thread, VirtualBuffer(VirtualRegister) virtual_registers, VirtualBuffer(u32)* spills, Bitset* active, Bitset* future_active, VirtualBuffer(BasicBlockIndex) scheduled, VirtualBuffer(BasicBlock) bb, Slice(s32) order, u32 virtual_register_id, u32 in_use) -{ - if (bitset_get(future_active, virtual_register_id)) - { - todo(); - } - - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto mask = thread_register_mask_get(thread, virtual_register->mask); - - if (virtual_register->assigned >= 0) - { - bitset_set_value(active, virtual_register_id, 1); - return 1; - } - else if (register_mask_spill(*mask)) - { - todo(); - } - else if (mask->class == REGISTER_CLASS_STACK) - { - todo(); - } - - auto mask_value = mask->mask; - auto old_in_use = in_use; - in_use |= ~mask_value; - print("Vreg mask: {u32:x}. Complement: {u32:x}. In use before: {u32:x}. In use after: {u32:x}\n", mask_value, ~mask_value, old_in_use, in_use); - - spills->length = 0; - - *vb_add(spills, 1) = virtual_register_id; - - FOREACH_SET(i, active) - { - print("Active[{u64}] set\n", i); - VirtualRegister* other = &virtual_registers.pointer[i]; - if (other->class == mask->class) - { - print("Interfere with active: {u32}\n", (s32)other->assigned); - in_use |= ((u32)1 << other->assigned); - *vb_add(spills, 1) = cast_to(u32, u64, i); - } - } - - FOREACH_SET(i, future_active) - { - print("Future active[{u64}] set\n", i); - VirtualRegister* other = &virtual_registers.pointer[i]; - if (other->class == mask->class && (in_use & ((u32)1 << other->assigned)) == 0) - { - if (interfere(thread, scheduled, bb, order, virtual_register->node_index, other->node_index)) - { - todo(); - } - } - } - - NodeIndex node_index = virtual_register->node_index; - auto hint_vreg = virtual_register->hint_vreg; - auto shared_edge = node_to_address(thread, node_index); - - if (shared_edge >= 0) - { - todo(); - } - - if (in_use == UINT32_MAX) - { - return 0; - } - - virtual_register->class = mask->class; - - auto hint_virtual_register = virtual_registers.pointer[hint_vreg]; - - s32 hint_reg = hint_vreg > 0 && hint_virtual_register.class == mask->class ? - hint_virtual_register.assigned : -1; - - print("IN USE: {u32:x}: ~ -> {u32:x}\n", in_use, ~in_use); - - if (hint_reg >= 0 && (in_use & ((u64)1 << hint_reg)) == 0) - { - todo(); - } - else - { - virtual_register->assigned = cast_to(s16, s32, __builtin_ffsll(~in_use) - 1); - print("Register assigned: {s}\n", gpr_to_string((GPR)virtual_register->assigned)); - } - - bitset_set_value(active, virtual_register_id, 1); - - return 1; -} - -fn s32 machine_operand_at(u32* virtual_register_map, VirtualBuffer(VirtualRegister) virtual_registers, NodeIndex node_index, s32 class) -{ - assert(validi(node_index)); - auto virtual_register_id = virtual_register_map[geti(node_index)]; - assert(virtual_register_id > 0); - assert(virtual_register_id < virtual_registers.length); - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - assert(virtual_register->assigned >= 0); - assert(virtual_register->class == class); - - return virtual_register->assigned; -} - -typedef enum MachineOperandId : u8 -{ - MACHINE_OPERAND_MEMORY, - MACHINE_OPERAND_GPR, - MACHINE_OPERAND_XMM, -} MachineOperandId; - -STRUCT(MachineOperand) -{ - MachineOperandId id; - s16 register_value; -}; - -fn MachineOperand operand_from_node(VirtualBuffer(VirtualRegister) virtual_registers, u32* virtual_register_map, NodeIndex node_index) -{ - assert(validi(node_index)); - auto virtual_register_id = virtual_register_map[geti(node_index)]; - assert(virtual_register_id > 0); - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - - if (virtual_register->class == REGISTER_CLASS_STACK) - { - todo(); - } - else - { - assert(virtual_register->assigned >= 0); - MachineOperandId id; - switch (virtual_register->class) - { - case REGISTER_CLASS_X86_64_GPR: - id = MACHINE_OPERAND_GPR; - break; - default: - todo(); - } - - return (MachineOperand) { - .id = id, - .register_value = virtual_register->assigned, - }; - } - - todo(); -} - -fn void node_ready_up(Thread* thread, Scheduler* scheduler, NodeIndex node_index, Node* end) -{ - auto* node = thread_node_get(thread, node_index); - auto priority = node_get_latency(thread, node, end); - auto unit_mask = node_get_unit_mask(thread, node); - - bitset_set_value(&scheduler->ready_set, geti(node_index), 1); - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - - u32 i; - auto count = scheduler->ready.length; - - for (i = 0; i < count; i += 1) - { - if (cast_to(s32, u64, priority) < scheduler->ready.pointer[i].priority) - { - break; - } - } - - *vb_add(&scheduler->ready, 1) = (ReadyNode){}; - - memmove(&scheduler->ready.pointer[i + 1], &scheduler->ready.pointer[i], (count - i) * sizeof(ReadyNode)); - - // print("Readying up node #{u32} ({s}) at index {u32}\n", geti(node_index), node_id_to_string(node->id), i); - - scheduler->ready.pointer[i] = (ReadyNode) { - .node_index = node_index, - .priority = cast_to(s32, u64, priority), - .unit_mask = unit_mask, - }; -} - -STRUCT(FixedBlockMap) -{ - NodeIndex* keys; - u32 count; -}; - -fn FixedBlockMap fixed_block_map_create(Thread* restrict thread, u32 count) -{ - auto* pointer = arena_allocate_bytes(thread->arena, sizeof(NodeIndex) * count + sizeof(BasicBlockIndex) * count, MAX(alignof(BasicBlockIndex), alignof(NodeIndex))); - return (FixedBlockMap) { - .keys = (NodeIndex*)pointer, - .count = count, - }; -} - -fn BasicBlockIndex* fixed_block_map_values(FixedBlockMap* restrict map) -{ - return (BasicBlockIndex*)(map->keys + map->count); -} - -fn void fixed_block_map_put(FixedBlockMap* restrict map, NodeIndex key, BasicBlockIndex value) -{ - auto count = map->count; - for (u32 i = 0; i < count; i += 1) - { - if (index_equal(key, map->keys[i])) - { - fixed_block_map_values(map)[i] = value; - break; - } - else if (!validi(map->keys[i])) - { - map->keys[i] = key; - fixed_block_map_values(map)[i] = value; - break; - } - } -} - -fn BasicBlockIndex fixed_block_map_get(FixedBlockMap* restrict map, NodeIndex key) -{ - auto count = map->count; - for (u32 i = 0; i < count; i += 1) - { - if (index_equal(key, map->keys[i])) - { - return fixed_block_map_values(map)[i]; - } - } - - return invalidi(BasicBlock); -} - -STRUCT(CFGBuilder) -{ - VirtualBuffer(NodeIndex) pinned; - VirtualBuffer(BasicBlock) basic_blocks; - VirtualBuffer(BasicBlockIndex) scheduled; - FixedBlockMap block_map; - WorkListHandle walker; - WorkListHandle worker; -}; - -fn CFGBuilder cfg_builder_init(Thread* restrict thread) -{ - CFGBuilder cfg_builder = {}; - cfg_builder.walker = thread_worklist_acquire(thread); - cfg_builder.worker = thread_worklist_acquire(thread); - - return cfg_builder; -} - -fn void cfg_builder_clear(CFGBuilder* restrict builder, Thread* restrict thread) -{ - thread_worklist_clear(thread, builder->walker); - thread_worklist_clear(thread, builder->worker); - - builder->pinned.length = 0; - builder->basic_blocks.length = 0; - builder->scheduled.length = 0; -} - -fn BasicBlockIndex cfg_get_predicate_basic_block(Thread* restrict thread, FixedBlockMap* map, NodeIndex arg_node_index, u16 i) -{ - auto* arg_node = thread_node_get(thread, arg_node_index); - auto arg_inputs = node_get_inputs(thread, arg_node); - auto node_index = arg_inputs.pointer[i]; - - while (1) - { - auto* node = thread_node_get(thread, node_index); - - auto search = fixed_block_map_get(map, node_index); - - if (validi(search)) - { - return search; - } - else - { - // TODO: or dead - if (node->id == IR_REGION) - { - return invalidi(BasicBlock); - } - } - - auto inputs = node_get_inputs(thread, node); - node_index = inputs.pointer[0]; - } - - unreachable(); -} - -fn void cfg_build(CFGBuilder* restrict builder, Thread* restrict thread, Function* restrict function) -{ - thread_worklist_push(thread, builder->worker, function->root); - - for (u32 i = 0; i < thread_worklist_length(thread, builder->worker); i += 1) - { - NodeIndex node_index = thread_worklist_get(thread, builder->worker, i); - Node* node = thread_node_get(thread, node_index); - auto pin = 0; - switch (node->id) - { - case IR_ROOT: - case IR_PHI: - case IR_RETURN: - case IR_REGION: - pin = 1; - break; - case IR_PROJECTION: - case IR_INTEGER_CONSTANT: - case IR_SYMBOL_TABLE: - break; - default: - todo(); - } - - if (pin) - { - *vb_add(&builder->pinned, 1) = node_index; - } - - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - assert(validi(output)); - thread_worklist_push(thread, builder->worker, output); - } - } - - thread_worklist_clear(thread, builder->worker); - - for (u64 pin_index = 0; pin_index < builder->pinned.length; pin_index += 1) - { - auto pinned_node_index = builder->pinned.pointer[pin_index]; - thread_worklist_push(thread, builder->walker, pinned_node_index); - // auto* pinned_node = thread_node_get(thread, pinned_node_index); - - while (thread_worklist_length(thread, builder->walker) > 0) - { - auto node_index = thread_worklist_pop_array(thread, builder->walker); - auto* node = thread_node_get(thread, node_index); - assert(node->interned); - auto inputs = node_get_inputs(thread, node); - auto outputs = node_get_outputs(thread, node); - - if (node->id != IR_PROJECTION && node->output_count == 0) - { - todo(); - } - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_MEMORY) - { - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - if (output->output_count == 0) - { - thread_worklist_push(thread, builder->worker, output_index); - } - } - } - - node_gvn_remove(thread, node_index); - - auto new_node_index = node_select_instruction(thread, node_index); - - if (validi(new_node_index) && !index_equal(node_index, new_node_index)) - { - todo(); - } - - for (auto i = inputs.length; i > 0; i -= 1) - { - auto input = inputs.pointer[i - 1]; - if (validi(input)) - { - thread_worklist_push(thread, builder->walker, input); - } - } - - if (node->id == IR_REGION) - { - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - assert(validi(output_index)); - auto output = thread_node_get(thread, output_index); - if (output->id) - { - thread_worklist_push(thread, builder->walker, output_index); - } - } - } - } - } - - auto control_start = function_get_control_start(thread, function); - auto* top = create_block(thread, control_start); - thread_worklist_clear(thread, builder->worker); - thread_worklist_test_and_set(thread, builder->worker, control_start); - - while (top) - { - auto successor_count = top->successor_count; - if (successor_count > 0) - { - auto index = successor_count - 1; - auto node_index = top->successors[index]; - assert(validi(node_index)); - top->successor_count = index; - - // Returns valid when the node hasnt been pushed to the worklist yet - if (!thread_worklist_test_and_set(thread, builder->worker, node_index)) - { - auto* new_top = create_block(thread, node_index); - new_top->parent = top; - top = new_top; - } - } - else - { - Block* parent = top->parent; - *vb_add(&builder->basic_blocks, 1) = (BasicBlock) { - .start = top->start, - .end = top->end, - .dominator_depth = -1, - }; - - top = parent; - } - } - - for (u32 i = 0; i < builder->basic_blocks.length / 2; i += 1) - { - SWAP(builder->basic_blocks.pointer[i], builder->basic_blocks.pointer[(builder->basic_blocks.length - 1) - i]); - } - - auto* blocks = builder->basic_blocks.pointer; - blocks[0].dominator_depth = 0; - blocks[0].dominator = Index(BasicBlock, 0); - auto block_count = builder->basic_blocks.length; - - builder->block_map = fixed_block_map_create(thread, block_count); - for (u32 i = 0; i < block_count; i += 1) - { - auto* block = &blocks[i]; - auto block_index = Index(BasicBlock, i); - fixed_block_map_put(&builder->block_map, block->start, block_index); - } - - // Compute dominators - u8 changed = 1; - while (changed) - { - changed = 0; - - for (u32 i = 1; i < block_count; i += 1) - { - // auto basic_block_index = Index(BasicBlock, i); - auto* basic_block = &blocks[i]; - - auto new_immediate_dominator_index = invalidi(BasicBlock); - - auto start_index = basic_block->start; - auto* start_node = thread_node_get(thread, start_index); - - // auto start_inputs = node_get_inputs(thread, start_node); - - for (u16 j = 0; j < start_node->input_count; j += 1) - { - auto predecessor_basic_block_index = cfg_get_predicate_basic_block(thread, &builder->block_map, start_index, j); - if (validi(predecessor_basic_block_index)) - { - auto* predecessor_basic_block = &blocks[geti(predecessor_basic_block_index)]; - auto immediate_dominator_predecessor_index = predecessor_basic_block->dominator; - if (validi(immediate_dominator_predecessor_index)) - { - if (validi(new_immediate_dominator_index)) - { - todo(); - } - else - { - new_immediate_dominator_index = predecessor_basic_block_index; - } - } - } - } - - assert(validi(new_immediate_dominator_index)); - if (!index_equal(basic_block->dominator, new_immediate_dominator_index)) - { - basic_block->dominator = new_immediate_dominator_index; - changed = 1; - } - } - } - - // Compute the depths - for (u32 i = 0; i < block_count; i += 1) - { - auto basic_block_index = Index(BasicBlock, i); - auto* basic_block = &blocks[geti(basic_block_index)]; - auto current_index = basic_block_index; - s32 depth = 0; - while (1) - { - auto* current = &blocks[geti(current_index)]; - if (current->dominator_depth >= 0) - { - break; - } - - current_index = current->dominator; - depth += 1; - } - - auto* current = &blocks[geti(current_index)]; - basic_block->dominator_depth = depth + current->dominator_depth; - } -} - -STRUCT(GlobalScheduleOptions) -{ - u8 dataflow:1; -}; - -fn void basic_block_add_node(Thread* restrict thread, BasicBlock* restrict basic_block, NodeIndex node_index, u32 place) -{ - // if (geti(node_index) == 1) - // { - // breakpoint(); - // } - print("[PLACE #{u32}] Adding node #{u32} ({s}) to basic block 0x{u64:x} with index {u32}\n", place, geti(node_index), node_id_to_string(thread_node_get(thread, node_index)->id), basic_block, basic_block->items.length); - *vb_add(&basic_block->items, 1) = node_index; -} - -fn void cfg_global_schedule(CFGBuilder* restrict builder, Thread* restrict thread, Function* restrict function, GlobalScheduleOptions options) -{ - // Global code motion - - auto node_count = thread->buffer.nodes.length; - vb_add(&builder->scheduled, thread->buffer.nodes.length); - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - bitset_ensure_length(&basic_block->live_in, node_count); - bitset_ensure_length(&basic_block->live_out, node_count); - } - - auto bb0 = Index(BasicBlock, cast_to(u32, s64, &builder->basic_blocks.pointer[0] - builder->basic_blocks.pointer)); - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - auto bb_index = Index(BasicBlock, cast_to(u32, s64, basic_block - builder->basic_blocks.pointer)); - builder->scheduled.pointer[geti(basic_block->start)] = bb_index; - - if (i == 0) - { - auto* root_node = thread_node_get(thread, function->root); - auto outputs = node_get_outputs(thread, root_node); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - builder->scheduled.pointer[geti(output)] = bb0; - basic_block_add_node(thread, &builder->basic_blocks.pointer[0], output, 0); - } - } - - auto* start = thread_node_get(thread, basic_block->start); - if (start->id == IR_REGION) - { - basic_block_add_node(thread, basic_block, basic_block->start, 1); - - auto outputs = node_get_outputs(thread, start); - - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output); - if (output_node->id == IR_PHI) - { - builder->scheduled.pointer[geti(output)] = bb_index; - basic_block_add_node(thread, basic_block, output, 2); - } - } - } - } - - thread_worklist_clear(thread, builder->worker); - thread_worklist_push(thread, builder->worker, function->root); - - VirtualBuffer(NodeIndex) pins = {}; - - for (u32 i = 0; i < thread_worklist_length(thread, builder->worker); i += 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i); - auto* node = thread_node_get(thread, node_index); - if (node->id != IR_ROOT && node_is_pinned(node)) - { - auto bb_index = builder->scheduled.pointer[geti(node_index)]; - if (node->id == IR_PROJECTION && !node_is_pinned(thread_node_get(thread, node_get_inputs(thread, node).pointer[0]))) - { - } - else - { - auto current = node_index; - while (!validi(bb_index)) - { - bb_index = builder->scheduled.pointer[geti(current)]; - auto* current_node = thread_node_get(thread, current); - auto current_inputs = node_get_inputs(thread, current_node); - current = current_inputs.pointer[0]; - } - - auto* basic_block = &builder->basic_blocks.pointer[geti(bb_index)]; - builder->scheduled.pointer[geti(node_index)] = bb_index; - *vb_add(&pins, 1) = node_index; - basic_block_add_node(thread, basic_block, node_index, 3); - } - } - - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - thread_worklist_push(thread, builder->worker, output); - } - } - - // Early schedule - thread_worklist_clear(thread, builder->worker); - - for (u32 i = 0; i < pins.length; i += 1) - { - auto pin_node_index = pins.pointer[i]; - auto* pin = thread_node_get(thread, pin_node_index); - - STRUCT(Elem) - { - struct Elem* parent; - NodeIndex node; - u32 i; - }; - - auto* top = arena_allocate(thread->arena, Elem, 1); - *top = (Elem) - { - .node = pin_node_index, - .parent = 0, - .i = pin->input_count, - }; - - while (top) - { - NodeIndex node_index = top->node; - Node* node = thread_node_get(thread, node_index); - auto node_inputs = node_get_inputs(thread, node); - - if (top->i > 0) - { - auto new_top_i = top->i - 1; - top->i = new_top_i; - NodeIndex input_index = node_inputs.pointer[new_top_i]; - - if (validi(input_index)) - { - Node* input = thread_node_get(thread, input_index); - if (input->id == IR_PROJECTION) - { - auto input_inputs = node_get_inputs(thread, input); - input_index = input_inputs.pointer[0]; - input = thread_node_get(thread, input_index); - } - - if (!node_is_pinned(input) && !thread_worklist_test_and_set(thread, builder->worker, input_index)) - { - auto* new_top = arena_allocate(thread->arena, Elem, 1); - *new_top = (Elem) - { - .parent = top, - .node = input_index, - .i = input->input_count, - }; - - top = new_top; - } - } - - continue; - } - - if (!index_equal(node_index, pin_node_index)) - { - auto best = Index(BasicBlock, 0); - s32 best_depth = 0; - - auto inputs = node_get_inputs(thread, node); - - for (u16 i = 0; i < node->input_count; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - auto basic_block_index = builder->scheduled.pointer[geti(input_index)]; - if (validi(basic_block_index)) - { - auto* basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - - if (best_depth < basic_block->dominator_depth) - { - best_depth = basic_block->dominator_depth; - best = basic_block_index; - } - } - } - } - - builder->scheduled.pointer[geti(node_index)] = best; - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - - thread_worklist_push_array(thread, builder->worker, node_index); - } - - top = top->parent; - } - } - - // Late schedule - for (u32 i = thread_worklist_length(thread, builder->worker); i > 0; i -= 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i - 1); - auto* node = thread_node_get(thread, node_index); - assert(!node_is_pinned(node)); - auto current_basic_block_index = builder->scheduled.pointer[geti(node_index)]; - auto current_basic_block = &builder->basic_blocks.pointer[geti(current_basic_block_index)]; - - auto lca = invalidi(BasicBlock); - - if (!node_has_memory_out(node->id)) - { - auto memory_in = node_memory_in(thread, node); - if (validi(memory_in)) - { - todo(); - } - } - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - else - { - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output = outputs.pointer[i]; - auto use_block_index = find_use_block(thread, builder->scheduled, node_index, node_index, output); - if (validi(use_block_index)) - { - lca = find_lca(lca, use_block_index); - } - } - } - - if (validi(lca)) - { - todo(); - } - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - - basic_block_add_node(thread, current_basic_block, node_index, 4); - } - - if (options.dataflow) - { - dataflow(thread, builder->worker, builder->basic_blocks, builder->scheduled, node_count); - } -} - -fn void cfg_build_and_global_schedule(CFGBuilder* restrict builder, Thread* restrict thread, Function* restrict function, GlobalScheduleOptions options) -{ - cfg_build(builder, thread, function); - - cfg_global_schedule(builder, thread, function, options); -} - -fn void cfg_list_schedule(Thread* restrict thread, CFGBuilder* restrict builder, Function* restrict function, BasicBlockIndex basic_block_index) -{ - // print("=================================\nLIST SCHEDULER START\n=================================\n"); - thread_worklist_clear(thread, builder->worker); - - auto* restrict basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - thread_worklist_push(thread, builder->worker, basic_block->start); - - if (geti(basic_block_index) == 0) - { - auto* root_node = thread_node_get(thread, function->root); - auto root_outputs = node_get_outputs(thread, root_node); - - for (u32 i = 0; i < root_outputs.length; i += 1) - { - auto output = root_outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output); - if (output_node->id == IR_PROJECTION) - { - thread_worklist_push(thread, builder->worker, output); - } - } - } - else - { - auto* bb_start = thread_node_get(thread, basic_block->start); - auto outputs = node_get_outputs(thread, bb_start); - for (u32 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - if (output->id == IR_PHI) - { - thread_worklist_push(thread, builder->worker, output_index); - } - } - } - - auto end_index = basic_block->end; - auto* end = thread_node_get(thread, end_index); - Scheduler scheduler = {}; - bitset_ensure_length(&scheduler.ready_set, thread->buffer.nodes.length); - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - - if (!thread_worklist_test(thread, builder->worker, node_index) && index_equal(builder->scheduled.pointer[geti(node_index)], basic_block_index) && node_is_ready(thread, builder->scheduled, builder->worker, node, basic_block_index)) - { - node_ready_up(thread, &scheduler, node_index, end); - } - } - - // TODO: IS BRANCH - VirtualBuffer(InFlightNode) active = {}; - u64 in_use_mask = 0; - u64 blocked_mask = UINT64_MAX >> (64 - 1); - u32 cycle = 0; - - while (active.length > 0 || scheduler.ready.length > 0) - { - while (in_use_mask != blocked_mask && scheduler.ready.length > 0) - { - auto signed_index = node_best_ready(&scheduler, in_use_mask); - if (signed_index < 0) - { - break; - } - auto index = cast_to(u32, s32, signed_index); - auto available = scheduler.ready.pointer[index].unit_mask & ~in_use_mask; - auto unit_i = __builtin_ffsll(cast_to(s64, u64, available)) - 1; - - auto node_index = scheduler.ready.pointer[index].node_index; - auto* node = thread_node_get(thread, node_index); - - in_use_mask |= (u64)1 << unit_i; - - if (index + 1 < scheduler.ready.length) - { - todo(); - } - - scheduler.ready.length -= 1; - assert(node->id != IR_PROJECTION); - - auto end_cycle = cycle + node_get_latency(thread, node, end); - *vb_add(&active, 1) = (InFlightNode) - { - .node_index = node_index, - .end = cast_to(u32, u64, end_cycle), - .unit_i = unit_i, - }; - - if (node != end) - { - thread_worklist_push(thread, builder->worker, node_index); - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - } - } - - cycle += 1; - - for (u32 i = 0; i < active.length; i += 1) - { - auto active_i = active.pointer[i]; - auto node_index = active_i.node_index; - auto* node = thread_node_get(thread, node_index); - - if (active_i.end > cycle) - { - i += 1; - continue; - } - - in_use_mask &= ~((u64)1 << active_i.unit_i); - auto last = active.pointer[active.length - 1]; - active.pointer[i] = last; - active.length -= 1; - - auto outputs = node_get_outputs(thread, node); - for (u16 i = 0; i < outputs.length; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output = thread_node_get(thread, output_index); - if (output->id == IR_PROJECTION) - { - print("TODO: proj\n"); - todo(); - } - else if (!bitset_get(&scheduler.ready_set, geti(output_index)) && index_equal(builder->scheduled.pointer[geti(output_index)], basic_block_index) && !thread_worklist_test(thread, builder->worker, output_index) && node_is_ready(thread, builder->scheduled, builder->worker, output, basic_block_index)) - { - node_ready_up(thread, &scheduler, output_index, end); - } - } - } - } - - if (!index_equal(end_index, basic_block->start)) - { - thread_worklist_push(thread, builder->worker, end_index); - } - // print("=================================\nLIST SCHEDULER END\n=================================\n"); -} - -fn u8 operand_equal(MachineOperand a, MachineOperand b) -{ - if (a.id != b.id) - { - return 0; - } - - if (a.id == MACHINE_OPERAND_MEMORY) - { - todo(); - } - - return (a.id == MACHINE_OPERAND_GPR || a.id == MACHINE_OPERAND_XMM) ? a.register_value == b.register_value : 0; -} - -typedef enum MachOCpuType : u32 -{ - MACHO_CPU_X86 = 7, - MACHO_CPU_ARM = 12, - MACHO_CPU_X86_64 = MACHO_CPU_X86 | 0x1000000, - MACHO_CPU_ARM64 = MACHO_CPU_ARM | 0x1000000, - MACHO_CPU_ANY = 0xffffffff, -} MachOCpuType; - -typedef enum MachOFileType : u32 -{ - MACHO_FILE_OBJECT = 1, - MACHO_FILE_EXECUTABLE = 2, - MACHO_FILE_FVM_LIB = 3, - MACHO_FILE_CORE = 4, - MACHO_FILE_PRELOAD = 5, - MACHO_FILE_DYLIB = 6, - MACHO_FILE_DYLINKER = 7, - MACHO_FILE_BUNDLE = 8, - MACHO_FILE_DYLIB_STUB = 9, - MACHO_FILE_DSYM = 10, - MACHO_FILE_KEXT_BUNDLE = 11, -} MachOFileType; - -STRUCT(MachOFlags) -{ - u32 no_undefined:1; - u32 incremental_link:1; - u32 dyld_link:1; - u32 binary_data_load:1; - u32 prebound:1; - u32 split_segments:1; - u32 lazy_init:1; - u32 two_level:1; - u32 force_flat:1; - u32 no_multi_definitions:1; - u32 no_fix_prebinding:1; - u32 prebindable:1; - u32 all_mods_bound:1; - u32 sub_sections_via_symbols:1; - u32 canonical:1; - u32 weak_defines:1; - u32 binds_to_weak:1; - u32 allow_stack_execution:1; - u32 root_safe:1; - u32 setuid_safe:1; - u32 no_reexported_dylibs:1; - u32 pie:1; - u32 dead_strippable_dylib:1; - u32 has_tlv_descriptors:1; - u32 no_heap_execution:1; - u32 app_extension_safe:1; - u32 n_list_out_of_sync_with_dyldinof:1; - u32 simulator_support:1; - u32 padding:3; - u32 dyld_cache:1; -}; - -static_assert(sizeof(MachOFlags) == sizeof(u32)); - -STRUCT(MachOHeader) -{ - u32 magic; - MachOCpuType cpu_type; - u32 sub_cpu_type:24; - u32 padding:7; - u32 lib64:1; - MachOFileType file_type; - u32 command_count; - u32 command_total_size; - MachOFlags flags; - u32 reserved; -}; - -static_assert(sizeof(MachOHeader) == 0x20); - -typedef enum MachOLoadCommandId : u32 -{ - LC_SEGMENT = 0x00000001, - LC_SYMTAB = 0x00000002, - LC_SYMSEG = 0x00000003, - LC_THREAD = 0x00000004, - LC_UNIXTHREAD = 0x00000005, - LC_LOADFVMLIB = 0x00000006, - LC_IDFVMLIB = 0x00000007, - LC_IDENT = 0x00000008, - LC_FVMFILE = 0x00000009, - LC_PREPAGE = 0x0000000A, - LC_DYSYMTAB = 0x0000000B, - LC_LOAD_DYLIB = 0x0000000C, - LC_ID_DYLIB = 0x0000000D, - LC_LOAD_DYLINKER = 0x0000000E, - LC_ID_DYLINKER = 0x0000000F, - LC_PREBOUND_DYLIB = 0x00000010, - LC_ROUTINES = 0x00000011, - LC_SUB_FRAMEWORK = 0x00000012, - LC_SUB_UMBRELLA = 0x00000013, - LC_SUB_CLIENT = 0x00000014, - LC_SUB_LIBRARY = 0x00000015, - LC_TWOLEVEL_HINTS = 0x00000016, - LC_PREBIND_CKSUM = 0x00000017, - LC_LOAD_WEAK_DYLIB = 0x80000018, - LC_SEGMENT_64 = 0x00000019, - LC_ROUTINES_64 = 0x0000001A, - LC_UUID = 0x0000001B, - LC_RPATH = 0x8000001C, - LC_CODE_SIGNATURE = 0x0000001D, - LC_SEGMENT_SPLIT_INFO = 0x0000001E, - LC_REEXPORT_DYLIB = 0x8000001F, - LC_LAZY_LOAD_DYLIB = 0x00000020, - LC_ENCRYPTION_INFO = 0x00000021, - LC_DYLD_INFO = 0x00000022, - LC_DYLD_INFO_ONLY = 0x80000022, - LC_LOAD_UPWARD_DYLIB = 0x80000023, - LC_VERSION_MIN_MACOSX = 0x00000024, - LC_VERSION_MIN_IPHONEOS = 0x00000025, - LC_FUNCTION_STARTS = 0x00000026, - LC_DYLD_ENVIRONMENT = 0x00000027, - LC_MAIN = 0x80000028, - LC_DATA_IN_CODE = 0x00000029, - LC_SOURCE_VERSION = 0x0000002A, - LC_DYLIB_CODE_SIGN_DRS = 0x0000002B, - LC_ENCRYPTION_INFO_64 = 0x0000002C, - LC_LINKER_OPTION = 0x0000002D, - LC_LINKER_OPTIMIZATION_HINT = 0x0000002E, - LC_VERSION_MIN_TVOS = 0x0000002F, - LC_VERSION_MIN_WATCHOS = 0x00000030, - LC_NOTE = 0x00000031, - LC_BUILD_VERSION = 0x00000032, - LC_DYLD_EXPORTS_TRIE = 0x80000033, - LC_DYLD_CHAINED_FIXUPS = 0x80000034, - LC_FILESET_ENTRY = 0x80000035, - LC_ATOM_INFO = 0x00000036, -} MachOLoadCommandId; - -STRUCT(MachOName16) -{ - u8 name[16]; -}; - -fn MachOName16 macho_name16(String string) -{ - MachOName16 result = {}; - assert(string.length <= array_length(result.name)); - memcpy(result.name, string.pointer, string.length); - - return result; -} - -STRUCT(MachOSegment) -{ - MachOName16 name; - u64 memory_address; - u64 memory_size; - u64 file_offset; - u64 file_size; - u32 max_protection; - u32 initial_protection; - u32 section_count; - u32 flags; -}; -static_assert(sizeof(MachOSegment) == 64); - -STRUCT(MachOCommand) -{ - MachOLoadCommandId id; - u32 command_size; -}; -static_assert(sizeof(MachOCommand) == 8); - -STRUCT(MachOSection) -{ - MachOName16 section_name; - MachOName16 segment_name; - u64 address; - u64 size; - u32 offset; - u32 alignment; - u32 relocation_offset; - u32 relocation_count; - u32 flags; - u8 reserved[12]; -}; -static_assert(sizeof(MachOSection) == 0x50); - -fn String write_macho(Thread* restrict thread, ObjectOptions options) -{ - unused(thread); - unused(options); - VirtualBuffer(u8) file = {}; - MachOHeader header = { - .magic = 0xfeedfacf, - .cpu_type = MACHO_CPU_ARM64, - .file_type = MACHO_FILE_EXECUTABLE, - .command_count = 15, - .command_total_size = 688, - .flags = { - .no_undefined = 1, - .dyld_link = 1, - .two_level = 1, - .pie = 1, - }, - }; - vb_copy_scalar(&file, header); - - MachOCommand page_zero_command = { - .id = LC_SEGMENT_64, - .command_size = sizeof(MachOCommand) + sizeof(MachOSegment), - }; - vb_copy_scalar(&file, page_zero_command); - - MachOSegment page_zero_segment = { - .name = macho_name16(strlit("__PAGEZERO")), - .memory_size = GB(4), - }; - vb_copy_scalar(&file, page_zero_segment); - - MachOCommand text_command = { - .id = LC_SEGMENT_64, - .command_size = 232, - }; - vb_copy_scalar(&file, text_command); - - MachOSection text_section = { - .section_name = macho_name16(strlit("__text")), - .segment_name = macho_name16(strlit("__TEXT")), - .address = 0x100003fa0, - .size = 8, - .offset = 16288, - .alignment = 2, - .relocation_offset = 0, - .relocation_count = 0, - .flags = 0x80000400, - }; - - MachOSection unwind_info_section = { - .section_name = macho_name16(strlit("__unwind_info")), - .segment_name = macho_name16(strlit("__TEXT")), - .address = 0x100003fa8, - .size = 88, - .offset = 16296, - .alignment = 2, - .relocation_offset = 0, - .relocation_count = 0, - .flags = 0, - }; - - MachOSegment text_segment = { - .name = macho_name16(strlit("__TEXT")), - .memory_address = GB(4), - .memory_size = KB(16), - .file_offset = 0, - .file_size = KB(16), - .max_protection = 5, - .initial_protection = 5, - .section_count = 2, - .flags = 0, - }; - - vb_copy_scalar(&file, text_segment); - - assert(file.length == 0xb0); - vb_copy_scalar(&file, text_section); - vb_align(&file, 0x10); - vb_copy_scalar(&file, unwind_info_section); - - MachOCommand linkedit_command = { - .id = LC_SEGMENT_64, - .command_size = sizeof(MachOCommand) + sizeof(MachOSegment), - }; - vb_copy_scalar(&file, linkedit_command); - - MachOSegment linkedit_segment = { - .name = macho_name16(strlit("__LINKEDIT")), - .memory_address = 0x100004000, - .memory_size = KB(16), - .file_offset = KB(16), - .file_size = 688, - .max_protection = 1, - .initial_protection = 1, - .section_count = 0, - .flags = 0, - }; - vb_copy_scalar(&file, linkedit_segment); - - MachOCommand chained_fixups_command = { - .id = LC_DYLD_CHAINED_FIXUPS, - .command_size = 16, - }; - vb_copy_scalar(&file, chained_fixups_command); - - { - u8 blob[] = { 0x00, 0x40, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand exports_trie_command = { - .id = LC_DYLD_EXPORTS_TRIE, - .command_size = 16, - }; - vb_copy_scalar(&file, exports_trie_command); - - { - u8 blob[] = { 0x38, 0x40, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand symtab_command = { - .id = LC_SYMTAB, - .command_size = 24, - }; - vb_copy_scalar(&file, symtab_command); - - { - u8 blob[] = { 0x70, 0x40, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand dysymtab_command = { - .id = LC_DYSYMTAB, - .command_size = 80, - }; - vb_copy_scalar(&file, dysymtab_command); - - { - u8 blob[] = { - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - vb_copy_any_array(&file, blob); - } - - MachOCommand load_dylinker_command = { - .id = LC_LOAD_DYLINKER, - .command_size = 32, - }; - vb_copy_scalar(&file, load_dylinker_command); - - { - u8 blob[] = { 0x0C, 0x00, 0x00, 0x00, 0x2F, 0x75, 0x73, 0x72, 0x2F, 0x6C, 0x69, 0x62, 0x2F, 0x64, 0x79, 0x6C, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand uuid_command = { - .id = LC_UUID, - .command_size = 24, - }; - vb_copy_scalar(&file, uuid_command); - - { - u8 uuid[] = { 0x9C, 0x6F, 0xC9, 0x12, 0xED, 0x7F, 0x39, 0x3A, 0x99, 0xA7, 0x93, 0x4B, 0xF6, 0xD1, 0x4D, 0xA1, }; - vb_copy_any_array(&file, uuid); - } - - MachOCommand build_version_command = { - .id = LC_BUILD_VERSION, - .command_size = 32, - }; - vb_copy_scalar(&file, build_version_command); - - { - u8 blob[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x07, 0x5B, 0x04, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand source_version_command = { - .id = LC_SOURCE_VERSION, - .command_size = 16, - }; - vb_copy_scalar(&file, source_version_command); - - { - u8 blob[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand main_command = { - .id = LC_MAIN, - .command_size = 24, - }; - vb_copy_scalar(&file, main_command); - - { - u8 blob[] = { 0xA0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand function_starts_command = { - .id = LC_FUNCTION_STARTS, - .command_size = 16, - }; - vb_copy_scalar(&file, function_starts_command); - - { - u8 blob[] = { 0x68, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand data_in_code_command = { - .id = LC_DATA_IN_CODE, - .command_size = 16, - }; - vb_copy_scalar(&file, data_in_code_command); - { - u8 blob[] = { 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - vb_copy_any_array(&file, blob); - } - - MachOCommand code_signature_command = { - .id = LC_CODE_SIGNATURE, - .command_size = 16, - }; - vb_copy_scalar(&file, code_signature_command); - - { - u8 blob[] = { - 0x90, 0x41, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, - }; - vb_copy_any_array(&file, blob); - } - - // Pad - unused(vb_add(&file, text_section.offset - file.length)); - - u8 text_section_content[] = { 0x00, 0x00, 0x80, 0x52, 0xC0, 0x03, 0x5F, 0xD6, }; - vb_copy_any_array(&file, text_section_content); - - u8 unwind_info_section_content[] = { - 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - }; - vb_copy_any_array(&file, unwind_info_section_content); - - vb_align(&file, 0x4000); - - u8 linkedit_segment_content[] = { - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5F, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xA0, 0x7F, 0x00, 0x00, 0x02, 0x5F, 0x6D, 0x68, 0x5F, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5F, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x00, 0x09, - 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x0D, 0x00, 0x00, 0xA0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x42, 0x00, 0x00, 0x00, 0x66, 0x00, 0x01, 0x00, 0xC1, 0x6A, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2E, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x4E, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x00, 0x00, 0xA0, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x5F, 0x5F, 0x6D, 0x68, 0x5F, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x00, 0x5F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x2F, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x2F, 0x64, 0x61, 0x76, 0x69, 0x64, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, - 0x2F, 0x00, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5F, 0x6D, 0x61, 0x63, 0x6F, 0x73, 0x2E, - 0x63, 0x00, 0x2F, 0x55, 0x73, 0x65, 0x72, 0x73, 0x2F, 0x64, 0x61, 0x76, 0x69, 0x64, 0x2F, 0x6D, - 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5F, 0x6D, - 0x61, 0x63, 0x6F, 0x73, 0x2E, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFA, 0xDE, 0x0C, 0xC0, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x14, 0xFA, 0xDE, 0x0C, 0x02, 0x00, 0x00, 0x01, 0x06, 0x00, 0x02, 0x04, 0x00, - 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x41, 0x90, 0x20, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6D, 0x69, 0x6E, 0x69, - 0x6D, 0x61, 0x6C, 0x5F, 0x6D, 0x61, 0x63, 0x6F, 0x73, 0x00, 0x29, 0x0B, 0x00, 0xDF, 0x14, 0xC1, - 0xD7, 0x61, 0x76, 0xD6, 0xF1, 0xC4, 0x26, 0x31, 0xFC, 0xD7, 0x84, 0x22, 0x15, 0x80, 0xEB, 0xF4, - 0x62, 0x35, 0xD2, 0xC9, 0xF0, 0xE4, 0xA7, 0x6B, 0x9E, 0x1D, 0xAD, 0x7F, 0xAC, 0xB2, 0x58, 0x6F, - 0xC6, 0xE9, 0x66, 0xC0, 0x04, 0xD7, 0xD1, 0xD1, 0x6B, 0x02, 0x4F, 0x58, 0x05, 0xFF, 0x7C, 0xB4, - 0x7C, 0x7A, 0x85, 0xDA, 0xBD, 0x8B, 0x48, 0x89, 0x2C, 0xA7, 0xAD, 0x7F, 0xAC, 0xB2, 0x58, 0x6F, - 0xC6, 0xE9, 0x66, 0xC0, 0x04, 0xD7, 0xD1, 0xD1, 0x6B, 0x02, 0x4F, 0x58, 0x05, 0xFF, 0x7C, 0xB4, - 0x7C, 0x7A, 0x85, 0xDA, 0xBD, 0x8B, 0x48, 0x89, 0x2C, 0xA7, 0xB2, 0x8A, 0x42, 0xCA, 0x3E, 0x6B, - 0xB1, 0x77, 0x13, 0x4F, 0xAB, 0xB6, 0xBD, 0xE2, 0x2E, 0xFD, 0xD4, 0x30, 0x73, 0x08, 0x83, 0x9F, - 0xEC, 0x51, 0x51, 0x2E, 0xCD, 0x15, 0xD0, 0xA2, 0x37, 0x03, 0x4F, 0x6C, 0xF0, 0xCF, 0x98, 0xAE, - 0x46, 0xE9, 0x51, 0x8A, 0x78, 0xC3, 0x8A, 0x49, 0xF4, 0xA0, 0xBC, 0x62, 0x94, 0x68, 0xFD, 0xDE, - 0xA6, 0x9A, 0x08, 0xAD, 0x02, 0xF7, 0x1C, 0xD4, 0x19, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - - vb_copy_any_array(&file, linkedit_segment_content); - -#define CHECK 0 -#if CHECK - auto foo = file_read(thread->arena, strlit("C:/Users/David/dev/minimal_macos/minimal_macos")); - assert(file.length == foo.length); - - for (u32 i = 0; i < file.length; i += 1) - { - auto mine = file.pointer[i]; - auto original = foo.pointer[i]; - assert(mine == original); - } -#endif - - return (String) { file.pointer, file.length }; -} - -fn void code_generation(Thread* restrict thread, CodegenOptions options) -{ - auto cfg_builder = cfg_builder_init(thread); - auto* restrict builder = &cfg_builder; - VirtualBuffer(u8) code = {}; - - auto object_path = binary_path_from_options(thread->arena, (BinaryPathOptions) { - .build_directory = strlit(BB_DIR), - .name = options.test_name, - .target = options.target, - .backend = options.backend, - .binary_file_type = BINARY_FILE_OBJECT, - }); - - auto exe_path = binary_path_from_options(thread->arena, (BinaryPathOptions) { - .build_directory = strlit(BB_DIR), - .name = options.test_name, - .target = options.target, - .backend = options.backend, - .binary_file_type = BINARY_FILE_EXECUTABLE, - }); - - for (u32 function_i = 0; function_i < thread->buffer.functions.length; function_i += 1) - { - Function* restrict function = &thread->buffer.functions.pointer[function_i]; - cfg_builder_clear(builder, thread); - - cfg_build_and_global_schedule(builder, thread, function, (GlobalScheduleOptions) { - .dataflow = 1, - }); - - auto node_count = thread->buffer.nodes.length; - VirtualBuffer(VirtualRegister) virtual_registers = {}; - auto* virtual_register_map = arena_allocate(thread->arena, u32, round_up_to_next_power_of_2(node_count + 16)); - { - u32 max_ins = 0; - u32 virtual_register_count = 1; - VirtualBuffer(u32) spills = {}; - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto basic_block_index = Index(BasicBlock, i); - BasicBlock* basic_block = &builder->basic_blocks.pointer[i]; - - cfg_list_schedule(thread, builder, function, basic_block_index); - - auto max_item_count = thread_worklist_length(thread, builder->worker); - print("Item count: {u32}\n", max_item_count); - - basic_block->items.length = 0; - - for (u32 i = 0; i < max_item_count; i += 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i); - basic_block_add_node(thread, basic_block, node_index, 5); - auto* node = thread_node_get(thread, node_index); - auto def_mask = node_constraint(thread, node, (Slice(RegisterMaskIndex)){}); - auto inputs = node->input_count + node_tmp_count(node); - - if (inputs > max_ins) - { - max_ins = inputs; - } - - u32 virtual_register_id = 0; - if (!index_equal(def_mask, empty_register_mask)) - { - if (node->id == MACHINE_MOVE) - { - assert(node->output_count == 1); - auto outputs = node_get_outputs(thread, node); - auto phi_index = outputs.pointer[0]; - auto* phi = thread_node_get(thread, phi_index); - assert(phi->id == IR_PHI); - - if (virtual_register_map[geti(phi_index)] == 0) - { - virtual_register_id = virtual_register_count; - virtual_register_count += 1; - virtual_register_map[geti(phi_index)] = virtual_register_id; - } - else - { - todo(); - } - } - else if (node->id == IR_PHI && virtual_register_map[geti(node_index)] > 0) - { - virtual_register_id = virtual_register_map[geti(node_index)]; - } - else - { - virtual_register_id = virtual_register_count; - virtual_register_count += 1; - } - } - - virtual_register_map[geti(node_index)] = virtual_register_id; - print("Assigning VR{u32} to node #{u32} ({s})\n", virtual_register_id, geti(node_index), node_id_to_string(node->id)); - } - } - auto ins = (Slice(RegisterMaskIndex)) { - .pointer = arena_allocate(thread->arena, RegisterMaskIndex, max_ins), - .length = max_ins, - }; - // TODO: remove? - memset(ins.pointer, 0, sizeof(RegisterMaskIndex) * max_ins); - - vb_ensure_capacity(&virtual_registers, cast_to(u32, u64, round_up_to_next_power_of_2(virtual_register_count + 16))); - virtual_registers.length = virtual_register_count; - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - - print("BB items: {u32}\n", basic_block->items.length); - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - auto virtual_register_id = virtual_register_map[geti(node_index)]; - assert(virtual_register_id >= 0 && virtual_register_id < virtual_register_count); - - if (virtual_register_id > 0 && node->id != MACHINE_MOVE) - { - auto mask_index = node_constraint(thread, node, (Slice(RegisterMaskIndex)){}); - print("Node #{u32} ({s}), VR{u32}, mask: ", geti(node_index), node_id_to_string(node->id), virtual_register_id); - if (validi(mask_index)) - { - print("0x{u32:x}", thread_register_mask_get(thread, mask_index)->mask); - } - else - { - print("invalid"); - } - print("\n"); - virtual_registers.pointer[virtual_register_id] = (VirtualRegister) { - .mask = mask_index, - .node_index = node_index, - .assigned = -1, - .spill_cost = NAN, - }; - } - } - } - - thread_worklist_clear(thread, builder->worker); - - u32 max_registers_in_class = 0; - auto* fixed = arena_allocate(thread->arena, s32, REGISTER_CLASS_X86_64_COUNT); - auto* in_use = arena_allocate(thread->arena, u32, REGISTER_CLASS_X86_64_COUNT); - - for (u32 class = 0; class < REGISTER_CLASS_X86_64_COUNT; class += 1) - { - auto count = register_count_per_class[class]; - max_registers_in_class = MAX(max_registers_in_class, count); - auto base = virtual_registers.length; - - for (u32 i = 0; i < count; i += 1) - { - auto mask = register_mask_intern(thread, (RegisterMask) { - .class = class, - .may_spill = 0, - .mask = class == 0 ? i : ((u32)1 << i), - }); - - *vb_add(&virtual_registers, 1) = (VirtualRegister) { - .mask = mask, - .class = cast_to(s16, u32, class), - .assigned = cast_to(s16, u32, i), - .spill_cost = INFINITY, - }; - } - - fixed[class] = cast_to(s32, u32, base); - } - - // Insert legalizing moves - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - // auto basic_block_index = Index(BasicBlock, i); - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - auto tmp_count = node_tmp_count(node); - node_constraint(thread, node, ins); - - auto inputs = node_get_inputs(thread, node); - for (u16 i = 1; i < inputs.length; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - // auto* input = thread_node_get(thread, input_index); - auto in_mask_index = ins.pointer[i]; - - if (!index_equal(in_mask_index, empty_register_mask)) - { - auto in_mask = thread_register_mask_get(thread, in_mask_index); - VirtualRegister* vreg = 0; - auto vreg_index = virtual_register_map[geti(input_index)]; - if (vreg_index > 0) - { - vreg = &virtual_registers.pointer[vreg_index]; - } - assert(vreg); - auto vreg_mask = thread_register_mask_get(thread, vreg->mask); - - auto hint = fixed_register_mask(*in_mask); - if (hint >= 0 && vreg_mask->class == in_mask->class) - { - vreg->hint_vreg = fixed[in_mask->class] + hint; - } - - auto new_mask_index = register_mask_meet(thread, in_mask_index, vreg->mask); - print("Input #{u32} ({s})\n", geti(input_index), node_id_to_string(thread_node_get(thread, input_index)->id)); - print("IN mask index: {u32}. TODO: not equal: {u32}, {u32}, {u32}\n", i, in_mask_index, empty_register_mask, new_mask_index); - if (!index_equal(in_mask_index, empty_register_mask) && index_equal(new_mask_index, empty_register_mask)) - { - // if (node->id == MACHINE_COPY) - { - print("{s} input count: {u32}\n", node_id_to_string(node->id), (u32)node->input_count); - } - todo(); - } - - auto* new_mask = thread_register_mask_get(thread, new_mask_index); - auto fixed = fixed_register_mask(*new_mask); - - if (fixed >= 0) - { - // auto fixed_mask = ((u32)1 << fixed); - auto shared_edge = node_to_address(thread, input_index); - - if (shared_edge >= 0) - { - auto* input_node = thread_node_get(thread, input_index); - auto p_shared_edge = cast_to(u16, s32, shared_edge); - assert(p_shared_edge < input_node->input_count); - auto inputs = node_get_inputs(thread, input_node); - for (u16 i = 1; i < input_node->input_count; i += 1) - { - if (i != shared_edge) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - todo(); - } - } - } - } - } - - vreg->mask = new_mask_index; - } - } - } - - auto virtual_register_index = virtual_register_map[geti(node_index)]; - - if (tmp_count > 0) - { - todo(); - } - - if (virtual_register_index > 0) - { - auto* virtual_register = &virtual_registers.pointer[virtual_register_index]; - virtual_register->spill_cost = NAN; - - if (node->id == MACHINE_COPY) - { - auto* in = thread_node_get(thread, inputs.pointer[1]); - if (in->id == IR_PHI) - { - thread_worklist_push(thread, builder->worker, node_index); - } - } - } - } - } - - u8 changes = 0; - - if (thread_worklist_length(thread, builder->worker) > 0) - { - // Compute ordinals - auto order = compute_ordinals(thread, builder->basic_blocks, node_count); - while (thread_worklist_length(thread, builder->worker) > 0) - { - auto node_index = thread_worklist_pop(thread, builder->worker); - auto* node = thread_node_get(thread, node_index); - assert(node->id == MACHINE_COPY); - auto id = virtual_register_map[geti(node_index)]; - assert(id > 0); - // auto mask_index = virtual_registers.pointer[id].mask; - auto inputs = node_get_inputs(thread, node); - - if (!interfere(thread, builder->scheduled, builder->basic_blocks, order, node_index, inputs.pointer[1])) - { - auto basic_block_index = builder->scheduled.pointer[geti(node_index)]; - auto* basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - u64 i = 0; - auto count = basic_block->items.length; - while (i < count && !index_equal(basic_block->items.pointer[i], node_index)) - { - i += 1; - } - - assert(index_equal(basic_block->items.pointer[i], node_index)); - memmove(&basic_block->items.pointer[i], &basic_block->items.pointer[i + 1], (count - (i + 1)) * sizeof(NodeIndex)); - basic_block->items.length -= 1; - builder->scheduled.pointer[geti(node_index)] = invalidi(BasicBlock); - subsume_node_without_killing(thread, node_index, inputs.pointer[1]); - changes = 1; - } - } - } - - // TODO: spills - if (spills.length) - { - todo(); - changes = 1; - } - - if (changes) - { - redo_dataflow(thread, builder->worker, builder->basic_blocks, builder->scheduled, node_count); - } - - auto al_index = 0; - // Allocate loop - while (1) - { - print("==============================\n#{u32} Allocate loop\n==============================\n", al_index++); - - auto order = compute_ordinals(thread, builder->basic_blocks, node_count); - - Bitset active = {}; - bitset_ensure_length(&active, virtual_registers.length); - Bitset future_active = {}; - bitset_ensure_length(&future_active, virtual_registers.length); - Bitset live_out = {}; - bitset_ensure_length(&live_out, node_count); - - for (u32 block_i = 0; block_i < builder->basic_blocks.length; block_i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[block_i]; - - for (u32 node_i = 0; node_i < basic_block->items.length; node_i += 1) - { - auto node_index = basic_block->items.pointer[node_i]; - auto virtual_register_id = virtual_register_map[geti(node_index)]; - - if (virtual_register_id > 0) - { - // auto* node = thread_node_get(thread, node_index); - - auto mask_index = virtual_registers.pointer[virtual_register_id].mask; - auto mask_pointer = thread_register_mask_get(thread, mask_index); - auto mask_value = *mask_pointer; - auto reg = fixed_register_mask(mask_value); - - // print("Block #{u32}, Node index #{u32}, Node GVN #{u32}, Node id: {s}, VR{u32}. Mask: {u32:x}. Reg: {u32:x}\n", block_i, node_i, geti(node_index), node_id_to_string(node->id), virtual_register_id, mask_value.mask, reg); - - if (reg >= 0) - { - todo(); - } - } - } - } - - if (spills.length) - { - todo(); - } - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - print("============\nBlock #{u32}\n============\n", i); - - auto basic_block_index = Index(BasicBlock, i); - - auto bb_live_in = &basic_block->live_in; - auto bb_live_out = &basic_block->live_out; - - FOREACH_SET(j, &live_out) if (!bitset_get(bb_live_in, j)) - { - auto virtual_register_id = virtual_register_map[j]; - print("General live out not present in basic block live in: N{u64}, VR{u32}\n", j, virtual_register_id); - if (virtual_register_id != 0) - { - u8 pause = 0; - for (u32 k = i; k < builder->basic_blocks.length; k += 1) - { - auto* other_basic_block = &builder->basic_blocks.pointer[k]; - if (bitset_get(&other_basic_block->live_in, j)) - { - unused(pause); - todo(); - } - } - - bitset_set_value(&active, virtual_register_id, 0); - bitset_set_value(&live_out, j, 0); - } - } - - FOREACH_SET(j, bb_live_in) if (!bitset_get(&live_out, j)) - { - auto virtual_register_id = virtual_register_map[j]; - print("Basic block live in not present in general live out: N{u64}, VR{u32}\n", j, virtual_register_id); - - if (virtual_register_id > 0) - { - { - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto node_index = virtual_register->node_index; - auto* node = thread_node_get(thread, node_index); - print("[BB LIVE IN ] Allocating register for node #{u32} ({s})\n", geti(node_index), node_id_to_string(node->id)); - } - - if (!register_allocate(thread, virtual_registers, &spills, &active, &future_active, builder->scheduled, builder->basic_blocks, order, virtual_register_id, 0)) - { - todo(); - } - } - } - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - NodeIndex node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - auto def = order.pointer[geti(node_index)]; - - auto inputs = node_get_inputs(thread, node); - - print("Node #{u32} ({s}). Def: {u32}\n", geti(node_index), node_id_to_string(node->id), def); - - if (node->id == IR_PROJECTION && !index_equal(inputs.pointer[0], function->root)) - { - print("Skipping...\n"); - continue; - } - - if (node->id != IR_PHI) - { - print("Node is not PHI. Examining inputs ({u32})...\n", (u32)node->input_count); - - for (u16 i = 1; i < node->input_count; i += 1) - { - auto input_index = inputs.pointer[i]; - if (validi(input_index)) - { - auto virtual_register_id = virtual_register_map[geti(input_index)]; - print("Input {u32}: node #{u32} ({s}). VR{u32}\n", i, geti(input_index), node_id_to_string(thread_node_get(thread, input_index)->id), virtual_register_id); - if (virtual_register_id == 0) - { - print("Invalid vreg id. Removing from general live out and skipping...\n"); - bitset_set_value(&live_out, geti(input_index), 0); - continue; - } - - if (!bitset_get(&live_out, geti(input_index))) - { - print("Duplicate input. Skipping...\n"); - continue; - } - - auto* input = thread_node_get(thread, input_index); - auto last_use = node_last_use_in_block(thread, builder->scheduled, order, input, basic_block_index); - print("Last use: {u32}\n", last_use); - - if (bitset_get(bb_live_out, geti(input_index))) - { - todo(); - } - - print("Removing node #{u32} from general liveout\n", geti(input_index)); - bitset_set_value(&live_out, geti(input_index), 0); - - auto pause = last_use > def; - if (!pause) - { - for (u32 i = geti(basic_block_index); i < builder->basic_blocks.length; i += 1) - { - auto* other = &builder->basic_blocks.pointer[i]; - if (bitset_get(&other->live_in, geti(input_index))) - { - pause = 1; - break; - } - } - } - - if (pause) - { - bitset_set_value(&future_active, virtual_register_id, 1); - } - - print("Removing VR{u32} from general active\n", virtual_register_id); - bitset_set_value(&active, virtual_register_id, 0); - } - } - } - - for (u32 i = 0; i < REGISTER_CLASS_X86_64_COUNT; i += 1) - { - in_use[i] = 0; - } - - // TODO: tmps - - auto virtual_register_id = virtual_register_map[geti(node_index)]; - - if (virtual_register_id > 0) - { - auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto class = virtual_register->class; - auto in_use_local = in_use[class]; - print("[ALLOCATE LOOP] Allocating register for node #{u32} ({s}), VR{u32}\n", geti(node_index), node_id_to_string(node->id), virtual_register_id); - if (!register_allocate(thread, virtual_registers, &spills, &active, &future_active, builder->scheduled, builder->basic_blocks, order, virtual_register_id, in_use_local)) - { - todo(); - } - - print("[END ALLOCATE LOOP]\n"); - assert(virtual_register_map[geti(node_index)] == virtual_register_id); - - auto def = virtual_register->node_index; - bitset_set_value(&live_out, geti(def), 1); - print("Setting as general live out node #{u32} ({s})\n", geti(def), node_id_to_string(thread_node_get(thread, def)->id)); - } - else if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - } - } - - break; - } - } - - // Basic block scheduling - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - auto basic_block_index = Index(BasicBlock, cast_to(u32, s64, basic_block - builder->basic_blocks.pointer)); - auto first_node = thread_node_get(thread, basic_block->items.pointer[0]); - auto item_count = basic_block->items.length; - u8 empty = 1; - - if (first_node->id == IR_REGION) - { - for (u32 i = 1; i < item_count; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - if (node->id != IR_PHI) - { - empty = 0; - break; - } - } - } - else if (item_count > 1 || node_is_control_projection(first_node)) - { - empty = 0; - } - - if (empty) - { - todo(); - } - else - { - basic_block->forward = cast_to(s32, u32, i); - - auto* bb_end = thread_node_get(thread, basic_block->end); - if (!cfg_node_terminator(bb_end)) - { - auto jump_node_index = thread_node_add(thread, (NodeCreate) - { - .id = MACHINE_JUMP, - .inputs = array_to_slice(((NodeIndex[]) { - invalidi(Node), - })), - .type_pair = type_pair_make(invalidi(DebugType), BACKEND_TYPE_CONTROL), - }); - auto successor_node_index = cfg_next_user(thread, basic_block->end); - auto* successor_node = thread_node_get(thread, successor_node_index); - auto successor_inputs = node_get_inputs(thread, successor_node); - u16 i; - for (i = 0; i < successor_node->input_count; i += 1) - { - auto input_index = successor_inputs.pointer[i]; - if (index_equal(input_index, basic_block->end)) - { - break; - } - } - assert(i < successor_node->input_count); - node_set_input(thread, successor_node_index, i, jump_node_index); - node_set_input(thread, jump_node_index, 0, basic_block->end); - basic_block->end = jump_node_index; - - basic_block_add_node(thread, basic_block, jump_node_index, 6); - - assert(builder->scheduled.length == geti(jump_node_index)); - *vb_add(&builder->scheduled, 1) = basic_block_index; - } - } - } - - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - - auto forward = basic_block->forward; - while (forward != builder->basic_blocks.pointer[forward].forward) - { - forward = builder->basic_blocks.pointer[forward].forward; - } - - basic_block->forward = forward; - } - - auto* order = arena_allocate(thread->arena, s32, builder->basic_blocks.length); - - u32 order_index = 0; - for (s32 i = 0; i < cast_to(s32, u32, builder->basic_blocks.length); i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - if (basic_block->forward == i) - { - auto* end_node = thread_node_get(thread, basic_block->end); - if (end_node->id != IR_RETURN) - { - order[order_index] = i; - order_index += 1; - } - } - } - - for (s32 i = 0; i < cast_to(s32, u32, builder->basic_blocks.length); i += 1) - { - auto* basic_block = &builder->basic_blocks.pointer[i]; - if (basic_block->forward == i) - { - auto* end_node = thread_node_get(thread, basic_block->end); - if (end_node->id == IR_RETURN) - { - order[order_index] = i; - order_index += 1; - } - } - } - - // Emit - auto final_order_count = order_index; - - for (u32 order_index = 0; order_index < final_order_count; order_index += 1) - { - auto i = order[order_index]; - auto* basic_block = &builder->basic_blocks.pointer[i]; - - for (u32 i = 0; i < basic_block->items.length; i += 1) - { - auto node_index = basic_block->items.pointer[i]; - auto* node = thread_node_get(thread, node_index); - // auto virtual_register_id = virtual_register_map[geti(node_index)]; - // auto* virtual_register = &virtual_registers.pointer[virtual_register_id]; - auto inputs = node_get_inputs(thread, node); - - auto fallthrough = INT32_MAX; - if (order_index + 1 < final_order_count) - { - fallthrough = order[order_index + 1]; - } - - switch (node->id) - { - case IR_PROJECTION: - case IR_REGION: - case IR_PHI: - break; - case IR_INTEGER_CONSTANT: - { - auto value = node->integer_constant.unsigned_value; - auto gpr = (GPR)machine_operand_at(virtual_register_map, virtual_registers, node_index, REGISTER_CLASS_X86_64_GPR); - auto backend_type = type_pair_get_backend(node->type); - - if (backend_type == BACKEND_TYPE_INTEGER_32) - { - if (value == 0) - { - if (gpr == RAX) - { -#ifdef __x86_64__ - *vb_add(&code, 1) = 0x31; - *vb_add(&code, 1) = 0xc0; -#else - *vb_add(&code, 1) = 0x2a; - *vb_add(&code, 1) = 0x1f; - *vb_add(&code, 1) = 0x03; - *vb_add(&code, 1) = 0xe0; -#endif - } - else - { - todo(); - } - } - else - { - todo(); - } - } - } break; - case MACHINE_MOVE: - { - auto destination = operand_from_node(virtual_registers, virtual_register_map, node_index); - auto source = operand_from_node(virtual_registers, virtual_register_map, inputs.pointer[1]); - if (!operand_equal(destination, source)) - { - todo(); - } - } break; - case MACHINE_JUMP: - { - auto successor_node_index = cfg_next_control(thread, node_index); - assert(validi(successor_node_index)); - auto successor_basic_block_index = fixed_block_map_get(&builder->block_map, successor_node_index); - assert(validi(successor_basic_block_index)); - auto* successor_basic_block = &builder->basic_blocks.pointer[geti(successor_basic_block_index)]; - if (fallthrough != successor_basic_block->forward) - { - todo(); - } - } break; - case IR_RETURN: - { -#ifdef __x86_64__ - *vb_add(&code, 1) = 0xc3; -#else - *vb_add(&code, 1) = 0xd6; - *vb_add(&code, 1) = 0x5f; - *vb_add(&code, 1) = 0x03; - *vb_add(&code, 1) = 0xc0; -#endif - } break; - default: - todo(); - } - } - } - } - - switch (options.backend) - { - case COMPILER_BACKEND_LLVM: - { - // TODO: delete, this is testing - llvm_codegen(options, object_path); - - auto lld_args = lld_driver(thread->arena, (LinkerArguments) { - .target = options.target, - .out_path = exe_path, - .objects = (Slice(String)) { .pointer = &object_path, .length = 1 }, - .link_libc = 1, - }); - - LLDArguments arguments = { - .disable_output = 0, - .exit_early = 1, - .argument_pointer = (const char**)lld_args.pointer, - .argument_count = lld_args.length, - }; - - u8 result; - switch (options.target.os) - { - case OPERATING_SYSTEM_LINUX: - result = lld_elf_link(arguments); - break; - case OPERATING_SYSTEM_MAC: - result = lld_macho_link(arguments); - break; - case OPERATING_SYSTEM_WINDOWS: - result = lld_coff_link(arguments); - break; - } - - if (!result) - { - failed_execution(); - } - } break; - case COMPILER_BACKEND_BB: - { - auto code_slice = (Slice(u8)) { .pointer = code.pointer, .length = code.length, }; - auto object_options = (ObjectOptions) { - .object_path = object_path, - .exe_path = exe_path, - .code = code_slice, - .dynamic = 1, - }; - - String executable; - switch (options.target.os) - { - case OPERATING_SYSTEM_LINUX: - { - executable = write_elf(thread, object_options); - write_pe(thread, object_options); - } break; - case OPERATING_SYSTEM_MAC: - { - executable = write_macho(thread, object_options); - } break; - case OPERATING_SYSTEM_WINDOWS: - { - executable = write_pe(thread, object_options); - } break; - } - - file_write((FileWriteOptions) { - .path = exe_path, - .content = (String) { executable.pointer, executable.length }, - .executable = 1, - }); - } break; - case COMPILER_BACKEND_COUNT: - unreachable(); - } -} - -fn u8 node_is_empty_control_projection(Thread* restrict thread, CFGBuilder* restrict builder, NodeIndex node_index) -{ - auto* restrict node = thread_node_get(thread, node_index); - u8 result = 0; - - if (node_is_control_projection(node)) - { - auto basic_block_index = builder->scheduled.pointer[geti(node_index)]; - auto* basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - result = basic_block->items.length == 1; - } - - return result; -} - -STRUCT(SchedPhi) -{ - NodeIndex phi; - NodeIndex node; -}; -decl_vb(SchedPhi); - -fn void fill_phis(Thread* restrict thread, VirtualBuffer(SchedPhi)* sched_phis, Node* restrict successor_node, NodeIndex original_index) -{ - auto succesor_inputs = node_get_inputs(thread, successor_node); - u16 i; - for (i = 0; i < successor_node->input_count; i += 1) - { - auto input_index = succesor_inputs.pointer[i]; - if (index_equal(input_index, original_index)) - { - break; - } - } - assert(i < successor_node->input_count); - auto phi_index = i; - - auto successor_outputs = node_get_outputs(thread, successor_node); - for (u16 i = 0; i < successor_node->output_count; i += 1) - { - auto output_index = successor_outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output_index); - if (output_node->id == IR_PHI) - { - auto output_inputs = node_get_inputs(thread, output_node); - assert(phi_index + 1 < output_node->input_count); - *vb_add(sched_phis, 1) = (SchedPhi) { - .phi = output_index, - .node = output_inputs.pointer[phi_index + 1], - }; - } - } -} - -STRUCT(SchedNode) -{ - SchedNode* parent; - NodeIndex node_index; - s32 index; -}; - -fn u8 sched_in_basic_block(Thread* restrict thread, CFGBuilder* restrict builder, BasicBlockIndex basic_block_index, NodeIndex node_index) -{ - return index_equal(builder->scheduled.pointer[geti(node_index)], basic_block_index) && !thread_worklist_test_and_set(thread, builder->worker, node_index); -} - -fn void greedy_scheduler(Thread* restrict thread, CFGBuilder* restrict builder, Function* restrict function, BasicBlockIndex basic_block_index) -{ - thread_worklist_clear(thread, builder->worker); - - auto* restrict basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - auto end_index = basic_block->end; - auto* end_node = thread_node_get(thread, end_index); - - VirtualBuffer(SchedPhi) phis = {}; - - if (node_is_cfg_fork(end_node)) - { - todo(); - } - else if (!cfg_is_endpoint(thread, end_node)) - { - auto successor_index = cfg_next_user(thread, end_index); - auto* successor_node = thread_node_get(thread, successor_index); - if (successor_node->id == IR_REGION) - { - fill_phis(thread, &phis, successor_node, end_index); - } - } - - auto* top = arena_allocate(thread->arena, SchedNode, 1); - *top = (SchedNode) - { - .node_index = end_index, - }; - thread_worklist_test_and_set(thread, builder->worker, end_index); - - if (geti(basic_block_index) == 0) - { - auto* root_node = thread_node_get(thread, function->root); - auto outputs = node_get_outputs(thread, root_node); - for (u16 i = 0; i < root_node->output_count; i += 1) - { - auto output_index = outputs.pointer[i]; - auto* output_node = thread_node_get(thread, output_index); - - if (output_node->id == IR_PROJECTION && !thread_worklist_test_and_set(thread, builder->worker, output_index)) - { - thread_worklist_push_array(thread, builder->worker, output_index); - } - } - } - - u64 phi_current = 0; - u64 leftovers = 0; - auto leftover_count = basic_block->items.length; - - while (top) - { - auto node_index = top->node_index; - auto* node = thread_node_get(thread, node_index); - - if (node->id != IR_PHI && top->index < node->input_capacity) - { - auto inputs = node_get_inputs(thread, node); - auto input_index = inputs.pointer[top->index]; - top->index += 1; - - if (validi(input_index)) - { - auto* input_node = thread_node_get(thread, input_index); - if (input_node->id == IR_PROJECTION) - { - auto projection_inputs = node_get_inputs(thread, input_node); - input_index = projection_inputs.pointer[0]; - input_node = thread_node_get(thread, input_index); - } - - if (sched_in_basic_block(thread, builder, basic_block_index, input_index)) - { - auto* new_top = arena_allocate(thread->arena, SchedNode, 1); - *new_top = (SchedNode) - { - .node_index = input_index, - .parent = top, - }; - top = new_top; - } - } - - continue; - } - - if (index_equal(end_index, node_index)) - { - if (phi_current < phis.length) - { - auto* restrict phi = &phis.pointer[phi_current]; - phi_current += 1; - - auto value = phi->node; - if (sched_in_basic_block(thread, builder, basic_block_index, value)) - { - auto* new_top = arena_allocate(thread->arena, SchedNode, 1); - *new_top = (SchedNode) - { - .node_index = value, - .parent = top, - }; - top = new_top; - } - - continue; - } - - auto try_again = 0; - while (leftovers < leftover_count) - { - auto index = leftovers; - leftovers += 1; - - auto bb_node_index = basic_block->items.pointer[index]; - - if (!thread_worklist_test_and_set(thread, builder->worker, bb_node_index)) - { - auto* new_top = arena_allocate(thread->arena, SchedNode, 1); - *new_top = (SchedNode) - { - .node_index = bb_node_index, - .parent = top, - }; - top = new_top; - try_again = 1; - break; - } - } - - if (try_again) - { - continue; - } - } - - thread_worklist_push_array(thread, builder->worker, node_index); - auto* parent = top->parent; - top = parent; - - if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - } -} - -fn void print_reference_to_node(Thread* restrict thread, NodeIndex node_index, u8 def) -{ - unused(def); - auto* restrict node = thread_node_get(thread, node_index); - print("[#{u32} ({s})", geti(node_index), node_id_to_string(node->id)); - - switch (node->id) - { - case IR_PROJECTION: - { - if (node_is_control_projection(node)) - { - todo(); - } - else - { - } - } break; - case IR_INTEGER_CONSTANT: - { - print(": 0x{u64:x}", node->integer_constant.unsigned_value); - } break; - // TODO: - case IR_REGION: - break; - case IR_PHI: - break; - case MACHINE_COPY: - case MACHINE_MOVE: - break; - default: - todo(); - } - - print("]"); -} - -fn void print_basic_block(Thread* restrict thread, CFGBuilder* restrict builder, Function* restrict function, BasicBlockIndex basic_block_index) -{ - auto* restrict basic_block = &builder->basic_blocks.pointer[geti(basic_block_index)]; - print_reference_to_node(thread, basic_block->start, 1); - print("\n"); - greedy_scheduler(thread, builder, function, basic_block_index); - - for (u32 i = 0; i < thread_worklist_length(thread, builder->worker); i += 1) - { - auto node_index = thread_worklist_get(thread, builder->worker, i); - auto* node = thread_node_get(thread, node_index); - - switch (node->id) - { - case IR_PROJECTION: - case IR_INTEGER_CONSTANT: - case IR_REGION: - case IR_PHI: - continue; - case MACHINE_MOVE: - case MACHINE_COPY: - case IR_RETURN: - { - auto is_branch = 0; - - if (is_branch) - { - todo(); - } - else if (type_pair_get_backend(node->type) == BACKEND_TYPE_TUPLE) - { - todo(); - } - else - { - print(" "); - print("#{u32}", geti(node_index)); - print(" = {s}.", node_id_to_string(node->id)); - // TODO: print type - } - - print(" I({u32})", (u32)node->input_count); - - u64 first = node->id != IR_PROJECTION; - auto inputs = node_get_inputs(thread, node); - if (node->input_count - first) - { - print(": "); - for (auto i = first; i < node->input_count; i += 1) - { - if (i != first) - { - print(", "); - } - print_reference_to_node(thread, inputs.pointer[i], 0); - } - } - else - { - print(" "); - } - - switch (node->id) - { - case MACHINE_MOVE: - case MACHINE_COPY: - case IR_REGION: - case IR_PHI: - case IR_RETURN: - break; - default: - todo(); - } - } break; - default: - todo(); - } - - print("\n"); - } - - thread_worklist_clear(thread, builder->worker); - - auto* end_node = thread_node_get(thread, basic_block->end); - if (cfg_node_terminator(end_node)) - { - // todo(); - } -} - -fn void print_ir(Thread* restrict thread) -{ - auto cfg_builder = cfg_builder_init(thread); - auto* restrict builder = &cfg_builder; - - for (u32 i = 0; i < thread->buffer.functions.length; i += 1) - { - Function* restrict function = &thread->buffer.functions.pointer[i]; - cfg_builder_clear(builder, thread); - - cfg_build_and_global_schedule(builder, thread, function, (GlobalScheduleOptions) { - .dataflow = 0, - }); - - auto end_basic_block_index = invalidi(BasicBlock); - for (u32 i = 0; i < builder->basic_blocks.length; i += 1) - { - auto* restrict basic_block = &builder->basic_blocks.pointer[i]; - auto end_node_index = basic_block->end; - auto* end_node = thread_node_get(thread, end_node_index); - if (end_node->id == IR_RETURN) - { - end_basic_block_index = Index(BasicBlock, i); - continue; - } - else if (node_is_empty_control_projection(thread, builder, end_node_index)) - { - continue; - } - - print_basic_block(thread, builder, function, Index(BasicBlock, i)); - } - - if (validi(end_basic_block_index)) - { - print_basic_block(thread, builder, function, end_basic_block_index); - } - } -} - -void entry_point(int argc, char* argv[], char* envp[]) -{ - // unused(envp); -#if DO_UNIT_TESTS - unit_tests(); -#endif - -#if BB_CI - Arena* global_arena = arena_init(MB(512), KB(64), KB(64)); - - { - arguments.length = cast_to(u64, s32, argc); - arguments.pointer = arena_allocate(global_arena, String, arguments.length); - - for (int i = 0; i < argc; i += 1) - { - arguments.pointer[i] = cstr(argv[i]); - } - } - - Thread* thread = arena_allocate(global_arena, Thread, 1); - thread_init(thread); - - // clang -c main.c -o main.o -g -Oz -fno-exceptions -fno-asynchronous-unwind-tables -fno-addrsig -fno-stack-protector -fno-ident - // dwarf_playground(thread); - - if (argc < 3) - { - failed_execution(); - } - - String source_file_path = arguments.pointer[1]; - CompilerBackend compiler_backend = one_char_string_to_compiler_backend(arguments.pointer[2]); - if (compiler_backend == COMPILER_BACKEND_COUNT) - { - print("Invalid backend: {s}\n", arguments.pointer[2]); - failed_execution(); - } - u8 emit_ir = arguments.length >= 4 && arguments.pointer[3].pointer[0] == 'y'; - - Target target = native_target_get(); - - os_directory_make(strlit(BB_DIR)); - - File file = { - .path = source_file_path, - .source = file_read(thread->arena, source_file_path), - }; - analyze_file(thread, &file); - - if (thread->main_function == -1) - { - failed_execution(); - } - - print("File path: {s}\n", source_file_path); - auto test_dir = path_no_extension(file.path); - print("Test dir path: {s}\n", test_dir); - auto test_name = path_base(test_dir); - print("Test name: {s}\n", test_name); - - if (emit_ir) - { - print_ir(thread); - } - else - { - code_generation(thread, (CodegenOptions) { - .test_name = test_name, - .backend = compiler_backend, - .target = target, - }); - } - - thread_clear(thread); -#else - run_app(); -#endif -} diff --git a/bootstrap/bloat-buster/pdb_image.c b/bootstrap/bloat-buster/pdb_image.c deleted file mode 100644 index 28599f1..0000000 --- a/bootstrap/bloat-buster/pdb_image.c +++ /dev/null @@ -1,8964 +0,0 @@ -#include - -u8 pdb_image[143360] = { - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x2F, 0x43, 0x2B, 0x2B, 0x20, - 0x4D, 0x53, 0x46, 0x20, 0x37, 0x2E, 0x30, 0x30, 0x0D, 0x0A, 0x1A, 0x44, 0x53, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0xFF, 0xE7, 0x2E, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x1F, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, - 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, - 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, - 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, - 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, - 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, - 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x16, 0x11, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x4B, 0x78, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, - 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, - 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, - 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, - 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, 0x2E, 0x00, 0x3C, 0x11, 0x07, 0x00, 0x00, 0x00, - 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, - 0x4C, 0x49, 0x4E, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x3D, 0x11, 0x00, 0x63, 0x77, 0x64, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0x65, 0x78, 0x65, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, - 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, - 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, - 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, - 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, 0x34, 0x5C, 0x78, 0x36, - 0x34, 0x5C, 0x6C, 0x69, 0x6E, 0x6B, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x70, 0x64, 0x62, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x70, - 0x64, 0x62, 0x00, 0x63, 0x6D, 0x64, 0x00, 0x20, 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x72, 0x65, - 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x70, 0x72, 0x6F, 0x6D, 0x70, 0x74, 0x20, 0x2F, 0x6F, 0x75, 0x74, - 0x3A, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x65, 0x78, 0x65, 0x20, 0x2F, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, - 0x6F, 0x20, 0x2F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2F, 0x4E, 0x4F, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4C, 0x54, 0x4C, 0x49, 0x42, 0x20, 0x2F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x3A, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x2F, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D, 0x3A, - 0x43, 0x4F, 0x4E, 0x53, 0x4F, 0x4C, 0x45, 0x20, 0x2F, 0x44, 0x45, 0x42, 0x55, 0x47, 0x20, 0x2F, - 0x49, 0x4E, 0x43, 0x52, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x41, 0x4C, 0x3A, 0x6E, 0x6F, 0x20, 0x2F, - 0x4F, 0x50, 0x54, 0x3A, 0x52, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, - 0x01, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, - 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, - 0x6D, 0x6E, 0x00, 0x00, 0x1A, 0x00, 0x36, 0x11, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x76, 0x6F, 0x6C, 0x74, 0x6D, 0x64, 0x00, 0x1E, 0x00, 0x37, 0x11, 0x2C, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0xB0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x65, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, - 0x1A, 0x00, 0x37, 0x11, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, - 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x10, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xC0, 0xE0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, - 0x24, 0x34, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, 0x1C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, - 0xF0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, - 0x1A, 0x00, 0x36, 0x11, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x40, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1A, 0x00, 0x37, 0x11, - 0x0C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0x70, - 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, - 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, - 0x3A, 0x00, 0x3C, 0x11, 0x00, 0x40, 0x00, 0x00, 0xD0, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, - 0x00, 0x00, 0x13, 0x00, 0x29, 0x00, 0x48, 0x85, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x4F, 0x70, 0x74, 0x69, 0x6D, 0x69, 0x7A, 0x69, - 0x6E, 0x67, 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x65, 0x72, 0x00, 0x2E, 0x00, 0x10, 0x11, - 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x12, 0x10, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x39, 0x11, - 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x4C, 0x11, 0x10, 0x10, 0x00, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x80, - 0xF4, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x03, 0x2C, 0x8A, - 0x49, 0x32, 0x20, 0x5B, 0x4D, 0x41, 0xA0, 0x3A, 0x81, 0x12, 0xE6, 0xF9, 0x5D, 0x5A, 0x33, 0x70, - 0x44, 0xA3, 0x93, 0x51, 0x1E, 0x17, 0xA3, 0x32, 0x4E, 0xA9, 0x6E, 0x80, 0x1C, 0xCE, 0x00, 0x00, - 0x91, 0x00, 0x00, 0x00, 0x20, 0x03, 0x6A, 0x10, 0xE9, 0xF0, 0x50, 0x5B, 0x89, 0x6D, 0x35, 0x6D, - 0x98, 0x6D, 0x67, 0x1C, 0x93, 0x9B, 0x7F, 0xB0, 0x60, 0x20, 0x12, 0xE4, 0x63, 0x31, 0x4F, 0xF7, - 0xBF, 0xD0, 0x18, 0x2A, 0x86, 0x1F, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x20, 0x03, 0xDD, 0xB4, - 0xF8, 0xA4, 0xB4, 0xA7, 0xB3, 0x0D, 0x4F, 0xF1, 0x59, 0x39, 0x41, 0xF5, 0x92, 0x79, 0x60, 0x6C, - 0x76, 0xB6, 0xD9, 0x58, 0xEB, 0x4C, 0x30, 0xEC, 0xC7, 0xDC, 0xA0, 0x1D, 0x9F, 0x07, 0x00, 0x00, - 0x25, 0x01, 0x00, 0x00, 0x20, 0x03, 0xC7, 0x6A, 0xB8, 0xA5, 0x63, 0x1A, 0x32, 0x3E, 0xB0, 0xB1, - 0x9D, 0xEE, 0x4B, 0xDA, 0xD1, 0xC5, 0xF7, 0x5D, 0xB1, 0x3C, 0x2D, 0xF4, 0x9A, 0x22, 0x91, 0x77, - 0x66, 0xFE, 0xD8, 0x5B, 0x3F, 0x41, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x20, 0x03, 0xE0, 0xF9, - 0x9E, 0x5F, 0x43, 0x19, 0x42, 0x63, 0x25, 0xDD, 0xBF, 0x4A, 0x6D, 0x4E, 0x23, 0x29, 0x8E, 0xED, - 0x9B, 0x08, 0x06, 0xEF, 0x49, 0xED, 0x6C, 0x95, 0xAD, 0x9D, 0xEC, 0xE7, 0x0D, 0x82, 0x00, 0x00, - 0xBE, 0x01, 0x00, 0x00, 0x20, 0x03, 0x36, 0xFD, 0x04, 0xBA, 0x37, 0xAA, 0xCF, 0x40, 0x4C, 0xB8, - 0x2E, 0xFF, 0xB9, 0xA3, 0x86, 0x34, 0xB5, 0x02, 0x99, 0x6F, 0x07, 0x9A, 0x01, 0x21, 0xAE, 0xEA, - 0x51, 0x91, 0xF5, 0xF4, 0x24, 0xFB, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x20, 0x03, 0x79, 0x6B, - 0x22, 0x26, 0x80, 0x97, 0x90, 0x07, 0x89, 0x84, 0xB9, 0x19, 0x54, 0x2D, 0x81, 0x8C, 0xE7, 0x41, - 0x90, 0xD2, 0x11, 0x0B, 0x11, 0x9F, 0x93, 0xC2, 0xA7, 0xC3, 0x88, 0x2B, 0x5D, 0xE5, 0x00, 0x00, - 0x52, 0x02, 0x00, 0x00, 0x20, 0x03, 0x8D, 0x76, 0x13, 0x5F, 0xF4, 0x01, 0x40, 0xC6, 0xD6, 0x4A, - 0x09, 0xD1, 0x73, 0xE1, 0x27, 0x6F, 0xEF, 0xB9, 0x6A, 0x2D, 0xB9, 0x07, 0x3B, 0x5A, 0xB2, 0x6F, - 0x25, 0x0C, 0x47, 0x33, 0xF9, 0x99, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0x20, 0x03, 0x18, 0xCA, - 0x52, 0x04, 0x16, 0x57, 0x91, 0x83, 0xBC, 0x36, 0x9C, 0x0A, 0x8E, 0x55, 0x59, 0x14, 0xDB, 0x5C, - 0x75, 0x77, 0x07, 0x5B, 0x93, 0x59, 0x17, 0x3F, 0xC6, 0xBC, 0x45, 0x59, 0x55, 0x60, 0x00, 0x00, - 0xF0, 0x02, 0x00, 0x00, 0x20, 0x03, 0x27, 0x90, 0x4E, 0x90, 0x09, 0x38, 0x74, 0x9C, 0x12, 0xA4, - 0xD1, 0xE7, 0x41, 0xAF, 0xD5, 0x64, 0x19, 0x8A, 0x57, 0xA2, 0x47, 0x24, 0xC1, 0xDD, 0xD3, 0x6C, - 0xD3, 0x30, 0x22, 0x24, 0xDF, 0x26, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x20, 0x03, 0xF2, 0xE0, - 0x91, 0x84, 0x1C, 0x3E, 0xFE, 0x2F, 0x18, 0x7F, 0xE7, 0x03, 0xA0, 0xF5, 0x62, 0xCC, 0xE6, 0x54, - 0xCA, 0x82, 0xE6, 0x8C, 0x34, 0x36, 0x98, 0xB0, 0x6E, 0xC6, 0x7F, 0x9B, 0xA0, 0x39, 0x00, 0x00, - 0x90, 0x03, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x4E, 0x8D, 0xF9, 0x6F, 0x05, 0x7F, 0xDE, 0xBC, 0x04, - 0x74, 0xBD, 0x76, 0x5C, 0xEE, 0x3A, 0xE1, 0x7D, 0xE3, 0x4A, 0x2B, 0x1F, 0xC9, 0xD1, 0x97, 0x59, - 0x73, 0x21, 0xF2, 0xD1, 0xE4, 0x47, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x20, 0x03, 0x72, 0x95, - 0x69, 0x9A, 0x85, 0xD8, 0x9A, 0xC3, 0x8B, 0xF0, 0xC3, 0xC2, 0xBB, 0x13, 0xCE, 0xBB, 0x7D, 0xE9, - 0x23, 0x8A, 0xEF, 0x87, 0x89, 0x6F, 0xF8, 0xD1, 0xC7, 0x80, 0x96, 0xE9, 0x70, 0x91, 0x00, 0x00, - 0xFB, 0x03, 0x00, 0x00, 0x20, 0x03, 0xDE, 0xE2, 0x7F, 0x27, 0x12, 0xB9, 0xE7, 0x2C, 0xA7, 0x8A, - 0x40, 0x48, 0x34, 0x73, 0x53, 0x03, 0xD1, 0x6B, 0xDB, 0x21, 0xC8, 0xAA, 0x3A, 0xDD, 0xAC, 0xA7, - 0xDB, 0xCA, 0x22, 0x66, 0x45, 0x29, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x20, 0x03, 0xD0, 0x71, - 0x10, 0xE7, 0xF7, 0x98, 0x9A, 0xEE, 0xF7, 0xEE, 0xD7, 0x7D, 0x5F, 0x58, 0x4F, 0x3E, 0xE6, 0x0F, - 0xF2, 0xCE, 0x58, 0xBC, 0x1A, 0x37, 0x4D, 0x70, 0x15, 0x1A, 0x18, 0xB4, 0xA6, 0x64, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x74, 0x12, 0xDF, 0x50, 0x2F, 0xB6, 0xEA, 0x39, 0x0C, - 0x96, 0xD7, 0xC9, 0xF8, 0x05, 0xA2, 0xA2, 0x11, 0x60, 0x9B, 0x95, 0xB8, 0xFD, 0xB4, 0x74, 0x05, - 0x40, 0xF7, 0x89, 0xD9, 0xC4, 0xCE, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x20, 0x03, 0x83, 0x18, - 0x07, 0x66, 0x77, 0xFB, 0xA2, 0x76, 0xE4, 0x94, 0xED, 0xC3, 0x9A, 0xAA, 0xC1, 0x1F, 0xBD, 0x9B, - 0xC6, 0x1C, 0xA2, 0xD3, 0x6B, 0xB6, 0x8B, 0xDC, 0xCC, 0xD2, 0x60, 0xEC, 0xE9, 0x77, 0x00, 0x00, - 0x2C, 0x05, 0x00, 0x00, 0x20, 0x03, 0xFB, 0x3A, 0xAE, 0xEF, 0x32, 0x4B, 0x5D, 0x00, 0xCE, 0x0A, - 0x6A, 0xE1, 0x17, 0x02, 0xDC, 0xC3, 0xC1, 0xDE, 0x65, 0xFA, 0x0A, 0x10, 0xCA, 0xAA, 0xB4, 0x33, - 0x6B, 0x97, 0xD3, 0xAD, 0xF4, 0x93, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x20, 0x03, 0xA5, 0x0D, - 0x0E, 0xF5, 0xCF, 0xE9, 0x6D, 0x63, 0x4A, 0x41, 0xEE, 0x9A, 0x97, 0x74, 0x9C, 0x14, 0x71, 0x65, - 0xF8, 0x65, 0x6C, 0xDF, 0xED, 0x5D, 0xF5, 0x3B, 0xC2, 0x4C, 0x8A, 0xDB, 0x12, 0x10, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x20, 0x03, 0x7C, 0x3F, 0x65, 0x9F, 0x98, 0xB3, 0xF1, 0x74, 0x8A, 0x31, - 0x4B, 0xD6, 0x41, 0x06, 0x58, 0x3D, 0x01, 0x64, 0x93, 0x33, 0xE0, 0x41, 0x9B, 0x66, 0x23, 0x2B, - 0x4F, 0x64, 0xB3, 0xF8, 0x5B, 0x0C, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x84, - 0xE2, 0x06, 0x81, 0xFD, 0x3D, 0xE7, 0x3C, 0xE1, 0x4A, 0xB0, 0x9D, 0x75, 0x9D, 0x5B, 0x4F, 0xAF, - 0x03, 0xF7, 0xD6, 0x6A, 0x78, 0x60, 0x2D, 0xA2, 0xAC, 0x92, 0x34, 0xB2, 0x4D, 0xF4, 0x00, 0x00, - 0x59, 0x06, 0x00, 0x00, 0x20, 0x03, 0xB0, 0x52, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x36, 0xD0, 0xC1, 0x0D, 0x2A, 0x7E, 0x10, 0x9D, 0x7F, 0xD1, 0xA7, 0x26, 0x59, 0x81, 0xCB, 0xB6, - 0xAD, 0x11, 0xB8, 0xCE, 0xE9, 0x26, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, - 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, - 0xC4, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, - 0x60, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0xA8, 0x02, 0x00, 0x00, - 0xBC, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xE0, 0x02, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, - 0x40, 0x03, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, - 0x84, 0x03, 0x00, 0x00, 0xA4, 0x03, 0x00, 0x00, 0xB4, 0x03, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, - 0xD4, 0x03, 0x00, 0x00, 0xE4, 0x03, 0x00, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, - 0x14, 0x04, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, - 0x54, 0x04, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, - 0x98, 0x04, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, 0xB8, 0x04, 0x00, 0x00, 0xC8, 0x04, 0x00, 0x00, - 0xD8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0x09, 0x2F, 0xF1, 0x90, 0x01, 0x00, 0x00, 0xC8, 0x02, 0x00, 0x00, - 0xE1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x89, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x15, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x79, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x21, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x7D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x41, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x61, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x51, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xC5, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x31, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x81, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x99, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0D, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC9, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xAD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x45, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA9, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xA5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xBD, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xD1, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x55, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x25, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB5, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, - 0x84, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, - 0xB4, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, - 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, - 0x20, 0x01, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, - 0x50, 0x01, 0x00, 0x00, 0x5C, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, - 0x80, 0x01, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, - 0xB0, 0x01, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x00, 0xC8, 0x01, 0x00, 0x00, 0xD4, 0x01, 0x00, 0x00, - 0xE0, 0x01, 0x00, 0x00, 0xEC, 0x01, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, - 0x10, 0x02, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, - 0x40, 0x02, 0x00, 0x00, 0x4C, 0x02, 0x00, 0x00, 0x04, 0xF6, 0x81, 0x4D, 0x1D, 0x7B, 0x7C, 0xA7, - 0x29, 0xB4, 0x1D, 0x41, 0x92, 0xD0, 0xE4, 0x77, 0x22, 0xF1, 0x62, 0xC0, 0xB1, 0xD3, 0x22, 0xF9, - 0x94, 0xBF, 0x96, 0x50, 0xAF, 0x63, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x20, 0x03, 0xE8, 0x44, - 0xC7, 0x72, 0x6C, 0x42, 0x73, 0x6D, 0xF7, 0x44, 0x45, 0xB3, 0x63, 0x51, 0xDC, 0x01, 0xE2, 0x9B, - 0xCC, 0xEE, 0x7D, 0x57, 0xEA, 0x20, 0x8F, 0x77, 0xF6, 0x1A, 0xA4, 0xC2, 0xB1, 0x91, 0x00, 0x00, - 0x17, 0x07, 0x00, 0x00, 0x20, 0x03, 0xD3, 0x5B, 0x73, 0xF8, 0x85, 0xD7, 0xEF, 0x7D, 0xFD, 0x27, - 0xFC, 0xE3, 0x76, 0x2C, 0x19, 0x0C, 0x1C, 0x95, 0x2A, 0x21, 0xE1, 0x0A, 0x39, 0x45, 0xBC, 0xB3, - 0xD1, 0x86, 0x0C, 0x67, 0x3B, 0x12, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x20, 0x03, 0x98, 0xE3, - 0x37, 0x20, 0xF9, 0xEC, 0x8F, 0xDE, 0xD8, 0x08, 0xAB, 0x94, 0xF1, 0x11, 0xB8, 0x33, 0x5D, 0x0B, - 0xA2, 0xFD, 0x22, 0x46, 0xA5, 0xAD, 0xAB, 0x3A, 0xAB, 0x2C, 0xE0, 0x55, 0x03, 0xD9, 0x00, 0x00, - 0xAC, 0x07, 0x00, 0x00, 0x20, 0x03, 0x8C, 0x35, 0x9D, 0x2D, 0xFF, 0x89, 0x4D, 0x54, 0x6F, 0x3E, - 0xCE, 0xD2, 0xFE, 0x94, 0x63, 0xDF, 0xA4, 0x82, 0x4B, 0xFF, 0xC6, 0xC8, 0xC7, 0x1E, 0xCD, 0x8F, - 0xEE, 0xF0, 0x2E, 0x7E, 0xAE, 0x21, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x20, 0x03, 0x20, 0x9E, - 0x79, 0xFD, 0xBB, 0xB3, 0x09, 0x71, 0x74, 0x0E, 0x59, 0xB2, 0xDA, 0x2D, 0x6C, 0x86, 0xE2, 0x7C, - 0x0E, 0x9D, 0xD0, 0x2B, 0xEE, 0x9C, 0xBC, 0x21, 0x73, 0x6F, 0xBD, 0x24, 0x26, 0xAD, 0x00, 0x00, - 0x44, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA8, 0xE0, 0xF6, 0x00, 0x1C, 0x78, 0x4B, 0x3A, 0xD9, 0xFE, - 0xB4, 0x4C, 0x61, 0xD9, 0x6B, 0x58, 0xC5, 0x73, 0x66, 0xC4, 0x73, 0x83, 0x2C, 0xA8, 0xB2, 0xEA, - 0x5D, 0xE0, 0x58, 0x77, 0xB4, 0x70, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x20, 0x03, 0xA0, 0xEF, - 0x5E, 0xA3, 0xF5, 0xF2, 0x58, 0x7A, 0xA6, 0xB8, 0x4F, 0xB6, 0xC8, 0x45, 0xB3, 0xCE, 0x86, 0x6A, - 0x0F, 0x09, 0xFA, 0x0A, 0x58, 0x98, 0xED, 0x1B, 0x15, 0x30, 0x72, 0xA0, 0x9C, 0x0B, 0x00, 0x00, - 0xD9, 0x08, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x48, 0x06, 0x2A, 0xA6, 0xD7, 0x07, 0xBF, 0x8C, 0x63, - 0xD8, 0xFB, 0x3E, 0x69, 0x56, 0xF3, 0x31, 0x21, 0x7B, 0xE7, 0x30, 0x9D, 0x38, 0xAC, 0x52, 0x39, - 0x51, 0xAF, 0x51, 0xCB, 0x32, 0x24, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB6, 0x22, - 0xB2, 0x4C, 0xBD, 0xA8, 0x42, 0xA1, 0x73, 0x69, 0x87, 0xF3, 0x8C, 0x9D, 0xEB, 0x50, 0x76, 0xE5, - 0x1A, 0xF0, 0x18, 0x63, 0x08, 0x42, 0xA1, 0x27, 0xBE, 0xBD, 0x91, 0x04, 0x07, 0x6E, 0x00, 0x00, - 0x79, 0x09, 0x00, 0x00, 0x20, 0x03, 0x32, 0x57, 0xAD, 0x8A, 0xF5, 0x3C, 0x58, 0x09, 0xBE, 0x4D, - 0x5D, 0x17, 0xED, 0x0F, 0xFD, 0x8B, 0x49, 0x45, 0x1D, 0x3F, 0x27, 0xC1, 0xFD, 0x74, 0x7F, 0xFD, - 0xE3, 0xE0, 0xA7, 0xA8, 0x15, 0x83, 0x00, 0x00, 0xC7, 0x09, 0x00, 0x00, 0x20, 0x03, 0xB3, 0x37, - 0xD6, 0x61, 0xD0, 0x3A, 0x4A, 0xBE, 0xFB, 0x7B, 0x86, 0xA2, 0x74, 0x2C, 0xE1, 0xAD, 0x5D, 0x19, - 0xB5, 0x7C, 0xD8, 0xB8, 0x58, 0xBD, 0x13, 0xE7, 0xBB, 0xCC, 0x1D, 0xBE, 0xEA, 0xAA, 0x00, 0x00, - 0x10, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x97, 0x1D, 0x19, 0x07, 0x46, 0x39, 0xCB, 0x36, 0x13, 0x4B, - 0xB4, 0x07, 0x76, 0xCB, 0x2F, 0x81, 0x7C, 0x53, 0xCB, 0xD0, 0x5D, 0x74, 0x8B, 0x52, 0x46, 0x8F, - 0x57, 0x19, 0x32, 0xBB, 0xCC, 0x49, 0x00, 0x00, 0x5E, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x68, 0xD2, - 0x84, 0x8D, 0x00, 0xAE, 0x33, 0x28, 0x2F, 0xB2, 0x65, 0x88, 0x0F, 0x81, 0x66, 0xF2, 0xB5, 0xDC, - 0x60, 0xCD, 0x7A, 0x26, 0xDB, 0x65, 0x24, 0x50, 0xA5, 0xB4, 0x4D, 0x44, 0xEE, 0x11, 0x00, 0x00, - 0xAC, 0x0A, 0x00, 0x00, 0x20, 0x03, 0xBD, 0xA5, 0x07, 0xD1, 0x4F, 0x2E, 0x40, 0x02, 0x3D, 0x34, - 0x4C, 0xB9, 0x43, 0xCB, 0xD9, 0x8A, 0xF2, 0x6D, 0xE8, 0xA4, 0x7F, 0x3B, 0x0F, 0x5F, 0xAC, 0x69, - 0x4D, 0x20, 0x25, 0x71, 0x1A, 0xF1, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x20, 0x03, 0x87, 0xC1, - 0x63, 0x0A, 0xBF, 0x7D, 0xC4, 0xED, 0x79, 0x78, 0xF2, 0xC4, 0xDB, 0xAC, 0xF4, 0x18, 0xF6, 0xBC, - 0xF9, 0x4C, 0xB9, 0x46, 0xE2, 0x77, 0xCB, 0x72, 0x50, 0x77, 0x0B, 0xD4, 0x42, 0x00, 0x00, 0x00, - 0x56, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x8F, 0x74, 0xE2, 0x54, 0x89, 0x60, 0x94, 0xA3, 0x88, 0x4E, - 0x69, 0x75, 0xFD, 0x24, 0xB3, 0x49, 0x38, 0x46, 0x51, 0x40, 0x65, 0xF4, 0x7D, 0x26, 0x66, 0xDF, - 0x53, 0xCD, 0xEA, 0x45, 0xB8, 0xEA, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x20, 0x03, 0x72, 0xD7, - 0x10, 0x4C, 0x84, 0x84, 0x46, 0x04, 0x73, 0x53, 0xE7, 0x65, 0xA5, 0x41, 0xE1, 0x80, 0x2B, 0x45, - 0x10, 0xC7, 0xA7, 0x49, 0x85, 0xE7, 0xD9, 0x97, 0x30, 0x04, 0xF4, 0x60, 0x2F, 0xAC, 0x00, 0x00, - 0xF7, 0x0B, 0x00, 0x00, 0x20, 0x03, 0xFD, 0xDC, 0x52, 0x58, 0xAC, 0xAF, 0xF6, 0x9C, 0xB6, 0x97, - 0xBD, 0xAF, 0x07, 0xF1, 0x75, 0x55, 0x09, 0x98, 0x3E, 0x92, 0x35, 0x18, 0xD7, 0xB1, 0xF1, 0xB2, - 0xE7, 0x0A, 0x38, 0x41, 0x2F, 0x1A, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0x20, 0x03, 0x19, 0x1A, - 0xB8, 0x3E, 0x32, 0x0A, 0x5E, 0x97, 0x12, 0xFE, 0x48, 0x32, 0x57, 0xFE, 0xCA, 0xE1, 0x4C, 0xB0, - 0xC1, 0x58, 0xA4, 0x51, 0x7B, 0x62, 0x0F, 0x3F, 0xDD, 0xB1, 0xAA, 0x6E, 0xF2, 0x3B, 0x00, 0x00, - 0xA8, 0x0C, 0x00, 0x00, 0x20, 0x03, 0xC9, 0x1D, 0x0F, 0xEA, 0x90, 0x72, 0x36, 0xFE, 0x8F, 0x1C, - 0xAB, 0x5A, 0x9C, 0x01, 0xD4, 0xD5, 0x42, 0xB0, 0x35, 0x29, 0x03, 0x97, 0x05, 0x52, 0x1F, 0xEE, - 0xF7, 0x75, 0xE0, 0xF5, 0x9A, 0x7D, 0x00, 0x00, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x4B, 0x0D, - 0x3B, 0xC1, 0x38, 0xEA, 0xAB, 0x8D, 0xC9, 0xDD, 0x40, 0xBF, 0xB1, 0x09, 0xF5, 0xFE, 0xA4, 0xCB, - 0xD2, 0xCA, 0xAF, 0x92, 0xD6, 0x3A, 0x4C, 0xF6, 0x0A, 0x8E, 0xDC, 0xFB, 0x0E, 0x3A, 0x00, 0x00, - 0x5E, 0x0D, 0x00, 0x00, 0x20, 0x03, 0xCD, 0xA0, 0x64, 0x59, 0xCA, 0x38, 0x68, 0x18, 0x00, 0xCE, - 0x5E, 0x98, 0x70, 0x3C, 0x66, 0x53, 0x4C, 0x74, 0xA8, 0x03, 0xAA, 0x65, 0x2B, 0xD4, 0xBC, 0x2B, - 0x34, 0x07, 0xDD, 0x45, 0xED, 0x46, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0x20, 0x03, 0x1E, 0xA9, - 0xA2, 0xE3, 0x2A, 0x6F, 0xF2, 0x98, 0xAD, 0x79, 0x04, 0x61, 0x0C, 0xC7, 0x10, 0x28, 0xCA, 0xA9, - 0xB1, 0x72, 0x39, 0x9A, 0x57, 0x9C, 0xA9, 0x0A, 0x12, 0x0D, 0x1B, 0x1A, 0xEC, 0x12, 0x00, 0x00, - 0x29, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x20, 0x0B, 0x49, 0xC2, 0xEF, 0xD2, 0x6B, 0xC7, 0xA9, 0x2E, - 0x9D, 0xFA, 0x3B, 0x84, 0x7C, 0xC6, 0x12, 0xB2, 0x37, 0xDF, 0xF5, 0xC7, 0x29, 0x1D, 0x9F, 0x90, - 0x1D, 0x39, 0xB4, 0xA5, 0xE5, 0x2E, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x81, 0x08, - 0xFE, 0x3F, 0x09, 0x99, 0x60, 0x01, 0x4F, 0x36, 0xD1, 0xB2, 0xDA, 0x42, 0x5A, 0x83, 0x82, 0xE9, - 0xD8, 0x39, 0xDE, 0x34, 0x77, 0xEB, 0x06, 0xF1, 0x81, 0x28, 0x9A, 0x06, 0x85, 0xC8, 0x00, 0x00, - 0xD4, 0x0E, 0x00, 0x00, 0x20, 0x03, 0x8B, 0xFD, 0x1A, 0x78, 0xCC, 0x30, 0xB6, 0xD3, 0x3C, 0x88, - 0xE3, 0xF6, 0x1A, 0xE2, 0xAC, 0x64, 0x68, 0xCE, 0xE0, 0x60, 0x73, 0x52, 0xEE, 0x8D, 0x09, 0x6B, - 0xA5, 0x37, 0x5B, 0x4D, 0x40, 0x1C, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, - 0xBF, 0x49, 0xA0, 0x04, 0x37, 0x0C, 0xE0, 0x17, 0x67, 0xCC, 0x9F, 0xD3, 0xFC, 0x85, 0xCE, 0xE3, - 0x2F, 0x79, 0xCD, 0x88, 0x90, 0xB0, 0x6C, 0xD5, 0xAB, 0x8D, 0x05, 0xB9, 0x44, 0x08, 0x00, 0x00, - 0x74, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x8A, 0xC6, 0xD7, 0xAA, 0xBA, 0xFE, 0x5B, 0x3A, 0x5E, 0x58, - 0xF3, 0xA3, 0x70, 0x72, 0x40, 0xD9, 0xB6, 0xDA, 0x8D, 0xA4, 0x07, 0x78, 0xBC, 0x91, 0x57, 0xCA, - 0x8C, 0xA0, 0xCF, 0x08, 0xC1, 0x04, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x20, 0x03, 0x1F, 0x1E, - 0x38, 0xCF, 0x7A, 0xAB, 0xEE, 0x42, 0xBB, 0xF2, 0x03, 0xBE, 0xEE, 0x0B, 0x9C, 0xDE, 0x39, 0x22, - 0x43, 0x00, 0x64, 0x44, 0xBD, 0xD2, 0xED, 0x47, 0x56, 0x6D, 0x35, 0x54, 0x42, 0xF8, 0x00, 0x00, - 0x0B, 0x10, 0x00, 0x00, 0x20, 0x03, 0xAD, 0xF5, 0x91, 0xF6, 0xCE, 0x17, 0x6A, 0x19, 0x0C, 0x2D, - 0x1A, 0xC9, 0x07, 0x39, 0x39, 0x99, 0x93, 0xD7, 0xFE, 0x3D, 0xA0, 0x16, 0x38, 0x9F, 0xC1, 0xDA, - 0xA5, 0xB1, 0xEE, 0xEF, 0xA3, 0xD5, 0x00, 0x00, 0x54, 0x10, 0x00, 0x00, 0x20, 0x03, 0x10, 0x93, - 0x68, 0x31, 0x04, 0xF9, 0x7C, 0x8C, 0x97, 0x25, 0xBB, 0x2E, 0x75, 0x39, 0xDC, 0xA2, 0x27, 0x22, - 0xDC, 0x8C, 0x56, 0x18, 0xCD, 0x84, 0x62, 0x87, 0xE9, 0x45, 0x86, 0x98, 0xAB, 0xFE, 0x00, 0x00, - 0xA5, 0x10, 0x00, 0x00, 0x20, 0x03, 0x24, 0x1F, 0x47, 0x5C, 0x7C, 0x52, 0x08, 0x5F, 0x1C, 0x9F, - 0xCC, 0x9B, 0x85, 0x1A, 0x9F, 0xA5, 0x34, 0x84, 0xC7, 0xC8, 0xA7, 0xC0, 0x84, 0x1C, 0xAF, 0x3F, - 0x28, 0xF0, 0x1D, 0x7E, 0xFB, 0x3A, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x20, 0x03, 0x1D, 0x12, - 0xFD, 0xDA, 0x2C, 0xA7, 0x3C, 0xE2, 0x87, 0xAB, 0x4C, 0x18, 0xE5, 0x98, 0x91, 0x6D, 0x03, 0xB9, - 0x1A, 0x67, 0xAA, 0xC1, 0x24, 0x90, 0x1A, 0x86, 0x38, 0x60, 0x10, 0xD4, 0x22, 0xB6, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x20, 0x03, 0xD3, 0xA5, 0xE8, 0xBF, 0xFB, 0xF9, 0xAA, 0xAB, 0x40, 0x88, - 0x67, 0x05, 0x21, 0x29, 0x49, 0x45, 0x93, 0x73, 0xC9, 0x0C, 0x3B, 0x70, 0x75, 0x59, 0x80, 0x27, - 0x06, 0x69, 0xE3, 0xC0, 0x6E, 0x21, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x20, 0x03, 0xA6, 0x92, - 0xBE, 0x0B, 0x6E, 0x83, 0xAD, 0x60, 0x0D, 0xCC, 0xF2, 0xCA, 0x09, 0x13, 0x1F, 0x1C, 0x1B, 0x59, - 0x9A, 0xD1, 0xC8, 0x07, 0x3A, 0xFD, 0xC1, 0x62, 0x0D, 0x1C, 0x23, 0x70, 0x3A, 0x1A, 0x00, 0x00, - 0x92, 0x11, 0x00, 0x00, 0x20, 0x03, 0x45, 0x07, 0xA5, 0xE0, 0xC4, 0xF4, 0x1D, 0x19, 0xA8, 0x0D, - 0x15, 0x43, 0x83, 0x3F, 0x1A, 0x9D, 0x90, 0x27, 0x7B, 0xC3, 0x76, 0x44, 0x1B, 0x27, 0x78, 0x84, - 0xBB, 0x04, 0x3B, 0xE2, 0x4B, 0xA5, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0x20, 0x03, 0x8C, 0xC1, - 0x14, 0xEC, 0x99, 0x5B, 0xEB, 0x8A, 0x5D, 0x4F, 0x0F, 0x4E, 0x66, 0x29, 0x32, 0x86, 0xA3, 0x85, - 0x66, 0x70, 0xF8, 0x9F, 0x85, 0x88, 0x9C, 0x2F, 0x81, 0x99, 0xF8, 0x03, 0xCE, 0x9C, 0x00, 0x00, - 0x30, 0x12, 0x00, 0x00, 0x20, 0x03, 0x7D, 0x71, 0xB7, 0xE0, 0x51, 0xC9, 0xC5, 0x2E, 0xCE, 0x96, - 0xC1, 0xE7, 0x8F, 0xE7, 0x99, 0xBB, 0xFC, 0x03, 0xE7, 0xB2, 0x20, 0xCB, 0x89, 0xE8, 0x88, 0x7B, - 0x7C, 0xA1, 0x0E, 0xF1, 0xA4, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x20, 0x03, 0x4E, 0xE4, - 0x16, 0xB2, 0xD2, 0x4E, 0x45, 0xCF, 0xC5, 0xD3, 0x5C, 0xE5, 0xB3, 0x48, 0x33, 0xB6, 0x4B, 0x34, - 0xFD, 0x9A, 0x39, 0x95, 0x7C, 0x66, 0xD7, 0x55, 0x09, 0xF6, 0xD3, 0xB8, 0xF9, 0x72, 0x00, 0x00, - 0xC5, 0x12, 0x00, 0x00, 0x20, 0x03, 0x08, 0xDD, 0xFF, 0x85, 0xEC, 0x80, 0xF1, 0x2B, 0x15, 0x68, - 0x37, 0xBB, 0xCE, 0x4F, 0x96, 0x94, 0x80, 0xFE, 0xA0, 0xE3, 0x2A, 0x08, 0xDA, 0xDE, 0x7C, 0xC1, - 0x6A, 0xCE, 0xCB, 0x08, 0x92, 0xD1, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x20, 0x03, 0xE4, 0x78, - 0x61, 0x76, 0x2A, 0x4B, 0x51, 0xA2, 0x68, 0x9C, 0x8A, 0x99, 0x79, 0x8A, 0x1A, 0x7E, 0x68, 0x33, - 0x55, 0x73, 0xE0, 0x3C, 0x85, 0x7E, 0x54, 0x51, 0x72, 0xB0, 0x95, 0xC5, 0xC8, 0x29, 0x00, 0x00, - 0x55, 0x13, 0x00, 0x00, 0x20, 0x03, 0xFD, 0x61, 0x7C, 0x29, 0x33, 0x68, 0xBB, 0x32, 0x25, 0x11, - 0xBB, 0x64, 0xC3, 0xD3, 0x2F, 0x4E, 0x5F, 0xA0, 0x64, 0x43, 0xF2, 0xB3, 0x0C, 0x72, 0x5F, 0xCD, - 0x39, 0x0C, 0x12, 0x81, 0x95, 0x18, 0x00, 0x00, 0xA1, 0x13, 0x00, 0x00, 0x20, 0x03, 0xCF, 0xA8, - 0xE3, 0x62, 0x6D, 0xBA, 0x11, 0x68, 0x99, 0x97, 0xD8, 0xFC, 0xD6, 0x5B, 0x5D, 0xFB, 0xF4, 0xBC, - 0xEF, 0x8D, 0xE0, 0x9D, 0xD7, 0xE4, 0xE8, 0x81, 0x76, 0x9D, 0x48, 0xD1, 0x65, 0xA2, 0x00, 0x00, - 0xED, 0x13, 0x00, 0x00, 0x20, 0x03, 0x9B, 0x6E, 0xBD, 0x7F, 0xB7, 0xB3, 0x2F, 0xE7, 0xEA, 0x6B, - 0x3C, 0xE7, 0x6F, 0x7C, 0x26, 0xED, 0x94, 0x66, 0x82, 0x1C, 0x24, 0x61, 0xFB, 0x71, 0x70, 0x7A, - 0xC2, 0xE2, 0x94, 0x6C, 0x07, 0x5C, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x20, 0x03, 0x39, 0x8E, - 0xF4, 0xF8, 0x27, 0x7A, 0x1E, 0xDB, 0x58, 0xE4, 0x1C, 0x5E, 0x82, 0x33, 0xE8, 0xDC, 0xE7, 0x74, - 0x45, 0x22, 0xBA, 0x8E, 0x98, 0x9D, 0x90, 0x4E, 0x93, 0x99, 0x1A, 0x25, 0x4C, 0x71, 0x00, 0x00, - 0x83, 0x14, 0x00, 0x00, 0x20, 0x03, 0x62, 0x1C, 0x02, 0x52, 0xA8, 0xA8, 0x31, 0x81, 0x35, 0x92, - 0xC4, 0xA9, 0x5E, 0x18, 0x3A, 0x2E, 0x7A, 0xE5, 0x5E, 0xFB, 0xBD, 0x7B, 0x8A, 0xD8, 0x86, 0xAF, - 0x7D, 0x88, 0x71, 0xFC, 0x4D, 0x50, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0x20, 0x03, 0x22, 0xB6, - 0x06, 0xB0, 0xA4, 0x09, 0x62, 0x95, 0x27, 0x2B, 0xCA, 0xE6, 0xFC, 0x35, 0x3C, 0x4F, 0x15, 0x9F, - 0x0C, 0xDF, 0xC9, 0x0B, 0x5F, 0x1A, 0x9A, 0x71, 0x2B, 0x2F, 0xFF, 0x50, 0xB5, 0x3F, 0x00, 0x00, - 0x19, 0x15, 0x00, 0x00, 0x20, 0x03, 0x70, 0xAD, 0x11, 0x26, 0x00, 0x3B, 0x54, 0x74, 0x3C, 0xB8, - 0xD1, 0x9D, 0x30, 0xE6, 0x8D, 0xB6, 0xDC, 0xFC, 0x4B, 0xDF, 0xBF, 0x23, 0x03, 0x14, 0x35, 0x36, - 0xB1, 0x66, 0xE6, 0xBA, 0x1F, 0x93, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x20, 0x03, 0x08, 0xBD, - 0x9C, 0x29, 0x5C, 0xE9, 0xFF, 0xDA, 0xCA, 0x18, 0x55, 0x12, 0xA2, 0xB3, 0x18, 0xB4, 0x70, 0x27, - 0xB0, 0x21, 0x57, 0xB4, 0x92, 0x10, 0x42, 0x30, 0xEF, 0xC8, 0x21, 0xFB, 0xA2, 0x3B, 0x00, 0x00, - 0xB5, 0x15, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x1D, 0x7D, 0xEE, 0x4D, 0x22, 0xCA, 0x84, 0x8E, 0x31, - 0x10, 0xA4, 0xC5, 0x5F, 0x32, 0xE1, 0x91, 0x8D, 0xC8, 0x65, 0x47, 0x93, 0x43, 0x89, 0x6A, 0xEC, - 0x9A, 0xB6, 0x53, 0xEE, 0x51, 0x10, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x20, 0x03, 0x85, 0xCC, - 0x13, 0xED, 0x70, 0x28, 0x96, 0x0B, 0xD7, 0xF9, 0x7C, 0x91, 0xF9, 0x8B, 0x96, 0x82, 0x5B, 0x46, - 0xF4, 0xB8, 0xBC, 0x38, 0x6A, 0xED, 0x2F, 0x2A, 0x6A, 0x9B, 0xCC, 0xBE, 0x40, 0x83, 0x00, 0x00, - 0x5D, 0x16, 0x00, 0x00, 0x20, 0x03, 0x5D, 0x61, 0xD0, 0xB6, 0x73, 0x4E, 0xF0, 0x83, 0x2C, 0x30, - 0x06, 0x48, 0x00, 0xE8, 0xD0, 0x1B, 0x3F, 0x12, 0xD2, 0x9D, 0x24, 0xC8, 0xB1, 0xBD, 0x07, 0xB3, - 0xEC, 0xE3, 0xB7, 0x2A, 0x93, 0x30, 0x00, 0x00, 0xC0, 0x16, 0x00, 0x00, 0x20, 0x03, 0x04, 0x05, - 0x35, 0xB1, 0x9A, 0x60, 0x26, 0x4E, 0x5F, 0xE6, 0x97, 0x1F, 0x7C, 0xB1, 0x3C, 0xBF, 0x24, 0xBE, - 0x17, 0xAB, 0xEE, 0xAA, 0x8A, 0xCD, 0x21, 0xE4, 0x4F, 0x5D, 0x7D, 0xFE, 0x8D, 0x22, 0x00, 0x00, - 0x0C, 0x17, 0x00, 0x00, 0x20, 0x03, 0xA9, 0xCF, 0x08, 0xBE, 0x84, 0x07, 0xA1, 0x96, 0x10, 0x41, - 0x24, 0xD5, 0xAD, 0xE2, 0x30, 0x8E, 0x20, 0x4E, 0x47, 0xD3, 0x25, 0x2B, 0xCD, 0x2A, 0xD2, 0x0D, - 0x0F, 0x21, 0x37, 0x84, 0x3D, 0x62, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x20, 0x03, 0x00, 0xC8, - 0x74, 0xB9, 0x81, 0xA1, 0x24, 0x2E, 0xE4, 0xEB, 0xC2, 0x1E, 0x6A, 0xE9, 0x6A, 0x69, 0xD7, 0xAA, - 0x70, 0x66, 0x2D, 0x82, 0x0C, 0xEF, 0xFB, 0xAB, 0xCF, 0xEA, 0x85, 0x9B, 0x03, 0xE4, 0x00, 0x00, - 0xAB, 0x17, 0x00, 0x00, 0x20, 0x03, 0xE9, 0x52, 0x41, 0xCA, 0x67, 0x62, 0x85, 0xFE, 0xC2, 0xD1, - 0xAB, 0x71, 0xF8, 0xEA, 0xBF, 0x94, 0xAF, 0xDF, 0xCC, 0x75, 0x8B, 0x4F, 0xD4, 0xC5, 0x28, 0xDE, - 0x69, 0x5B, 0x82, 0x58, 0x59, 0xB6, 0x00, 0x00, 0xFC, 0x17, 0x00, 0x00, 0x20, 0x03, 0x49, 0xB1, - 0x28, 0x98, 0xB4, 0x2B, 0xCF, 0x53, 0xE5, 0xF8, 0xFB, 0x75, 0xE6, 0xDB, 0x1A, 0x5D, 0x3F, 0xFB, - 0x7A, 0x9F, 0x39, 0x4E, 0x50, 0xDF, 0x33, 0x51, 0xE0, 0x82, 0x4D, 0x4A, 0x8B, 0x42, 0x00, 0x00, - 0x54, 0x18, 0x00, 0x00, 0x20, 0x03, 0x6A, 0xBA, 0x76, 0xEA, 0xBB, 0xEC, 0x62, 0x7E, 0xDA, 0xDB, - 0xA5, 0xAB, 0x29, 0x30, 0x4D, 0x9E, 0x2F, 0xF4, 0xEB, 0x9D, 0xA1, 0x65, 0xFD, 0x81, 0xA9, 0x09, - 0x5C, 0x85, 0x1F, 0x40, 0x5A, 0x01, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x20, 0x03, 0x81, 0x4C, - 0x7B, 0x46, 0x2A, 0x7D, 0xB0, 0x89, 0x4E, 0xD5, 0x67, 0x6C, 0xEB, 0x6F, 0x86, 0xA8, 0x97, 0xBD, - 0xFC, 0xA7, 0x02, 0xAB, 0xCE, 0xA1, 0x1C, 0x97, 0x78, 0x2C, 0x88, 0x58, 0x60, 0x9E, 0x00, 0x00, - 0xF3, 0x18, 0x00, 0x00, 0x20, 0x03, 0x9C, 0xF7, 0xE9, 0xE1, 0xC9, 0xB5, 0x5C, 0x7C, 0x35, 0x1E, - 0x87, 0xFF, 0x5A, 0x98, 0xE3, 0x62, 0xB6, 0xFF, 0xDB, 0x51, 0x1C, 0x33, 0x09, 0xAB, 0x9C, 0xF4, - 0x6B, 0x62, 0xB0, 0xDA, 0xCE, 0x42, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x20, 0x03, 0x99, 0xFD, - 0x81, 0xF9, 0x46, 0x41, 0x50, 0xF5, 0x69, 0x63, 0xC3, 0xBB, 0xAF, 0xAA, 0x95, 0xF9, 0x3B, 0x83, - 0x7C, 0x22, 0x1C, 0x42, 0x37, 0xE6, 0xE3, 0x99, 0xA8, 0x5E, 0x00, 0xEA, 0x9F, 0x39, 0x00, 0x00, - 0x99, 0x19, 0x00, 0x00, 0x20, 0x03, 0x30, 0x54, 0x0E, 0xB3, 0x5D, 0xAA, 0x79, 0xC7, 0xA5, 0xCB, - 0x98, 0x05, 0x94, 0x30, 0xDF, 0x48, 0x0E, 0x86, 0xB5, 0x49, 0xB7, 0x98, 0x02, 0x47, 0x28, 0x8D, - 0xA8, 0xA2, 0x80, 0x1A, 0xDD, 0x1D, 0x00, 0x00, 0xE1, 0x19, 0x00, 0x00, 0x20, 0x03, 0x46, 0x4C, - 0x48, 0x45, 0x42, 0x56, 0xE0, 0x1A, 0x64, 0x8E, 0x77, 0xE3, 0xD3, 0xF5, 0x77, 0xC9, 0xA5, 0xBD, - 0x00, 0x53, 0xC1, 0x7A, 0x16, 0xBB, 0x72, 0xD3, 0x22, 0x84, 0x9B, 0x4A, 0x73, 0x6F, 0x00, 0x00, - 0x2D, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x81, 0x97, 0x11, 0x87, 0xB8, 0x2B, 0x27, 0xDF, 0x42, 0x47, - 0x77, 0x61, 0xE5, 0x62, 0xD8, 0x83, 0xD2, 0x4B, 0x2E, 0x81, 0xF5, 0x0F, 0x2A, 0x8C, 0xEF, 0x4E, - 0xC0, 0x67, 0xC3, 0x48, 0xF8, 0xA5, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x47, 0xF3, - 0x97, 0x2A, 0x12, 0x11, 0xE3, 0xA5, 0xAC, 0x32, 0xB1, 0x8F, 0xAE, 0x1A, 0x82, 0x4D, 0xB0, 0x87, - 0xDC, 0x7D, 0xC5, 0x62, 0xD1, 0x52, 0xE9, 0xCC, 0xAB, 0x9B, 0x29, 0x7F, 0xAE, 0xF0, 0x00, 0x00, - 0xCC, 0x1A, 0x00, 0x00, 0x20, 0x03, 0x63, 0xC6, 0x23, 0xA8, 0x27, 0xF1, 0x02, 0xBF, 0x51, 0x01, - 0x9A, 0xA1, 0xF6, 0xB7, 0x44, 0xAD, 0xD4, 0x83, 0xCD, 0x66, 0xED, 0x24, 0x78, 0x02, 0xE9, 0x3B, - 0x5D, 0xBC, 0x6A, 0x7A, 0xDF, 0x12, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x1C, 0xB4, - 0xD0, 0x7A, 0x21, 0x8E, 0xC4, 0x3C, 0x79, 0x35, 0xB4, 0x31, 0xB1, 0x61, 0x46, 0xFC, 0x0F, 0x3D, - 0x29, 0xD4, 0x3B, 0xD1, 0x92, 0xF1, 0x29, 0x59, 0x05, 0x1D, 0x62, 0xC4, 0x8D, 0x57, 0x00, 0x00, - 0x6D, 0x1B, 0x00, 0x00, 0x20, 0x03, 0x94, 0x2D, 0x0B, 0x80, 0xEB, 0x7D, 0x18, 0x6E, 0xE9, 0x35, - 0xFC, 0xE8, 0x06, 0x4C, 0xCD, 0xCD, 0xEA, 0x3A, 0x49, 0xB3, 0x9B, 0xCC, 0x03, 0xF5, 0x52, 0x08, - 0xB7, 0xC3, 0x7E, 0x28, 0x97, 0x79, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xC6, 0x0E, - 0x13, 0x7E, 0x7F, 0xF8, 0x85, 0x82, 0xF7, 0x2E, 0x50, 0xFE, 0x74, 0x90, 0x4F, 0x57, 0x73, 0x50, - 0x2D, 0x22, 0x9F, 0x78, 0x23, 0x4E, 0xA8, 0x3A, 0xBB, 0x26, 0x88, 0xF6, 0xE8, 0xAE, 0x00, 0x00, - 0xFA, 0x1B, 0x00, 0x00, 0x20, 0x03, 0xFF, 0x9B, 0xEE, 0x8E, 0xE5, 0xB7, 0xAA, 0x81, 0xEA, 0xF7, - 0x9A, 0x1E, 0xAB, 0x0E, 0x93, 0xBD, 0x30, 0x76, 0x01, 0xE8, 0x7D, 0x3B, 0x80, 0xA7, 0x3F, 0x24, - 0x98, 0x4E, 0x9C, 0x95, 0x1C, 0x61, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x0C, 0x08, - 0x46, 0x3F, 0xBC, 0x5A, 0x23, 0xA8, 0x86, 0x2E, 0x57, 0x69, 0x9E, 0x2F, 0x30, 0xDD, 0x14, 0xCD, - 0x3D, 0xB4, 0xA4, 0x09, 0x03, 0xE4, 0xFC, 0xA9, 0x39, 0x2A, 0x57, 0x94, 0x2D, 0xAE, 0x00, 0x00, - 0x90, 0x1C, 0x00, 0x00, 0x20, 0x03, 0xE5, 0x6B, 0x73, 0xEF, 0xAC, 0xB2, 0xAA, 0xB3, 0x59, 0x62, - 0x1E, 0x97, 0xA8, 0x1C, 0x82, 0xB7, 0xDF, 0x71, 0xF5, 0x57, 0xAE, 0xC4, 0x8C, 0xAD, 0xAF, 0x39, - 0xFE, 0xE0, 0x9B, 0x73, 0x90, 0xC5, 0x00, 0x00, 0xDB, 0x1C, 0x00, 0x00, 0x20, 0x03, 0x1E, 0x73, - 0x4C, 0x1D, 0x26, 0x25, 0xE7, 0x19, 0xA4, 0x54, 0x7A, 0x6E, 0x4F, 0x64, 0x7A, 0x88, 0x8D, 0x80, - 0x4D, 0x2C, 0xFE, 0xF5, 0xEE, 0x3A, 0x85, 0xC8, 0x31, 0x19, 0x42, 0x1D, 0x9C, 0xF1, 0x00, 0x00, - 0x28, 0x1D, 0x00, 0x00, 0x20, 0x03, 0x5D, 0xE0, 0xDA, 0x90, 0xCA, 0x80, 0x5C, 0x29, 0xB8, 0x26, - 0x16, 0x00, 0x25, 0x11, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, 0x06, 0x10, 0x00, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x42, 0x41, 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x2E, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, 0x41, 0x47, 0x00, 0x00, 0x32, 0x00, 0x07, 0x11, - 0x06, 0x10, 0x00, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, - 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x00, 0x00, - 0x2A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x36, 0x00, 0x07, 0x11, - 0x08, 0x10, 0x00, 0x00, 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x53, 0x54, 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, - 0x4D, 0x45, 0x00, 0x00, 0x3A, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0x00, - 0x42, 0x00, 0x07, 0x11, 0x08, 0x10, 0x00, 0x00, 0x08, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, - 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, 0x46, 0x54, 0x5F, 0x43, - 0x41, 0x50, 0x00, 0x00, 0x1A, 0x00, 0x07, 0x11, 0x0A, 0x10, 0x00, 0x00, 0x03, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0x00, - 0x1E, 0x00, 0x07, 0x11, 0x0C, 0x10, 0x00, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0x00, - 0x36, 0x00, 0x07, 0x11, 0x0E, 0x10, 0x00, 0x00, 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, - 0x41, 0x43, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x07, 0x11, 0x10, 0x10, 0x00, 0x00, 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x49, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, - 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, - 0x1E, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, - 0x69, 0x6D, 0x70, 0x5F, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, - 0x16, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, - 0xB8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, - 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, - 0x33, 0x32, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x7F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, - 0x5F, 0x54, 0x48, 0x55, 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x50, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1A, 0x09, 0x2F, 0xF1, 0x28, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x04, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, - 0x10, 0x05, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0xE8, 0x04, 0x00, 0x00, - 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, - 0x55, 0x49, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x72, 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x12, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, - 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x70, 0x06, 0x00, 0x00, 0x50, 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5F, 0x74, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x21, 0x00, 0x00, 0x00, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x06, 0x00, 0x00, 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x59, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x53, 0x49, 0x5A, 0x45, 0x5F, 0x54, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, 0x44, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x11, 0x11, 0x06, 0x00, 0x00, 0x50, 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, - 0x12, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4F, 0x4E, 0x00, 0x00, 0x1E, 0x00, 0x08, 0x11, 0x10, 0x10, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x44, 0x57, 0x4F, 0x52, - 0x44, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x4C, - 0x45, 0x41, 0x4E, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, 0x50, 0x56, 0x4F, 0x49, - 0x44, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, 0x65, 0x72, 0x72, 0x6E, - 0x6F, 0x5F, 0x74, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x00, 0x00, 0x00, 0x57, 0x43, 0x48, 0x41, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x20, 0x06, 0x00, 0x00, 0x50, 0x42, 0x59, 0x54, - 0x45, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x12, 0x00, 0x00, 0x00, 0x48, 0x52, 0x45, 0x53, - 0x55, 0x4C, 0x54, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, 0x4C, 0x4F, 0x4E, 0x47, - 0x36, 0x34, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x22, 0x00, 0x00, 0x00, 0x55, 0x4C, 0x4F, 0x4E, - 0x47, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x50, 0x57, 0x53, 0x54, - 0x52, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x75, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x33, 0x32, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x71, 0x06, 0x00, 0x00, 0x4C, 0x50, 0x57, 0x53, - 0x54, 0x52, 0x00, 0x00, 0x12, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, 0x55, 0x49, 0x4E, 0x54, - 0x5F, 0x50, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x74, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x03, 0x06, 0x00, 0x00, - 0x48, 0x41, 0x4E, 0x44, 0x4C, 0x45, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x23, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x7A, 0x65, 0x5F, 0x74, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x53, 0x48, 0x4F, 0x52, 0x54, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x06, 0x00, 0x00, - 0x50, 0x4C, 0x4F, 0x4E, 0x47, 0x36, 0x34, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x13, 0x00, 0x00, 0x00, - 0x49, 0x4E, 0x54, 0x5F, 0x50, 0x54, 0x52, 0x00, 0x0E, 0x00, 0x08, 0x11, 0x70, 0x00, 0x00, 0x00, - 0x43, 0x48, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x0E, 0x11, 0x02, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x00, 0x00, 0x00, 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, - 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x4F, 0x52, 0x00, 0x00, 0x1E, 0x00, 0x0E, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5F, 0x5F, 0x69, 0x6D, 0x70, 0x5F, - 0x45, 0x78, 0x69, 0x74, 0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x0E, 0x11, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, - 0x02, 0x00, 0x5F, 0x5F, 0x49, 0x4D, 0x50, 0x4F, 0x52, 0x54, 0x5F, 0x44, 0x45, 0x53, 0x43, 0x52, - 0x49, 0x50, 0x54, 0x4F, 0x52, 0x5F, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x00, 0x00, - 0x26, 0x00, 0x0E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0x4B, - 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, 0x5F, 0x4E, 0x55, 0x4C, 0x4C, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x09, 0x31, 0x01, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x29, 0x8E, - 0x0E, 0x00, 0x48, 0x85, 0x0F, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0xA8, 0x01, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x86, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0A, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0F, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, - 0x6F, 0x62, 0x6A, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, - 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, - 0x61, 0x69, 0x6E, 0x2E, 0x6F, 0x62, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x45, 0x52, 0x4E, 0x45, 0x4C, 0x33, 0x32, - 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, 0x69, 0x62, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, 0x6C, 0x69, 0x62, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x49, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x4B, 0x45, 0x52, 0x4E, 0x45, - 0x4C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x6C, - 0x69, 0x62, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x4B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, - 0x6C, 0x69, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2A, 0x20, 0x4C, 0x69, 0x6E, 0x6B, 0x65, 0x72, 0x20, 0x2A, 0x00, 0x00, - 0x2D, 0xBA, 0x2E, 0xF1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA9, 0xAB, 0xB5, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xC0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xDC, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x88, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xCC, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x40, 0x30, 0x40, 0xC0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x40, 0x20, 0x40, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, - 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, - 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, - 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, - 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, - 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, - 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, - 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, - 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, - 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, - 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, - 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, - 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, - 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, - 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, - 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, - 0x65, 0x73, 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, - 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, - 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, - 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6D, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x69, 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, - 0x70, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, - 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x5C, 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, - 0x77, 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, - 0x5F, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, - 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, - 0x65, 0x72, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, - 0x70, 0x69, 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x00, 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, - 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, - 0x2E, 0x70, 0x64, 0x62, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x40, 0x30, 0x20, 0xC0, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0xFE, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x20, 0x20, 0xC0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0D, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x02, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, - 0x26, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, - 0x54, 0x02, 0x00, 0x00, 0xA6, 0x02, 0x00, 0x00, 0xF2, 0x02, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, - 0x8F, 0x03, 0x00, 0x00, 0xB1, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x4F, 0x04, 0x00, 0x00, - 0x99, 0x04, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, - 0xC3, 0x05, 0x00, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x7C, 0x06, 0x00, 0x00, 0xCD, 0x06, 0x00, 0x00, - 0x1A, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xAD, 0x07, 0x00, 0x00, 0xFA, 0x07, 0x00, 0x00, - 0x46, 0x08, 0x00, 0x00, 0x8F, 0x08, 0x00, 0x00, 0xDD, 0x08, 0x00, 0x00, 0x2F, 0x09, 0x00, 0x00, - 0x7D, 0x09, 0x00, 0x00, 0xC6, 0x09, 0x00, 0x00, 0x14, 0x0A, 0x00, 0x00, 0x62, 0x0A, 0x00, 0x00, - 0xB4, 0x0A, 0x00, 0x00, 0x0C, 0x0B, 0x00, 0x00, 0x62, 0x0B, 0x00, 0x00, 0xAD, 0x0B, 0x00, 0x00, - 0xFC, 0x0B, 0x00, 0x00, 0x5E, 0x0C, 0x00, 0x00, 0xC4, 0x0C, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00, - 0x74, 0x0D, 0x00, 0x00, 0xDF, 0x0D, 0x00, 0x00, 0x42, 0x0E, 0x00, 0x00, 0x8A, 0x0E, 0x00, 0x00, - 0xDD, 0x0E, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0xC1, 0x0F, 0x00, 0x00, - 0x0A, 0x10, 0x00, 0x00, 0x5B, 0x10, 0x00, 0x00, 0xA9, 0x10, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, - 0x3D, 0x11, 0x00, 0x00, 0x90, 0x11, 0x00, 0x00, 0xE4, 0x11, 0x00, 0x00, 0x2E, 0x12, 0x00, 0x00, - 0x7E, 0x12, 0x00, 0x00, 0xC3, 0x12, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x53, 0x13, 0x00, 0x00, - 0x9F, 0x13, 0x00, 0x00, 0xEB, 0x13, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x81, 0x14, 0x00, 0x00, - 0xCE, 0x14, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x65, 0x15, 0x00, 0x00, 0xB3, 0x15, 0x00, 0x00, - 0x05, 0x16, 0x00, 0x00, 0x5B, 0x16, 0x00, 0x00, 0xBE, 0x16, 0x00, 0x00, 0x0A, 0x17, 0x00, 0x00, - 0x59, 0x17, 0x00, 0x00, 0xA9, 0x17, 0x00, 0x00, 0xFA, 0x17, 0x00, 0x00, 0x52, 0x18, 0x00, 0x00, - 0xA9, 0x18, 0x00, 0x00, 0xF1, 0x18, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x97, 0x19, 0x00, 0x00, - 0xDF, 0x19, 0x00, 0x00, 0x2B, 0x1A, 0x00, 0x00, 0x7C, 0x1A, 0x00, 0x00, 0xCA, 0x1A, 0x00, 0x00, - 0x1D, 0x1B, 0x00, 0x00, 0x6B, 0x1B, 0x00, 0x00, 0xB0, 0x1B, 0x00, 0x00, 0xF8, 0x1B, 0x00, 0x00, - 0x41, 0x1C, 0x00, 0x00, 0x8E, 0x1C, 0x00, 0x00, 0xD9, 0x1C, 0x00, 0x00, 0x26, 0x1D, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x6E, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, - 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, - 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, - 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, - 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, - 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, - 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, - 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, - 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, - 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, - 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, - 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, - 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, - 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, - 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, - 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, - 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, - 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, - 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0xFE, 0xEF, 0xFE, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x23, 0x1E, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x67, 0x64, 0x69, 0x2E, 0x68, 0x00, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x74, - 0x79, 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x64, - 0x70, 0x69, 0x70, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x65, 0x62, 0x75, 0x67, 0x61, 0x70, - 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x63, 0x72, 0x74, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x6E, 0x63, - 0x6C, 0x61, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, - 0x72, 0x74, 0x5F, 0x6D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x65, 0x5F, 0x63, - 0x6D, 0x6F, 0x64, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x6D, 0x65, 0x6D, 0x63, 0x70, 0x79, 0x5F, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x65, 0x72, 0x72, - 0x6E, 0x6F, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, - 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x5C, - 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, 0x70, 0x61, 0x63, - 0x6B, 0x31, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x66, 0x72, 0x6F, 0x6D, 0x61, - 0x70, 0x70, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x65, 0x74, 0x77, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, - 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x6E, 0x6E, 0x63, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x6F, 0x70, 0x70, 0x61, 0x63, 0x6B, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6F, - 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, - 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x63, 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x62, 0x61, 0x73, 0x65, 0x74, 0x73, 0x64, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, - 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x74, 0x76, 0x6F, 0x75, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x63, 0x6F, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x75, - 0x74, 0x69, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x75, 0x73, - 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6C, 0x69, 0x62, 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, 0x5F, 0x77, 0x63, 0x74, 0x79, - 0x70, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, - 0x73, 0x68, 0x70, 0x61, 0x63, 0x6B, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6B, 0x74, 0x6D, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x61, 0x70, - 0x69, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, - 0x6F, 0x6F, 0x6C, 0x6C, 0x65, 0x67, 0x61, 0x63, 0x79, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x66, - 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x64, 0x6B, 0x64, 0x64, 0x6B, 0x76, 0x65, 0x72, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, - 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, - 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, - 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, - 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x65, 0x78, 0x63, 0x70, - 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, 0x63, - 0x72, 0x75, 0x6E, 0x74, 0x69, 0x6D, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x6F, - 0x63, 0x6B, 0x65, 0x64, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x73, 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, - 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, - 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, - 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, - 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x63, 0x6F, 0x6E, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x73, - 0x61, 0x6C, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, - 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, - 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, - 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, - 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x76, - 0x61, 0x64, 0x65, 0x66, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x73, 0x76, 0x63, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6D, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x61, - 0x70, 0x69, 0x71, 0x75, 0x65, 0x72, 0x79, 0x32, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x6E, 0x76, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x63, 0x63, 0x6F, 0x6E, 0x76, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5C, 0x77, 0x69, 0x6E, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x69, - 0x6E, 0x77, 0x69, 0x6E, 0x62, 0x61, 0x73, 0x65, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, - 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, - 0x63, 0x65, 0x73, 0x73, 0x74, 0x6F, 0x70, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x61, 0x70, 0x69, 0x2E, - 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, - 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, - 0x5C, 0x73, 0x79, 0x6E, 0x63, 0x68, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x65, 0x72, 0x72, 0x68, 0x61, - 0x6E, 0x64, 0x6C, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6D, 0x63, 0x78, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x6E, 0x6C, 0x73, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x73, 0x79, 0x73, 0x69, 0x6E, 0x66, 0x6F, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x70, 0x72, 0x6F, 0x66, - 0x69, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6D, 0x65, - 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x6A, 0x6F, 0x62, 0x61, 0x70, 0x69, 0x32, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x74, 0x69, - 0x6D, 0x65, 0x7A, 0x6F, 0x6E, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x68, 0x65, 0x61, 0x70, 0x61, - 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x74, 0x72, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, - 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x70, 0x6F, 0x6F, 0x6C, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, - 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, - 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, - 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, - 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x61, 0x70, 0x70, 0x63, 0x6F, 0x6E, - 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x73, 0x74, 0x64, 0x61, 0x72, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x77, - 0x69, 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x6D, 0x69, 0x6E, 0x77, 0x69, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x69, 0x6D, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x70, 0x65, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x5F, 0x75, - 0x6E, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x65, 0x67, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x73, 0x2E, 0x68, 0x00, - 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, - 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, - 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, - 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x5C, 0x73, 0x64, 0x76, 0x5F, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x73, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x75, 0x6D, 0x5C, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, - 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, - 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, - 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, - 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x62, 0x61, 0x73, 0x65, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, - 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, - 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, - 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, 0x68, - 0x70, 0x61, 0x63, 0x6B, 0x38, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, - 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x5C, 0x63, 0x6F, 0x72, 0x65, 0x63, 0x72, 0x74, - 0x5F, 0x77, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5C, 0x70, 0x73, - 0x68, 0x70, 0x61, 0x63, 0x6B, 0x34, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, - 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, - 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x69, 0x6D, 0x6D, 0x2E, 0x68, 0x00, 0x43, 0x3A, - 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x77, 0x69, 0x6E, - 0x76, 0x65, 0x72, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, - 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, - 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x76, 0x65, 0x72, 0x72, 0x73, 0x72, 0x63, 0x2E, 0x68, 0x00, 0x43, - 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, - 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, - 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, - 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5C, 0x67, 0x75, 0x69, 0x64, 0x64, 0x65, 0x66, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x66, 0x69, 0x62, 0x65, 0x72, - 0x73, 0x61, 0x70, 0x69, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, - 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x5C, 0x63, 0x6F, 0x6E, 0x73, 0x6F, 0x6C, 0x65, 0x61, 0x70, 0x69, - 0x33, 0x2E, 0x68, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, - 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, - 0x75, 0x6D, 0x5C, 0x77, 0x6F, 0x77, 0x36, 0x34, 0x61, 0x70, 0x69, 0x73, 0x65, 0x74, 0x2E, 0x68, - 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, - 0x47, 0x53, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, - 0x41, 0x47, 0x53, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x52, 0x65, 0x70, 0x6C, - 0x61, 0x63, 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, - 0x63, 0x44, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, - 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, - 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x8B, - 0x00, 0x00, 0x00, 0x44, 0x19, 0x00, 0x00, 0x97, 0x1D, 0x00, 0x00, 0xA5, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x06, 0x00, 0x00, 0xE1, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x0F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xF7, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, - 0x0D, 0x00, 0x00, 0x75, 0x1D, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, - 0x10, 0x00, 0x00, 0x5D, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x02, 0x00, 0x00, 0xD4, - 0x0E, 0x00, 0x00, 0xD9, 0x03, 0x00, 0x00, 0x27, 0x0F, 0x00, 0x00, 0xCC, 0x1A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x0D, 0x00, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x2C, - 0x05, 0x00, 0x00, 0x43, 0x1C, 0x00, 0x00, 0xAC, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x1D, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0xDB, - 0x1C, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0xD0, 0x1D, 0x00, 0x00, 0xA8, 0x0C, 0x00, 0x00, 0x29, - 0x0E, 0x00, 0x00, 0x0C, 0x17, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x0D, - 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1A, 0x00, 0x00, 0xED, - 0x1D, 0x00, 0x00, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0xFC, - 0x17, 0x00, 0x00, 0xF3, 0x18, 0x00, 0x00, 0x83, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, - 0x0A, 0x00, 0x00, 0xE3, 0x04, 0x00, 0x00, 0x46, 0x0C, 0x00, 0x00, 0xFA, 0x1B, 0x00, 0x00, 0x74, - 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3A, 0x14, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x28, 0x1D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, - 0x09, 0x00, 0x00, 0xC3, 0x05, 0x00, 0x00, 0xBE, 0x0D, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x91, - 0x00, 0x00, 0x00, 0xAB, 0x17, 0x00, 0x00, 0xAC, 0x0B, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0xC7, - 0x09, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0xB2, 0x1B, 0x00, 0x00, 0xBE, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x1F, 0x1B, 0x00, 0x00, 0x56, 0x0B, 0x00, 0x00, 0xC0, - 0x16, 0x00, 0x00, 0x92, 0x11, 0x00, 0x00, 0xAB, 0x18, 0x00, 0x00, 0x90, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x8C, 0x0E, 0x00, 0x00, 0xA1, - 0x13, 0x00, 0x00, 0xD0, 0x14, 0x00, 0x00, 0xED, 0x13, 0x00, 0x00, 0x0D, 0x06, 0x00, 0x00, 0x55, - 0x13, 0x00, 0x00, 0xFE, 0x0A, 0x00, 0x00, 0x30, 0x12, 0x00, 0x00, 0x19, 0x15, 0x00, 0x00, 0x90, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x94, 0x2E, 0x31, 0x01, 0xA2, 0x5E, 0xFD, 0x66, 0x03, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x71, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, - 0x01, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0xC6, 0x06, 0x00, 0x00, 0x5B, 0x17, 0x00, 0x00, 0x0D, 0x13, 0x00, 0x00, 0x99, - 0x19, 0x00, 0x00, 0xB5, 0x15, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x7E, 0x1A, 0x00, 0x00, 0x6D, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x07, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xD9, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0xE6, 0x11, 0x00, 0x00, 0xAC, 0x07, 0x00, 0x00, 0x67, - 0x00, 0x00, 0x00, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xDC, 0x51, 0x33, 0x01, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xAD, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x10, 0x00, 0x00, - 0x68, 0x04, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, - 0x9C, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0xAC, 0x09, 0x00, 0x00, 0x11, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x08, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x10, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x10, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x10, - 0x03, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, - 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, - 0x41, 0x42, 0x4C, 0x45, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x42, 0x41, - 0x4E, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1B, 0x00, 0x00, 0x00, 0xA2, 0x5E, 0xFD, 0x66, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x15, 0x84, 0x0A, - 0xBC, 0x9F, 0xA1, 0x4B, 0x82, 0xB4, 0x94, 0xF1, 0x5B, 0x91, 0x63, 0x3A, 0x64, 0x00, 0x00, 0x00, - 0x2F, 0x4C, 0x69, 0x6E, 0x6B, 0x49, 0x6E, 0x66, 0x6F, 0x00, 0x2F, 0x54, 0x4D, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x00, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x00, 0x2F, 0x55, 0x44, 0x54, 0x53, - 0x52, 0x43, 0x4C, 0x49, 0x4E, 0x45, 0x55, 0x4E, 0x44, 0x4F, 0x4E, 0x45, 0x00, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x6C, 0x69, 0x6E, 0x6B, 0x24, 0x31, 0x00, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x6C, 0x69, 0x6E, - 0x6B, 0x24, 0x31, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDC, 0x51, 0x33, 0x01, 0x44, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, - 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x44, 0x53, 0x43, 0x50, 0x5F, 0x54, - 0x41, 0x47, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x07, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, - 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, 0x4C, 0x41, 0x47, - 0x53, 0x00, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x04, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x05, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, - 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, - 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, - 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x4E, 0x45, 0x54, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, - 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, 0x00, 0xF1, - 0x06, 0x01, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, - 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x45, 0x4E, 0x41, 0x42, 0x4C, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, - 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x53, 0x54, 0x41, - 0x4E, 0x44, 0x41, 0x4C, 0x4F, 0x4E, 0x45, 0x5F, 0x56, 0x4F, 0x4C, 0x55, 0x4D, 0x45, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, - 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, - 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5F, 0x41, 0x4C, 0x4C, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, 0x5F, 0x55, - 0x4E, 0x49, 0x54, 0x5F, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5F, 0x4F, 0x4E, 0x5F, 0x53, 0x4F, - 0x46, 0x54, 0x5F, 0x43, 0x41, 0x50, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x0F, 0x00, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x4A, 0x4F, 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, - 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, - 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x4A, 0x4F, - 0x42, 0x5F, 0x4F, 0x42, 0x4A, 0x45, 0x43, 0x54, 0x5F, 0x49, 0x4F, 0x5F, 0x52, 0x41, 0x54, 0x45, - 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x52, 0x4F, 0x4C, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x40, 0x40, - 0x00, 0xF3, 0xF2, 0xF1, 0x7E, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x50, 0x6F, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4E, - 0x6F, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x00, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x4D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6E, 0x76, 0x61, 0x6C, - 0x69, 0x64, 0x00, 0xF1, 0x46, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, - 0x09, 0x10, 0x00, 0x00, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x00, 0x2E, 0x3F, 0x41, 0x57, - 0x34, 0x5F, 0x55, 0x53, 0x45, 0x52, 0x5F, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5F, - 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x43, 0x45, 0x40, 0x40, 0x00, 0xF1, 0x2A, 0x03, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x4F, 0x4E, 0x4C, 0x59, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x49, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, - 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x53, 0x54, 0x52, 0x4F, 0x4E, 0x47, 0x4E, 0x41, 0x4D, 0x45, 0x53, - 0x49, 0x47, 0x4E, 0x45, 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, - 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x4E, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5F, 0x45, 0x4E, 0x54, 0x52, 0x59, 0x50, 0x4F, 0x49, 0x4E, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, - 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, 0x5F, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x44, 0x41, 0x54, 0x41, 0x00, 0x02, 0x15, 0x03, 0x00, 0x04, 0x80, 0x00, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x4D, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x46, 0x4C, 0x41, 0x47, 0x53, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, - 0x4E, 0x5F, 0x4D, 0x41, 0x4A, 0x4F, 0x52, 0x5F, 0x56, 0x32, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x41, - 0x4A, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, 0x05, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x5F, 0x4D, 0x49, 0x4E, 0x4F, 0x52, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x44, 0x45, 0x4C, 0x45, 0x54, 0x45, 0x44, 0x5F, 0x4E, 0x41, - 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x47, 0x41, 0x50, 0x5F, - 0x4E, 0x41, 0x4D, 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x47, 0x54, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, - 0x01, 0x00, 0x4E, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x42, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0xFF, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x49, 0x4C, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x5F, 0x53, 0x45, 0x43, 0x54, 0x5F, - 0x53, 0x4D, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x41, 0x58, 0x5F, 0x44, 0x41, 0x54, 0x41, 0x53, 0x49, - 0x5A, 0x45, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x4D, 0x45, 0x54, 0x48, 0x4F, 0x44, 0x52, 0x56, - 0x41, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, - 0x43, 0x4F, 0x52, 0x5F, 0x4D, 0x49, 0x48, 0x5F, 0x45, 0x48, 0x52, 0x56, 0x41, 0x00, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, - 0x4D, 0x49, 0x48, 0x5F, 0x42, 0x41, 0x53, 0x49, 0x43, 0x42, 0x4C, 0x4F, 0x43, 0x4B, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x33, 0x32, 0x42, 0x49, 0x54, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x43, 0x4F, - 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x36, 0x34, 0x42, 0x49, 0x54, 0x00, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x04, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x00, - 0x02, 0x15, 0x03, 0x00, 0x08, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x5F, 0x46, 0x52, 0x4F, 0x4D, 0x5F, 0x55, 0x4E, 0x4D, 0x41, 0x4E, 0x41, 0x47, 0x45, 0x44, 0x5F, - 0x52, 0x45, 0x54, 0x41, 0x49, 0x4E, 0x5F, 0x41, 0x50, 0x50, 0x44, 0x4F, 0x4D, 0x41, 0x49, 0x4E, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x10, 0x00, 0x43, 0x4F, 0x52, 0x5F, 0x56, 0x54, - 0x41, 0x42, 0x4C, 0x45, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x5F, 0x4D, 0x4F, 0x53, 0x54, 0x5F, 0x44, - 0x45, 0x52, 0x49, 0x56, 0x45, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x20, 0x00, 0x49, 0x4D, - 0x41, 0x47, 0x45, 0x5F, 0x43, 0x4F, 0x52, 0x5F, 0x45, 0x41, 0x54, 0x4A, 0x5F, 0x54, 0x48, 0x55, - 0x4E, 0x4B, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, - 0x58, 0x5F, 0x43, 0x4C, 0x41, 0x53, 0x53, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x04, 0x4D, 0x41, 0x58, 0x5F, 0x50, 0x41, 0x43, 0x4B, 0x41, 0x47, - 0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x00, 0xF1, 0x52, 0x00, 0x07, 0x15, 0x19, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x73, - 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x73, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x52, 0x65, 0x70, 0x6C, 0x61, 0x63, - 0x65, 0x73, 0x43, 0x6F, 0x72, 0x48, 0x64, 0x72, 0x4E, 0x75, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x73, 0x40, 0x40, 0x00, 0xF3, 0xF2, 0xF1, 0x5A, 0x01, 0x03, 0x12, - 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x55, 0x4E, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, - 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, - 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x56, 0x45, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x44, 0x49, - 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, - 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, - 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x02, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, - 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, - 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, 0x5F, 0x55, 0x50, 0x50, - 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, - 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, - 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4C, 0x41, 0x43, 0x45, 0x44, - 0x5F, 0x4C, 0x4F, 0x57, 0x45, 0x52, 0x46, 0x49, 0x45, 0x4C, 0x44, 0x46, 0x49, 0x52, 0x53, 0x54, - 0x00, 0xF3, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x44, 0x49, 0x53, 0x50, 0x4C, - 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, - 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x5F, 0x46, 0x4F, 0x52, 0x43, 0x45, - 0x5F, 0x55, 0x49, 0x4E, 0x54, 0x33, 0x32, 0x00, 0x56, 0x00, 0x07, 0x15, 0x06, 0x00, 0x00, 0x02, - 0x74, 0x00, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x44, 0x49, 0x53, 0x50, 0x4C, 0x41, 0x59, 0x43, - 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x4F, - 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x44, 0x49, 0x53, - 0x50, 0x4C, 0x41, 0x59, 0x43, 0x4F, 0x4E, 0x46, 0x49, 0x47, 0x5F, 0x53, 0x43, 0x41, 0x4E, 0x4C, - 0x49, 0x4E, 0x45, 0x5F, 0x4F, 0x52, 0x44, 0x45, 0x52, 0x49, 0x4E, 0x47, 0x40, 0x40, 0x00, 0xF1, - 0xAE, 0x00, 0x03, 0x12, 0x02, 0x15, 0x03, 0x00, 0x00, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x48, - 0x49, 0x47, 0x48, 0x00, 0x02, 0x15, 0x03, 0x00, 0x01, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, - 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x4E, - 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x00, 0xF2, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x02, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x4C, 0x4F, 0x57, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, 0x03, 0x00, 0x54, 0x50, - 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, - 0x54, 0x59, 0x5F, 0x49, 0x4E, 0x56, 0x41, 0x4C, 0x49, 0x44, 0x00, 0xF1, 0x02, 0x15, 0x03, 0x00, - 0x03, 0x00, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, - 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x00, 0xF3, 0xF2, 0xF1, - 0x42, 0x00, 0x07, 0x15, 0x05, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x00, - 0x5F, 0x54, 0x50, 0x5F, 0x43, 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, - 0x4F, 0x52, 0x49, 0x54, 0x59, 0x00, 0x2E, 0x3F, 0x41, 0x57, 0x34, 0x5F, 0x54, 0x50, 0x5F, 0x43, - 0x41, 0x4C, 0x4C, 0x42, 0x41, 0x43, 0x4B, 0x5F, 0x50, 0x52, 0x49, 0x4F, 0x52, 0x49, 0x54, 0x59, - 0x40, 0x40, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0xCA, 0x31, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, - 0x9C, 0x04, 0x00, 0x00, 0x13, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0x00, 0x00, 0x5F, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0xF1, 0x10, 0x00, 0x07, 0x16, - 0x06, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF3, 0x32, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x07, 0x16, 0x08, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x33, 0x00, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x07, 0x16, 0x0A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD7, 0x42, 0x00, 0x00, - 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0C, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x50, - 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x0E, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0F, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x07, 0x16, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x9E, 0x5E, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, - 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x61, 0x6C, 0x00, 0xF1, 0x72, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, - 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, - 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, - 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, - 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x62, 0x69, 0x6E, 0x5C, 0x48, 0x6F, 0x73, 0x74, 0x58, 0x36, - 0x34, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x63, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0xF3, 0xF2, 0xF1, - 0x0E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x63, 0x00, 0xF1, - 0x2E, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3A, 0x5C, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x5C, 0x44, 0x61, 0x76, 0x69, 0x64, 0x5C, 0x64, 0x65, 0x76, 0x5C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, - 0x61, 0x6C, 0x5C, 0x76, 0x63, 0x31, 0x34, 0x30, 0x2E, 0x70, 0x64, 0x62, 0x00, 0xF3, 0xF2, 0xF1, - 0xFA, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x4F, 0x73, 0x20, 0x2D, 0x73, 0x74, 0x64, - 0x3A, 0x63, 0x6C, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2D, 0x47, 0x53, 0x2D, 0x20, 0x2D, 0x6E, - 0x6F, 0x6C, 0x6F, 0x67, 0x6F, 0x20, 0x2D, 0x57, 0x58, 0x20, 0x2D, 0x57, 0x61, 0x6C, 0x6C, 0x20, - 0x2D, 0x5A, 0x69, 0x20, 0x2D, 0x4D, 0x54, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, - 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, - 0x64, 0x69, 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, - 0x74, 0x79, 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, - 0x5C, 0x31, 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x69, 0x6E, 0x63, - 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, - 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, - 0x6F, 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, - 0x6F, 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, - 0x5C, 0x56, 0x43, 0x5C, 0x54, 0x6F, 0x6F, 0x6C, 0x73, 0x5C, 0x4D, 0x53, 0x56, 0x43, 0x5C, 0x31, - 0x34, 0x2E, 0x34, 0x31, 0x2E, 0x33, 0x34, 0x31, 0x32, 0x30, 0x5C, 0x41, 0x54, 0x4C, 0x4D, 0x46, - 0x43, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x00, 0xF1, 0xF2, 0x00, 0x05, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x5C, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, - 0x66, 0x74, 0x20, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6C, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, - 0x5C, 0x32, 0x30, 0x32, 0x32, 0x5C, 0x43, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x74, 0x79, 0x5C, - 0x56, 0x43, 0x5C, 0x41, 0x75, 0x78, 0x69, 0x6C, 0x69, 0x61, 0x72, 0x79, 0x5C, 0x56, 0x53, 0x5C, - 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, - 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, - 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, - 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, - 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x63, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, - 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, - 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, - 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, - 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x75, 0x6D, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0xF1, - 0xF2, 0x00, 0x05, 0x16, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, - 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, - 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, - 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, - 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, - 0x5C, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, - 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x31, - 0x30, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x31, 0x30, 0x2E, 0x30, 0x2E, 0x32, - 0x32, 0x36, 0x32, 0x31, 0x2E, 0x30, 0x5C, 0x63, 0x70, 0x70, 0x77, 0x69, 0x6E, 0x72, 0x74, 0x22, - 0x20, 0x2D, 0x49, 0x22, 0x43, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x46, - 0x69, 0x6C, 0x65, 0x73, 0x20, 0x28, 0x78, 0x38, 0x36, 0x29, 0x5C, 0x57, 0x69, 0x6E, 0x64, 0x6F, - 0x77, 0x73, 0x00, 0xF1, 0x12, 0x00, 0x04, 0x16, 0x03, 0x00, 0x00, 0x00, 0x0B, 0x10, 0x00, 0x00, - 0x0C, 0x10, 0x00, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x05, 0x16, 0x0E, 0x10, 0x00, 0x00, - 0x20, 0x4B, 0x69, 0x74, 0x73, 0x5C, 0x4E, 0x45, 0x54, 0x46, 0x58, 0x53, 0x44, 0x4B, 0x5C, 0x34, - 0x2E, 0x38, 0x5C, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x5C, 0x75, 0x6D, 0x22, 0x20, 0x2D, - 0x54, 0x43, 0x20, 0x2D, 0x58, 0x00, 0xF2, 0xF1, 0x1A, 0x00, 0x03, 0x16, 0x05, 0x00, 0x07, 0x10, - 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x0F, 0x10, - 0x00, 0x00, 0xF2, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x24, 0x03, 0x00, 0xE0, 0x72, 0x00, 0x00, 0x7A, 0xBF, 0x00, 0x00, 0x35, 0x50, 0x01, 0x00, - 0x20, 0xAE, 0x02, 0x00, 0x57, 0xFE, 0x03, 0x00, 0xD2, 0xB2, 0x00, 0x00, 0x7A, 0xBA, 0x03, 0x00, - 0x51, 0xDE, 0x00, 0x00, 0x20, 0xE1, 0x01, 0x00, 0xAD, 0x29, 0x03, 0x00, 0xC1, 0xC3, 0x01, 0x00, - 0x06, 0xE5, 0x00, 0x00, 0xF8, 0x12, 0x01, 0x00, 0x89, 0x13, 0x01, 0x00, 0x07, 0xA8, 0x02, 0x00, - 0x2B, 0xD9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDD, 0xBC, 0x03, 0x00, 0x0D, 0x1C, 0x00, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x11, 0x1C, 0x00, 0x00, - 0x17, 0x1C, 0x00, 0x00, 0x15, 0x1C, 0x00, 0x00, 0x1B, 0x1C, 0x00, 0x00, 0x77, 0x1A, 0x00, 0x00, - 0xF5, 0x84, 0x00, 0x00, 0xAE, 0xF3, 0x03, 0x00, 0x9B, 0xC8, 0x01, 0x00, 0xAC, 0x90, 0x00, 0x00, - 0xF3, 0x1A, 0x02, 0x00, 0xFE, 0x6B, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x13, 0x3C, 0x00, 0x00, - 0xE1, 0x9D, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xE4, 0x09, 0x00, 0x00, - 0xC9, 0x23, 0x00, 0x00, 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x20, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, - 0xE4, 0x10, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, - 0xB8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/bootstrap/bloat-buster/pdb_image.h b/bootstrap/bloat-buster/pdb_image.h deleted file mode 100644 index 53fc9c6..0000000 --- a/bootstrap/bloat-buster/pdb_image.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -extern u8 pdb_image[143360]; diff --git a/bootstrap/std/base.c b/bootstrap/std/base.c deleted file mode 100644 index 8e03c85..0000000 --- a/bootstrap/std/base.c +++ /dev/null @@ -1,463 +0,0 @@ -#pragma once - -#if _MSC_VER -extern u32 _lzcnt_u32(u32); -extern u32 _tzcnt_u32(u32); -extern u64 _lzcnt_u64(u64); -extern u64 _tzcnt_u64(u64); -#endif - -fn u8 leading_zeroes_u32(u32 value) -{ -#if _MSC_VER - return (u8)_lzcnt_u32(value); -#else - return __builtin_clz(value); -#endif -} - -fn u8 leading_zeroes_u64(u64 value) -{ -#if _MSC_VER - return (u8)_lzcnt_u64(value); -#else - return __builtin_clzll(value); -#endif -} - -fn u8 log2_alignment(u64 alignment) -{ - assert(alignment != 0); - assert((alignment & (alignment - 1)) == 0); - u8 left = (sizeof(alignment) * 8) - 1; - u8 right = leading_zeroes_u64(alignment); - let_cast(u8, result, left - right); - return result; -} - -fn u8 log2_u64(u64 v) -{ - assert(v != 0); - return (sizeof(u64) * 8 - 1) - leading_zeroes_u64(v); -} - -fn u8 log2_u32(u32 v) -{ - assert(v != 0); - return (sizeof(u32) * 8 - 1) - leading_zeroes_u32(v); -} - -fn u8 hex_digit_count(u64 v) -{ - u8 result = 1; - if (v) - { - result = log2_u64(v) / log2_u64(16) + 1; - } - - return result; -} - -fn u128 u128_from_u64(u64 n) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result = { .low = n }; - return result; -#else - return n; -#endif -} - -fn u64 u64_from_u128(u128 n) -{ -#if defined (__TINYC__) || defined(_MSC_VER) - return n.low; -#else - return (u64)n; -#endif -} - -fn u128 u128_shift_right(u128 value, u16 n) -{ -#if defined (__TINYC__) || defined(_MSC_VER) - u128 result = {}; - - if (n < 128) - { - if (n >= 64) - { - // If n >= 64, only the high part contributes to the low part - result.low = value.high >> (n - 64); - result.high = 0; - } - else - { - // Standard case: n < 64 - result.low = (value.low >> n) | (value.high << (64 - n)); - result.high = value.high >> n; - } - } - - return result; -#else - return value >> n; -#endif -} - -fn u128 u128_shift_left(u128 value, u16 n) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result = {}; - - if (n < 128) - { - if (n >= 64) - { - // If n >= 64, only the low part contributes to the high part - result.high = value.low << (n - 64); - result.low = 0; - } - else - { - // Standard case: n < 64 - result.high = (value.high << n) | (value.low >> (64 - n)); - result.low = value.low << n; - } - } - - return result; -#else - return value << n; -#endif -} - -fn u128 u128_u64_or(u128 a, u64 b) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - a.low |= b; - return a; -#else - return a | b; -#endif -} - -fn u128 u128_u64_add(u128 a, u64 b) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result; - - // Add the lower 64 bits and check for overflow - result.low = a.low + b; - u64 carry = (result.low < a.low) ? 1 : 0; - - // Add the carry to the upper 64 bits - result.high = a.high + carry; - - return result; -#else - return a + b; -#endif -} - -// Multiply two u128 values -fn u128 u128_u64_mul(u128 a, u64 b) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - u128 result = {}; - - // Compute low and high parts of the product - u64 low_low = (a.low & 0xFFFFFFFF) * (b & 0xFFFFFFFF); - u64 low_high = (a.low >> 32) * (b & 0xFFFFFFFF); - u64 high_low = (a.low & 0xFFFFFFFF) * (b >> 32); - u64 high_high = (a.low >> 32) * (b >> 32); - - // Combine partial products for the lower 64 bits - u64 carry = (low_low >> 32) + (low_high & 0xFFFFFFFF) + (high_low & 0xFFFFFFFF); - result.low = (low_low & 0xFFFFFFFF) | (carry << 32); - - // Add carry from lower to the high product - result.high = a.high * b + (low_high >> 32) + (high_low >> 32) + (carry >> 32) + high_high; - - return result; -#else - return a * b; -#endif -} - -fn u64 u128_shift_right_by_64(u128 n) -{ -#if defined(__TINYC__) || defined(_MSC_VER) - return n.high; -#else - return n >> 64; -#endif -} - -// Lehmer's generator -// https://lemire.me/blog/2019/03/19/the-fastest-conventional-random-number-generator-that-can-pass-big-crush/ -global_variable u128 rn_state; -fn u64 generate_random_number() -{ - rn_state = u128_u64_mul(rn_state, 0xda942042e4dd58b5); - return u128_shift_right_by_64(rn_state); -} - -fn u64 next_power_of_two(u64 n) -{ - n -= 1; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n |= n >> 32; - n += 1; - return n; -} - -fn u64 absolute_int(s64 n) -{ - return n < 0 ? cast_to(u64, -n) : cast_to(u64, n); -} - -fn u64 parse_decimal(String string) -{ - u64 value = 0; - for (u64 i = 0; i < string.length; i += 1) - { - u8 ch = s_get(string, i); - assert(((ch >= '0') & (ch <= '9'))); - value = (value * 10) + (ch - '0'); - } - - return value; -} - -fn u8 get_next_ch_safe(String string, u64 index) -{ - u64 next_index = index + 1; - u64 is_in_range = next_index < string.length; - u64 safe_index = safe_flag(next_index, is_in_range); - u8 unsafe_result = string.pointer[safe_index]; - u64 safe_result = safe_flag(unsafe_result, is_in_range); - assert(safe_result < 256); - return (u8)safe_result; -} - -fn u32 is_space(u8 ch, u8 next_ch) -{ - u32 is_comment = (ch == '/') & (next_ch == '/'); - u32 is_whitespace = ch == ' '; - u32 is_vertical_tab = ch == 0x0b; - u32 is_horizontal_tab = ch == '\t'; - u32 is_line_feed = ch == '\n'; - u32 is_carry_return = ch == '\r'; - u32 result = (((is_vertical_tab | is_horizontal_tab) | (is_line_feed | is_carry_return)) | (is_comment | is_whitespace)); - return result; -} - -fn u64 is_lower(u8 ch) -{ - return (ch >= 'a') & (ch <= 'z'); -} - -fn u64 is_upper(u8 ch) -{ - return (ch >= 'A') & (ch <= 'Z'); -} - -fn u64 is_alphabetic(u8 ch) -{ - return is_lower(ch) | is_upper(ch); -} - -fn u64 is_decimal_digit(u8 ch) -{ - return (ch >= '0') & (ch <= '9'); -} - -fn u64 is_alphanumeric(u8 ch) -{ - return is_alphabetic(ch) | is_decimal_digit(ch); -} - -fn u64 is_hex_digit_alpha_lower(u8 ch) -{ - return (ch >= 'a') & (ch <= 'f'); -} - -fn u64 is_hex_digit_alpha_upper(u8 ch) -{ - return (ch >= 'A') & (ch <= 'F'); -} - -fn u64 is_hex_digit_alpha(u8 ch) -{ - return is_hex_digit_alpha_lower(ch) | is_hex_digit_alpha_upper(ch); -} - -fn u64 is_hex_digit(u8 ch) -{ - return is_decimal_digit(ch) | is_hex_digit_alpha(ch); -} - -fn u8 hex_ch_to_int(u8 ch) -{ - if ((ch >= '0') & (ch <= '9')) - { - return ch - '0'; - } - else if ((ch >= 'a') & (ch <= 'f')) - { - return ch - 'a' + 10; - } - else if ((ch >= 'A') & (ch <= 'F')) - { - return ch - 'A' + 10; - } - else - { - unreachable(); - } -} - -fn u64 is_identifier_start(u8 ch) -{ - u64 alphabetic = is_alphabetic(ch); - u64 is_underscore = ch == '_'; - return alphabetic | is_underscore; -} - -fn u64 is_identifier_ch(u8 ch) -{ - u64 identifier_start = is_identifier_start(ch); - u64 decimal = is_decimal_digit(ch); - return identifier_start | decimal; -} - -fn Hash64 hash_byte(Hash64 source, u8 ch) -{ - source ^= ch; - source *= fnv_prime; - return source; -} - -fn Hash64 hash_bytes(String bytes) -{ - u64 result = fnv_offset; - for (u64 i = 0; i < bytes.length; i += 1) - { - result = hash_byte(result, bytes.pointer[i]); - } - - return result; -} - -fn Hash32 hash64_to_hash32(Hash64 hash64) -{ - Hash32 low = hash64 & 0xffff; - Hash32 high = (hash64 >> 32) & 0xffff; - Hash32 result = (high << 16) | low; - return result; -} - -fn u64 align_forward_u32(u32 value, u32 alignment) -{ - u32 mask = alignment - 1; - u32 result = (value + mask) & ~mask; - return result; -} - -fn u32 align_backward_u32(u32 value, u32 alignment) -{ - u32 result = value & ~(alignment - 1); - return result; -} - -fn u64 align_forward_u64(u64 value, u64 alignment) -{ - u64 mask = alignment - 1; - u64 result = (value + mask) & ~mask; - return result; -} - -fn u64 align_backward_u64(u64 value, u64 alignment) -{ - u64 result = value & ~(alignment - 1); - return result; -} - -fn u8 is_power_of_two_u64(u64 value) -{ - return (value & (value - 1)) == 0; -} - -fn u8 first_bit_set_u32(u32 value) -{ -#if _MSC_VER - DWORD result_dword; - u8 result_u8 = _BitScanForward(&result_dword, value); - unused(result_u8); - let_cast(u8, result, result_dword); -#else - let(result, (u8)__builtin_ffs((s32)value)); -#endif - result -= result != 0; - return result; -} - -fn u64 first_bit_set_u64(u64 value) -{ -#if _MSC_VER - DWORD result_dword; - u8 result_u8 = _BitScanForward64(&result_dword, value); - unused(result_u8); - let_cast(u8, result, result_dword); -#else - let(result, (u8) __builtin_ffs((s64)value)); -#endif - result -= result != 0; - return result; -} - -fn Hash32 hash32_fib_end(Hash32 hash) -{ - let(result, TRUNCATE(Hash32, ((hash + 1) * 11400714819323198485ull) >> 32)); - return result; -} - -fn Hash32 hash64_fib_end(Hash64 hash) -{ - let(result, TRUNCATE(Hash32, ((hash + 1) * 11400714819323198485ull) >> 32)); - return result; -} - -fn u64 parse_hexadecimal(String string, u8* error) -{ - u8* it = &string.pointer[string.length - 1]; - u8 is_error = 0; - - u64 result = 0; - - while (it >= string.pointer) - { - u8 ch = *it; - - u8 is_error_it = !is_hex_digit(ch); - is_error |= is_error_it; - if (is_error_it) - { - break; - } - - u8 sub = is_decimal_digit(ch) ? '0' : (is_hex_digit_alpha_lower(ch) ? 'a' : 'A'); - u8 hex_value = ch - sub + 10 * is_hex_digit_alpha(ch); - assert((hex_value & 0xf) == hex_value); - result = (result << 4) | hex_value; - - it -= 1; - } - - *error = is_error; - return result; -} diff --git a/bootstrap/std/base.h b/bootstrap/std/base.h deleted file mode 100644 index 9a50b27..0000000 --- a/bootstrap/std/base.h +++ /dev/null @@ -1,373 +0,0 @@ -#pragma once - -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) - -#define USE_MEMCPY 1 - -#if _WIN32 -#define _CRT_SECURE_NO_WARNINGS -#endif - -#define LINK_LIBC 1 - -#ifndef BB_DEBUG -#define BB_DEBUG 1 -#endif - -#include -#include -#include - -#ifndef BB_SAFETY -#define BB_SAFETY BB_DEBUG -#endif - -#define STRUCT_FORWARD_DECL(S) typedef struct S S -#define STRUCT(S) STRUCT_FORWARD_DECL(S); struct S -#define UNION_FORWARD_DECL(U) typedef union U U -#define UNION(U) UNION_FORWARD_DECL(U); union U - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define CLAMP(a, x, b) (((a)>(x))?(a):((b)<(x))?(b):(x)) - -#ifdef __TINYC__ -#define declare_vector_type #error -#else -#ifdef __clang__ -#define declare_vector_type(T, count, name) typedef T name __attribute__((ext_vector_type(count))) -#else -#define declare_vector_type(T, count, name) typedef T name __attribute__((vector_size(count))) -#endif -#endif -#define array_length(arr) sizeof(arr) / sizeof((arr)[0]) -#define KB(n) ((n) * 1024) -#define MB(n) ((n) * 1024 * 1024) -#define GB(n) ((u64)(n) * 1024 * 1024 * 1024) -#define TB(n) ((u64)(n) * 1024 * 1024 * 1024 * 1024) -#define unused(x) (void)(x) -#if _MSC_VER -#define BB_NORETURN __declspec(noreturn) -#define BB_COLD __declspec(noinline) -#elif defined(__TINYC__) -#define BB_NORETURN __attribute__((noreturn)) -#define BB_COLD __attribute__((cold)) -#else -#define BB_NORETURN [[noreturn]] -#define BB_COLD [[gnu::cold]] -#endif -#define TRUNCATE(Destination, source) (Destination)(source) - -#if _MSC_VER -#define ENUM_START(EnumName, T) typedef T EnumName; typedef enum EnumName ## Flags -#define ENUM_END(EnumName) EnumName ## Flags -#else -#define ENUM_START(EnumName, T) typedef enum EnumName : T -#define ENUM_END(EnumName) EnumName -#endif - -#define ENUM(EnumName, T, ...) \ -ENUM_START(EnumName, T)\ -{\ - __VA_ARGS__\ -} ENUM_END(EnumName) - -typedef uint8_t u8; -typedef uint16_t u16; -typedef uint32_t u32; -typedef uint64_t u64; -#if defined (__TINYC__) || defined(_MSC_VER) -UNION(u128) -{ - struct - { - u64 low; - u64 high; - }; - u64 v[2]; -}; -#else -typedef __uint128_t u128; -#endif -typedef unsigned int uint; - -typedef int8_t s8; -typedef int16_t s16; -typedef int32_t s32; -typedef int64_t s64; -#if !defined(__TINYC__) && !defined(_MSC_VER) -typedef __int128_t s128; -#endif - -typedef size_t usize; - -#if !defined(__TINYC__) && !defined(_MSC_VER) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpedantic" -typedef _Float16 f16; -#pragma GCC diagnostic pop -#endif -typedef float f32; -typedef double f64; - -typedef u32 Hash32; -typedef u64 Hash64; - -#define Slice(T) Slice_ ## T -#define SliceP(T) SliceP_ ## T -#define declare_slice_ex(T, StructName) STRUCT(StructName) \ -{\ - T* pointer;\ - u64 length;\ -} - -#define declare_slice(T) declare_slice_ex(T, Slice(T)) -#define declare_slice_p(T) declare_slice_ex(T*, SliceP(T)) - -declare_slice(u8); -declare_slice(u16); -declare_slice(u32); -declare_slice(u64); -declare_slice(s8); -declare_slice(s16); -declare_slice(s32); -declare_slice(s64); - -declare_slice_p(char); -declare_slice_p(u8); -declare_slice_p(void); - -typedef Slice(u8) String; -declare_slice(String); - -#if BB_DEBUG -#define assert(x) (unlikely(!(x)) ? panic("Assert failed: \"" # x "\" at {cstr}:{u32}\n", __FILE__, __LINE__) : unused(0)) -#else -#define assert(x) unused(likely(x)) -#endif - -#ifndef __cplusplus -#if _MSC_VER -#define unreachable_raw() __assume(0) -#else -#define unreachable_raw() __builtin_unreachable() -#endif -// Undefine unreachable if needed to provide a more safe-guard implementation -#ifdef unreachable -#undef unreachable -#endif -#if BB_DEBUG -#define unreachable() panic("Unreachable triggered\n", __FILE__, __LINE__) -#else -#define unreachable() unreachable_raw() -#endif -#define fix_unreachable() unreachable_raw() - -#ifndef static_assert -#define static_assert(x) _Static_assert((x), "Static assert failed!") -#endif -#define alignof(x) _Alignof(x) -#else -#define restrict __restrict -#endif -#ifndef BB_INFINITY -#define BB_INFINITY __builtin_inff() -#endif -#ifndef BB_NAN -#define BB_NAN __builtin_nanf("") -#endif -#define fn static -#define method __attribute__((visibility("internal"))) -#define global_variable static -#define forceinline __attribute__((always_inline)) -#if _MSC_VER -#define expect(x, b) (!!(x)) -#else -#define expect(x, b) __builtin_expect(!!(x), b) -#endif -#define likely(x) expect(x, 1) -#define unlikely(x) expect(x, 0) -#define breakpoint() __builtin_debugtrap() -#define failed_execution() panic("Failed execution at {cstr}:{u32}\n", __FILE__, __LINE__) -#define todo() os_is_being_debugged() ? trap() : panic("TODO at {cstr}:{u32}\n", __FILE__, __LINE__); fix_unreachable() - -fn void print(const char* format, ...); -BB_NORETURN BB_COLD fn void os_exit(u32 exit_code); - -#if _MSC_VER -#define trap() __fastfail(1) -#elif __has_builtin(__builtin_trap) -#define trap() __builtin_trap() -#else -extern BB_NORETURN BB_COLD void abort(void); -fn BB_NORETURN BB_COLD void trap_ext() -{ -#ifdef __x86_64__ - asm volatile("ud2"); -#else - abort(); -#endif -} -#define trap() (trap_ext(), __builtin_unreachable()) -#endif - -fn u8 os_is_being_debugged(); -#define panic(format, ...) (!os_is_being_debugged() ? print(format, __VA_ARGS__), os_exit(1) : os_exit(1)) - -#define let_pointer_cast(PointerChildType, var_name, value) PointerChildType* var_name = (PointerChildType*)(value) -#if defined(__TINYC__) || defined(_MSC_VER) -#define let(name, value) typeof(value) name = (value) -#else -#define let(name, value) __auto_type name = (value) -#endif -#define let_cast(T, name, value) T name = cast_to(T, value) -#define assign_cast(to, from) to = cast_to(typeof(to), from) -#define let_va_arg(T, name, args) T name = va_arg(args, T) -#define transmute(D, source) *(D*)&source - -#if BB_SAFETY -#define cast_to(T, value) (assert((typeof(value)) (T) (value) == (value) && ((value) > 0) == ((T) (value) > 0)), (T) (value)) -#else -#define cast_to(T, value) (T)(value) -#endif - -typedef enum Corner -{ - CORNER_00, - CORNER_01, - CORNER_10, - CORNER_11, - CORNER_COUNT, -} Corner; - -typedef enum Axis2 -{ - AXIS2_X, - AXIS2_Y, - AXIS2_COUNT, -} Axis2; - -// #ifdef __cplusplus -// #define EXPORT extern "C" -// #else -// #define EXPORT -// #endif - -#if defined(__cplusplus) && defined(__linux__) -#define NO_EXCEPT __THROW -#else -#define NO_EXCEPT -#endif - -#define NamedEnumMemberEnum(e, enum_member) e ## _ ## enum_member -#define NamedEnumMemberString(e, enum_member) strlit(#enum_member) - -typedef SliceP(char) CStringSlice; - -#ifdef _WIN32 -typedef void* FileDescriptor; -#else -typedef int FileDescriptor; -#endif - -#define FOR_N(it, start, end) \ -for (u32 it = (start), end__ = (end); it < end__; ++it) - -#define FOR_REV_N(it, start, end) \ -for (u32 it = (end), start__ = (start); (it--) > start__;) - -#define FOR_BIT(it, start, bits) \ -for (typeof(bits) _bits_ = (bits), it = (start); _bits_; _bits_ >>= 1, ++it) if (_bits_ & 1) - -#define FOREACH_SET(it, set) \ -FOR_N(_i, 0, ((set)->arr.capacity + 63) / 64) FOR_BIT(it, _i*64, (set)->arr.pointer[_i]) - -#define size_until_end(T, field_name) (sizeof(T) - offsetof(T, field_name)) -#define SWAP(a, b) \ - do {\ - static_assert(typeof(a) == typeof(b));\ - let(temp, a);\ - a = b;\ - b = temp;\ - } while (0) - -#define slice_from_pointer_range(T, start, end) (Slice(T)) { .pointer = start, .length = (u64)(end - start), } - -#define strlit_len(s) (sizeof(s) - 1) -#define strlit(s) (String){ .pointer = (u8*)(s), .length = strlit_len(s), } -#define ch_to_str(ch) (String){ .pointer = &ch, .length = 1 } -#define array_to_slice(arr) { .pointer = (arr), .length = array_length(arr) } -#define array_to_bytes(arr) { .pointer = (u8*)(arr), .length = sizeof(arr) } -#define pointer_to_bytes(p) (String) { .pointer = (u8*)(p), .length = sizeof(*p) } -#define scalar_to_bytes(s) pointer_to_bytes(&(s)) -#define string_to_c(s) ((char*)((s).pointer)) -#define cstr(s) ((String) { .pointer = (u8*)(s), .length = strlen((char*)s), } ) - -#define case_to_name(prefix, e) case prefix ## e: return strlit(#e) - -global_variable const u8 brace_open = '{'; -global_variable const u8 brace_close = '}'; - -global_variable const u8 parenthesis_open = '('; -global_variable const u8 parenthesis_close = ')'; - -global_variable const u8 bracket_open = '['; -global_variable const u8 bracket_close = ']'; - -#define s_get(s, i) (s).pointer[i] -#define s_get_pointer(s, i) &((s).pointer[i]) -#define s_get_slice(T, s, start, end) (Slice(T)){ .pointer = ((s).pointer) + (start), .length = (end) - (start) } -#define s_equal(a, b) ((a).length == (b).length && memcmp((a).pointer, (b).pointer, sizeof(*((a).pointer)) * (a).length) == 0) - -fn u64 align_forward_u64(u64 value, u64 alignment); -fn u64 align_backward_u64(u64 value, u64 alignment); -fn u8 log2_alignment_u64(u64 alignment); -fn u8 is_power_of_two_u64(u64 value); -fn u8 first_bit_set_u32(u32 value); -fn u64 first_bit_set_u64(u64 value); - -fn u32 format_decimal(String buffer, u64 decimal); -fn u32 format_hexadecimal(String buffer, u64 hexadecimal); -fn u64 format_float(String buffer, f64 value_double); - -fn u64 is_decimal_digit(u8 ch); -fn u32 is_space(u8 ch, u8 next_ch); -fn u8 get_next_ch_safe(String string, u64 index); -fn u64 is_identifier_start(u8 ch); -fn u64 is_identifier_ch(u8 ch); -fn u64 is_alphabetic(u8 ch); -fn u64 is_alphanumeric(u8 ch); - -fn u64 parse_decimal(String string); - -global_variable const Hash64 fnv_offset = 14695981039346656037ull; -global_variable const u64 fnv_prime = 1099511628211ull; - -fn Hash32 hash32_fib_end(Hash32 hash); -fn Hash32 hash64_fib_end(Hash64 hash); - -fn Hash64 hash_byte(Hash64 source, u8 ch); -fn Hash64 hash_bytes(String bytes); -fn Hash32 hash64_to_hash32(Hash64 hash64); - -fn u64 round_up_to_next_power_of_2(u64 n); - -STRUCT(TextureIndex) -{ - u32 value; -}; - -fn u64 safe_flag(u64 value, u64 flag) -{ - u64 result = value & ((u64)0 - flag); - return result; -} - -#define member_from_offset(pointer, type, memory_offset) (*(type*)((u8*)pointer + memory_offset)) -#if _MSC_VER -#define offset_of(T, member) offsetof(T, member) -#else -#define offset_of(T, member) __builtin_offsetof(T, member) -#endif - diff --git a/bootstrap/std/cocoa_windowing.c b/bootstrap/std/cocoa_windowing.c deleted file mode 100644 index c64bf4f..0000000 --- a/bootstrap/std/cocoa_windowing.c +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once - -@implementation AppleApplicationDelegate -- (void)applicationDidFinishLaunching:(NSNotification*)aNotification -{ -} - -@end -@implementation AppleWindow -@end - -global_variable WindowConnection window_connection; - -fn u8 windowing_initialize() -{ - u8 result = 1; - window_connection.application = [NSApplication sharedApplication]; - AppleApplicationDelegate* application_delegate = [[AppleApplicationDelegate alloc] init]; - NSApp.delegate = application_delegate; - - return result; -} - -fn WindowingInstance* windowing_instantiate(WindowingInstantiate instantiate) -{ - NSRect rect = { { 0, 0 }, { 800, 600 } }; - AppleWindow* window = [[AppleWindow alloc] initWithContentRect:rect styleMask:(NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable) backing:NSBackingStoreBuffered defer:NO]; - window.title = @"Hello Metal"; - [window_connection.application activate]; - [window orderFrontRegardless]; - return window; -} - -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* instance) -{ - WindowingSize size; - @autoreleasepool { - const NSRect contentRect = instance.contentView.frame; - const NSRect fbRect = [instance.contentView convertRectToBacking:contentRect]; - - size = (WindowingSize) { - .width = fbRect.size.width, - .height = fbRect.size.height, - }; - } // autoreleasepool - return size; -} - -fn void windowing_poll_events() -{ - @autoreleasepool { - while (1) - { - NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]; - - if (event == nil) - { - break; - } - - [NSApp sendEvent:event]; - } - - } // autoreleasepool -} diff --git a/bootstrap/std/cocoa_windowing.h b/bootstrap/std/cocoa_windowing.h deleted file mode 100644 index a727a8a..0000000 --- a/bootstrap/std/cocoa_windowing.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#import -#import - -@interface AppleApplicationDelegate : NSObject -@end -@interface AppleWindow : NSWindow -@end -@interface AppleWindowDelegate : NSObject -@end - -typedef AppleWindow WindowingInstance; - -STRUCT(WindowConnection) -{ - NSApplication* application; -}; diff --git a/bootstrap/std/directx12_rendering.c b/bootstrap/std/directx12_rendering.c deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/directx12_rendering.c +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/directx12_rendering.h b/bootstrap/std/directx12_rendering.h deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/directx12_rendering.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/entry_point.c b/bootstrap/std/entry_point.c deleted file mode 100644 index aeb007c..0000000 --- a/bootstrap/std/entry_point.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -#if LINK_LIBC == 0 -[[gnu::naked]] BB_NORETURN void _start() -{ - __asm__ __volatile__( - "\nxor %ebp, %ebp" - "\npopq %rdi" - "\nmov %rsp, %rsi" - "\nand $~0xf, %rsp" - "\npushq %rsp" - "\npushq $0" - "\ncallq static_entry_point" - "\nud2\n" - ); -} -#endif - -#if LINK_LIBC == 0 -void static_entry_point(int argc, char* argv[]) -{ - char** envp = (char**)&argv[argc + 1]; -#else -int main(int argc, char* argv[], char* envp[]) -{ -#endif - calibrate_cpu_timer(); - entry_point(argc, argv, envp); -#if LINK_LIBC - return 0; -#else - syscall_exit(0); -#endif -} diff --git a/bootstrap/std/entry_point.h b/bootstrap/std/entry_point.h deleted file mode 100644 index 240fc9c..0000000 --- a/bootstrap/std/entry_point.h +++ /dev/null @@ -1,11 +0,0 @@ -#include - -void entry_point(int argc, char* argv[], char* envp[]); - -#if LINK_LIBC == 0 -[[gnu::naked]] BB_NORETURN void _start(); -#endif - -#if LINK_LIBC == 0 -void static_entry_point(int argc, char* argv[]); -#endif diff --git a/bootstrap/std/font_provider.c b/bootstrap/std/font_provider.c deleted file mode 100644 index e2e479c..0000000 --- a/bootstrap/std/font_provider.c +++ /dev/null @@ -1,167 +0,0 @@ -#pragma once - -#include - -#define STBTT_STATIC -#define STB_TRUETYPE_IMPLEMENTATION -#define stbtt_uint8 u8 -#define stbtt_uint16 u16 -#define stbtt_uint32 u32 -#define stbtt_int8 s8 -#define stbtt_int16 s16 -#define stbtt_int32 s32 - -extern float sqrtf(float x); -extern float roundf(float x); -extern float floorf(float x); - -extern double sqrt(double x); -extern double fabs(double x); -extern double floor(double x); -extern double ceil(double x); -extern double fmod(double x, double y); -extern double pow(double x, double y); -extern double acos(double x); -extern double cos(double x); - -#define STBTT_ifloor(x) ((int) floor(x)) -#define STBTT_iceil(x) ((int) ceil(x)) -#define STBTT_sqrt(x) sqrt(x) -#define STBTT_pow(x,y) pow(x,y) -#define STBTT_fmod(x,y) fmod(x,y) -#define STBTT_cos(x) cos(x) -#define STBTT_acos(x) acos(x) -#define STBTT_fabs(x) fabs(x) -#define STBTT_malloc(x,u) ((void)(u),malloc(x)) -#define STBTT_free(x,u) ((void)(u),free(x)) -#define STBTT_assert(x) assert(x) -#define STBTT_strlen(x) strlen(x) -#define STBTT_memcpy memcpy -#define STBTT_memset memset - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" -#endif -#include -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -fn TextureAtlas font_texture_atlas_create(Arena* arena, Renderer* renderer, TextureAtlasCreate create) -{ - let(font_file, file_read(arena, create.font_path)); - stbtt_fontinfo font_info; - if (!stbtt_InitFont(&font_info, font_file.pointer, stbtt_GetFontOffsetForIndex(font_file.pointer, 0))) - { - failed_execution(); - } - - TextureAtlas result = {}; - u32 character_count = 256; - result.characters = arena_allocate(arena, FontCharacter, character_count); - result.kerning_tables = arena_allocate(arena, s32, character_count * character_count); - result.height = (u32)sqrtf((f32)(create.text_height * create.text_height * character_count)); - result.width = result.height; - result.pointer = arena_allocate(arena, u32, result.width * result.height); - let(scale_factor, stbtt_ScaleForPixelHeight(&font_info, create.text_height)); - - int ascent; - int descent; - int line_gap; - stbtt_GetFontVMetrics(&font_info, &ascent, &descent, &line_gap); - - result.ascent = (u32)roundf(ascent * scale_factor); - result.descent = (u32)roundf(descent * scale_factor); - result.line_gap = (u32)roundf(line_gap * scale_factor); - - u32 x = 0; - u32 y = 0; - u32 max_row_height = 0; - u32 first_character = ' '; - u32 last_character = '~'; - - for (let(i, first_character); i <= last_character; ++i) - { - u32 width; - u32 height; - int advance; - int left_bearing; - - let(ch, (u8)i); - let(character, &result.characters[i]); - stbtt_GetCodepointHMetrics(&font_info, ch, &advance, &left_bearing); - - character->advance = (u32)roundf(advance * scale_factor); - character->left_bearing = (u32)roundf(left_bearing * scale_factor); - - u8* bitmap = stbtt_GetCodepointBitmap(&font_info, 0.0f, scale_factor, ch, (int*)&width, (int*)&height, &character->x_offset, &character->y_offset); - let(kerning_table, result.kerning_tables + i * character_count); - for (u32 j = first_character; j <= last_character; j += 1) - { - let(kerning_advance, stbtt_GetCodepointKernAdvance(&font_info, i, j)); - kerning_table[j] = (s32)roundf(kerning_advance * scale_factor); - } - - if (x + width > result.width) - { - y += max_row_height; - max_row_height = height; - x = 0; - } - else - { - max_row_height = MAX(height, max_row_height); - } - - character->x = x; - character->y = y; - character->width = width; - character->height = height; - - let(source, bitmap); - let(destination, result.pointer); - - for (u32 bitmap_y = 0; bitmap_y < height; bitmap_y += 1) - { - for (u32 bitmap_x = 0; bitmap_x < width; bitmap_x += 1) - { - let(source_index, bitmap_y * width + bitmap_x); - let(destination_index, (bitmap_y + y) * result.width + (bitmap_x + x)); - let(value, source[source_index]); - destination[destination_index] = ((u32)value << 24) | 0xffffff; - } - } - - x += width; - - stbtt_FreeBitmap(bitmap, 0); - } - - result.texture = renderer_texture_create(renderer, (TextureMemory) { - .pointer = result.pointer, - .width = result.width, - .height = result.height, - .depth = 1, - .format = TEXTURE_FORMAT_R8G8B8A8_SRGB, - }); - - return result; -} - -fn uint2 texture_atlas_compute_string_rect(String string, const TextureAtlas* atlas) -{ - let(height, atlas->ascent - atlas->descent); - u32 x_offset = 0; - u32 y_offset = height; - - for (u64 i = 0; i < string.length; i += 1) - { - let(ch, string.pointer[i]); - let(character, &atlas->characters[ch]); - let(kerning, (atlas->kerning_tables + ch * 256)[string.pointer[i + 1]]); - x_offset += character->advance + kerning; - } - - return (uint2) { x_offset, y_offset }; -} diff --git a/bootstrap/std/font_provider.h b/bootstrap/std/font_provider.h deleted file mode 100644 index 8daa3b8..0000000 --- a/bootstrap/std/font_provider.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -STRUCT(FontCharacter) -{ - u32 advance; - u32 left_bearing; - u32 x; - u32 y; - u32 width; - u32 height; - s32 x_offset; - s32 y_offset; -}; - -STRUCT(TextureAtlas) -{ - u32* pointer; - FontCharacter* characters; - s32* kerning_tables; - u32 width; - u32 height; - s32 ascent; - s32 descent; - s32 line_gap; - TextureIndex texture; -}; - -STRUCT(TextureAtlasCreate) -{ - String font_path; - u32 text_height; -}; - -fn TextureAtlas font_texture_atlas_create(Arena* arena, Renderer* renderer, TextureAtlasCreate create); -fn uint2 texture_atlas_compute_string_rect(String string, const TextureAtlas* atlas); diff --git a/bootstrap/std/format.c b/bootstrap/std/format.c deleted file mode 100644 index 672c59b..0000000 --- a/bootstrap/std/format.c +++ /dev/null @@ -1,1442 +0,0 @@ -#include - -fn u32 format_hexadecimal(String buffer, u64 hexadecimal) -{ - u64 value = hexadecimal; - if (value) - { - u8 reverse_buffer[16]; - u8 reverse_index = 0; - - while (value) - { - u8 digit_value = value % 16; - u8 ascii_ch = digit_value >= 10 ? (digit_value + 'a' - 10) : (digit_value + '0'); - value /= 16; - reverse_buffer[reverse_index] = ascii_ch; - reverse_index += 1; - } - - u32 index = 0; - - while (reverse_index > 0) - { - reverse_index -= 1; - buffer.pointer[index] = reverse_buffer[reverse_index]; - index += 1; - } - - return index; - } - else - { - buffer.pointer[0] = '0'; - return 1; - } -} - -fn u32 format_decimal(String buffer, u64 decimal) -{ - u64 value = decimal; - if (value) - { - u8 reverse_buffer[64]; - u8 reverse_index = 0; - - while (value) - { - u8 digit_value = (value % 10); - u8 ascii_ch = digit_value + '0'; - value /= 10; - reverse_buffer[reverse_index] = ascii_ch; - reverse_index += 1; - } - - u32 index = 0; - while (reverse_index > 0) - { - reverse_index -= 1; - buffer.pointer[index] = reverse_buffer[reverse_index]; - index += 1; - } - - return index; - } - else - { - buffer.pointer[0] = '0'; - return 1; - } -} - -STRUCT(SmallIntResult) -{ - u64 mantissa; - s32 exponent; - u32 is_small_int:1; -}; - -#define double_mantissa_bits 52 -#define double_exponent_bits 11 -#define double_bias 1023 - -#define double_pow5_bitcount 125 -#define double_pow5_inv_bitcount 125 - -// Returns floor(log_10(2^e)); requires 0 <= e <= 1650. -fn u32 log10_pow2(const s32 e) -{ - // The first value this approximation fails for is 2^1651 which is just greater than 10^297. - assert(e >= 0); - assert(e <= 1650); - return (((u32) e) * 78913) >> 18; -} - -// Returns e == 0 ? 1 : ceil(log_2(5^e)); requires 0 <= e <= 3528. -fn s32 pow5_bits(const s32 e) -{ - // This approximation works up to the point that the multiplication overflows at e = 3529. - // If the multiplication were done in 64 bits, it would fail at 5^4004 which is just greater - // than 2^9297. - assert(e >= 0); - assert(e <= 3528); - return (s32) (((((u32) e) * 1217359) >> 19) + 1); -} - -#define DOUBLE_POW5_INV_BITCOUNT 125 -#define DOUBLE_POW5_BITCOUNT 125 - -#define DOUBLE_POW5_INV_TABLE_SIZE 342 -#define DOUBLE_POW5_TABLE_SIZE 326 - -global_variable const u8 DIGIT_TABLE[200] = { - '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', - '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', - '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', - '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', - '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', - '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', - '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', - '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', - '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', - '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' -}; - -global_variable const u64 DOUBLE_POW5_INV_SPLIT[DOUBLE_POW5_INV_TABLE_SIZE][2] = -{ - { 1u, 2305843009213693952u }, { 11068046444225730970u, 1844674407370955161u }, - { 5165088340638674453u, 1475739525896764129u }, { 7821419487252849886u, 1180591620717411303u }, - { 8824922364862649494u, 1888946593147858085u }, { 7059937891890119595u, 1511157274518286468u }, - { 13026647942995916322u, 1208925819614629174u }, { 9774590264567735146u, 1934281311383406679u }, - { 11509021026396098440u, 1547425049106725343u }, { 16585914450600699399u, 1237940039285380274u }, - { 15469416676735388068u, 1980704062856608439u }, { 16064882156130220778u, 1584563250285286751u }, - { 9162556910162266299u, 1267650600228229401u }, { 7281393426775805432u, 2028240960365167042u }, - { 16893161185646375315u, 1622592768292133633u }, { 2446482504291369283u, 1298074214633706907u }, - { 7603720821608101175u, 2076918743413931051u }, { 2393627842544570617u, 1661534994731144841u }, - { 16672297533003297786u, 1329227995784915872u }, { 11918280793837635165u, 2126764793255865396u }, - { 5845275820328197809u, 1701411834604692317u }, { 15744267100488289217u, 1361129467683753853u }, - { 3054734472329800808u, 2177807148294006166u }, { 17201182836831481939u, 1742245718635204932u }, - { 6382248639981364905u, 1393796574908163946u }, { 2832900194486363201u, 2230074519853062314u }, - { 5955668970331000884u, 1784059615882449851u }, { 1075186361522890384u, 1427247692705959881u }, - { 12788344622662355584u, 2283596308329535809u }, { 13920024512871794791u, 1826877046663628647u }, - { 3757321980813615186u, 1461501637330902918u }, { 10384555214134712795u, 1169201309864722334u }, - { 5547241898389809503u, 1870722095783555735u }, { 4437793518711847602u, 1496577676626844588u }, - { 10928932444453298728u, 1197262141301475670u }, { 17486291911125277965u, 1915619426082361072u }, - { 6610335899416401726u, 1532495540865888858u }, { 12666966349016942027u, 1225996432692711086u }, - { 12888448528943286597u, 1961594292308337738u }, { 17689456452638449924u, 1569275433846670190u }, - { 14151565162110759939u, 1255420347077336152u }, { 7885109000409574610u, 2008672555323737844u }, - { 9997436015069570011u, 1606938044258990275u }, { 7997948812055656009u, 1285550435407192220u }, - { 12796718099289049614u, 2056880696651507552u }, { 2858676849947419045u, 1645504557321206042u }, - { 13354987924183666206u, 1316403645856964833u }, { 17678631863951955605u, 2106245833371143733u }, - { 3074859046935833515u, 1684996666696914987u }, { 13527933681774397782u, 1347997333357531989u }, - { 10576647446613305481u, 2156795733372051183u }, { 15840015586774465031u, 1725436586697640946u }, - { 8982663654677661702u, 1380349269358112757u }, { 18061610662226169046u, 2208558830972980411u }, - { 10759939715039024913u, 1766847064778384329u }, { 12297300586773130254u, 1413477651822707463u }, - { 15986332124095098083u, 2261564242916331941u }, { 9099716884534168143u, 1809251394333065553u }, - { 14658471137111155161u, 1447401115466452442u }, { 4348079280205103483u, 1157920892373161954u }, - { 14335624477811986218u, 1852673427797059126u }, { 7779150767507678651u, 1482138742237647301u }, - { 2533971799264232598u, 1185710993790117841u }, { 15122401323048503126u, 1897137590064188545u }, - { 12097921058438802501u, 1517710072051350836u }, { 5988988032009131678u, 1214168057641080669u }, - { 16961078480698431330u, 1942668892225729070u }, { 13568862784558745064u, 1554135113780583256u }, - { 7165741412905085728u, 1243308091024466605u }, { 11465186260648137165u, 1989292945639146568u }, - { 16550846638002330379u, 1591434356511317254u }, { 16930026125143774626u, 1273147485209053803u }, - { 4951948911778577463u, 2037035976334486086u }, { 272210314680951647u, 1629628781067588869u }, - { 3907117066486671641u, 1303703024854071095u }, { 6251387306378674625u, 2085924839766513752u }, - { 16069156289328670670u, 1668739871813211001u }, { 9165976216721026213u, 1334991897450568801u }, - { 7286864317269821294u, 2135987035920910082u }, { 16897537898041588005u, 1708789628736728065u }, - { 13518030318433270404u, 1367031702989382452u }, { 6871453250525591353u, 2187250724783011924u }, - { 9186511415162383406u, 1749800579826409539u }, { 11038557946871817048u, 1399840463861127631u }, - { 10282995085511086630u, 2239744742177804210u }, { 8226396068408869304u, 1791795793742243368u }, - { 13959814484210916090u, 1433436634993794694u }, { 11267656730511734774u, 2293498615990071511u }, - { 5324776569667477496u, 1834798892792057209u }, { 7949170070475892320u, 1467839114233645767u }, - { 17427382500606444826u, 1174271291386916613u }, { 5747719112518849781u, 1878834066219066582u }, - { 15666221734240810795u, 1503067252975253265u }, { 12532977387392648636u, 1202453802380202612u }, - { 5295368560860596524u, 1923926083808324180u }, { 4236294848688477220u, 1539140867046659344u }, - { 7078384693692692099u, 1231312693637327475u }, { 11325415509908307358u, 1970100309819723960u }, - { 9060332407926645887u, 1576080247855779168u }, { 14626963555825137356u, 1260864198284623334u }, - { 12335095245094488799u, 2017382717255397335u }, { 9868076196075591040u, 1613906173804317868u }, - { 15273158586344293478u, 1291124939043454294u }, { 13369007293925138595u, 2065799902469526871u }, - { 7005857020398200553u, 1652639921975621497u }, { 16672732060544291412u, 1322111937580497197u }, - { 11918976037903224966u, 2115379100128795516u }, { 5845832015580669650u, 1692303280103036413u }, - { 12055363241948356366u, 1353842624082429130u }, { 841837113407818570u, 2166148198531886609u }, - { 4362818505468165179u, 1732918558825509287u }, { 14558301248600263113u, 1386334847060407429u }, - { 12225235553534690011u, 2218135755296651887u }, { 2401490813343931363u, 1774508604237321510u }, - { 1921192650675145090u, 1419606883389857208u }, { 17831303500047873437u, 2271371013423771532u }, - { 6886345170554478103u, 1817096810739017226u }, { 1819727321701672159u, 1453677448591213781u }, - { 16213177116328979020u, 1162941958872971024u }, { 14873036941900635463u, 1860707134196753639u }, - { 15587778368262418694u, 1488565707357402911u }, { 8780873879868024632u, 1190852565885922329u }, - { 2981351763563108441u, 1905364105417475727u }, { 13453127855076217722u, 1524291284333980581u }, - { 7073153469319063855u, 1219433027467184465u }, { 11317045550910502167u, 1951092843947495144u }, - { 12742985255470312057u, 1560874275157996115u }, { 10194388204376249646u, 1248699420126396892u }, - { 1553625868034358140u, 1997919072202235028u }, { 8621598323911307159u, 1598335257761788022u }, - { 17965325103354776697u, 1278668206209430417u }, { 13987124906400001422u, 2045869129935088668u }, - { 121653480894270168u, 1636695303948070935u }, { 97322784715416134u, 1309356243158456748u }, - { 14913111714512307107u, 2094969989053530796u }, { 8241140556867935363u, 1675975991242824637u }, - { 17660958889720079260u, 1340780792994259709u }, { 17189487779326395846u, 2145249268790815535u }, - { 13751590223461116677u, 1716199415032652428u }, { 18379969808252713988u, 1372959532026121942u }, - { 14650556434236701088u, 2196735251241795108u }, { 652398703163629901u, 1757388200993436087u }, - { 11589965406756634890u, 1405910560794748869u }, { 7475898206584884855u, 2249456897271598191u }, - { 2291369750525997561u, 1799565517817278553u }, { 9211793429904618695u, 1439652414253822842u }, - { 18428218302589300235u, 2303443862806116547u }, { 7363877012587619542u, 1842755090244893238u }, - { 13269799239553916280u, 1474204072195914590u }, { 10615839391643133024u, 1179363257756731672u }, - { 2227947767661371545u, 1886981212410770676u }, { 16539753473096738529u, 1509584969928616540u }, - { 13231802778477390823u, 1207667975942893232u }, { 6413489186596184024u, 1932268761508629172u }, - { 16198837793502678189u, 1545815009206903337u }, { 5580372605318321905u, 1236652007365522670u }, - { 8928596168509315048u, 1978643211784836272u }, { 18210923379033183008u, 1582914569427869017u }, - { 7190041073742725760u, 1266331655542295214u }, { 436019273762630246u, 2026130648867672343u }, - { 7727513048493924843u, 1620904519094137874u }, { 9871359253537050198u, 1296723615275310299u }, - { 4726128361433549347u, 2074757784440496479u }, { 7470251503888749801u, 1659806227552397183u }, - { 13354898832594820487u, 1327844982041917746u }, { 13989140502667892133u, 2124551971267068394u }, - { 14880661216876224029u, 1699641577013654715u }, { 11904528973500979224u, 1359713261610923772u }, - { 4289851098633925465u, 2175541218577478036u }, { 18189276137874781665u, 1740432974861982428u }, - { 3483374466074094362u, 1392346379889585943u }, { 1884050330976640656u, 2227754207823337509u }, - { 5196589079523222848u, 1782203366258670007u }, { 15225317707844309248u, 1425762693006936005u }, - { 5913764258841343181u, 2281220308811097609u }, { 8420360221814984868u, 1824976247048878087u }, - { 17804334621677718864u, 1459980997639102469u }, { 17932816512084085415u, 1167984798111281975u }, - { 10245762345624985047u, 1868775676978051161u }, { 4507261061758077715u, 1495020541582440929u }, - { 7295157664148372495u, 1196016433265952743u }, { 7982903447895485668u, 1913626293225524389u }, - { 10075671573058298858u, 1530901034580419511u }, { 4371188443704728763u, 1224720827664335609u }, - { 14372599139411386667u, 1959553324262936974u }, { 15187428126271019657u, 1567642659410349579u }, - { 15839291315758726049u, 1254114127528279663u }, { 3206773216762499739u, 2006582604045247462u }, - { 13633465017635730761u, 1605266083236197969u }, { 14596120828850494932u, 1284212866588958375u }, - { 4907049252451240275u, 2054740586542333401u }, { 236290587219081897u, 1643792469233866721u }, - { 14946427728742906810u, 1315033975387093376u }, { 16535586736504830250u, 2104054360619349402u }, - { 5849771759720043554u, 1683243488495479522u }, { 15747863852001765813u, 1346594790796383617u }, - { 10439186904235184007u, 2154551665274213788u }, { 15730047152871967852u, 1723641332219371030u }, - { 12584037722297574282u, 1378913065775496824u }, { 9066413911450387881u, 2206260905240794919u }, - { 10942479943902220628u, 1765008724192635935u }, { 8753983955121776503u, 1412006979354108748u }, - { 10317025513452932081u, 2259211166966573997u }, { 874922781278525018u, 1807368933573259198u }, - { 8078635854506640661u, 1445895146858607358u }, { 13841606313089133175u, 1156716117486885886u }, - { 14767872471458792434u, 1850745787979017418u }, { 746251532941302978u, 1480596630383213935u }, - { 597001226353042382u, 1184477304306571148u }, { 15712597221132509104u, 1895163686890513836u }, - { 8880728962164096960u, 1516130949512411069u }, { 10793931984473187891u, 1212904759609928855u }, - { 17270291175157100626u, 1940647615375886168u }, { 2748186495899949531u, 1552518092300708935u }, - { 2198549196719959625u, 1242014473840567148u }, { 18275073973719576693u, 1987223158144907436u }, - { 10930710364233751031u, 1589778526515925949u }, { 12433917106128911148u, 1271822821212740759u }, - { 8826220925580526867u, 2034916513940385215u }, { 7060976740464421494u, 1627933211152308172u }, - { 16716827836597268165u, 1302346568921846537u }, { 11989529279587987770u, 2083754510274954460u }, - { 9591623423670390216u, 1667003608219963568u }, { 15051996368420132820u, 1333602886575970854u }, - { 13015147745246481542u, 2133764618521553367u }, { 3033420566713364587u, 1707011694817242694u }, - { 6116085268112601993u, 1365609355853794155u }, { 9785736428980163188u, 2184974969366070648u }, - { 15207286772667951197u, 1747979975492856518u }, { 1097782973908629988u, 1398383980394285215u }, - { 1756452758253807981u, 2237414368630856344u }, { 5094511021344956708u, 1789931494904685075u }, - { 4075608817075965366u, 1431945195923748060u }, { 6520974107321544586u, 2291112313477996896u }, - { 1527430471115325346u, 1832889850782397517u }, { 12289990821117991246u, 1466311880625918013u }, - { 17210690286378213644u, 1173049504500734410u }, { 9090360384495590213u, 1876879207201175057u }, - { 18340334751822203140u, 1501503365760940045u }, { 14672267801457762512u, 1201202692608752036u }, - { 16096930852848599373u, 1921924308174003258u }, { 1809498238053148529u, 1537539446539202607u }, - { 12515645034668249793u, 1230031557231362085u }, { 1578287981759648052u, 1968050491570179337u }, - { 12330676829633449412u, 1574440393256143469u }, { 13553890278448669853u, 1259552314604914775u }, - { 3239480371808320148u, 2015283703367863641u }, { 17348979556414297411u, 1612226962694290912u }, - { 6500486015647617283u, 1289781570155432730u }, { 10400777625036187652u, 2063650512248692368u }, - { 15699319729512770768u, 1650920409798953894u }, { 16248804598352126938u, 1320736327839163115u }, - { 7551343283653851484u, 2113178124542660985u }, { 6041074626923081187u, 1690542499634128788u }, - { 12211557331022285596u, 1352433999707303030u }, { 1091747655926105338u, 2163894399531684849u }, - { 4562746939482794594u, 1731115519625347879u }, { 7339546366328145998u, 1384892415700278303u }, - { 8053925371383123274u, 2215827865120445285u }, { 6443140297106498619u, 1772662292096356228u }, - { 12533209867169019542u, 1418129833677084982u }, { 5295740528502789974u, 2269007733883335972u }, - { 15304638867027962949u, 1815206187106668777u }, { 4865013464138549713u, 1452164949685335022u }, - { 14960057215536570740u, 1161731959748268017u }, { 9178696285890871890u, 1858771135597228828u }, - { 14721654658196518159u, 1487016908477783062u }, { 4398626097073393881u, 1189613526782226450u }, - { 7037801755317430209u, 1903381642851562320u }, { 5630241404253944167u, 1522705314281249856u }, - { 814844308661245011u, 1218164251424999885u }, { 1303750893857992017u, 1949062802279999816u }, - { 15800395974054034906u, 1559250241823999852u }, { 5261619149759407279u, 1247400193459199882u }, - { 12107939454356961969u, 1995840309534719811u }, { 5997002748743659252u, 1596672247627775849u }, - { 8486951013736837725u, 1277337798102220679u }, { 2511075177753209390u, 2043740476963553087u }, - { 13076906586428298482u, 1634992381570842469u }, { 14150874083884549109u, 1307993905256673975u }, - { 4194654460505726958u, 2092790248410678361u }, { 18113118827372222859u, 1674232198728542688u }, - { 3422448617672047318u, 1339385758982834151u }, { 16543964232501006678u, 2143017214372534641u }, - { 9545822571258895019u, 1714413771498027713u }, { 15015355686490936662u, 1371531017198422170u }, - { 5577825024675947042u, 2194449627517475473u }, { 11840957649224578280u, 1755559702013980378u }, - { 16851463748863483271u, 1404447761611184302u }, { 12204946739213931940u, 2247116418577894884u }, - { 13453306206113055875u, 1797693134862315907u }, { 3383947335406624054u, 1438154507889852726u }, - { 16482362180876329456u, 2301047212623764361u }, { 9496540929959153242u, 1840837770099011489u }, - { 11286581558709232917u, 1472670216079209191u }, { 5339916432225476010u, 1178136172863367353u }, - { 4854517476818851293u, 1885017876581387765u }, { 3883613981455081034u, 1508014301265110212u }, - { 14174937629389795797u, 1206411441012088169u }, { 11611853762797942306u, 1930258305619341071u }, - { 5600134195496443521u, 1544206644495472857u }, { 15548153800622885787u, 1235365315596378285u }, - { 6430302007287065643u, 1976584504954205257u }, { 16212288050055383484u, 1581267603963364205u }, - { 12969830440044306787u, 1265014083170691364u }, { 9683682259845159889u, 2024022533073106183u }, - { 15125643437359948558u, 1619218026458484946u }, { 8411165935146048523u, 1295374421166787957u }, - { 17147214310975587960u, 2072599073866860731u }, { 10028422634038560045u, 1658079259093488585u }, - { 8022738107230848036u, 1326463407274790868u }, { 9147032156827446534u, 2122341451639665389u }, - { 11006974540203867551u, 1697873161311732311u }, { 5116230817421183718u, 1358298529049385849u }, - { 15564666937357714594u, 2173277646479017358u }, { 1383687105660440706u, 1738622117183213887u }, - { 12174996128754083534u, 1390897693746571109u }, { 8411947361780802685u, 2225436309994513775u }, - { 6729557889424642148u, 1780349047995611020u }, { 5383646311539713719u, 1424279238396488816u }, - { 1235136468979721303u, 2278846781434382106u }, { 15745504434151418335u, 1823077425147505684u }, - { 16285752362063044992u, 1458461940118004547u }, { 5649904260166615347u, 1166769552094403638u }, - { 5350498001524674232u, 1866831283351045821u }, { 591049586477829062u, 1493465026680836657u }, - { 11540886113407994219u, 1194772021344669325u }, { 18673707743239135u, 1911635234151470921u }, - { 14772334225162232601u, 1529308187321176736u }, { 8128518565387875758u, 1223446549856941389u }, - { 1937583260394870242u, 1957514479771106223u }, { 8928764237799716840u, 1566011583816884978u }, - { 14521709019723594119u, 1252809267053507982u }, { 8477339172590109297u, 2004494827285612772u }, - { 17849917782297818407u, 1603595861828490217u }, { 6901236596354434079u, 1282876689462792174u }, - { 18420676183650915173u, 2052602703140467478u }, { 3668494502695001169u, 1642082162512373983u }, - { 10313493231639821582u, 1313665730009899186u }, { 9122891541139893884u, 2101865168015838698u }, - { 14677010862395735754u, 1681492134412670958u }, { 673562245690857633u, 1345193707530136767u } -}; -// Best case: use 128-bit type. -fn u64 mul_shift_64(const u64 m, const u64* const mul, const s32 j) -{ - const u128 b0 = u128_u64_mul(u128_from_u64(m), mul[0]); - const u128 b2 = u128_u64_mul(u128_from_u64(m), mul[1]); - return u64_from_u128(u128_shift_right(u128_u64_add(b2, u128_shift_right_by_64(b0)), cast_to(u16, j - 64))); - // return (u64) (((b0 >> 64) + b2) >> (j - 64)); -} - -fn u64 mul_shift_all_64(const u64 m, const u64* const mul, const s32 j, u64* const vp, u64* const vm, const u32 mmShift) -{ - *vp = mul_shift_64(4 * m + 2, mul, j); - *vm = mul_shift_64(4 * m - 1 - mmShift, mul, j); - return mul_shift_64(4 * m, mul, j); -} - -// Returns e == 0 ? 1 : [log_2(5^e)]; requires 0 <= e <= 3528. -// fn s32 log2_pow5(const s32 e) -// { -// // This approximation works up to the point that the multiplication overflows at e = 3529. -// // If the multiplication were done in 64 bits, it would fail at 5^4004 which is just greater -// // than 2^9297. -// assert(e >= 0); -// assert(e <= 3528); -// return (s32) ((((u32) e) * 1217359) >> 19); -// } -// Returns floor(log_10(5^e)); requires 0 <= e <= 2620. -fn u32 log10_pow5(const s32 e) { - // The first value this approximation fails for is 5^2621 which is just greater than 10^1832. - assert(e >= 0); - assert(e <= 2620); - return (((u32) e) * 732923) >> 20; -} - -global_variable const u64 DOUBLE_POW5_SPLIT[DOUBLE_POW5_TABLE_SIZE][2] = -{ - { 0u, 1152921504606846976u }, { 0u, 1441151880758558720u }, - { 0u, 1801439850948198400u }, { 0u, 2251799813685248000u }, - { 0u, 1407374883553280000u }, { 0u, 1759218604441600000u }, - { 0u, 2199023255552000000u }, { 0u, 1374389534720000000u }, - { 0u, 1717986918400000000u }, { 0u, 2147483648000000000u }, - { 0u, 1342177280000000000u }, { 0u, 1677721600000000000u }, - { 0u, 2097152000000000000u }, { 0u, 1310720000000000000u }, - { 0u, 1638400000000000000u }, { 0u, 2048000000000000000u }, - { 0u, 1280000000000000000u }, { 0u, 1600000000000000000u }, - { 0u, 2000000000000000000u }, { 0u, 1250000000000000000u }, - { 0u, 1562500000000000000u }, { 0u, 1953125000000000000u }, - { 0u, 1220703125000000000u }, { 0u, 1525878906250000000u }, - { 0u, 1907348632812500000u }, { 0u, 1192092895507812500u }, - { 0u, 1490116119384765625u }, { 4611686018427387904u, 1862645149230957031u }, - { 9799832789158199296u, 1164153218269348144u }, { 12249790986447749120u, 1455191522836685180u }, - { 15312238733059686400u, 1818989403545856475u }, { 14528612397897220096u, 2273736754432320594u }, - { 13692068767113150464u, 1421085471520200371u }, { 12503399940464050176u, 1776356839400250464u }, - { 15629249925580062720u, 2220446049250313080u }, { 9768281203487539200u, 1387778780781445675u }, - { 7598665485932036096u, 1734723475976807094u }, { 274959820560269312u, 2168404344971008868u }, - { 9395221924704944128u, 1355252715606880542u }, { 2520655369026404352u, 1694065894508600678u }, - { 12374191248137781248u, 2117582368135750847u }, { 14651398557727195136u, 1323488980084844279u }, - { 13702562178731606016u, 1654361225106055349u }, { 3293144668132343808u, 2067951531382569187u }, - { 18199116482078572544u, 1292469707114105741u }, { 8913837547316051968u, 1615587133892632177u }, - { 15753982952572452864u, 2019483917365790221u }, { 12152082354571476992u, 1262177448353618888u }, - { 15190102943214346240u, 1577721810442023610u }, { 9764256642163156992u, 1972152263052529513u }, - { 17631875447420442880u, 1232595164407830945u }, { 8204786253993389888u, 1540743955509788682u }, - { 1032610780636961552u, 1925929944387235853u }, { 2951224747111794922u, 1203706215242022408u }, - { 3689030933889743652u, 1504632769052528010u }, { 13834660704216955373u, 1880790961315660012u }, - { 17870034976990372916u, 1175494350822287507u }, { 17725857702810578241u, 1469367938527859384u }, - { 3710578054803671186u, 1836709923159824231u }, { 26536550077201078u, 2295887403949780289u }, - { 11545800389866720434u, 1434929627468612680u }, { 14432250487333400542u, 1793662034335765850u }, - { 8816941072311974870u, 2242077542919707313u }, { 17039803216263454053u, 1401298464324817070u }, - { 12076381983474541759u, 1751623080406021338u }, { 5872105442488401391u, 2189528850507526673u }, - { 15199280947623720629u, 1368455531567204170u }, { 9775729147674874978u, 1710569414459005213u }, - { 16831347453020981627u, 2138211768073756516u }, { 1296220121283337709u, 1336382355046097823u }, - { 15455333206886335848u, 1670477943807622278u }, { 10095794471753144002u, 2088097429759527848u }, - { 6309871544845715001u, 1305060893599704905u }, { 12499025449484531656u, 1631326116999631131u }, - { 11012095793428276666u, 2039157646249538914u }, { 11494245889320060820u, 1274473528905961821u }, - { 532749306367912313u, 1593091911132452277u }, { 5277622651387278295u, 1991364888915565346u }, - { 7910200175544436838u, 1244603055572228341u }, { 14499436237857933952u, 1555753819465285426u }, - { 8900923260467641632u, 1944692274331606783u }, { 12480606065433357876u, 1215432671457254239u }, - { 10989071563364309441u, 1519290839321567799u }, { 9124653435777998898u, 1899113549151959749u }, - { 8008751406574943263u, 1186945968219974843u }, { 5399253239791291175u, 1483682460274968554u }, - { 15972438586593889776u, 1854603075343710692u }, { 759402079766405302u, 1159126922089819183u }, - { 14784310654990170340u, 1448908652612273978u }, { 9257016281882937117u, 1811135815765342473u }, - { 16182956370781059300u, 2263919769706678091u }, { 7808504722524468110u, 1414949856066673807u }, - { 5148944884728197234u, 1768687320083342259u }, { 1824495087482858639u, 2210859150104177824u }, - { 1140309429676786649u, 1381786968815111140u }, { 1425386787095983311u, 1727233711018888925u }, - { 6393419502297367043u, 2159042138773611156u }, { 13219259225790630210u, 1349401336733506972u }, - { 16524074032238287762u, 1686751670916883715u }, { 16043406521870471799u, 2108439588646104644u }, - { 803757039314269066u, 1317774742903815403u }, { 14839754354425000045u, 1647218428629769253u }, - { 4714634887749086344u, 2059023035787211567u }, { 9864175832484260821u, 1286889397367007229u }, - { 16941905809032713930u, 1608611746708759036u }, { 2730638187581340797u, 2010764683385948796u }, - { 10930020904093113806u, 1256727927116217997u }, { 18274212148543780162u, 1570909908895272496u }, - { 4396021111970173586u, 1963637386119090621u }, { 5053356204195052443u, 1227273366324431638u }, - { 15540067292098591362u, 1534091707905539547u }, { 14813398096695851299u, 1917614634881924434u }, - { 13870059828862294966u, 1198509146801202771u }, { 12725888767650480803u, 1498136433501503464u }, - { 15907360959563101004u, 1872670541876879330u }, { 14553786618154326031u, 1170419088673049581u }, - { 4357175217410743827u, 1463023860841311977u }, { 10058155040190817688u, 1828779826051639971u }, - { 7961007781811134206u, 2285974782564549964u }, { 14199001900486734687u, 1428734239102843727u }, - { 13137066357181030455u, 1785917798878554659u }, { 11809646928048900164u, 2232397248598193324u }, - { 16604401366885338411u, 1395248280373870827u }, { 16143815690179285109u, 1744060350467338534u }, - { 10956397575869330579u, 2180075438084173168u }, { 6847748484918331612u, 1362547148802608230u }, - { 17783057643002690323u, 1703183936003260287u }, { 17617136035325974999u, 2128979920004075359u }, - { 17928239049719816230u, 1330612450002547099u }, { 17798612793722382384u, 1663265562503183874u }, - { 13024893955298202172u, 2079081953128979843u }, { 5834715712847682405u, 1299426220705612402u }, - { 16516766677914378815u, 1624282775882015502u }, { 11422586310538197711u, 2030353469852519378u }, - { 11750802462513761473u, 1268970918657824611u }, { 10076817059714813937u, 1586213648322280764u }, - { 12596021324643517422u, 1982767060402850955u }, { 5566670318688504437u, 1239229412751781847u }, - { 2346651879933242642u, 1549036765939727309u }, { 7545000868343941206u, 1936295957424659136u }, - { 4715625542714963254u, 1210184973390411960u }, { 5894531928393704067u, 1512731216738014950u }, - { 16591536947346905892u, 1890914020922518687u }, { 17287239619732898039u, 1181821263076574179u }, - { 16997363506238734644u, 1477276578845717724u }, { 2799960309088866689u, 1846595723557147156u }, - { 10973347230035317489u, 1154122327223216972u }, { 13716684037544146861u, 1442652909029021215u }, - { 12534169028502795672u, 1803316136286276519u }, { 11056025267201106687u, 2254145170357845649u }, - { 18439230838069161439u, 1408840731473653530u }, { 13825666510731675991u, 1761050914342066913u }, - { 3447025083132431277u, 2201313642927583642u }, { 6766076695385157452u, 1375821026829739776u }, - { 8457595869231446815u, 1719776283537174720u }, { 10571994836539308519u, 2149720354421468400u }, - { 6607496772837067824u, 1343575221513417750u }, { 17482743002901110588u, 1679469026891772187u }, - { 17241742735199000331u, 2099336283614715234u }, { 15387775227926763111u, 1312085177259197021u }, - { 5399660979626290177u, 1640106471573996277u }, { 11361262242960250625u, 2050133089467495346u }, - { 11712474920277544544u, 1281333180917184591u }, { 10028907631919542777u, 1601666476146480739u }, - { 7924448521472040567u, 2002083095183100924u }, { 14176152362774801162u, 1251301934489438077u }, - { 3885132398186337741u, 1564127418111797597u }, { 9468101516160310080u, 1955159272639746996u }, - { 15140935484454969608u, 1221974545399841872u }, { 479425281859160394u, 1527468181749802341u }, - { 5210967620751338397u, 1909335227187252926u }, { 17091912818251750210u, 1193334516992033078u }, - { 12141518985959911954u, 1491668146240041348u }, { 15176898732449889943u, 1864585182800051685u }, - { 11791404716994875166u, 1165365739250032303u }, { 10127569877816206054u, 1456707174062540379u }, - { 8047776328842869663u, 1820883967578175474u }, { 836348374198811271u, 2276104959472719343u }, - { 7440246761515338900u, 1422565599670449589u }, { 13911994470321561530u, 1778206999588061986u }, - { 8166621051047176104u, 2222758749485077483u }, { 2798295147690791113u, 1389224218428173427u }, - { 17332926989895652603u, 1736530273035216783u }, { 17054472718942177850u, 2170662841294020979u }, - { 8353202440125167204u, 1356664275808763112u }, { 10441503050156459005u, 1695830344760953890u }, - { 3828506775840797949u, 2119787930951192363u }, { 86973725686804766u, 1324867456844495227u }, - { 13943775212390669669u, 1656084321055619033u }, { 3594660960206173375u, 2070105401319523792u }, - { 2246663100128858359u, 1293815875824702370u }, { 12031700912015848757u, 1617269844780877962u }, - { 5816254103165035138u, 2021587305976097453u }, { 5941001823691840913u, 1263492066235060908u }, - { 7426252279614801142u, 1579365082793826135u }, { 4671129331091113523u, 1974206353492282669u }, - { 5225298841145639904u, 1233878970932676668u }, { 6531623551432049880u, 1542348713665845835u }, - { 3552843420862674446u, 1927935892082307294u }, { 16055585193321335241u, 1204959932551442058u }, - { 10846109454796893243u, 1506199915689302573u }, { 18169322836923504458u, 1882749894611628216u }, - { 11355826773077190286u, 1176718684132267635u }, { 9583097447919099954u, 1470898355165334544u }, - { 11978871809898874942u, 1838622943956668180u }, { 14973589762373593678u, 2298278679945835225u }, - { 2440964573842414192u, 1436424174966147016u }, { 3051205717303017741u, 1795530218707683770u }, - { 13037379183483547984u, 2244412773384604712u }, { 8148361989677217490u, 1402757983365377945u }, - { 14797138505523909766u, 1753447479206722431u }, { 13884737113477499304u, 2191809349008403039u }, - { 15595489723564518921u, 1369880843130251899u }, { 14882676136028260747u, 1712351053912814874u }, - { 9379973133180550126u, 2140438817391018593u }, { 17391698254306313589u, 1337774260869386620u }, - { 3292878744173340370u, 1672217826086733276u }, { 4116098430216675462u, 2090272282608416595u }, - { 266718509671728212u, 1306420176630260372u }, { 333398137089660265u, 1633025220787825465u }, - { 5028433689789463235u, 2041281525984781831u }, { 10060300083759496378u, 1275800953740488644u }, - { 12575375104699370472u, 1594751192175610805u }, { 1884160825592049379u, 1993438990219513507u }, - { 17318501580490888525u, 1245899368887195941u }, { 7813068920331446945u, 1557374211108994927u }, - { 5154650131986920777u, 1946717763886243659u }, { 915813323278131534u, 1216698602428902287u }, - { 14979824709379828129u, 1520873253036127858u }, { 9501408849870009354u, 1901091566295159823u }, - { 12855909558809837702u, 1188182228934474889u }, { 2234828893230133415u, 1485227786168093612u }, - { 2793536116537666769u, 1856534732710117015u }, { 8663489100477123587u, 1160334207943823134u }, - { 1605989338741628675u, 1450417759929778918u }, { 11230858710281811652u, 1813022199912223647u }, - { 9426887369424876662u, 2266277749890279559u }, { 12809333633531629769u, 1416423593681424724u }, - { 16011667041914537212u, 1770529492101780905u }, { 6179525747111007803u, 2213161865127226132u }, - { 13085575628799155685u, 1383226165704516332u }, { 16356969535998944606u, 1729032707130645415u }, - { 15834525901571292854u, 2161290883913306769u }, { 2979049660840976177u, 1350806802445816731u }, - { 17558870131333383934u, 1688508503057270913u }, { 8113529608884566205u, 2110635628821588642u }, - { 9682642023980241782u, 1319147268013492901u }, { 16714988548402690132u, 1648934085016866126u }, - { 11670363648648586857u, 2061167606271082658u }, { 11905663298832754689u, 1288229753919426661u }, - { 1047021068258779650u, 1610287192399283327u }, { 15143834390605638274u, 2012858990499104158u }, - { 4853210475701136017u, 1258036869061940099u }, { 1454827076199032118u, 1572546086327425124u }, - { 1818533845248790147u, 1965682607909281405u }, { 3442426662494187794u, 1228551629943300878u }, - { 13526405364972510550u, 1535689537429126097u }, { 3072948650933474476u, 1919611921786407622u }, - { 15755650962115585259u, 1199757451116504763u }, { 15082877684217093670u, 1499696813895630954u }, - { 9630225068416591280u, 1874621017369538693u }, { 8324733676974063502u, 1171638135855961683u }, - { 5794231077790191473u, 1464547669819952104u }, { 7242788847237739342u, 1830684587274940130u }, - { 18276858095901949986u, 2288355734093675162u }, { 16034722328366106645u, 1430222333808546976u }, - { 1596658836748081690u, 1787777917260683721u }, { 6607509564362490017u, 2234722396575854651u }, - { 1823850468512862308u, 1396701497859909157u }, { 6891499104068465790u, 1745876872324886446u }, - { 17837745916940358045u, 2182346090406108057u }, { 4231062170446641922u, 1363966306503817536u }, - { 5288827713058302403u, 1704957883129771920u }, { 6611034641322878003u, 2131197353912214900u }, - { 13355268687681574560u, 1331998346195134312u }, { 16694085859601968200u, 1664997932743917890u }, - { 11644235287647684442u, 2081247415929897363u }, { 4971804045566108824u, 1300779634956185852u }, - { 6214755056957636030u, 1625974543695232315u }, { 3156757802769657134u, 2032468179619040394u }, - { 6584659645158423613u, 1270292612261900246u }, { 17454196593302805324u, 1587865765327375307u }, - { 17206059723201118751u, 1984832206659219134u }, { 6142101308573311315u, 1240520129162011959u }, - { 3065940617289251240u, 1550650161452514949u }, { 8444111790038951954u, 1938312701815643686u }, - { 665883850346957067u, 1211445438634777304u }, { 832354812933696334u, 1514306798293471630u }, - { 10263815553021896226u, 1892883497866839537u }, { 17944099766707154901u, 1183052186166774710u }, - { 13206752671529167818u, 1478815232708468388u }, { 16508440839411459773u, 1848519040885585485u }, - { 12623618533845856310u, 1155324400553490928u }, { 15779523167307320387u, 1444155500691863660u }, - { 1277659885424598868u, 1805194375864829576u }, { 1597074856780748586u, 2256492969831036970u }, - { 5609857803915355770u, 1410308106144398106u }, { 16235694291748970521u, 1762885132680497632u }, - { 1847873790976661535u, 2203606415850622041u }, { 12684136165428883219u, 1377254009906638775u }, - { 11243484188358716120u, 1721567512383298469u }, { 219297180166231438u, 2151959390479123087u }, - { 7054589765244976505u, 1344974619049451929u }, { 13429923224983608535u, 1681218273811814911u }, - { 12175718012802122765u, 2101522842264768639u }, { 14527352785642408584u, 1313451776415480399u }, - { 13547504963625622826u, 1641814720519350499u }, { 12322695186104640628u, 2052268400649188124u }, - { 16925056528170176201u, 1282667750405742577u }, { 7321262604930556539u, 1603334688007178222u }, - { 18374950293017971482u, 2004168360008972777u }, { 4566814905495150320u, 1252605225005607986u }, - { 14931890668723713708u, 1565756531257009982u }, { 9441491299049866327u, 1957195664071262478u }, - { 1289246043478778550u, 1223247290044539049u }, { 6223243572775861092u, 1529059112555673811u }, - { 3167368447542438461u, 1911323890694592264u }, { 1979605279714024038u, 1194577431684120165u }, - { 7086192618069917952u, 1493221789605150206u }, { 18081112809442173248u, 1866527237006437757u }, - { 13606538515115052232u, 1166579523129023598u }, { 7784801107039039482u, 1458224403911279498u }, - { 507629346944023544u, 1822780504889099373u }, { 5246222702107417334u, 2278475631111374216u }, - { 3278889188817135834u, 1424047269444608885u }, { 8710297504448807696u, 1780059086805761106u } -}; - -fn uint32_t pow5_factor(uint64_t value) -{ - const uint64_t m_inv_5 = 14757395258967641293u; // 5 * m_inv_5 = 1 (mod 2^64) - const uint64_t n_div_5 = 3689348814741910323u; // #{ n | n = 0 (mod 2^64) } = 2^64 / 5 - uint32_t count = 0; - for (;;) { - assert(value != 0); - value *= m_inv_5; - if (value > n_div_5) - break; - ++count; - } - return count; -} - -// Returns true if value is divisible by 5^p. -fn u8 multiple_of_power_of_5(const uint64_t value, const uint32_t p) -{ - // I tried a case distinction on p, but there was no performance difference. - return pow5_factor(value) >= p; -} - -// Returns true if value is divisible by 2^p. -fn u8 multiple_of_power_of_2(const u64 value, const u32 p) { - assert(value != 0); - assert(p < 64); - // __builtin_ctzll doesn't appear to be faster here. - return (value & ((1ull << p) - 1)) == 0; -} - -fn inline uint64_t div5(const uint64_t x) { - return x / 5; -} - -fn inline uint64_t div10(const uint64_t x) { - return x / 10; -} - -fn inline uint64_t div100(const uint64_t x) { - return x / 100; -} - -fn inline uint64_t div1e8(const uint64_t x) { - return x / 100000000; -} - -fn inline uint64_t div1e9(const uint64_t x) { - return x / 1000000000; -} - -fn inline uint32_t mod1e9(const uint64_t x) { - return (uint32_t) (x - 1000000000 * div1e9(x)); -} - -STRUCT(Double) -{ - u64 mantissa; - s32 exponent; - u32 reserved; -}; - -fn Double double_transform(u64 ieee_mantissa, u32 ieee_exponent) -{ - u64 m2; - s32 e2; - if (ieee_exponent) - { - m2 = ((u64)1 << double_mantissa_bits) | ieee_mantissa; - e2 = (s32)(ieee_exponent) - double_bias - double_mantissa_bits - 2; - } - else - { - m2 = ieee_mantissa; - e2 = 1 - double_bias - double_mantissa_bits - 2; - } - - u8 is_even = (m2 & 1) == 0; - let(accept_bounds, is_even); - - u64 mv = 4 * m2; - u32 mm_shift = (ieee_mantissa != 0) | (ieee_exponent <= 1); - - u64 vr, vp, vm; - s32 e10; - u8 vm_is_trailing_zeroes = 0; - u8 vr_is_trailing_zeroes = 0; - - if (e2 >= 0) - { - u32 q = log10_pow2(e2) - (e2 > 3); - e10 = (s32)q; - s32 k = double_pow5_inv_bitcount + pow5_bits((s32)q) - 1; - s32 i = -e2 + (s32)q + k; - vr = mul_shift_all_64(m2, DOUBLE_POW5_INV_SPLIT[q], i, &vp, &vm, mm_shift); - if (q <= 21) - { - u32 mv_mod_5 = ((u32)mv) - 5 * ((u32)div5(mv)); - if (mv_mod_5 == 0) - { - vr_is_trailing_zeroes = multiple_of_power_of_5(mv, q); - } - else if (accept_bounds) - { - vm_is_trailing_zeroes = multiple_of_power_of_5(mv - 1 - mm_shift, q); - } - else - { - vp -= multiple_of_power_of_5(mv + 2, q); - } - } - } - else - { - u32 q = log10_pow5(-e2) - (-e2 > 1); - e10 = (s32) q + e2; - s32 i = -e2 - (s32)q; - s32 k = pow5_bits(i) - double_pow5_bitcount; - s32 j = (s32)q - k; - vr = mul_shift_all_64(m2, DOUBLE_POW5_SPLIT[i], j, &vp, &vm, mm_shift); - - if (q <= 1) - { - vr_is_trailing_zeroes = 1; - if (accept_bounds) - { - vm_is_trailing_zeroes = mm_shift == 1; - } - else - { - vp -= 1; - } - } - else if (q < 63) - { - vr_is_trailing_zeroes = multiple_of_power_of_2(mv, q); - } - } - - s32 removed = 0; - u64 output; - u8 last_removed_digit = 0; - - if (vm_is_trailing_zeroes | vr_is_trailing_zeroes) - { - while (1) - { - u64 vp_div10 = div10(vp); - u64 vm_div10 = div10(vm); - - if (vp_div10 <= vm_div10) - { - break; - } - - u32 vm_mod10 = ((u32)vm) - 10 * ((u32)vm_div10); - u64 vr_div10 = div10(vr); - u32 vr_mod10 = ((u32)vr) - 10 * ((u32)vr_div10); - vm_is_trailing_zeroes &= vm_mod10 == 0; - vr_is_trailing_zeroes &= last_removed_digit == 0; - last_removed_digit = (u8)vr_mod10; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - - if (vm_is_trailing_zeroes) - { - while (1) - { - const uint64_t vm_div10 = div10(vm); - const uint32_t vm_mod10 = ((uint32_t) vm) - 10 * ((uint32_t) vm_div10); - - if (vm_mod10 != 0) - { - break; - } - - const uint64_t vp_div10 = div10(vp); - const uint64_t vr_div10 = div10(vr); - const uint32_t vr_mod10 = ((uint32_t) vr) - 10 * ((uint32_t) vr_div10); - vr_is_trailing_zeroes &= last_removed_digit == 0; - last_removed_digit = (uint8_t) vr_mod10; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - } - - if (vr_is_trailing_zeroes && last_removed_digit == 5 && vr % 2 == 0) - { - // Round even if the exact number is .....50..0. - last_removed_digit = 4; - } - // We need to take vr + 1 if vr is outside bounds or we need to round up. - output = vr + ((vr == vm && (!accept_bounds || !vm_is_trailing_zeroes)) || last_removed_digit >= 5); - } - else - { - u8 round_up = 0; - u64 vp_div100 = div100(vp); - u64 vm_div100 = div100(vm); - - if (vp_div100 > vm_div100) - { - u64 vr_div100 = div100(vr); - u32 vr_mod100 = ((u32)vr) - 100 * ((u32)vr_div100); - round_up = vr_mod100 >= 50; - vr = vr_div100; - vp = vp_div100; - vm = vm_div100; - removed += 2; - } - - while (1) - { - u64 vp_div10 = div10(vp); - u64 vm_div10 = div10(vm); - if (vp_div10 <= vm_div10) - { - break; - } - u64 vr_div10 = div10(vr); - u32 vr_mod10 = ((u32)vr) - 10 * ((u32) vr_div10); - round_up = vr_mod10 >= 5; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - - output = vr + ((vr == vm) | round_up); - } - - s32 exp = e10 + removed; - - return (Double) - { - .mantissa = output, - .exponent = exp, - }; -} - -fn SmallIntResult small_int(u64 ieee_mantissa, u32 ieee_exponent) -{ - SmallIntResult result = {}; - let(m2, ((u64)1 << double_mantissa_bits) | ieee_mantissa); - let(e2, (s32)ieee_exponent - double_bias - double_mantissa_bits); - - if (e2 > 0) - { - return result; - } - - if (e2 < -52) - { - return result; - } - - u64 mask = ((u64)1 << -e2) - 1; - u64 fraction = m2 & mask; - if (fraction != 0) - { - return result; - } - - result.mantissa = m2 >> -e2; - result.exponent = 0; - result.is_small_int = 1; - - return result; -} - -fn u32 decimalLength17(const u64 v) { - // This is slightly faster than a loop. - // The average output length is 16.38 digits, so we check high-to-low. - // Function precondition: v is not an 18, 19, or 20-digit number. - // (17 digits are sufficient for round-tripping.) - assert(v < 100000000000000000L); - if (v >= 10000000000000000L) { return 17; } - if (v >= 1000000000000000L) { return 16; } - if (v >= 100000000000000L) { return 15; } - if (v >= 10000000000000L) { return 14; } - if (v >= 1000000000000L) { return 13; } - if (v >= 100000000000L) { return 12; } - if (v >= 10000000000L) { return 11; } - if (v >= 1000000000L) { return 10; } - if (v >= 100000000L) { return 9; } - if (v >= 10000000L) { return 8; } - if (v >= 1000000L) { return 7; } - if (v >= 100000L) { return 6; } - if (v >= 10000L) { return 5; } - if (v >= 1000L) { return 4; } - if (v >= 100L) { return 3; } - if (v >= 10L) { return 2; } - return 1; -} - -// A floating decimal representing m * 10^e. -STRUCT(floating_decimal_64) -{ - u64 mantissa; - // Decimal exponent's range is -324 to 308 - // inclusive, and can fit in a short if needed. - s32 exponent; - u32 reserved; -}; - -fn u8* digits2(u64 value) -{ - String str = strlit("00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899"); - return str.pointer + (value * 2); -} - -fn void write_float_decimal(String buffer, u64* value, u64 count) -{ - u64 i = 0; - - while (i + 2 < count) - { - let_cast(u8, c, *value % 100); - *value /= 100; - let(ptr, digits2(c)); - buffer.pointer[count - i - 1] = ptr[1]; - buffer.pointer[count - i - 2] = ptr[0]; - i += 2; - } - - while (i < count) - { - let(c, cast_to(u8, *value % 10)); - *value /= 10; - buffer.pointer[count - i - 1] = '0' + c; - - i += 1; - } -} - -fn u64 format_float(String buffer, f64 value_double) -{ - let(value_int, *(u64*)&value_double); - u64 buffer_i = 0; - - const u8 ieee_sign = ((value_int >> (double_mantissa_bits + double_exponent_bits)) & 1) != 0; - let(ieee_mantissa, value_int & (((u64)1 << double_mantissa_bits) - 1)); - let(ieee_exponent, (u32)((value_int >> double_mantissa_bits) & (((u32)1 << double_exponent_bits) - 1))); - - if (ieee_exponent == (((u32)1 << double_exponent_bits) - 1) || (ieee_exponent == 0 && ieee_mantissa == 0)) - { - if (ieee_mantissa) - { - String nan = strlit("NaN"); - memcpy(&buffer.pointer[buffer_i], nan.pointer, nan.length); - buffer_i += nan.length; - } - else - { - if (ieee_sign) - { - buffer.pointer[buffer_i] = '-'; - buffer_i += 1; - } - - if (ieee_exponent) - { - String inf = strlit("Infinity"); - memcpy(&buffer.pointer[buffer_i], inf.pointer, inf.length); - buffer_i += inf.length; - } - else - { - String e0 = strlit("0E0"); - memcpy(&buffer.pointer[buffer_i], e0.pointer, e0.length); - buffer_i += e0.length; - } - } - } - else - { - let(small_int_result, small_int(ieee_mantissa, ieee_exponent)); - Double result; - if (small_int_result.is_small_int) - { - while (1) - { - u64 q = div10(small_int_result.mantissa); - u32 r = ((u32)small_int_result.mantissa) - 10 * ((u32)q); - - if (r != 0) - { - break; - } - - small_int_result.mantissa = q; - small_int_result.exponent += 1; - } - } - else - { - result = double_transform(ieee_mantissa, ieee_exponent); - } - - typedef enum FloatFormat - { - FLOAT_FORMAT_DECIMAL, - FLOAT_FORMAT_SCIENTIFIC, - } FloatFormat; - - FloatFormat format = FLOAT_FORMAT_DECIMAL; - u64 output = result.mantissa; - u32 olength = decimalLength17(output); - - // Sign - buffer.pointer[buffer_i] = '-'; - buffer_i += ieee_sign; - - switch (format) - { - case FLOAT_FORMAT_SCIENTIFIC: - { - u32 i = 0; - - if ((output >> 32) != 0) - { - u64 q = div1e8(output); - u32 output2 = ((u32)output) - 100000000 * ((u32)q); - output = q; - - u32 c = output % 10000; - output2 /= 10000; - - const uint32_t d = output2 % 10000; - const uint32_t c0 = (c % 100) << 1; - const uint32_t c1 = (c / 100) << 1; - const uint32_t d0 = (d % 100) << 1; - const uint32_t d1 = (d / 100) << 1; - - let(base_index, buffer_i + olength); - let(base, buffer.pointer + base_index); - memcpy(base - 1, DIGIT_TABLE + c0, 2); - memcpy(base - 3, DIGIT_TABLE + c1, 2); - memcpy(base - 5, DIGIT_TABLE + d0, 2); - memcpy(base - 7, DIGIT_TABLE + d1, 2); - - i += 8; - } - - let(output2, (u32)output); - - while (output2 >= 10000) - { -#ifdef __clang__ - const u32 c = output2 - 10000 * (output2 / 10000); -#else - const uint32_t c = output2 % 10000; -#endif - output2 /= 10000; - const u32 c0 = (c % 100) << 1; - const u32 c1 = (c / 100) << 1; - let(base_index, buffer_i + olength - i); - memcpy(buffer.pointer + base_index - 1, DIGIT_TABLE + c0, 2); - memcpy(buffer.pointer + base_index - 3, DIGIT_TABLE + c1, 2); - - i += 4; - } - - if (output2 >= 100) - { - const u32 c = (output2 % 100) << 1; - output2 /= 100; - memcpy(buffer.pointer + buffer_i + olength - i - 1, DIGIT_TABLE + c, 2); - i += 2; - } - - if (output2 >= 10) - { - const uint32_t c = output2 << 1; - // We can't use memcpy here: the decimal dot goes between these two digits. - buffer.pointer[buffer_i + olength - i] = DIGIT_TABLE[c + 1]; - buffer.pointer[buffer_i] = DIGIT_TABLE[c]; - } - else - { - buffer.pointer[buffer_i] = (u8)output2 + '0'; - } - - // Print decimal point if needed. - if (olength > 1) - { - buffer.pointer[buffer_i + 1] = '.'; - buffer_i += olength + 1; - } else { - buffer_i += 1; - } - - // Print the exponent. - buffer.pointer[buffer_i] = 'E'; - buffer_i += 1; - int32_t exp = result.exponent + (int32_t) olength - 1; - if (exp < 0) { - buffer.pointer[buffer_i] = '-'; - buffer_i += 1; - exp = -exp; - } - - if (exp >= 100) - { - const int32_t c = exp % 10; - memcpy(buffer.pointer + buffer_i, DIGIT_TABLE + 2 * (exp / 10), 2); - buffer.pointer[buffer_i + 2] = (u8)c + '0'; - buffer_i += 3; - } - else if (exp >= 10) - { - memcpy(buffer.pointer + buffer_i, DIGIT_TABLE + 2 * exp, 2); - buffer_i += 2; - } - else - { - buffer.pointer[buffer_i] = (u8)exp + '0'; - buffer_i += 1; - } - } break; - case FLOAT_FORMAT_DECIMAL: - { - let(dp_offset, result.exponent + cast_to(s32, olength)); - - if (dp_offset <= 0) - { - buffer.pointer[buffer_i] = '0'; - buffer.pointer[buffer_i + 1] = '.'; - buffer_i += 2; - - // let(dp_index, buffer_i); - - let(dp_poffset, (u32)(-dp_offset)); - memset(buffer.pointer + buffer_i, '0', dp_poffset); - buffer_i += dp_poffset; - write_float_decimal(s_get_slice(u8, buffer, buffer_i, buffer.length), &output, olength); - buffer_i += olength; - } - else - { - let(dp_uoffset, (u64)dp_offset); - if (dp_uoffset >= olength) - { - write_float_decimal(s_get_slice(u8, buffer, buffer_i, buffer.length), &output, olength); - buffer_i += olength; - let(length, dp_uoffset - olength); - String memset_slice = s_get_slice(u8, buffer, buffer_i, buffer_i + length); - memset(memset_slice.pointer, 0, length); - buffer_i += length; - } - else - { - write_float_decimal(s_get_slice(u8, buffer, buffer_i + dp_uoffset + 1, buffer.length), &output, olength - dp_uoffset); - buffer.pointer[buffer_i + dp_uoffset] = '.'; - // let(dp_index, buffer_i + dp_uoffset + 1); - write_float_decimal(s_get_slice(u8, buffer, buffer_i, buffer.length), &output, dp_uoffset); - buffer_i += olength + 1; - } - } - } break; - } - } - - return buffer_i; -} - -typedef enum IntegerFormat -{ - INTEGER_FORMAT_HEXADECIMAL, - INTEGER_FORMAT_DECIMAL, - INTEGER_FORMAT_OCTAL, - INTEGER_FORMAT_BINARY, -} IntegerFormat; - -STRUCT(IntegerFormatOptions) -{ - IntegerFormat format; - u32 width; -}; - -fn IntegerFormatOptions integer_format_options(u8** it) -{ - IntegerFormatOptions options = { - .format = INTEGER_FORMAT_DECIMAL, - }; - - if (**it == ':') - { - *it += 1; - - while (**it != brace_close) - { - switch (**it) - { - case 'x': - options.format = INTEGER_FORMAT_HEXADECIMAL; - *it += 1; - break; - case 'd': - options.format = INTEGER_FORMAT_DECIMAL; - *it += 1; - break; - case 'o': - options.format = INTEGER_FORMAT_OCTAL; - *it += 1; - break; - case 'b': - options.format = INTEGER_FORMAT_BINARY; - *it += 1; - break; - case 'w': - { - *it += 1; - - if (**it != '=') - { - todo(); - } - - *it += 1; - - let(start, *it); - while (is_decimal_digit(**it)) - { - *it += 1; - } - let(end, *it); - assign_cast(options.width, parse_decimal(slice_from_pointer_range(u8, start, end))); - } break; - default: - unreachable(); - } - - *it += **it == ','; - } - } - - return options; -} - -fn String format_string_va(String buffer, const char* format, va_list args) -{ - u8* it = (u8*)format; - u64 buffer_i = 0; - - while (*it) - { - while (*it && *it != brace_open) - { - s_get(buffer, buffer_i) = *it; - buffer_i += 1; - it += 1; - } - - if (*it == brace_open) - { - it += 1; - let(next_ch, *it); - - if (next_ch == brace_open) - { - todo(); - } - else - { - switch (next_ch) - { - case 'c': - { - int done = 0; - it += 1; - if (*it == 's') - { - it += 1; - if (*it == 't') - { - it += 1; - if (*it == 'r') - { - it += 1; - done = 1; - let_va_arg(const u8*, cstring, args); - while (*cstring) - { - buffer.pointer[buffer_i] = *cstring; - buffer_i += 1; - cstring += 1; - } - } - } - } - else - { - let_cast(u8, character, cast_to(u8, va_arg(args, u32))); - buffer.pointer[buffer_i] = character; - buffer_i += 1; - done = 1; - } - - assert(done); - } break; - case 'f': - { - it += 1; - f64 value_double; - switch (*it) - { - case '3': - it += 1; - if (*it != '2') - { - failed_execution(); - } - it += 1; - value_double = va_arg(args, f64); - break; - case '6': - it += 1; - if (*it != '4') - { - failed_execution(); - } - it += 1; - value_double = va_arg(args, f64); - break; - default: - failed_execution(); - } - - buffer_i += format_float(s_get_slice(u8, buffer, buffer_i, buffer.length), value_double); - } break; - case 's': - { - it += 1; - - if (is_decimal_digit(*it)) - { - u8* bit_count_start = it; - while (is_decimal_digit(*it)) - { - it += 1; - } - - u8* bit_count_end = it; - u64 bit_count = parse_decimal(slice_from_pointer_range(u8, (u8*)bit_count_start, (u8*)bit_count_end)); - - IntegerFormatOptions options = integer_format_options(&it); - - s64 original_value; - switch (bit_count) - { - case 8: - case 16: - case 32: - original_value = va_arg(args, s32); - break; - case 64: - original_value = va_arg(args, s64); - break; - default: - unreachable(); - } - - String buffer_slice = s_get_slice(u8, buffer, buffer_i, buffer.length); - - switch (options.format) - { - case INTEGER_FORMAT_HEXADECIMAL: - { - u32 expected_characters = hex_digit_count(original_value); - - if (expected_characters < options.width) - { - u32 extra_characters = options.width - expected_characters; - memset(buffer.pointer, '0', extra_characters); - buffer_i += extra_characters; - } - - let(written_characters, format_hexadecimal(buffer_slice, original_value)); - assert(expected_characters == written_characters); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_DECIMAL: - { - u64 value; - if (original_value < 0) - { - buffer_slice.pointer[0] = '-'; - buffer_slice.pointer += 1; - buffer_slice.length -= 1; - buffer_i += 1; - value = (u64)(-(original_value - (original_value == INT64_MIN))) + (original_value == INT64_MIN); - } - else - { - value = (u64)original_value; - } - - let(written_characters, format_decimal(buffer_slice, value)); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_OCTAL: - { - todo(); - } break; - case INTEGER_FORMAT_BINARY: - { - todo(); - } break; - } - } - else - { - String string = va_arg(args, String); - memcpy(buffer.pointer + buffer_i, string.pointer, string.length); - buffer_i += string.length; - } - - } break; - case 'u': - { - it += 1; - - u8* bit_count_start = it; - while (is_decimal_digit(*it)) - { - it += 1; - } - - u8* bit_count_end = it; - u64 bit_count = parse_decimal(slice_from_pointer_range(u8, (u8*)bit_count_start, (u8*)bit_count_end)); - - IntegerFormatOptions options = integer_format_options(&it); - - u64 original_value; - switch (bit_count) - { - case 8: - case 16: - case 32: - original_value = va_arg(args, u32); - break; - case 64: - original_value = va_arg(args, u64); - break; - default: - unreachable(); - } - - - switch (options.format) - { - case INTEGER_FORMAT_HEXADECIMAL: - { - u32 expected_characters = hex_digit_count(original_value); - - if (expected_characters < options.width) - { - u32 extra_characters = options.width - expected_characters; - memset(buffer.pointer + buffer_i, '0', extra_characters); - buffer_i += extra_characters; - } - - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - let(written_characters, format_hexadecimal(buffer_slice, original_value)); - assert(expected_characters == written_characters); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_DECIMAL: - { - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - let(written_characters, format_decimal(buffer_slice, original_value)); - buffer_i += written_characters; - } break; - case INTEGER_FORMAT_OCTAL: - { - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - unused(buffer_slice); - todo(); - } break; - case INTEGER_FORMAT_BINARY: - { - let(buffer_slice, s_get_slice(u8, buffer, buffer_i, buffer.length)); - unused(buffer_slice); - todo(); - } break; - } - } break; - default: - buffer.pointer[buffer_i] = '{'; - buffer_i += 1; - continue; - } - - if (*it != brace_close) - { - failed_execution(); - } - - it += 1; - } - } - } - - return (String) { .pointer = buffer.pointer, .length = buffer_i }; -} - -fn String format_string(String buffer, const char* format, ...) -{ - va_list args; - va_start(args, format); - let(result, format_string_va(buffer, format, args)); - va_end(args); - return result; -} - -fn void formatter_append(StringFormatter* formatter, const char* format, ...) -{ - va_list args; - va_start(args, format); - String buffer = s_get_slice(u8, formatter->buffer, formatter->index, formatter->buffer.length); - let(result, format_string_va(buffer, format, args)); - va_end(args); - formatter->index += result.length; -} - -fn void formatter_append_string(StringFormatter* formatter, String string) -{ - assert(string.length + formatter->index <= formatter->buffer.length); - memcpy(formatter->buffer.pointer + formatter->index, string.pointer, string.length); - formatter->index += string.length; -} - -fn void formatter_append_character(StringFormatter* formatter, u8 ch) -{ - assert(formatter->index < formatter->buffer.length); - formatter->buffer.pointer[formatter->index] = ch; - formatter->index += 1; -} diff --git a/bootstrap/std/format.h b/bootstrap/std/format.h deleted file mode 100644 index 1eeca03..0000000 --- a/bootstrap/std/format.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -STRUCT(StringFormatter) -{ - String buffer; - u64 index; -}; - -fn void formatter_append(StringFormatter* formatter, const char* format, ...); -fn void formatter_append_string(StringFormatter* formatter, String string); -fn void formatter_append_character(StringFormatter* formatter, u8 ch); -fn String format_string(String buffer, const char* format, ...); -fn String format_string_va(String buffer, const char* format, va_list args); diff --git a/bootstrap/std/image_loader.c b/bootstrap/std/image_loader.c deleted file mode 100644 index db4c4c6..0000000 --- a/bootstrap/std/image_loader.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -#define STB_IMAGE_STATIC -#define STB_IMAGE_IMPLEMENTATION -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" -#include -#pragma clang diagnostic pop - -EXPORT TextureMemory texture_load_from_file(Arena* arena, String path) -{ - auto file = file_read(arena, path); - int width; - int height; - int channels; - u8* buffer = stbi_load_from_memory(file.pointer, file.length, &width, &height, &channels, STBI_rgb_alpha); - channels += 1; - - return (TextureMemory) { - .pointer = buffer, - .width = width, - .height = height, - .format = TEXTURE_FORMAT_R8G8B8A8_SRGB, - .depth = 1, - }; -} diff --git a/bootstrap/std/image_loader.h b/bootstrap/std/image_loader.h deleted file mode 100644 index fde4fd0..0000000 --- a/bootstrap/std/image_loader.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include -#include -#include - -EXPORT TextureMemory texture_load_from_file(Arena* arena, String path); diff --git a/bootstrap/std/md5.c b/bootstrap/std/md5.c deleted file mode 100644 index 8895618..0000000 --- a/bootstrap/std/md5.c +++ /dev/null @@ -1,178 +0,0 @@ -#include - -STRUCT(MD5Context) -{ - u32 buffer[4]; - u8 input[64]; - u64 size; -}; - -// Took from: https://github.com/Zunawe/md5-c - -#define MD5_A 0x67452301 -#define MD5_B 0xefcdab89 -#define MD5_C 0x98badcfe -#define MD5_D 0x10325476 - -#define MD5_F(X, Y, Z) ((X & Y) | (~X & Z)) -#define MD5_G(X, Y, Z) ((X & Z) | (Y & ~Z)) -#define MD5_H(X, Y, Z) (X ^ Y ^ Z) -#define MD5_I(X, Y, Z) (Y ^ (X | ~Z)) - -global_variable u32 md5_s[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}; - -global_variable u32 md5_k[] = {0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, - 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, - 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, - 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, - 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, - 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, - 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, - 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, - 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, - 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, - 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, - 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, - 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, - 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, - 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, - 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391}; - -/* - * Padding used to make the size (in bits) of the input congruent to 448 mod 512 - */ -global_variable u8 md5_padding[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - -fn MD5Context md5_init() -{ - return (MD5Context) { - .buffer = { MD5_A, MD5_B, MD5_C, MD5_D }, - }; -} - -fn u32 rotate_left_u32(u32 x, u32 n) -{ - return (x << n) | (x >> (32 - n)); -} - -fn void md5_step(u32* buffer, u32* input) -{ - u32 aa = buffer[0]; - u32 bb = buffer[1]; - u32 cc = buffer[2]; - u32 dd = buffer[3]; - - for (u32 i = 0; i < 64; i += 1) - { - u32 j; - u32 e; - switch (i / 16) - { - case 0: - { - e = MD5_F(bb, cc, dd); - j = i; - } break; - case 1: - { - e = MD5_G(bb, cc, dd); - j = ((i * 5) + 1) % 16; - } break; - case 2: - { - e = MD5_H(bb, cc, dd); - j = ((i * 3) + 5) % 16; - } break; - default: - { - e = MD5_I(bb, cc, dd); - j = (i * 7) % 16; - } break; - } - - u32 old_dd = dd; - dd = cc; - cc = bb; - bb = bb + rotate_left_u32(aa + e + md5_k[i] + input[j], md5_s[i]); - aa = old_dd; - } - - buffer[0] += aa; - buffer[1] += bb; - buffer[2] += cc; - buffer[3] += dd; -} - -fn void md5_update(MD5Context* context, String input_argument) -{ - u32 input_local[16]; - auto offset = context->size % 64; - context->size += input_argument.length; - - for (u64 i = 0; i < input_argument.length; i += 1) - { - context->input[offset] = input_argument.pointer[i]; - offset += 1; - - if (offset % 64 == 0) - { - // TODO: convert to little-endian in case we are big-endian? - for (u16 i = 0; i < 16; i += 1) - { - auto existing = *(u32*)&input_argument.pointer[i * 4]; - input_local[i] = existing; - } - md5_step(context->buffer, input_local); - offset = 0; - } - } -} - -fn MD5Result md5_end(MD5Context* context) -{ - u32 input[16]; - auto offset = context->size % 64; - auto padding_length = offset < 56 ? 56 - offset : (56 + 64) - offset; - - md5_update(context, (String) { .pointer = md5_padding, .length = padding_length }); - context->size -= (u64)padding_length; - - for (u32 i = 0; i < 14; i += 1) - { - input[i] = *(u32*)&context->input[i * 4]; - } - input[14] = (u32)(context->size * 8); - input[15] = (u32)((context->size * 8) >> 32); - - md5_step(context->buffer, input); - - MD5Result result; - for (u32 i = 0; i < 4; i += 1) - { - result.hash[(i * 4) + 0] = (u8)((context->buffer[i] & 0x000000ff) >> 0); - result.hash[(i * 4) + 1] = (u8)((context->buffer[i] & 0x0000ff00) >> 8); - result.hash[(i * 4) + 2] = (u8)((context->buffer[i] & 0x00ff0000) >> 16); - result.hash[(i * 4) + 3] = (u8)((context->buffer[i] & 0xff000000) >> 24); - } - - return result; -} - -MD5Result md5_string(String string) -{ - auto context = md5_init(); - md5_update(&context, string); - auto result = md5_end(&context); - return result; -} diff --git a/bootstrap/std/md5.h b/bootstrap/std/md5.h deleted file mode 100644 index c889c31..0000000 --- a/bootstrap/std/md5.h +++ /dev/null @@ -1,8 +0,0 @@ -#include - -STRUCT(MD5Result) -{ - u8 hash[16]; -}; - -MD5Result md5_string(String string); diff --git a/bootstrap/std/metal_rendering.c b/bootstrap/std/metal_rendering.c deleted file mode 100644 index a5cd8b3..0000000 --- a/bootstrap/std/metal_rendering.c +++ /dev/null @@ -1,148 +0,0 @@ -#pragma once - -global_variable Renderer renderer_memory; - -fn NSString* apple_string(String string) -{ - NSString* result = [[NSString alloc] initWithBytes:string.pointer length:string.length encoding:NSUTF8StringEncoding]; - return result; -} - -fn Renderer* rendering_initialize(Arena* arena) -{ - Renderer* renderer = &renderer_memory; - @autoreleasepool { - renderer->device = MTLCreateSystemDefaultDevice(); - String shader_source = file_read(arena, strlit("bootstrap/std/shaders/rect.metal")); - NSString* apple_shader_source = apple_string(shader_source); - NSError* error = nil; - id library = [renderer->device newLibraryWithSource: apple_shader_source options:nil error:&error]; - if (!library) - { - // Inspect the error - NSLog(@"Error Domain: %@", error.domain); - NSLog(@"Error Code: %ld", (long)error.code); - NSLog(@"Localized Description: %@", error.localizedDescription); - - NSDictionary *userInfo = error.userInfo; - if (userInfo) { - NSLog(@"Additional Info: %@", userInfo); - } - - // Take action based on the error - if ([error.domain isEqualToString:MTLLibraryErrorDomain]) { - NSLog(@"Metal Library Compilation Error. Check the shader source."); - } else { - NSLog(@"Unexpected error occurred."); - } - } - - id vertex = [library newFunctionWithName:@"vertex_main"]; - id fragment = [library newFunctionWithName:@"fragment_main"]; - - MTLRenderPipelineDescriptor* pipeline_descriptor = [[MTLRenderPipelineDescriptor alloc] init]; - pipeline_descriptor.vertexFunction = vertex; - pipeline_descriptor.fragmentFunction = fragment; - pipeline_descriptor.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; - - id pipeline_state = [renderer->device newRenderPipelineStateWithDescriptor:pipeline_descriptor error:&error]; - - if (!pipeline_state) - { - // Inspect the error - NSLog(@"Error Domain: %@", error.domain); - NSLog(@"Error Code: %ld", (long)error.code); - NSLog(@"Localized Description: %@", error.localizedDescription); - - NSDictionary *userInfo = error.userInfo; - if (userInfo) { - NSLog(@"Additional Info: %@", userInfo); - } - } - - id command_queue = [renderer->device newCommandQueue]; - } - - return renderer; -} - -global_variable RenderWindow render_window_memory; - -fn RenderWindow* rendering_initialize_window(Renderer* renderer, WindowingInstance* window) -{ - RenderWindow* render_window = &render_window_memory; - - CAMetalLayer* layer = [CAMetalLayer layer]; - render_window->layer = layer; - layer.device = renderer->device; - layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; - layer.framebufferOnly = true; - layer.frame = window.frame; - window.contentView.layer = layer; - window.opaque = true; - window.backgroundColor = nil; - - return render_window; -} - -fn void renderer_window_frame_begin(Renderer* renderer, RenderWindow* window) -{ - @autoreleasepool { - id drawable = [window->layer nextDrawable]; - MTLRenderPassDescriptor* render_pass_descriptor = [MTLRenderPassDescriptor renderPassDescriptor]; - MTLRenderPassColorAttachmentDescriptor* color_attachment = render_pass_descriptor.colorAttachments[0]; - color_attachment.clearColor = MTLClearColorMake(1, 1, 1, 1); - color_attachment.storeAction = MTLStoreActionStore; - color_attachment.texture = drawable.texture; - - id command_buffer = [renderer->command_queue commandBuffer]; - - id render_command_encoder = [command_buffer renderCommandEncoderWithDescriptor:render_pass_descriptor]; - [render_command_encoder setRenderPipelineState: renderer->pipeline_state]; - [render_command_encoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:3]; - [render_command_encoder endEncoding]; - [command_buffer presentDrawable:drawable]; - [command_buffer commit]; - } -} - -fn void renderer_window_frame_end(Renderer* renderer, RenderWindow* window) -{ - - // todo(); -} - -fn TextureIndex renderer_texture_create(Renderer* renderer, TextureMemory texture_memory) -{ - todo(); -} - -fn void window_rect_texture_update_begin(RenderWindow* window) -{ - todo(); -} - -fn void renderer_queue_font_update(Renderer* renderer, RenderWindow* window, RenderFontType type, TextureAtlas atlas) -{ - todo(); -} - -fn void window_queue_rect_texture_update(RenderWindow* window, RectTextureSlot slot, TextureIndex texture_index) -{ - todo(); -} - -fn void window_rect_texture_update_end(Renderer* renderer, RenderWindow* window) -{ - todo(); -} - -fn void window_render_rect(RenderWindow* window, RectDraw draw) -{ - // todo(); -} - -fn void window_render_text(Renderer* renderer, RenderWindow* window, String string, float4 color, RenderFontType font_type, u32 x_offset, u32 y_offset) -{ - // todo(); -} diff --git a/bootstrap/std/metal_rendering.h b/bootstrap/std/metal_rendering.h deleted file mode 100644 index 5c9fc2a..0000000 --- a/bootstrap/std/metal_rendering.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#import - -STRUCT(Renderer) -{ - id device; - id command_queue; - id pipeline_state; -}; - -STRUCT(RenderWindow) -{ - CAMetalLayer* layer; -}; - diff --git a/bootstrap/std/os.c b/bootstrap/std/os.c deleted file mode 100644 index 0d1b68d..0000000 --- a/bootstrap/std/os.c +++ /dev/null @@ -1,1701 +0,0 @@ -#pragma once - -#include -#include -#include - -#include -#include -#include - -#if _WIN32 -global_variable u64 cpu_frequency; -#else -#if LINK_LIBC -global_variable struct timespec cpu_resolution; -#else -global_variable u64 cpu_frequency; -#endif -#endif - -fn Timestamp os_timestamp() -{ - Timestamp result; - -#if _WIN32 - LARGE_INTEGER li; - QueryPerformanceCounter(&li); - result.value = u128_from_u64(li.QuadPart); -#else - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - result.value = u128_u64_or(u128_shift_left(u128_from_u64(ts.tv_sec), 64), ts.tv_nsec); -#endif - - return result; -} - -fn f64 os_resolve_timestamps(Timestamp start, Timestamp end, TimeUnit time_unit) -{ - f64 result; -#if _WIN32 - let(start_tick, (s64)u64_from_u128(start.value)); - let(end_tick, (s64)u64_from_u128(end.value)); - - let(seconds, (f64)(end_tick - start_tick) / cpu_frequency); - - switch (time_unit) - { - case TIME_UNIT_NANOSECONDS: - result = seconds * 1000000000.0; - break; - case TIME_UNIT_MICROSECONDS: - result = seconds * 1000000.0; - break; - case TIME_UNIT_MILLISECONDS: - result = seconds * 1000.0; - break; - case TIME_UNIT_SECONDS: - result = seconds; - break; - } -#else - let(segmented_nanoseconds, (s64)u64_from_u128(end.value) - (s64)u64_from_u128(start.value)); - let(segmented_seconds, (s64)u128_shift_right_by_64(end.value) - (s64)u128_shift_right_by_64(start.value)); - - if (segmented_nanoseconds < 0) - { - segmented_seconds -= 1; - segmented_nanoseconds += 1000000000; - } - - let(total_ns, segmented_seconds * 1000000000 + segmented_nanoseconds); - - switch (time_unit) - { - case TIME_UNIT_NANOSECONDS: - result = total_ns; - break; - case TIME_UNIT_MICROSECONDS: - result = total_ns / 1000.0; - break; - case TIME_UNIT_MILLISECONDS: - result = total_ns / 1000000.0; - break; - case TIME_UNIT_SECONDS: - result = total_ns / 1000000000.0; - break; - } -#endif - - return result; -} - -fn FileDescriptor os_stdout_get() -{ -#if _WIN32 - let(handle, GetStdHandle(STD_OUTPUT_HANDLE)); - assert(handle != INVALID_HANDLE_VALUE); - return handle; -#else - return 1; -#endif -} - -fn String path_dir(String string) -{ - String result = {}; - let(index, string_last_ch(string, '/')); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, 0, index); - } - - return result; -} - -fn String path_base(String string) -{ - String result = {}; - let(index, string_last_ch(string, '/')); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, index + 1, string.length); - } -#if _WIN32 - if (!result.pointer) - { - index = string_last_ch(string, '\\'); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, index + 1, string.length); - } - } -#endif - - return result; -} - -fn String path_no_extension(String string) -{ - String result = {}; - let(index, string_last_ch(string, '.')); - if (index != STRING_NO_MATCH) - { - result = s_get_slice(u8, string, 0, index); - } - - return result; -} - -#if LINK_LIBC == 0 -#ifdef __linux__ -fn forceinline long syscall0(long n) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall1(long n, long a1) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall2(long n, long a1, long a2) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2) - : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall3(long n, long a1, long a2, long a3) -{ - long ret; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall4(long n, long a1, long a2, long a3, long a4) -{ - long ret; - register long r10 __asm__("r10") = a4; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10): "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall5(long n, long a1, long a2, long a3, long a4, long a5) -{ - long ret; - register long r10 __asm__("r10") = a4; - register long r8 __asm__("r8") = a5; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory"); - return ret; -} - -fn forceinline long syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6) -{ - long ret; - register long r10 __asm__("r10") = a4; - register long r8 __asm__("r8") = a5; - register long r9 __asm__("r9") = a6; - __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), - "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); - return ret; -} - -enum SyscallX86_64 : u64 { - syscall_x86_64_read = 0, - syscall_x86_64_write = 1, - syscall_x86_64_open = 2, - syscall_x86_64_close = 3, - syscall_x86_64_stat = 4, - syscall_x86_64_fstat = 5, - syscall_x86_64_lstat = 6, - syscall_x86_64_poll = 7, - syscall_x86_64_lseek = 8, - syscall_x86_64_mmap = 9, - syscall_x86_64_mprotect = 10, - syscall_x86_64_munmap = 11, - syscall_x86_64_brk = 12, - syscall_x86_64_rt_sigaction = 13, - syscall_x86_64_rt_sigprocmask = 14, - syscall_x86_64_rt_sigreturn = 15, - syscall_x86_64_ioctl = 16, - syscall_x86_64_pread64 = 17, - syscall_x86_64_pwrite64 = 18, - syscall_x86_64_readv = 19, - syscall_x86_64_writev = 20, - syscall_x86_64_access = 21, - syscall_x86_64_pipe = 22, - syscall_x86_64_select = 23, - syscall_x86_64_sched_yield = 24, - syscall_x86_64_mremap = 25, - syscall_x86_64_msync = 26, - syscall_x86_64_mincore = 27, - syscall_x86_64_madvise = 28, - syscall_x86_64_shmget = 29, - syscall_x86_64_shmat = 30, - syscall_x86_64_shmctl = 31, - syscall_x86_64_dup = 32, - syscall_x86_64_dup2 = 33, - syscall_x86_64_pause = 34, - syscall_x86_64_nanosleep = 35, - syscall_x86_64_getitimer = 36, - syscall_x86_64_alarm = 37, - syscall_x86_64_setitimer = 38, - syscall_x86_64_getpid = 39, - syscall_x86_64_sendfile = 40, - syscall_x86_64_socket = 41, - syscall_x86_64_connect = 42, - syscall_x86_64_accept = 43, - syscall_x86_64_sendto = 44, - syscall_x86_64_recvfrom = 45, - syscall_x86_64_sendmsg = 46, - syscall_x86_64_recvmsg = 47, - syscall_x86_64_shutdown = 48, - syscall_x86_64_bind = 49, - syscall_x86_64_listen = 50, - syscall_x86_64_getsockname = 51, - syscall_x86_64_getpeername = 52, - syscall_x86_64_socketpair = 53, - syscall_x86_64_setsockopt = 54, - syscall_x86_64_getsockopt = 55, - syscall_x86_64_clone = 56, - syscall_x86_64_fork = 57, - syscall_x86_64_vfork = 58, - syscall_x86_64_execve = 59, - syscall_x86_64_exit = 60, - syscall_x86_64_wait4 = 61, - syscall_x86_64_kill = 62, - syscall_x86_64_uname = 63, - syscall_x86_64_semget = 64, - syscall_x86_64_semop = 65, - syscall_x86_64_semctl = 66, - syscall_x86_64_shmdt = 67, - syscall_x86_64_msgget = 68, - syscall_x86_64_msgsnd = 69, - syscall_x86_64_msgrcv = 70, - syscall_x86_64_msgctl = 71, - syscall_x86_64_fcntl = 72, - syscall_x86_64_flock = 73, - syscall_x86_64_fsync = 74, - syscall_x86_64_fdatasync = 75, - syscall_x86_64_truncate = 76, - syscall_x86_64_ftruncate = 77, - syscall_x86_64_getdents = 78, - syscall_x86_64_getcwd = 79, - syscall_x86_64_chdir = 80, - syscall_x86_64_fchdir = 81, - syscall_x86_64_rename = 82, - syscall_x86_64_mkdir = 83, - syscall_x86_64_rmdir = 84, - syscall_x86_64_creat = 85, - syscall_x86_64_link = 86, - syscall_x86_64_unlink = 87, - syscall_x86_64_symlink = 88, - syscall_x86_64_readlink = 89, - syscall_x86_64_chmod = 90, - syscall_x86_64_fchmod = 91, - syscall_x86_64_chown = 92, - syscall_x86_64_fchown = 93, - syscall_x86_64_lchown = 94, - syscall_x86_64_umask = 95, - syscall_x86_64_gettimeofday = 96, - syscall_x86_64_getrlimit = 97, - syscall_x86_64_getrusage = 98, - syscall_x86_64_sysinfo = 99, - syscall_x86_64_times = 100, - syscall_x86_64_ptrace = 101, - syscall_x86_64_getuid = 102, - syscall_x86_64_syslog = 103, - syscall_x86_64_getgid = 104, - syscall_x86_64_setuid = 105, - syscall_x86_64_setgid = 106, - syscall_x86_64_geteuid = 107, - syscall_x86_64_getegid = 108, - syscall_x86_64_setpgid = 109, - syscall_x86_64_getppid = 110, - syscall_x86_64_getpgrp = 111, - syscall_x86_64_setsid = 112, - syscall_x86_64_setreuid = 113, - syscall_x86_64_setregid = 114, - syscall_x86_64_getgroups = 115, - syscall_x86_64_setgroups = 116, - syscall_x86_64_setresuid = 117, - syscall_x86_64_getresuid = 118, - syscall_x86_64_setresgid = 119, - syscall_x86_64_getresgid = 120, - syscall_x86_64_getpgid = 121, - syscall_x86_64_setfsuid = 122, - syscall_x86_64_setfsgid = 123, - syscall_x86_64_getsid = 124, - syscall_x86_64_capget = 125, - syscall_x86_64_capset = 126, - syscall_x86_64_rt_sigpending = 127, - syscall_x86_64_rt_sigtimedwait = 128, - syscall_x86_64_rt_sigqueueinfo = 129, - syscall_x86_64_rt_sigsuspend = 130, - syscall_x86_64_sigaltstack = 131, - syscall_x86_64_utime = 132, - syscall_x86_64_mknod = 133, - syscall_x86_64_uselib = 134, - syscall_x86_64_personality = 135, - syscall_x86_64_ustat = 136, - syscall_x86_64_statfs = 137, - syscall_x86_64_fstatfs = 138, - syscall_x86_64_sysfs = 139, - syscall_x86_64_getpriority = 140, - syscall_x86_64_setpriority = 141, - syscall_x86_64_sched_setparam = 142, - syscall_x86_64_sched_getparam = 143, - syscall_x86_64_sched_setscheduler = 144, - syscall_x86_64_sched_getscheduler = 145, - syscall_x86_64_sched_get_priority_max = 146, - syscall_x86_64_sched_get_priority_min = 147, - syscall_x86_64_sched_rr_get_interval = 148, - syscall_x86_64_mlock = 149, - syscall_x86_64_munlock = 150, - syscall_x86_64_mlockall = 151, - syscall_x86_64_munlockall = 152, - syscall_x86_64_vhangup = 153, - syscall_x86_64_modify_ldt = 154, - syscall_x86_64_pivot_root = 155, - syscall_x86_64__sysctl = 156, - syscall_x86_64_prctl = 157, - syscall_x86_64_arch_prctl = 158, - syscall_x86_64_adjtimex = 159, - syscall_x86_64_setrlimit = 160, - syscall_x86_64_chroot = 161, - syscall_x86_64_sync = 162, - syscall_x86_64_acct = 163, - syscall_x86_64_settimeofday = 164, - syscall_x86_64_mount = 165, - syscall_x86_64_umount2 = 166, - syscall_x86_64_swapon = 167, - syscall_x86_64_swapoff = 168, - syscall_x86_64_reboot = 169, - syscall_x86_64_sethostname = 170, - syscall_x86_64_setdomainname = 171, - syscall_x86_64_iopl = 172, - syscall_x86_64_ioperm = 173, - syscall_x86_64_create_module = 174, - syscall_x86_64_init_module = 175, - syscall_x86_64_delete_module = 176, - syscall_x86_64_get_kernel_syms = 177, - syscall_x86_64_query_module = 178, - syscall_x86_64_quotactl = 179, - syscall_x86_64_nfsservctl = 180, - syscall_x86_64_getpmsg = 181, - syscall_x86_64_putpmsg = 182, - syscall_x86_64_afs_syscall = 183, - syscall_x86_64_tuxcall = 184, - syscall_x86_64_security = 185, - syscall_x86_64_gettid = 186, - syscall_x86_64_readahead = 187, - syscall_x86_64_setxattr = 188, - syscall_x86_64_lsetxattr = 189, - syscall_x86_64_fsetxattr = 190, - syscall_x86_64_getxattr = 191, - syscall_x86_64_lgetxattr = 192, - syscall_x86_64_fgetxattr = 193, - syscall_x86_64_listxattr = 194, - syscall_x86_64_llistxattr = 195, - syscall_x86_64_flistxattr = 196, - syscall_x86_64_removexattr = 197, - syscall_x86_64_lremovexattr = 198, - syscall_x86_64_fremovexattr = 199, - syscall_x86_64_tkill = 200, - syscall_x86_64_time = 201, - syscall_x86_64_futex = 202, - syscall_x86_64_sched_setaffinity = 203, - syscall_x86_64_sched_getaffinity = 204, - syscall_x86_64_set_thread_area = 205, - syscall_x86_64_io_setup = 206, - syscall_x86_64_io_destroy = 207, - syscall_x86_64_io_getevents = 208, - syscall_x86_64_io_submit = 209, - syscall_x86_64_io_cancel = 210, - syscall_x86_64_get_thread_area = 211, - syscall_x86_64_lookup_dcookie = 212, - syscall_x86_64_epoll_create = 213, - syscall_x86_64_epoll_ctl_old = 214, - syscall_x86_64_epoll_wait_old = 215, - syscall_x86_64_remap_file_pages = 216, - syscall_x86_64_getdents64 = 217, - syscall_x86_64_set_tid_address = 218, - syscall_x86_64_restart_syscall = 219, - syscall_x86_64_semtimedop = 220, - syscall_x86_64_fadvise64 = 221, - syscall_x86_64_timer_create = 222, - syscall_x86_64_timer_settime = 223, - syscall_x86_64_timer_gettime = 224, - syscall_x86_64_timer_getoverrun = 225, - syscall_x86_64_timer_delete = 226, - syscall_x86_64_clock_settime = 227, - syscall_x86_64_clock_gettime = 228, - syscall_x86_64_clock_getres = 229, - syscall_x86_64_clock_nanosleep = 230, - syscall_x86_64_exit_group = 231, - syscall_x86_64_epoll_wait = 232, - syscall_x86_64_epoll_ctl = 233, - syscall_x86_64_tgkill = 234, - syscall_x86_64_utimes = 235, - syscall_x86_64_vserver = 236, - syscall_x86_64_mbind = 237, - syscall_x86_64_set_mempolicy = 238, - syscall_x86_64_get_mempolicy = 239, - syscall_x86_64_mq_open = 240, - syscall_x86_64_mq_unlink = 241, - syscall_x86_64_mq_timedsend = 242, - syscall_x86_64_mq_timedreceive = 243, - syscall_x86_64_mq_notify = 244, - syscall_x86_64_mq_getsetattr = 245, - syscall_x86_64_kexec_load = 246, - syscall_x86_64_waitid = 247, - syscall_x86_64_add_key = 248, - syscall_x86_64_request_key = 249, - syscall_x86_64_keyctl = 250, - syscall_x86_64_ioprio_set = 251, - syscall_x86_64_ioprio_get = 252, - syscall_x86_64_inotify_init = 253, - syscall_x86_64_inotify_add_watch = 254, - syscall_x86_64_inotify_rm_watch = 255, - syscall_x86_64_migrate_pages = 256, - syscall_x86_64_openat = 257, - syscall_x86_64_mkdirat = 258, - syscall_x86_64_mknodat = 259, - syscall_x86_64_fchownat = 260, - syscall_x86_64_futimesat = 261, - syscall_x86_64_fstatat64 = 262, - syscall_x86_64_unlinkat = 263, - syscall_x86_64_renameat = 264, - syscall_x86_64_linkat = 265, - syscall_x86_64_symlinkat = 266, - syscall_x86_64_readlinkat = 267, - syscall_x86_64_fchmodat = 268, - syscall_x86_64_faccessat = 269, - syscall_x86_64_pselect6 = 270, - syscall_x86_64_ppoll = 271, - syscall_x86_64_unshare = 272, - syscall_x86_64_set_robust_list = 273, - syscall_x86_64_get_robust_list = 274, - syscall_x86_64_splice = 275, - syscall_x86_64_tee = 276, - syscall_x86_64_sync_file_range = 277, - syscall_x86_64_vmsplice = 278, - syscall_x86_64_move_pages = 279, - syscall_x86_64_utimensat = 280, - syscall_x86_64_epoll_pwait = 281, - syscall_x86_64_signalfd = 282, - syscall_x86_64_timerfd_create = 283, - syscall_x86_64_eventfd = 284, - syscall_x86_64_fallocate = 285, - syscall_x86_64_timerfd_settime = 286, - syscall_x86_64_timerfd_gettime = 287, - syscall_x86_64_accept4 = 288, - syscall_x86_64_signalfd4 = 289, - syscall_x86_64_eventfd2 = 290, - syscall_x86_64_epoll_create1 = 291, - syscall_x86_64_dup3 = 292, - syscall_x86_64_pipe2 = 293, - syscall_x86_64_inotify_init1 = 294, - syscall_x86_64_preadv = 295, - syscall_x86_64_pwritev = 296, - syscall_x86_64_rt_tgsigqueueinfo = 297, - syscall_x86_64_perf_event_open = 298, - syscall_x86_64_recvmmsg = 299, - syscall_x86_64_fanotify_init = 300, - syscall_x86_64_fanotify_mark = 301, - syscall_x86_64_prlimit64 = 302, - syscall_x86_64_name_to_handle_at = 303, - syscall_x86_64_open_by_handle_at = 304, - syscall_x86_64_clock_adjtime = 305, - syscall_x86_64_syncfs = 306, - syscall_x86_64_sendmmsg = 307, - syscall_x86_64_setns = 308, - syscall_x86_64_getcpu = 309, - syscall_x86_64_process_vm_readv = 310, - syscall_x86_64_process_vm_writev = 311, - syscall_x86_64_kcmp = 312, - syscall_x86_64_finit_module = 313, - syscall_x86_64_sched_setattr = 314, - syscall_x86_64_sched_getattr = 315, - syscall_x86_64_renameat2 = 316, - syscall_x86_64_seccomp = 317, - syscall_x86_64_getrandom = 318, - syscall_x86_64_memfd_create = 319, - syscall_x86_64_kexec_file_load = 320, - syscall_x86_64_bpf = 321, - syscall_x86_64_execveat = 322, - syscall_x86_64_userfaultfd = 323, - syscall_x86_64_membarrier = 324, - syscall_x86_64_mlock2 = 325, - syscall_x86_64_copy_file_range = 326, - syscall_x86_64_preadv2 = 327, - syscall_x86_64_pwritev2 = 328, - syscall_x86_64_pkey_mprotect = 329, - syscall_x86_64_pkey_alloc = 330, - syscall_x86_64_pkey_free = 331, - syscall_x86_64_statx = 332, - syscall_x86_64_io_pgetevents = 333, - syscall_x86_64_rseq = 334, - syscall_x86_64_pidfd_send_signal = 424, - syscall_x86_64_io_uring_setup = 425, - syscall_x86_64_io_uring_enter = 426, - syscall_x86_64_io_uring_register = 427, - syscall_x86_64_open_tree = 428, - syscall_x86_64_move_mount = 429, - syscall_x86_64_fsopen = 430, - syscall_x86_64_fsconfig = 431, - syscall_x86_64_fsmount = 432, - syscall_x86_64_fspick = 433, - syscall_x86_64_pidfd_open = 434, - syscall_x86_64_clone3 = 435, - syscall_x86_64_close_range = 436, - syscall_x86_64_openat2 = 437, - syscall_x86_64_pidfd_getfd = 438, - syscall_x86_64_faccessat2 = 439, - syscall_x86_64_process_madvise = 440, - syscall_x86_64_epoll_pwait2 = 441, - syscall_x86_64_mount_setattr = 442, - syscall_x86_64_quotactl_fd = 443, - syscall_x86_64_landlock_create_ruleset = 444, - syscall_x86_64_landlock_add_rule = 445, - syscall_x86_64_landlock_restrict_self = 446, - syscall_x86_64_memfd_secret = 447, - syscall_x86_64_process_mrelease = 448, - syscall_x86_64_futex_waitv = 449, - syscall_x86_64_set_mempolicy_home_node = 450, - syscall_x86_64_cachestat = 451, - syscall_x86_64_fchmodat2 = 452, - syscall_x86_64_map_shadow_stack = 453, - syscall_x86_64_futex_wake = 454, - syscall_x86_64_futex_wait = 455, - syscall_x86_64_futex_requeue = 456, -}; -#endif -#endif - -#ifndef _WIN32 -fn void* posix_mmap(void* address, size_t length, int protection_flags, int map_flags, int fd, signed long offset) -{ -#if LINK_LIBC - return mmap(address, length, protection_flags, map_flags, fd, offset); -#else -#ifdef __linux__ - return (void*) syscall6(syscall_x86_64_mmap, (s64)address, cast_to(s64, length), protection_flags, map_flags, fd, offset); -#else -#error "Unsupported operating system for static linking" -#endif -#endif -} - -fn int syscall_mprotect(void *address, size_t length, int protection_flags) -{ -#if LINK_LIBC - return mprotect(address, length, protection_flags); -#else -#ifdef __linux__ - return cast_to(s32, syscall3(syscall_x86_64_mprotect, (s64)address, cast_to(s64, length), protection_flags)); -#else - return mprotect(address, length, protection_flags); -#endif -#endif -} - -fn int syscall_open(const char *file_path, int flags, int mode) -{ -#if LINK_LIBC - return open(file_path, flags, mode); -#else -#ifdef __linux__ - return cast_to(s32, syscall3(syscall_x86_64_open, (s64)file_path, flags, mode)); -#else - return open(file_path, flags, mode); -#endif -#endif -} - -fn int syscall_close(int fd) -{ -#if LINK_LIBC - return close(fd); -#else -#ifdef __linux__ - return cast_to(s32, syscall1(syscall_x86_64_close, fd)); -#else - return close(fd); -#endif -#endif -} - -fn int syscall_fstat(int fd, struct stat *buffer) -{ -#if LINK_LIBC - return fstat(fd, buffer); -#else -#ifdef __linux__ - return cast_to(s32, syscall2(syscall_x86_64_fstat, fd, (s64)buffer)); -#else - return fstat(fd, buffer); -#endif -#endif -} - -fn ssize_t syscall_read(int fd, void* buffer, size_t bytes) -{ -#if LINK_LIBC - return read(fd, buffer, bytes); -#else -#ifdef __linux__ - return syscall3(syscall_x86_64_read, fd, (s64)buffer, (s64)bytes); -#else - return read(fd, buffer, bytes); -#endif -#endif -} - -fn ssize_t syscall_write(int fd, const void *buffer, size_t bytes) -{ -#if LINK_LIBC - return write(fd, buffer, bytes); -#else -#ifdef __linux__ - return syscall3(syscall_x86_64_write, fd, (s64)buffer, (s64)bytes); -#else - return write(fd, buffer, bytes); -#endif -#endif -} - -fn int syscall_mkdir(String path, u32 mode) -{ - assert(path.pointer[path.length] == 0); -#if LINK_LIBC - return mkdir((char*)path.pointer, mode); -#else - return cast_to(s32, syscall2(syscall_x86_64_mkdir, (s64)path.pointer, (s64)mode)); -#endif -} - -fn int syscall_rmdir(String path) -{ - assert(path.pointer[path.length] == 0); -#if LINK_LIBC - return rmdir((char*)path.pointer); -#else - return cast_to(s32, syscall1(syscall_x86_64_rmdir, (s64)path.pointer)); -#endif -} - -fn int syscall_unlink(String path) -{ - assert(path.pointer[path.length] == 0); -#if LINK_LIBC - return unlink((char*)path.pointer); -#else - return cast_to(s32, syscall1(syscall_x86_64_unlink, (s64)path.pointer)); -#endif -} - -fn pid_t syscall_fork() -{ -#if LINK_LIBC - return fork(); -#else - return cast_to(s32, syscall0(syscall_x86_64_fork)); -#endif - -} - -fn signed long syscall_execve(const char* path, char *const argv[], char *const envp[]) -{ -#if LINK_LIBC - return execve(path, argv, envp); -#else - return syscall3(syscall_x86_64_execve, (s64)path, (s64)argv, (s64)envp); -#endif -} - -fn pid_t syscall_waitpid(pid_t pid, int* status, int options) -{ -#if LINK_LIBC - return waitpid(pid, status, options); -#else - return cast_to(s32, syscall4(syscall_x86_64_wait4, pid, (s64)status, options, 0)); -#endif -} - -fn int syscall_gettimeofday(struct timeval* tv, struct timezone* tz) -{ -#if LINK_LIBC - return gettimeofday(tv, tz); -#else - return cast_to(s32, syscall2(syscall_x86_64_gettimeofday, (s64)tv, (s64)tz)); -#endif -} - -BB_NORETURN BB_COLD fn void syscall_exit(int status) -{ -#if LINK_LIBC - _exit(status); -#else -#ifdef __linux__ - (void)syscall1(231, status); - trap(); -#else - _exit(status); -#endif -#endif -} -#endif - -fn u64 os_timer_freq() -{ - return 1000 * 1000; -} - -fn u64 os_timer_get() -{ -#if _WIN32 - LARGE_INTEGER large_integer; - QueryPerformanceCounter(&large_integer); - return (u64)large_integer.QuadPart; -#else - struct timeval tv; - syscall_gettimeofday(&tv, 0); - let(result, os_timer_freq() * cast_to(u64, tv.tv_sec) + cast_to(u64, tv.tv_usec)); - return result; -#endif -} - -FileDescriptor os_file_descriptor_invalid() -{ -#if _WIN32 - return INVALID_HANDLE_VALUE; -#else - return -1; -#endif -} - -fn u8 os_file_descriptor_is_valid(FileDescriptor fd) -{ -#if _WIN32 - return fd != INVALID_HANDLE_VALUE; -#else - return fd >= 0; -#endif -} - -fn FileDescriptor os_file_open(String path, OSFileOpenFlags flags, OSFilePermissions permissions) -{ - assert(path.pointer[path.length] == 0); -#if _WIN32 - unused(permissions); - - DWORD dwDesiredAccess = 0; - dwDesiredAccess |= flags.read * GENERIC_READ; - dwDesiredAccess |= flags.write * GENERIC_WRITE; - dwDesiredAccess |= flags.executable * GENERIC_EXECUTE; - DWORD dwShareMode = 0; - LPSECURITY_ATTRIBUTES lpSecurityAttributes = 0; - DWORD dwCreationDisposition = 0; - dwCreationDisposition |= (!flags.create) * OPEN_EXISTING; - dwCreationDisposition |= flags.create * CREATE_ALWAYS; - DWORD dwFlagsAndAttributes = 0; - dwFlagsAndAttributes |= FILE_ATTRIBUTE_NORMAL; - dwFlagsAndAttributes |= flags.directory * FILE_FLAG_BACKUP_SEMANTICS; - HANDLE hTemplateFile = 0; - - let(handle, CreateFileA(string_to_c(path), dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)); - return handle; -#else - int posix_flags = 0; - posix_flags |= O_WRONLY * (flags.write & !flags.read); - posix_flags |= O_RDONLY * ((!flags.write) & flags.read); - posix_flags |= O_RDWR * (flags.write & flags.read); - posix_flags |= O_CREAT * flags.create; - posix_flags |= O_TRUNC * flags.truncate; - - int posix_permissions; - // TODO: make permissions better - if (permissions.executable) - { - posix_permissions = 0755; - } - else - { - posix_permissions = 0644; - } - let(result, syscall_open((char*)path.pointer, posix_flags, posix_permissions)); - return result; -#endif -} - -fn u64 os_file_get_size(FileDescriptor fd) -{ -#if _WIN32 - LARGE_INTEGER file_size; - BOOL result = GetFileSizeEx(fd, &file_size); - assert(result != 0); - return (u64)file_size.QuadPart; -#else - struct stat stat_buffer; - int stat_result = syscall_fstat(fd, &stat_buffer); - assert(stat_result == 0); - let_cast(u64, size, stat_buffer.st_size); - return size; -#endif -} - -fn void os_file_write(FileDescriptor fd, String content) -{ -#if _WIN32 - DWORD bytes_written = 0; - BOOL result = WriteFile(fd, content.pointer, cast_to(u32, content.length), &bytes_written, 0); - assert(result != 0); -#else - let(result, syscall_write(fd, content.pointer, content.length)); - let(my_errno, strerror(errno)); - unused(my_errno); - assert(cast_to(u64, result) == content.length); -#endif -} - -fn u64 os_file_read(FileDescriptor fd, String buffer, u64 byte_count) -{ - assert(byte_count); - assert(byte_count <= buffer.length); - u64 bytes_read = 0; - if (byte_count <= buffer.length) - { -#if _WIN32 - DWORD read = 0; - BOOL result = ReadFile(fd, buffer.pointer, cast_to(u32, byte_count), &read, 0); - assert(result != 0); - bytes_read = read; -#else - let(result, syscall_read(fd, buffer.pointer, byte_count)); - assert(result > 0); - if (result > 0) - { - assign_cast(bytes_read, result); - } -#endif - } - assert(bytes_read == byte_count); - return bytes_read; -} - -fn void os_file_close(FileDescriptor fd) -{ -#if _WIN32 - BOOL result = CloseHandle(fd); - assert(result != 0); -#else - let(result, syscall_close(fd)); - assert(result == 0); -#endif -} - -fn void calibrate_cpu_timer() -{ -#ifndef SILENT -#if _WIN32 - LARGE_INTEGER li; - QueryPerformanceFrequency(&li); - cpu_frequency = (u64)li.QuadPart; -#else -#if LINK_LIBC - clock_getres(CLOCK_MONOTONIC, &cpu_resolution); -#else - u64 miliseconds_to_wait = 100; - u64 cpu_start = os_timestamp(); - u64 os_frequency = os_timer_freq(); - u64 os_elapsed = 0; - u64 os_start = os_timer_get(); - u64 os_wait_time = os_frequency * miliseconds_to_wait / 1000; - - while (os_elapsed < os_wait_time) - { - let(os_end, os_timer_get()); - os_elapsed = os_end - os_start; - } - - u64 cpu_end = os_timestamp(); - u64 cpu_elapsed = cpu_end - cpu_start; - cpu_frequency = os_frequency * cpu_elapsed / os_elapsed; -#endif -#endif -#endif -} - -fn u8* os_reserve(u64 base, u64 size, OSReserveProtectionFlags protection, OSReserveMapFlags map) -{ -#if _WIN32 - DWORD map_flags = 0; - map_flags |= (MEM_RESERVE * map.noreserve); - DWORD protection_flags = 0; - protection_flags |= PAGE_READWRITE * (!protection.write && !protection.read); - protection_flags |= PAGE_READWRITE * (protection.write && protection.read); - protection_flags |= PAGE_READONLY * (protection.write && !protection.read); - return (u8*)VirtualAlloc((void*)base, size, map_flags, protection_flags); -#else - int protection_flags = (protection.read * PROT_READ) | (protection.write * PROT_WRITE) | (protection.execute * PROT_EXEC); - int map_flags = (map.anon * MAP_ANONYMOUS) | (map.priv * MAP_PRIVATE) | (map.noreserve * MAP_NORESERVE); -#ifdef __linux__ - map_flags |= (map.populate * MAP_POPULATE); -#endif - u8* result = (u8*)posix_mmap((void*)base, size, protection_flags, map_flags, -1, 0); - assert(result != MAP_FAILED); - return result; -#endif -} - -fn void os_commit(void* address, u64 size) -{ -#if _WIN32 - VirtualAlloc(address, size, MEM_COMMIT, PAGE_READWRITE); -#else - int result = syscall_mprotect(address, size, PROT_READ | PROT_WRITE); - assert(result == 0); -#endif -} - -fn void os_directory_make(String path) -{ - assert(path.pointer[path.length] == 0); -#if _WIN32 - CreateDirectoryA((char*)path.pointer, 0); -#else - syscall_mkdir(path, 0755); -#endif -} - -fn u8 os_is_being_debugged() -{ - u8 result = 0; -#if _WIN32 - result = IsDebuggerPresent() != 0; -#else -#ifdef __APPLE__ - let(request, PT_TRACE_ME); -#else - let(request, PTRACE_TRACEME); -#endif - if (ptrace(request, 0, 0, 0) == -1) - { - let(error, errno); - if (error == EPERM) - { - result = 1; - } - } -#endif - - return result; -} - -BB_NORETURN BB_COLD fn void os_exit(u32 exit_code) -{ - if (exit_code != 0 && os_is_being_debugged()) - { - trap(); - } - exit(exit_code); -} - -fn void vprint(const char* format, va_list args) -{ - u8 stack_buffer[16*1024]; - String buffer = { .pointer = stack_buffer, .length = array_length(stack_buffer) }; - String final_string = format_string_va(buffer, format, args); - os_file_write(os_stdout_get(), final_string); -} - -fn void print(const char* format, ...) -{ - va_list args; - va_start(args, format); - vprint(format, args); - va_end(args); -} - -static_assert(sizeof(Arena) == 64); -global_variable const u64 minimum_position = sizeof(Arena); - -fn Arena* arena_initialize(u64 reserved_size, u64 granularity, u64 initial_size) -{ - OSReserveProtectionFlags protection_flags = { - .read = 1, - .write = 1, - }; - OSReserveMapFlags map_flags = { - .priv = 1, - .anon = 1, - .noreserve = 1, - }; - Arena* arena = (Arena*)os_reserve(0, reserved_size, protection_flags, map_flags); - os_commit(arena, initial_size); - *arena = (Arena) { - .reserved_size = reserved_size, - .os_position = initial_size, - .position = minimum_position, - .granularity = granularity, - }; - return arena; -} - -fn Arena* arena_initialize_default(u64 initial_size) -{ - return arena_initialize(default_size, minimum_granularity, initial_size); -} - -fn u8* arena_allocate_bytes(Arena* arena, u64 size, u64 alignment) -{ - u64 aligned_offset = align_forward_u64(arena->position, alignment); - u64 aligned_size_after = aligned_offset + size; - - if (aligned_size_after > arena->os_position) - { - u64 committed_size = align_forward_u64(aligned_size_after, arena->granularity); - u64 size_to_commit = committed_size - arena->os_position; - void* commit_pointer = (u8*)arena + arena->os_position; - os_commit(commit_pointer, size_to_commit); - arena->os_position = committed_size; - } - - let(result, (u8*)arena + aligned_offset); - arena->position = aligned_size_after; - assert(arena->position <= arena->os_position); - return result; -} - -fn String arena_join_string(Arena* arena, Slice(String) pieces) -{ - u64 size = 0; - for (u64 i = 0; i < pieces.length; i += 1) - { - String piece = pieces.pointer[i]; - size += piece.length; - } - - u8* pointer = arena_allocate_bytes(arena, size + 1, 1); - let(it, pointer); - for (u64 i = 0; i < pieces.length; i += 1) - { - String piece = pieces.pointer[i]; - memcpy(it, piece.pointer, piece.length); - it += piece.length; - } - assert((u64)(it - pointer) == size); - *it = 0; - - return (String) { .pointer = pointer, .length = size }; -} - -fn String arena_duplicate_string(Arena* arena, String string) -{ - u8* result = arena_allocate(arena, u8, string.length + 1); - memcpy(result, string.pointer, string.length); - result[string.length] = 0; - - return (String) { - .pointer = result, - .length = string.length, - }; -} - -fn void arena_reset(Arena* arena) -{ - arena->position = minimum_position; - memset(arena + 1, 0, arena->position - minimum_position); -} - -fn String file_read(Arena* arena, String path) -{ - String result = {}; - let(file_descriptor, os_file_open(path, (OSFileOpenFlags) { - .truncate = 0, - .executable = 0, - .write = 0, - .read = 1, - .create = 0, - }, (OSFilePermissions) { - .readable = 1, - })); - - if (os_file_descriptor_is_valid(file_descriptor)) - { - let(file_size, os_file_get_size(file_descriptor)); - if (file_size > 0) - { - result = (String){ - .pointer = arena_allocate_bytes(arena, file_size, 64), - .length = file_size, - }; - - // TODO: big files - // TODO: result codes - os_file_read(file_descriptor, result, file_size); - } - else - { - result.pointer = (u8*)&result; - } - - // TODO: check result - os_file_close(file_descriptor); - } - - - return result; -} - -fn void file_write(FileWriteOptions options) -{ - let(fd, os_file_open(options.path, (OSFileOpenFlags) { - .write = 1, - .truncate = 1, - .create = 1, - .executable = options.executable, - }, (OSFilePermissions) { - .readable = 1, - .writable = 1, - .executable = options.executable, - })); - assert(os_file_descriptor_is_valid(fd)); - - os_file_write(fd, options.content); - os_file_close(fd); -} - -fn RunCommandResult run_command(Arena* arena, CStringSlice arguments, char* envp[], RunCommandOptions run_options) -{ - unused(arena); - assert(arguments.length > 0); - assert(arguments.pointer[arguments.length - 1] == 0); - - RunCommandResult result = {}; - Timestamp start_timestamp = {}; - Timestamp end_timestamp = {}; - f64 ms = 0.0; - u64 measure_time = run_options.debug; - - if (run_options.debug) - { - print("Running command:\n"); - for (u32 i = 0; i < arguments.length - 1; i += 1) - { - char* argument = arguments.pointer[i]; - print("{cstr} ", argument); - } - print("\n"); - } - -#if _WIN32 - u32 length = 0; - for (u32 i = 0; i < arguments.length; i += 1) - { - let(argument, arguments.pointer[i]); - if (argument) - { - let(string_len, strlen(argument)); - length += cast_to(u32, string_len + 1); - } - } - - char* bytes = (char*)arena_allocate_bytes(arena, length, 1); - u32 byte_i = 0; - for (u32 i = 0; i < arguments.length; i += 1) - { - let(argument, arguments.pointer[i]); - if (argument) - { - let(len, strlen(argument)); - memcpy(&bytes[byte_i], argument, len); - byte_i += cast_to(u32, len); - bytes[byte_i] = ' '; - byte_i += 1; - } - } - bytes[byte_i - 1] = 0; - - PROCESS_INFORMATION process_information = {}; - STARTUPINFOA startup_info = {}; - startup_info.cb = sizeof(startup_info); - startup_info.dwFlags |= STARTF_USESTDHANDLES; - startup_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); - startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); - let(handle_inheritance, 1); - - if (measure_time) - { - start_timestamp = os_timestamp(); - } - - if (CreateProcessA(0, bytes, 0, 0, handle_inheritance, 0, 0, 0, &startup_info, &process_information)) - { - WaitForSingleObject(process_information.hProcess, INFINITE); - if (measure_time) - { - end_timestamp = os_timestamp(); - ms = os_resolve_timestamps(start_timestamp, end_timestamp, TIME_UNIT_MILLISECONDS); - } - - - if (run_options.debug) - { - print("Process ran in {f64} ms\n", ms); - } - - DWORD exit_code; - if (GetExitCodeProcess(process_information.hProcess, &exit_code)) - { - if (run_options.debug) - { - print("Process ran with exit code: 0x{u32:x}\n", exit_code); - } - - if (exit_code != 0) - { - failed_execution(); - } - } - else - { - failed_execution(); - } - - CloseHandle(process_information.hProcess); - CloseHandle(process_information.hThread); - } - else - { - let(err, GetLastError()); - LPSTR lpMsgBuf; - DWORD bufSize = FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - err, - LANG_NEUTRAL, // Use default language - (LPSTR)&lpMsgBuf, - 0, - NULL - ); - unused(bufSize); - print("CreateProcessA call failed: {cstr}\n", lpMsgBuf); - todo(); - } -#else - int null_fd; - - if (run_options.use_null_file_descriptor) - { - null_fd = run_options.null_file_descriptor; - assert(os_file_descriptor_is_valid(null_fd)); - } - else if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_IGNORE || run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_IGNORE) - { - null_fd = open("/dev/null", O_WRONLY); - assert(os_file_descriptor_is_valid(null_fd)); - } - - int stdout_pipe[2]; - int stderr_pipe[2]; - - if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_PIPE && pipe(stdout_pipe) == -1) - { - todo(); - } - - if (run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_PIPE && pipe(stderr_pipe) == -1) - { - todo(); - } - - pid_t pid = syscall_fork(); - if (pid == -1) - { - todo(); - } - - if (measure_time) - { - start_timestamp = os_timestamp(); - } - - if (pid == 0) - { - switch (run_options.stdout_stream.policy) - { - case CHILD_PROCESS_STREAM_PIPE: - { - close(stdout_pipe[0]); - dup2(stdout_pipe[1], STDOUT_FILENO); - close(stdout_pipe[1]); - } break; - case CHILD_PROCESS_STREAM_IGNORE: - { - dup2(null_fd, STDOUT_FILENO); - close(null_fd); - } break; - case CHILD_PROCESS_STREAM_INHERIT: - { - } break; - } - - switch (run_options.stderr_stream.policy) - { - case CHILD_PROCESS_STREAM_PIPE: - { - close(stderr_pipe[0]); - dup2(stderr_pipe[1], STDERR_FILENO); - close(stderr_pipe[1]); - } break; - case CHILD_PROCESS_STREAM_IGNORE: - { - dup2(null_fd, STDERR_FILENO); - close(null_fd); - } break; - case CHILD_PROCESS_STREAM_INHERIT: - { - } break; - } - - // fcntl(pipes[1], F_SETFD, FD_CLOEXEC); - let(result, syscall_execve(arguments.pointer[0], arguments.pointer, envp)); - unused(result); - panic("Execve failed! Error: {cstr}\n", strerror(errno)); - } - else - { - if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - close(stdout_pipe[1]); - } - - if (run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - close(stderr_pipe[1]); - } - - if (run_options.stdout_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - assert(run_options.stdout_stream.capacity); - ssize_t byte_count = read(stdout_pipe[0], run_options.stdout_stream.buffer, run_options.stdout_stream.capacity); - assert(byte_count >= 0); - *run_options.stdout_stream.length = byte_count; - - close(stdout_pipe[0]); - } - - if (run_options.stderr_stream.policy == CHILD_PROCESS_STREAM_PIPE) - { - assert(run_options.stderr_stream.capacity); - ssize_t byte_count = read(stderr_pipe[0], run_options.stderr_stream.buffer, run_options.stderr_stream.capacity); - assert(byte_count >= 0); - *run_options.stderr_stream.length = byte_count; - - close(stderr_pipe[0]); - } - - int status = 0; - int options = 0; - pid_t waitpid_result = syscall_waitpid(pid, &status, options); - - if (measure_time) - { - end_timestamp = os_timestamp(); - } - - if (waitpid_result == pid) - { - if (run_options.debug) - { - print("{cstr} ", arguments.pointer[0]); - } - - if (WIFEXITED(status)) - { - let(exit_code, WEXITSTATUS(status)); - result.termination_code = exit_code; - result.termination_kind = PROCESS_TERMINATION_EXIT; - - if (run_options.debug) - { - print("exited with code {u32}\n", exit_code); - } - } - else if (WIFSIGNALED(status)) - { - let(signal_code, WTERMSIG(status)); - result.termination_code = signal_code; - result.termination_kind = PROCESS_TERMINATION_SIGNAL; - - if (run_options.debug) - { - print("was signaled: {u32}\n", signal_code); - } - } - else if (WIFSTOPPED(status)) - { - let(stop_code, WSTOPSIG(status)); - result.termination_code = stop_code; - result.termination_kind = PROCESS_TERMINATION_STOP; - - if (run_options.debug) - { - print("was stopped: {u32}\n", stop_code); - } - } - else - { - result.termination_kind = PROCESS_TERMINATION_UNKNOWN; - - if (run_options.debug) - { - print("terminated unexpectedly with status {u32}\n", status); - } - } - } - else if (waitpid_result == -1) - { - let(waitpid_error, errno); - print("Error waiting for process termination: {u32}\n", waitpid_error); - trap(); - } - else - { - todo(); - } - - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (run_options.debug && !success) - { - print("{cstr} failed to run successfully!\n", arguments.pointer[0]); - } - - if (run_options.debug) - { - ms = os_resolve_timestamps(start_timestamp, end_timestamp, TIME_UNIT_MILLISECONDS); - u32 ticks = 0; -#if LINK_LIBC == 0 - ticks = cpu_frequency != 0; -#endif - print("Command run {cstr} in {f64} {cstr}\n", success ? "successfully" : "with errors", ms, ticks ? "ticks" : "ms"); - } - - if (!run_options.use_null_file_descriptor && os_file_descriptor_is_valid(null_fd)) - { - close(null_fd); - } - } -#endif - - return result; -} - -fn void print_string(String message) -{ -#ifndef SILENT - // TODO: check writes - os_file_write(os_stdout_get(), message); - // assert(result >= 0); - // assert((u64)result == message.length); -#else - unused(message); -#endif -} - -fn String os_get_environment_variable(const char* name) -{ - String result = {}; - char* env = getenv(name); - if (env) - { - result = cstr(env); - } - - return result; -} - -#ifndef _WIN32 -fn u64 os_readlink(String path, String buffer) -{ - u64 result = 0; - assert(path.pointer[path.length] == 0); - let(sys_result, readlink(string_to_c(path), string_to_c(buffer), buffer.length)); - if (sys_result > 0) - { - assign_cast(result, sys_result); - } - - return result; -} - -fn String os_readlink_allocate(Arena* arena, String path) -{ - String result = {}; - u8 buffer[4096]; - let(bytes, os_readlink(path, (String)array_to_slice(buffer))); - - if (bytes > 0) - { - result.pointer = arena_allocate(arena, u8, bytes + 1); - result.length = bytes; - memcpy(result.pointer, buffer, bytes); - result.pointer[bytes] = 0; - } - - return result; -} - -fn String os_realpath(String path, String buffer) -{ - String result = {}; - assert(path.pointer[path.length] == 0); - char* system_result = realpath(string_to_c(path), string_to_c(buffer)); - if (system_result) - { - result = cstr(system_result); - } - - return result; -} -#endif - -fn void os_free(void* pointer) -{ - free(pointer); -} - -#if _WIN32 -fn HANDLE os_windows_get_module_handle() -{ - return GetModuleHandleW(0); -} -#endif - -// TODO: structure this better -#if _WIN32 -fn OSLibrary os_library_load(const char* library_name) -{ - OSLibrary library = {}; - library.handle = LoadLibraryA(library_name); - return library; -} - -fn OSSymbol os_symbol_load(OSLibrary library, const char* symbol_name) -{ - OSSymbol symbol = (OSSymbol)GetProcAddress(library.handle, symbol_name); - return symbol; -} -#else -fn OSLibrary os_library_load(const char* library_name) -{ - OSLibrary library = {}; - library.handle = dlopen(library_name, RTLD_NOW | RTLD_LOCAL); - return library; -} - -fn OSSymbol os_symbol_load(OSLibrary library, const char* symbol_name) -{ - OSSymbol symbol = dlsym(library.handle, symbol_name); - return symbol; -} -#endif - -fn u8 os_library_is_valid(OSLibrary library) -{ - return library.handle != 0; -} - -fn String file_find_in_path(Arena* arena, String file, String path_env, String extension) -{ - String result = {}; - assert(path_env.pointer); - - String path_it = path_env; - u8 buffer[4096]; - -#if _WIN32 - u8 env_path_separator = ';'; - u8 path_separator = '\\'; -#else - u8 env_path_separator = ':'; - u8 path_separator = '/'; -#endif - - while (path_it.length) - { - let(index, string_first_ch(path_it, env_path_separator)); - index = unlikely(index == STRING_NO_MATCH) ? path_it.length : index; - let(path_chunk, s_get_slice(u8, path_it, 0, index)); - - u64 i = 0; - - memcpy(&buffer[i], path_chunk.pointer, path_chunk.length); - i += path_chunk.length; - - buffer[i] = path_separator; - i += 1; - - memcpy(&buffer[i], file.pointer, file.length); - i += file.length; - - if (extension.length) - { - memcpy(&buffer[i], extension.pointer, extension.length); - i += extension.length; - } - - buffer[i] = 0; - i += 1; - - let(total_length, i - 1); - OSFileOpenFlags flags = { - .read = 1, - }; - OSFilePermissions permissions = { - .readable = 1, - .writable = 1, - }; - - String path = { .pointer = buffer, .length = total_length }; - - FileDescriptor fd = os_file_open(path, flags, permissions); - - if (os_file_descriptor_is_valid(fd)) - { - os_file_close(fd); - result.pointer = arena_allocate(arena, u8, total_length + 1); - memcpy(result.pointer, buffer, total_length + 1); - result.length = total_length; - break; - } - - String new_path = s_get_slice(u8, path_it, index + (index != path_it.length), path_it.length); - assert(new_path.length < path_env.length); - path_it = new_path; - } - - return result; -} - -fn String executable_find_in_path(Arena* arena, String executable, String path_env) -{ - String extension = {}; -#if _WIN32 - extension = strlit(".exe"); -#endif - return file_find_in_path(arena, executable, path_env, extension); -} - diff --git a/bootstrap/std/os.h b/bootstrap/std/os.h deleted file mode 100644 index fb4879f..0000000 --- a/bootstrap/std/os.h +++ /dev/null @@ -1,195 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN 1 -#include -#else -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -typedef enum TimeUnit -{ - TIME_UNIT_NANOSECONDS, - TIME_UNIT_MICROSECONDS, - TIME_UNIT_MILLISECONDS, - TIME_UNIT_SECONDS, -} TimeUnit; - -ENUM(ProcessTerminationKind, u8, - PROCESS_TERMINATION_UNKNOWN, - PROCESS_TERMINATION_EXIT, - PROCESS_TERMINATION_SIGNAL, - PROCESS_TERMINATION_STOP, -); - -STRUCT(RunCommandResult) -{ - u32 termination_code; - ProcessTerminationKind termination_kind; - u8 reserved[3]; -}; - -typedef enum ChildProcessStreamPolicy -{ - CHILD_PROCESS_STREAM_INHERIT, - CHILD_PROCESS_STREAM_PIPE, - CHILD_PROCESS_STREAM_IGNORE, -} ChildProcessStreamPolicy; - -STRUCT(ChildProcessStream) -{ - u8* buffer; - u32* length; - u32 capacity; - ChildProcessStreamPolicy policy; -}; - -STRUCT(RunCommandOptions) -{ - ChildProcessStream stdout_stream; - ChildProcessStream stderr_stream; - FileDescriptor null_file_descriptor; - u64 use_null_file_descriptor:1; - u64 debug:1; - u64 reserved:62; -}; - -STRUCT(Timestamp) -{ - u128 value; -}; - -STRUCT(OSFileOpenFlags) -{ - u32 truncate:1; - u32 executable:1; - u32 write:1; - u32 read:1; - u32 create:1; - u32 directory:1; -}; - -STRUCT(OSFilePermissions) -{ - u8 readable:1; - u8 writable:1; - u8 executable:1; -}; - -STRUCT(OSReserveProtectionFlags) -{ - u32 read:1; - u32 write:1; - u32 execute:1; - u32 reserved:29; -}; - -STRUCT(OSReserveMapFlags) -{ - u32 priv:1; - u32 anon:1; - u32 populate:1; - u32 noreserve:1; - u32 reserved:29; -}; - -STRUCT(Arena) -{ - u64 reserved_size; - u64 position; - u64 os_position; - u64 granularity; - u8 reserved[4 * 8]; -}; - -STRUCT(FileWriteOptions) -{ - String path; - String content; - u64 executable:1; -}; - -#ifndef __APPLE__ -#define MY_PAGE_SIZE KB(4) -#else -#define MY_PAGE_SIZE KB(16) -#endif -global_variable const u64 page_size = MY_PAGE_SIZE; - -global_variable u64 minimum_granularity = MY_PAGE_SIZE; -// global_variable u64 middle_granularity = MB(2); -global_variable u64 default_size = GB(4); - -fn void vprint(const char* format, va_list args); -fn void print(const char* format, ...); -fn RunCommandResult run_command(Arena* arena, CStringSlice arguments, char* envp[], RunCommandOptions options); -fn String file_read(Arena* arena, String path); -fn void file_write(FileWriteOptions options); - -fn String path_dir(String string); -fn String path_base(String string); -fn String path_no_extension(String string); - - -fn Arena* arena_initialize(u64 reserved_size, u64 granularity, u64 initial_size); -fn Arena* arena_initialize_default(u64 initial_size); -fn void arena_clear(Arena* arena); -fn String arena_join_string(Arena* arena, Slice(String) pieces); -fn u8* arena_allocate_bytes(Arena* arena, u64 size, u64 alignment); -fn void arena_reset(Arena* arena); - -#define arena_allocate(arena, T, count) (T*)(arena_allocate_bytes(arena, sizeof(T) * count, alignof(T))) -#define arena_allocate_slice(arena, T, count) (Slice(T)){ .pointer = arena_allocate(arena, T, count), .length = count } - -fn u8* os_reserve(u64 base, u64 size, OSReserveProtectionFlags protection, OSReserveMapFlags map); -fn void os_commit(void* address, u64 size); - -fn u8 os_file_descriptor_is_valid(FileDescriptor fd); -fn FileDescriptor os_file_open(String path, OSFileOpenFlags flags, OSFilePermissions permissions); -fn void os_file_close(FileDescriptor fd); -fn u64 os_file_get_size(FileDescriptor fd); -fn void os_file_write(FileDescriptor fd, String content); -fn FileDescriptor os_stdout_get(); -fn void os_directory_make(String path); -BB_NORETURN BB_COLD fn void os_exit(u32 exit_code); - -fn void calibrate_cpu_timer(); - -fn void print_string(String string); - -fn Timestamp os_timestamp(); -fn f64 os_resolve_timestamps(Timestamp start, Timestamp end, TimeUnit time_unit); -fn u8 os_is_being_debugged(); - -#if _WIN32 -typedef void* HANDLE; -fn HANDLE os_windows_get_module_handle(); -#endif - -#if _WIN32 -#define EXECUTABLE_EXTENSION ".exe" -#else -#define EXECUTABLE_EXTENSION "" -#endif - -STRUCT(OSLibrary) -{ - void* handle; -}; - -typedef void* OSSymbol; - -fn OSLibrary os_library_load(const char* library_name); -fn OSSymbol os_symbol_load(OSLibrary library, const char* symbol_name); diff --git a/bootstrap/std/project.h b/bootstrap/std/project.h deleted file mode 100644 index 1bea07d..0000000 --- a/bootstrap/std/project.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#ifndef BUILD_DIR -#define BUILD_DIR "cache" -#endif - -typedef enum RenderingBackend -{ - RENDERING_BACKEND_NONE, - RENDERING_BACKEND_METAL, - RENDERING_BACKEND_VULKAN, - RENDERING_BACKEND_DIRECTX12, - RENDERING_BACKEND_COUNT, -} RenderingBackend; - -typedef enum WindowingBackend -{ - WINDOWING_BACKEND_NONE, - WINDOWING_BACKEND_WIN32, - WINDOWING_BACKEND_X11, - WINDOWING_BACKEND_WAYLAND, - WINDOWING_BACKEND_COCOA, - WINDOWING_BACKEND_COUNT, -} WindowingBackend; - -fn u8 rendering_backend_is_valid(RenderingBackend rendering_backend) -{ - u8 valid = rendering_backend != RENDERING_BACKEND_COUNT; - - if (valid && rendering_backend != RENDERING_BACKEND_NONE) - { -#ifdef __linux__ - valid = rendering_backend == RENDERING_BACKEND_VULKAN; -#elif defined(__APPLE__) - valid = rendering_backend == RENDERING_BACKEND_METAL || rendering_backend == RENDERING_BACKEND_VULKAN; -#elif _WIN32 - valid = rendering_backend == RENDERING_BACKEND_DIRECTX12 || rendering_backend == RENDERING_BACKEND_VULKAN; -#endif - } - - return valid; -} - -fn u8 windowing_backend_is_valid(WindowingBackend windowing_backend) -{ - u8 valid = windowing_backend != WINDOWING_BACKEND_COUNT; - - if (valid && windowing_backend != WINDOWING_BACKEND_NONE) - { -#ifdef __linux__ - valid = windowing_backend == WINDOWING_BACKEND_WAYLAND || windowing_backend == WINDOWING_BACKEND_X11; -#elif _WIN32 - valid = windowing_backend == WINDOWING_BACKEND_WIN32; -#elif __APPLE__ - valid = windowing_backend == WINDOWING_BACKEND_COCOA; -#endif - } - - return valid; -} diff --git a/bootstrap/std/rendering.c b/bootstrap/std/rendering.c deleted file mode 100644 index 5cb4248..0000000 --- a/bootstrap/std/rendering.c +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include - -#if BB_RENDERING_BACKEND_VULKAN -#include -#endif - -#if BB_RENDERING_BACKEND_METAL -#include -#endif - -#if BB_RENDERING_BACKEND_DIRECTX12 -#include -#endif diff --git a/bootstrap/std/rendering.h b/bootstrap/std/rendering.h deleted file mode 100644 index 2e0713e..0000000 --- a/bootstrap/std/rendering.h +++ /dev/null @@ -1,334 +0,0 @@ -#pragma once - -#if BB_RENDERING_BACKEND_VULKAN -#include -#endif - -#if BB_RENDERING_BACKEND_METAL -#include -#endif - -#if BB_RENDERING_BACKEND_DIRECTX12 -#include -#endif - -#ifdef __clang__ -#define BB_HAS_NATIVE_FLOAT2 1 -#define BB_HAS_NATIVE_FLOAT3 1 -#define BB_HAS_NATIVE_FLOAT4 1 -#define BB_HAS_NATIVE_UINT2 1 -#define BB_HAS_NATIVE_UINT3 1 -#define BB_HAS_NATIVE_UINT4 1 -#else -#define BB_HAS_NATIVE_FLOAT2 0 -#define BB_HAS_NATIVE_FLOAT3 0 -#define BB_HAS_NATIVE_FLOAT4 0 -#define BB_HAS_NATIVE_UINT2 0 -#define BB_HAS_NATIVE_UINT3 0 -#define BB_HAS_NATIVE_UINT4 0 -#endif - -#if BB_HAS_NATIVE_FLOAT2 -declare_vector_type(float, 2, float2); -#else -UNION(float2) -{ - struct - { - float x, y; - }; - float v[2]; -}; -#endif - -#if BB_HAS_NATIVE_FLOAT3 -declare_vector_type(float, 3, float3); -#else -UNION(float3) -{ - struct - { - float x, y, z; - }; - float v[3]; -}; -#endif - -#if BB_HAS_NATIVE_FLOAT4 -declare_vector_type(float, 4, float4); -#else -UNION(float4) -{ - struct - { - float x, y, z, w; - }; - float v[4]; -}; -#endif - -#if BB_HAS_NATIVE_UINT2 -declare_vector_type(uint, 2, uint2); -#else -UNION(uint2) -{ - struct - { - uint x, y; - }; - uint v[2]; -}; -#endif - -#if BB_HAS_NATIVE_UINT3 -declare_vector_type(uint, 3, uint3); -#else -UNION(uint3) -{ - struct - { - uint x, y, z; - }; - uint v[3]; -}; -#endif - -#if BB_HAS_NATIVE_UINT4 -declare_vector_type(uint, 4, uint4); -#else -UNION(uint4) -{ - struct - { - uint x, y, z, w; - }; - uint v[4]; -}; -#endif - -typedef float2 vec2; -typedef float3 vec3; -typedef float4 vec4; - -#if BB_HAS_NATIVE_FLOAT2 -#define VEC2(_x, y) ((vec2){_x, _y}) -#else -#define VEC2(_x, _y) ((vec2){ .x = _x, .y = _y}) -#endif - -#if BB_HAS_NATIVE_FLOAT3 -#define VEC3(_x, _y, _z) ((vec3){_x, _y, _z}) -#else -#define VEC3(_x, _y, _z) ((vec3){ .x = _x, .y = _y, .z = _z}) -#endif - -#if BB_HAS_NATIVE_FLOAT4 -#define VEC4(_x, _y, _z, _w) ((vec4){_x, _y, _z, _w}) -#else -#define VEC4(_x, _y, _z, _w) ((vec4){ .x = _x, .y = _y, .z = _z, .w = _w}) -#endif - -fn float2 float2_add(float2 a, float2 b) -{ -#if BB_HAS_NATIVE_FLOAT2 - return a + b; -#else - float2 result; - result.x = a.x + b.x; - result.y = a.y + b.y; - return result; -#endif -} - -fn float2 float2_sub(float2 a, float2 b) -{ -#if BB_HAS_NATIVE_FLOAT2 - return a - b; -#else - float2 result; - result.x = a.x - b.x; - result.y = a.y - b.y; - return result; -#endif -} - -UNION(F32Interval2) -{ - struct - { - vec2 min; - vec2 max; - }; - struct - { - float2 p0; - float2 p1; - }; - struct - { - f32 x0; - f32 y0; - f32 x1; - f32 y1; - }; - float2 v[2]; -}; -static_assert(sizeof(F32Interval2) == 4 * sizeof(f32)); - -typedef struct Renderer Renderer; -typedef struct RenderWindow RenderWindow; -typedef struct Pipeline Pipeline; - -STRUCT(RectDraw) -{ - F32Interval2 vertex; - F32Interval2 texture; - vec4 colors[4]; - u32 texture_index; -}; - -#include "../std/shaders/rect.inc" -typedef struct RectVertex RectVertex; -decl_vb(RectVertex); - -typedef enum BBPipeline -{ - BB_PIPELINE_RECT, - BB_PIPELINE_COUNT, -} BBPipeline; - -typedef enum RenderFontType -{ - RENDER_FONT_TYPE_MONOSPACE, - RENDER_FONT_TYPE_PROPORTIONAL, - RENDER_FONT_TYPE_COUNT, -} RenderFontType; - -typedef enum RectTextureSlot -{ - RECT_TEXTURE_SLOT_WHITE, - RECT_TEXTURE_SLOT_MONOSPACE_FONT, - RECT_TEXTURE_SLOT_PROPORTIONAL_FONT, - RECT_TEXTURE_SLOT_COUNT -} RectTextureSlot; - -typedef enum TextureFormat -{ - TEXTURE_FORMAT_R8_UNORM, - TEXTURE_FORMAT_R8G8B8A8_SRGB, -} TextureFormat; - -STRUCT(TextureMemory) -{ - void* pointer; - u32 width; - u32 height; - u32 depth; - TextureFormat format; -}; - -ENUM(ShaderStage, u8, - SHADER_STAGE_VERTEX, - SHADER_STAGE_FRAGMENT, -); - -STRUCT(PipelineCreate) -{ - Slice(u16) shader_source_indices; - u16 layout_index; -}; -declare_slice(PipelineCreate); - -STRUCT(PushConstantRange) -{ - u16 offset; - u16 size; - ShaderStage stage; -}; -declare_slice(PushConstantRange); - -ENUM(DescriptorType, u8, - DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER, - DESCRIPTOR_TYPE_COUNT, -); - -STRUCT(DescriptorSetLayoutBinding) -{ - u8 binding; - DescriptorType type; - ShaderStage stage; - u8 count; -}; -declare_slice(DescriptorSetLayoutBinding); - -STRUCT(DescriptorSetLayoutCreate) -{ - Slice(DescriptorSetLayoutBinding) bindings; -}; -declare_slice(DescriptorSetLayoutCreate); - -STRUCT(PipelineLayoutCreate) -{ - Slice(PushConstantRange) push_constant_ranges; - Slice(DescriptorSetLayoutCreate) descriptor_set_layouts; -}; -declare_slice(PipelineLayoutCreate); - -STRUCT(GraphicsPipelinesCreate) -{ - Slice(String) shader_binaries; - Slice(PipelineLayoutCreate) layouts; - Slice(PipelineCreate) pipelines; -}; - -STRUCT(PipelineIndex) -{ - u32 value; -}; - -STRUCT(PipelineLayoutIndex) -{ - u32 value; -}; - -STRUCT(DescriptorSetIndex) -{ - u32 value; -}; - -ENUM(BufferType, u8, - BUFFER_TYPE_VERTEX, - BUFFER_TYPE_INDEX, - BUFFER_TYPE_STAGING, -); - -STRUCT(HostBufferCopy) -{ - String source; - u64 destination_offset; -}; -declare_slice(HostBufferCopy); - -STRUCT(LocalBufferCopyRegion) -{ - u64 source_offset; - u64 destination_offset; - u64 size; -}; -declare_slice(LocalBufferCopyRegion); - -#include - -fn Renderer* rendering_initialize(Arena* arena); -fn RenderWindow* rendering_initialize_window(Renderer* renderer, WindowingInstance* window); -fn void renderer_window_frame_begin(Renderer* renderer, RenderWindow* window); -fn void renderer_window_frame_end(Renderer* renderer, RenderWindow* window); -fn TextureIndex renderer_texture_create(Renderer* renderer, TextureMemory texture_memory); - -fn void window_rect_texture_update_begin(RenderWindow* window); -fn void renderer_queue_font_update(Renderer* renderer, RenderWindow* window, RenderFontType type, TextureAtlas atlas); -fn void window_queue_rect_texture_update(RenderWindow* window, RectTextureSlot slot, TextureIndex texture_index); -fn void window_rect_texture_update_end(Renderer* renderer, RenderWindow* window); - -fn void window_render_rect(RenderWindow* window, RectDraw draw); -fn void window_render_text(Renderer* renderer, RenderWindow* window, String string, float4 color, RenderFontType font_type, u32 x_offset, u32 y_offset); diff --git a/bootstrap/std/sha1.c b/bootstrap/std/sha1.c deleted file mode 100644 index f38cf4e..0000000 --- a/bootstrap/std/sha1.c +++ /dev/null @@ -1,163 +0,0 @@ -#include -// https://github.com/jasinb/sha1.git -// STRUCT(Sha1Digest) -// { -// u32 digest[5]; -// }; - -// static uint32_t rotl32(uint32_t x, int b) -// { -// return (x << b) | (x >> (32-b)); -// } -// -// switch endianness -// fn u32 sha1_get32(u8* p) -// { -// return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; -// } - -// fn u32 sha1_f(int t, u32 b, u32 c, u32 d) -// { -// assert(0 <= t && t < 80); -// -// if (t < 20) -// { -// return (b & c) | ((~b) & d); -// } -// else if (t < 40) -// { -// return b ^ c ^ d; -// } -// else if (t < 60) -// { -// return (b & c) | (b & d) | (c & d); -// } -// else -// //if (t < 80) -// { -// return b ^ c ^ d; -// } -// } - -// STRUCT(Sha1Context) -// { -// u8 block[64]; -// u32 h[5]; -// u64 bytes; -// u32 cur; -// }; - -// fn void sha1_reset(Sha1Context* ctx) -// { -// ctx->h[0] = 0x67452301; -// ctx->h[1] = 0xefcdab89; -// ctx->h[2] = 0x98badcfe; -// ctx->h[3] = 0x10325476; -// ctx->h[4] = 0xc3d2e1f0; -// ctx->bytes = 0; -// ctx->cur = 0; -// } - -// fn void sha1_process_block(Sha1Context* ctx) -// { -// global_variable const u32 k[4] = -// { -// 0x5A827999, -// 0x6ED9EBA1, -// 0x8F1BBCDC, -// 0xCA62C1D6 -// }; -// -// u32 w[16]; -// u32 a = ctx->h[0]; -// u32 b = ctx->h[1]; -// u32 c = ctx->h[2]; -// u32 d = ctx->h[3]; -// u32 e = ctx->h[4]; -// u32 t; -// -// for (t = 0; t < 16; t++) -// w[t] = sha1_get32((u8*)(&((uint32_t*)ctx->block)[t])); -// -// for (t = 0; t < 80; t++) -// { -// auto s = t & 0xf; -// u32 temp; -// if (t >= 16) -// w[s] = rotate_left_u32(w[(s + 13) & 0xf] ^ w[(s + 8) & 0xf] ^ w[(s + 2) & 0xf] ^ w[s], 1); -// -// temp = rotate_left_u32(a, 5) + sha1_f(t, b,c,d) + e + w[s] + k[t/20]; -// -// e = d; d = c; c = rotate_left_u32(b, 30); b = a; a = temp; -// } -// -// ctx->h[0] += a; -// ctx->h[1] += b; -// ctx->h[2] += c; -// ctx->h[3] += d; -// ctx->h[4] += e; -// } - -// fn void sha1_write(Sha1Context* ctx, String bytes) -// { -// auto length = bytes.length; -// ctx->bytes += length; -// -// const uint8_t* src = bytes.pointer; -// while (length--) -// { -// // TODO: could optimize the first and last few bytes, and then copy -// // 128 bit blocks with SIMD in between -// ctx->block[ctx->cur++] = *src++; -// if (ctx->cur == 64) -// { -// sha1_process_block(ctx); -// ctx->cur = 0; -// } -// } -// } - -// fn Sha1Digest sha1_get_digest(Sha1Context* ctx) -// { -// // append separator -// ctx->block[ctx->cur++] = 0x80; -// if (ctx->cur > 56) -// { -// // no space in block for the 64-bit message length, flush -// memset(&ctx->block[ctx->cur], 0, 64 - ctx->cur); -// sha1_process_block(ctx); -// ctx->cur = 0; -// } -// -// memset(&ctx->block[ctx->cur], 0, 56 - ctx->cur); -// uint64_t bits = ctx->bytes * 8; -// -// // TODO a few instructions could be shaven -// ctx->block[56] = (uint8_t)(bits >> 56 & 0xff); -// ctx->block[57] = (uint8_t)(bits >> 48 & 0xff); -// ctx->block[58] = (uint8_t)(bits >> 40 & 0xff); -// ctx->block[59] = (uint8_t)(bits >> 32 & 0xff); -// ctx->block[60] = (uint8_t)(bits >> 24 & 0xff); -// ctx->block[61] = (uint8_t)(bits >> 16 & 0xff); -// ctx->block[62] = (uint8_t)(bits >> 8 & 0xff); -// ctx->block[63] = (uint8_t)(bits >> 0 & 0xff); -// sha1_process_block(ctx); -// -// { -// Sha1Digest ret; -// int i; -// for (i = 0; i < 5; i++) -// ret.digest[i] = sha1_get32((u8*)&ctx->h[i]); -// sha1_reset(ctx); -// return ret; -// } -// } - -// fn Sha1Digest sha1_compute(String bytes) -// { -// Sha1Context ctx; -// sha1_reset(&ctx); -// sha1_write(&ctx, bytes); -// return sha1_get_digest(&ctx); -// } - diff --git a/bootstrap/std/sha1.h b/bootstrap/std/sha1.h deleted file mode 100644 index e69de29..0000000 diff --git a/bootstrap/std/shaders/rect.frag b/bootstrap/std/shaders/rect.frag deleted file mode 100644 index a05a157..0000000 --- a/bootstrap/std/shaders/rect.frag +++ /dev/null @@ -1,43 +0,0 @@ -#version 450 -#extension GL_EXT_nonuniform_qualifier : require -#extension GL_EXT_debug_printf : require -#extension GL_GOOGLE_include_directive : require - -#include "rect.inc" - -layout (location = 0) in flat uint texture_index; -layout (location = 1) in RectFragmentShaderInput inputs; - -layout (location = 0) out vec4 color; - -layout(set = 0, binding = 0) uniform sampler2D textures[]; - -float rounded_rect_sdf(vec2 position, vec2 center, vec2 half_size, float radius) -{ - vec2 r2 = vec2(radius, radius); - // This is 0 when the point is at the border - vec2 d2_no_r2 = abs(center - position) - half_size; - vec2 d2 = d2_no_r2 + r2; - // 0 when outside the rectangle - float negative_euclidean_distance = min(max(d2.x, d2.y), 0.0); - // 0 when inside the rectangle - float positive_euclidean_distance = length(max(d2, 0.0)); - float result = negative_euclidean_distance + positive_euclidean_distance - radius; - return result; -} - -void main() -{ - // WARN: do not cache nonuniformEXT indexing - vec2 texture_size = textureSize(textures[nonuniformEXT(texture_index)], 0); - vec2 uv = vec2(inputs.uv.x / texture_size.x, inputs.uv.y / texture_size.y); - // WARN: do not cache nonuniformEXT indexing - vec4 sampled = texture(textures[nonuniformEXT(texture_index)], uv); - float softness = inputs.softness; - float softness_padding_scalar = max(0, softness * 2 - 1); - vec2 softness_padding = vec2(softness_padding_scalar, softness_padding_scalar); - float distance = rounded_rect_sdf(inputs.position, inputs.center, inputs.half_size - softness_padding, inputs.corner_radius); - - float sdf_factor = 1.0 - smoothstep(0, 2 * softness, distance); - color = inputs.color * sampled * sdf_factor; -} diff --git a/bootstrap/std/shaders/rect.inc b/bootstrap/std/shaders/rect.inc deleted file mode 100644 index dfa78a4..0000000 --- a/bootstrap/std/shaders/rect.inc +++ /dev/null @@ -1,22 +0,0 @@ -struct RectVertex -{ - vec2 p0; - vec2 uv0; - vec2 extent; - float corner_radius; - float softness; - vec4 colors[4]; - uint texture_index; - uint reserved[3]; -}; - -struct RectFragmentShaderInput -{ - vec4 color; - vec2 uv; - vec2 position; - vec2 center; - vec2 half_size; - float corner_radius; - float softness; -}; diff --git a/bootstrap/std/shaders/rect.metal b/bootstrap/std/shaders/rect.metal deleted file mode 100644 index 4532602..0000000 --- a/bootstrap/std/shaders/rect.metal +++ /dev/null @@ -1,122 +0,0 @@ -#include -using namespace metal; - -// Structs to match buffer data -struct RectVertex -{ - float2 p0; // Bottom-left corner position - float2 extent; // Rectangle size (width and height) - float2 uv0; // UV coordinates for bottom-left - float corner_radius; // Corner radius - float softness; // Edge softness - float4 colors[4]; // Per-vertex colors - uint texture_index; // Texture index -}; - -struct RectFragmentShaderInput -{ - float4 vertex_position [[position]]; - float4 color; // Vertex color - float2 uv; // UV coordinates - float2 position; // Position in world space - float2 center; // Center of the rectangle - float2 half_size; // Half dimensions of the rectangle - float corner_radius; // Corner radius - float softness; // Edge softness -}; - -// Push constants (Metal uses constant buffers or argument buffers for this) -struct PushConstants -{ - device const RectVertex* vertex_buffer; - float width; // Screen width - float height; // Screen height -}; - -// Vertex shader main function -vertex RectFragmentShaderInput vertex_main(const device PushConstants& push_constants [[buffer(0)]], uint vertex_id [[vertex_id]]) -{ - // Constants for normalized quad corners - constexpr float2 vertices[] = { - float2(-1.0, -1.0), - float2( 1.0, -1.0), - float2(-1.0, 1.0), - float2( 1.0, 1.0) - }; - - // Fetch the vertex data from the buffer - const RectVertex v = push_constants.vertex_buffer[vertex_id / 4]; - - // Rectangle calculations - float2 p0 = v.p0; - float2 p1 = p0 + v.extent; - float2 position_center = (p1 + p0) * 0.5; - float2 half_size = (p1 - p0) * 0.5; - float2 position = vertices[vertex_id % 4] * half_size + position_center; - - // Screen-space transformation - float2 ndc_position = float2(2.0 * position.x / push_constants.width - 1.0, - 2.0 * position.y / push_constants.height - 1.0); - - // Texture UV calculations - float2 uv0 = v.uv0; - float2 uv1 = uv0 + v.extent; - float2 texture_center = (uv1 + uv0) * 0.5; - float2 uv = vertices[vertex_id % 4] * half_size + texture_center; - - // Output to fragment shader - RectFragmentShaderInput out_data; - out_data.color = v.colors[vertex_id % 4]; - out_data.uv = uv; - out_data.position = position; - out_data.vertex_position = float4(ndc_position.x, ndc_position.y, 0, 1); - out_data.center = position_center; - out_data.half_size = half_size; - out_data.corner_radius = v.corner_radius; - out_data.softness = v.softness; - - return out_data; -} - -// Uniform buffer for textures -struct FragmentUniforms -{ - array, 100> textures; // Array of textures - sampler texture_sampler; // Sampler for texture sampling -}; - -// Calculate the signed distance field (SDF) for a rounded rectangle -float rounded_rect_sdf(float2 position, float2 center, float2 half_size, float radius) -{ - float2 r2 = float2(radius, radius); - float2 d2_no_r2 = abs(center - position) - half_size; - float2 d2 = d2_no_r2 + r2; - float negative_euclidean_distance = min(max(d2.x, d2.y), 0.0); - float positive_euclidean_distance = length(max(d2, 0.0)); - return negative_euclidean_distance + positive_euclidean_distance - radius; -} - -// Fragment shader function -fragment float4 fragment_main(RectFragmentShaderInput inputs [[stage_in]], constant FragmentUniforms &uniforms [[buffer(0)]], uint texture_index) -{ - // Texture size - float2 texture_size = float2(uniforms.textures[texture_index].get_width(), uniforms.textures[texture_index].get_height()); - float2 uv = float2(inputs.uv.x / texture_size.x, inputs.uv.y / texture_size.y); - - // Sample texture - float4 sampled = uniforms.textures[texture_index].sample(uniforms.texture_sampler, uv); - - // Compute softness padding - float softness = inputs.softness; - float softness_padding_scalar = max(0.0, softness * 2.0 - 1.0); - float2 softness_padding = float2(softness_padding_scalar, softness_padding_scalar); - - // Compute signed distance - float distance = rounded_rect_sdf(inputs.position, inputs.center, inputs.half_size - softness_padding, inputs.corner_radius); - - // Compute SDF factor - float sdf_factor = 1.0 - smoothstep(0.0, 2.0 * softness, distance); - - // Compute final color - return inputs.color * sampled * sdf_factor; -} diff --git a/bootstrap/std/shaders/rect.vert b/bootstrap/std/shaders/rect.vert deleted file mode 100644 index 9e79819..0000000 --- a/bootstrap/std/shaders/rect.vert +++ /dev/null @@ -1,61 +0,0 @@ -#version 450 -#extension GL_EXT_buffer_reference : require -#extension GL_EXT_debug_printf : require -#extension GL_GOOGLE_include_directive : require - -#include "rect.inc" - -layout (location = 0) out uint texture_index; -layout (location = 1) out RectFragmentShaderInput outputs; - -layout(buffer_reference, std430) readonly buffer VertexBuffer{ - RectVertex vertices[]; -}; - -layout(push_constant) uniform constants -{ - VertexBuffer vertex_buffer; - float width; - float height; -} PushConstants; - -const vec2 vertices[] = { - { -1, -1 }, - { +1, -1 }, - { -1, +1 }, - { +1, +1 }, -}; - -void main() -{ - RectVertex v = PushConstants.vertex_buffer.vertices[gl_VertexIndex]; - uint vertex_id = gl_VertexIndex % 4; - float width = PushConstants.width; - float height = PushConstants.height; - - vec2 extent = v.extent; - - vec2 p0 = v.p0; - vec2 p1 = p0 + extent; - vec2 position_center = (p1 + p0) / 2; - vec2 half_size = (p1 - p0) / 2; - vec2 position = vertices[vertex_id] * half_size + position_center; - //debugPrintfEXT("Vertex index: (%u). P0: (%f, %f). P1: (%f, %f). Center: (%f, %f). Half size: (%f, %f). Position: (%f, %f)\n", gl_VertexIndex, p0.x, p0.y, p1.x, p1.y, center.x, center.y, half_size.x, half_size.y, position.x, position.y); - - gl_Position = vec4(2 * position.x / width - 1, 2 * position.y / height - 1, 0, 1); - - vec2 uv0 = v.uv0; - vec2 uv1 = uv0 + extent; - vec2 texture_center = (uv1 + uv0) / 2; - vec2 uv = vertices[vertex_id] * half_size + texture_center; - - texture_index = v.texture_index; - - outputs.color = v.colors[vertex_id]; - outputs.uv = uv; - outputs.position = position; - outputs.center = position_center; - outputs.half_size = half_size; - outputs.corner_radius = v.corner_radius; - outputs.softness = v.softness; -} diff --git a/bootstrap/std/string.c b/bootstrap/std/string.c deleted file mode 100644 index 7c26c31..0000000 --- a/bootstrap/std/string.c +++ /dev/null @@ -1,136 +0,0 @@ -#include - -u64 string_first_ch(String string, u8 ch) -{ - u64 result = STRING_NO_MATCH; - for (u64 i = 0; i < string.length; i += 1) - { - if (string.pointer[i] == ch) - { - result = i; - break; - } - } - - return result; -} - -u64 string_last_ch(String string, u8 ch) -{ - u64 result = STRING_NO_MATCH; - u64 i = string.length; - while (i > 0) - { - i -= 1; - if (string.pointer[i] == ch) - { - result = i; - break; - } - } - - return result; -} - -u8 string_starts_with(String string, String start) -{ - u8 result = 0; - - if (likely(start.length <= string.length)) - { - if (unlikely(start.pointer == string.pointer)) - { - result = 1; - } - else - { - u64 i; - for (i = 0; i < start.length; i += 1) - { - let(start_ch, start.pointer[i]); - let(string_ch, string.pointer[i]); - if (unlikely(string_ch != start_ch)) - { - break; - } - } - - result = i == start.length; - } - } - - return result; -} - -u8 string_ends_with(String string, String end) -{ - u8 result = 0; - - if (likely(end.length <= string.length)) - { - u64 i; - u64 offset = string.length - end.length; - for (i = 0; i < end.length; i += 1) - { - let(start_ch, end.pointer[i]); - let(string_ch, string.pointer[i + offset]); - if (unlikely(string_ch != start_ch)) - { - break; - } - } - - result = i == end.length; - } - - return result; -} - -u64 string_first_occurrence(String string, String substring) -{ - u64 result = STRING_NO_MATCH; - - if (substring.length < string.length) - { - for (u64 i = 0; i < string.length; i += 1) - { - if ((string.length - i) < substring.length) - { - break; - } - - String s = s_get_slice(u8, string, i, i + substring.length); - if (s_equal(s, substring)) - { - result = i; - break; - } - } - } - else if (unlikely(substring.length == string.length)) - { - if (unlikely(string.pointer == substring.pointer)) - { - result = 0; - } - else if (memcmp(string.pointer, substring.pointer, substring.length) == 0) - { - result = 0; - } - } - - return result; -} - -fn u64 string_last_occurrence(String string, String substring) -{ - unused(string); - unused(substring); - - todo(); -} - -fn u8 string_contains(String string, String substring) -{ - return string_first_occurrence(string, substring) != STRING_NO_MATCH; -} diff --git a/bootstrap/std/string.h b/bootstrap/std/string.h deleted file mode 100644 index 20b8d9a..0000000 --- a/bootstrap/std/string.h +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#define STRING_NO_MATCH UINT64_MAX - -fn u64 string_first_ch(String string, u8 ch); -fn u64 string_last_ch(String string, u8 ch); -fn u8 string_starts_with(String string, String start); -fn u8 string_ends_with(String string, String end); -fn u64 string_first_occurrence(String string, String substring); -fn u64 string_last_occurrence(String string, String substring); diff --git a/bootstrap/std/ui_builder.c b/bootstrap/std/ui_builder.c deleted file mode 100644 index 1a6a1b4..0000000 --- a/bootstrap/std/ui_builder.c +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -fn UI_Signal ui_button(String string) -{ - let(widget, ui_widget_make((UI_WidgetFlags) { - .draw_text = 1, - .draw_background = 1, - .mouse_clickable = 1, - .keyboard_pressable = 1, - }, string)); - - UI_Signal signal = ui_signal_from_widget(widget); - return signal; -} diff --git a/bootstrap/std/ui_builder.h b/bootstrap/std/ui_builder.h deleted file mode 100644 index b3c8578..0000000 --- a/bootstrap/std/ui_builder.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include -#include - -fn UI_Signal ui_button(String string); diff --git a/bootstrap/std/ui_core.c b/bootstrap/std/ui_core.c deleted file mode 100644 index 4b36d23..0000000 --- a/bootstrap/std/ui_core.c +++ /dev/null @@ -1,810 +0,0 @@ -// This UI is heavily inspired by the ideas of Casey Muratori and Ryan Fleury ideas on GUI programming, to whom I am deeply grateful. -// Here are some links which helped me achieve this build -// https://www.youtube.com/watch?v=Z1qyvQsjK5Y -// https://www.rfleury.com/p/ui-part-1-the-interaction-medium -// https://www.rfleury.com/p/ui-part-2-build-it-every-frame-immediate -// https://www.rfleury.com/p/ui-part-3-the-widget-building-language -// https://www.rfleury.com/p/ui-part-4-the-widget-is-a-lie-node -// https://www.rfleury.com/p/ui-part-5-visual-content -// https://www.rfleury.com/p/ui-part-6-rendering -// https://www.rfleury.com/p/ui-part-7-where-imgui-ends -// https://www.rfleury.com/p/ui-part-8-state-mutation-jank-and -// https://www.rfleury.com/p/ui-part-9-keyboard-and-gamepad-navigation -// https://www.rfleury.com/p/ui-bonus-1-simple-single-line-text -// https://www.rfleury.com/p/codebase-walkthrough-multi-window - -#pragma once - -global_variable UI_State* ui_state = 0; - -fn void ui_autopop(UI_State* state) -{ - let(stack_end, (u32*)((u8*)&state->stacks + sizeof(state->stacks))); - - let(bitset_pointer, (u64*)&state->stack_autopops); - u64 bitset_index = 0; - for (let(stack_pointer, (u32*)&state->stacks); stack_pointer != stack_end; stack_pointer += sizeof(VirtualBuffer(u8)) / sizeof(u32)) - { - let(bitset, *bitset_pointer); - let(shift_value, 1 << bitset_index); - let(autopop, (bitset & shift_value) != 0); - let(mask, ~shift_value); - *bitset_pointer = bitset & mask; - let(length_pointer, stack_pointer + (offsetof(VirtualBuffer(u8), length) / sizeof(u32))); - let(current_length, *length_pointer); - assert(!autopop | current_length); - *length_pointer -= autopop; - - u64 increment_bitset_element = (bitset_index > 0) & (bitset_index % 64 == 0); - bitset_pointer += increment_bitset_element; - bitset_index = increment_bitset_element ? 0 : bitset_index + 1; - } -} - -fn void ui_state_select(UI_State* state) -{ - ui_state = state; -} - -fn UI_State* ui_state_get() -{ - return ui_state; -} - -fn Arena* ui_build_arena() -{ - let(arena, ui_state->build_arenas[ui_state->build_count % array_length(ui_state->build_arenas)]); - return arena; -} - -fn UI_Key ui_key_null() -{ - UI_Key key = {}; - return key; -} - -fn UI_State* ui_state_allocate(Renderer* renderer, RenderWindow* window) -{ - Arena* arena = arena_initialize(GB(8), MB(2), MB(2)); - UI_State* state = arena_allocate(arena, UI_State, 1); - state->renderer = renderer; - state->render_window = window; - state->arena = arena; - state->widget_table.length = 4096; - state->widget_table.pointer = arena_allocate(arena, UI_WidgetSlot, state->widget_table.length); - - for (u64 i = 0; i < array_length(state->build_arenas); i += 1) - { - state->build_arenas[i] = arena_initialize(GB(8), MB(2), MB(2)); - } - - state->stack_nulls = (UI_StateStackNulls){ - .parent = 0, - .child_layout_axis = AXIS2_COUNT, - .pref_width = {}, - .pref_height = {}, - }; - - let(stack_end, (u32*)((u8*)&state->stacks + sizeof(state->stacks))); - - for (let(stack_pointer, (u32*)&state->stacks); stack_pointer != stack_end; stack_pointer += sizeof(VirtualBuffer(u8)) / sizeof(u32)) - { - let(length_pointer, stack_pointer + (offsetof(VirtualBuffer(u8), length) / sizeof(u32))); - assert(*length_pointer == 0); - } - - return state; -} - -fn u64 ui_widget_index_from_key(UI_Key key) -{ - let(length, ui_state->widget_table.length); - assert(is_power_of_two(length)); - return key.value & (length - 1); -} - - -fn String ui_text_from_key_string(String string) -{ - String result = string; - String text_end_delimiter = strlit("##"); - let(index, string_first_occurrence(string, text_end_delimiter)); - if (index < string.length) - { - result.length = index; - } - return result; -} - -fn String ui_hash_from_key_string(String string) -{ - String result = string; - String hash_start_delimiter = strlit("###"); - let(index, string_first_occurrence(string, hash_start_delimiter)); - if (index < string.length) - { - result = s_get_slice(u8, string, index, string.length); - } - - return result; -} - -fn UI_Key ui_key_from_string(UI_Key seed, String string) -{ - UI_Key key = ui_key_null(); - - if (string.length) - { - key = seed; - - for (u64 i = 0; i < string.length; i += 1) - { - key.value = ((key.value << 5) + key.value) + string.pointer[i]; - } - } - - return key; -} - -fn UI_Key ui_key_from_string_format(UI_Key seed, char* format, ...) -{ - u8 buffer[256]; - va_list args; - va_start(args, format); - let(string, format_string_va((String)array_to_slice(buffer), format, args)); - va_end(args); - let(result, ui_key_from_string(seed, string)); - return result; -} - -fn u8 ui_key_equal(UI_Key a, UI_Key b) -{ - return a.value == b.value; -} - -fn UI_Widget* ui_widget_from_key(UI_Key key) -{ - UI_Widget* result = 0; - - if (!ui_key_equal(key, ui_key_null())) - { - let(index, ui_widget_index_from_key(key)); - for (UI_Widget* widget = ui_state->widget_table.pointer[index].first; widget; widget = widget->hash_next) - { - if (ui_key_equal(widget->key, key)) - { - result = widget; - break; - } - } - } - - return result; -} - -fn UI_Widget* ui_widget_make_from_key(UI_WidgetFlags flags, UI_Key key) -{ - let(widget, ui_widget_from_key(key)); - static let(count, 0); - count += 1; - - if (widget) - { - if (widget->last_build_touched == ui_state->build_count) - { - key = ui_key_null(); - widget = 0; - } - } - - u8 first_frame = 0; - if (!widget) - { - let(index, ui_widget_index_from_key(key)); - first_frame = 1; - - widget = arena_allocate(ui_state->arena, UI_Widget, 1); - - let(table_widget_slot, &ui_state->widget_table.pointer[index]); - if (!table_widget_slot->last) - { - table_widget_slot->first = widget; - table_widget_slot->last = widget; - } - else - { - table_widget_slot->last->hash_next = widget; - widget->hash_previous = table_widget_slot->last; - table_widget_slot->last = widget; - } - } - - let(parent, ui_top(parent)); - - if (parent) - { - if (!parent->last) - { - parent->last = widget; - parent->first = widget; - } - else - { - let(previous_last, parent->last); - previous_last->next = widget; - widget->previous = previous_last; - parent->last = widget; - } - - parent->child_count += 1; - widget->parent = parent; - } - else - { - ui_state->root = widget; - } - - widget->key = key; - - for (u64 i = 0; i < array_length(widget->background_colors); i += 1) - { - widget->background_colors[i] = ui_top(background_color); - } - widget->text_color = ui_top(text_color); - widget->flags = flags; - widget->first = 0; - widget->last = 0; - widget->last_build_touched = ui_state->build_count; - widget->pref_size[AXIS2_X] = ui_top(pref_width); - widget->pref_size[AXIS2_Y] = ui_top(pref_height); - widget->child_layout_axis = ui_top(child_layout_axis); - - ui_autopop(ui_state); - - return widget; -} - -fn UI_Widget* ui_widget_make(UI_WidgetFlags flags, String string) -{ - // TODO: - let(seed, ui_key_null()); - - let(hash_string, ui_hash_from_key_string(string)); - let(key, ui_key_from_string(seed, hash_string)); - - let(widget, ui_widget_make_from_key(flags, key)); - - if (flags.draw_text) - { - widget->text = ui_text_from_key_string(string); - } - - return widget; -} - -fn UI_Widget* ui_widget_make_format(UI_WidgetFlags flags, const char* format, ...) -{ - va_list args; - u8 buffer[4096]; - va_start(args, format); - let(string, format_string_va((String)array_to_slice(buffer), format, args)); - va_end(args); - - let(result, ui_widget_make(flags, string)); - return result; -} - -fn UI_Signal ui_signal_from_widget(UI_Widget* widget) -{ - let(rect, widget->rect); - let(mouse_position, ui_state->mouse_position); - UI_Signal signal = { - .clicked_left = - (widget->flags.mouse_clickable & (ui_state->mouse_button_events[WINDOWING_EVENT_MOUSE_LEFT].action == WINDOWING_EVENT_MOUSE_RELEASE)) & - ((mouse_position.x >= rect.x0) & (mouse_position.x <= rect.x1)) & - ((mouse_position.y >= rect.y0) & (mouse_position.y <= rect.y1)), - }; - return signal; -} - -fn void ui_stack_reset(UI_State* state) -{ - let(stack_end, (u32*)((u8*)&state->stacks + sizeof(state->stacks))); - - for (let(stack_pointer, (u32*)&state->stacks); stack_pointer != stack_end; stack_pointer += sizeof(VirtualBuffer(u8)) / sizeof(u32)) - { - let(length_pointer, stack_pointer + (offsetof(VirtualBuffer(u8), length) / sizeof(u32))); - *length_pointer = 0; - } -} - -fn UI_Size ui_pixels(u32 width, f32 strictness) -{ - return (UI_Size) { - .kind = UI_SIZE_PIXEL_COUNT, - .strictness = strictness, - .value = (f32)width, - }; -} - -fn UI_Size ui_percentage(f32 percentage, f32 strictness) -{ - return (UI_Size) { - .kind = UI_SIZE_PERCENTAGE, - .strictness = strictness, - .value = percentage, - }; -} - -fn UI_Size ui_em(f32 value, f32 strictness) -{ - let(font_size, ui_top(font_size)); - assert(font_size); - return (UI_Size) { - .kind = UI_SIZE_PIXEL_COUNT, - .strictness = strictness, - .value = value * font_size, - }; -} - -fn u8 ui_build_begin(WindowingInstance* window, f64 frame_time, WindowingEventQueue* event_queue) -{ - ui_state->build_count += 1; - let(build_arena, ui_build_arena()); - arena_reset(build_arena); - ui_state->frame_time = frame_time; - ui_state->window = window; - - ui_stack_reset(ui_state); - - u8 open = 1; - - let(mouse_button_count, 0); - for (u32 generic_event_index = 0; open & (generic_event_index < event_queue->descriptors.length); generic_event_index += 1) - { - let(event_descriptor, event_queue->descriptors.pointer[generic_event_index]); - u32 event_index = event_descriptor.index; - - switch (event_descriptor.type) - { - case WINDOWING_EVENT_TYPE_MOUSE_BUTTON: - { - let(button, event_queue->mouse_buttons.pointer[event_index]); - let(previous_button_event, ui_state->mouse_button_events[button.button]); - switch (button.event.action) - { - case WINDOWING_EVENT_MOUSE_RELAX: - unreachable(); - case WINDOWING_EVENT_MOUSE_RELEASE: - { - assert(previous_button_event.action == WINDOWING_EVENT_MOUSE_PRESS); - } break; - case WINDOWING_EVENT_MOUSE_PRESS: - { - // TODO: handle properly - assert(previous_button_event.action == WINDOWING_EVENT_MOUSE_RELAX || mouse_button_count); - } break; - case WINDOWING_EVENT_MOUSE_REPEAT: - { - unreachable(); - } break; - } - - ui_state->mouse_button_events[button.button] = button.event; - mouse_button_count += 1; - } break; - case WINDOWING_EVENT_TYPE_WINDOW_FOCUS: - { - } break; - case WINDOWING_EVENT_TYPE_CURSOR_POSITION: - { - let(mouse_position, event_queue->cursor_positions.pointer[event_index]); - ui_state->mouse_position = (UI_MousePosition) { - .x = mouse_position.x, - .y = mouse_position.y, - }; - } break; - case WINDOWING_EVENT_TYPE_CURSOR_ENTER: - { - todo(); - } break; - case WINDOWING_EVENT_TYPE_WINDOW_POSITION: - { - // event_queue->window_positions.pointer[event_index]; - // todo(); - } break; - case WINDOWING_EVENT_TYPE_WINDOW_CLOSE: - { - open = 0; - } break; - } - } - - if (open) - { - for (u64 i = 0; i < ui_state->widget_table.length; i += 1) - { - let(widget_table_element, &ui_state->widget_table.pointer[i]); - for (UI_Widget* widget = widget_table_element->first, *next = 0; widget; widget = next) - { - next = widget->hash_next; - - if (ui_key_equal(widget->key, ui_key_null()) || widget->last_build_touched + 1 < ui_state->build_count) - { - // Remove from the list - if (widget->hash_previous) - { - widget->hash_previous->hash_next = widget->hash_next; - } - - if (widget->hash_next) - { - widget->hash_next->hash_previous = widget->hash_previous; - } - - if (widget_table_element->first == widget) - { - widget_table_element->first = widget->hash_next; - } - - if (widget_table_element->last == widget) - { - widget_table_element->last = widget->hash_previous; - } - } - } - } - - let(framebuffer_size, windowing_get_instance_framebuffer_size(window)); - ui_push_next_only(pref_width, ui_pixels(framebuffer_size.width, 1.0f)); - ui_push_next_only(pref_height, ui_pixels(framebuffer_size.height, 1.0f)); - ui_push_next_only(child_layout_axis, AXIS2_Y); - - let(root, ui_widget_make_format((UI_WidgetFlags) {}, "window_root_{u64}", window)); - assert(!ui_state->stack_autopops.child_layout_axis); - - ui_push(parent, root); - - ui_push(font_size, 12); - - ui_push(text_color, VEC4(0.9, 0.9, 0.02, 1)); - ui_push(background_color, VEC4(0.1, 0.1, 0.1, 1)); - ui_push(pref_width, ui_percentage(1.0, 0.0)); - ui_push(pref_height, ui_percentage(1.0, 0.0)); - // ui_push(pref_height, ui_em(1.8, 0.0)); - } - - return open; -} - -fn void ui_compute_independent_sizes(UI_Widget* widget) -{ - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { - let(pref_size, widget->pref_size[axis]); - switch (pref_size.kind) - { - default: break; case UI_SIZE_COUNT: unreachable(); - case UI_SIZE_PIXEL_COUNT: - { -#if BB_HAS_NATIVE_FLOAT2 - widget->computed_size[axis] = floorf(widget->pref_size[axis].value); -#else - widget->computed_size.v[axis] = floorf(widget->pref_size[axis].value); -#endif - } break; - } - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_compute_independent_sizes(child_widget); - } -} - -fn void ui_compute_upward_dependent_sizes(UI_Widget* widget) -{ - // TODO: optimize loop out if possible - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { - let(pref_size, widget->pref_size[axis]); - switch (pref_size.kind) - { - default: break; case UI_SIZE_COUNT: unreachable(); - case UI_SIZE_PERCENTAGE: - { - for (UI_Widget* ancestor = widget->parent; ancestor; ancestor = ancestor->parent) - { - if (ancestor->pref_size[axis].kind != UI_SIZE_BY_CHILDREN) - { -#if BB_HAS_NATIVE_FLOAT2 - widget->computed_size[axis] = floorf(ancestor->computed_size[axis] * widget->pref_size[axis].value); -#else - widget->computed_size.v[axis] = floorf(ancestor->computed_size.v[axis] * widget->pref_size[axis].value); -#endif - break; - } - } - } break; - } - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_compute_upward_dependent_sizes(child_widget); - } -} - -fn void ui_compute_downward_dependent_sizes(UI_Widget* widget) -{ - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_compute_downward_dependent_sizes(child_widget); - } - - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { - let(pref_size, widget->pref_size[axis]); - switch (pref_size.kind) - { - default: break; case UI_SIZE_COUNT: unreachable(); - case UI_SIZE_BY_CHILDREN: - { - todo(); - } break; - } - } -} - -fn void ui_resolve_conflicts(UI_Widget* widget) -{ - for (Axis2 axis = 0; axis < AXIS2_COUNT; axis += 1) - { -#if BB_HAS_NATIVE_FLOAT2 - let(available_space, widget->computed_size[axis]); -#else - let(available_space, widget->computed_size.v[axis]); -#endif - f32 taken_space = 0; - f32 total_fixup_budget = 0; - - if (!(widget->flags.v & (UI_WIDGET_FLAG_OVERFLOW_X << axis))) - { - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { - if (axis == widget->child_layout_axis) - { -#if BB_HAS_NATIVE_FLOAT2 - taken_space += child_widget->computed_size[axis]; -#else - taken_space += child_widget->computed_size.v[axis]; -#endif - } - else - { -#if BB_HAS_NATIVE_FLOAT2 - taken_space = MAX(taken_space, child_widget->computed_size[axis]); -#else - taken_space = MAX(taken_space, child_widget->computed_size.v[axis]); -#endif - } -#if BB_HAS_NATIVE_FLOAT2 - let(fixup_budget_this_child, child_widget->computed_size[axis] * (1 - child_widget->pref_size[axis].strictness)); -#else - let(fixup_budget_this_child, child_widget->computed_size.v[axis] * (1 - child_widget->pref_size[axis].strictness)); -#endif - total_fixup_budget += fixup_budget_this_child; - } - } - - let(conflict, taken_space - available_space); - - if (conflict > 0 && total_fixup_budget > 0) - { - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { -#if BB_HAS_NATIVE_FLOAT2 - let(fixup_budget_this_child, child_widget->computed_size[axis] * (1 - child_widget->pref_size[axis].strictness)); -#else - let(fixup_budget_this_child, child_widget->computed_size.v[axis] * (1 - child_widget->pref_size[axis].strictness)); -#endif - f32 fixup_size_this_child = 0; - - if (axis == widget->child_layout_axis) - { - fixup_size_this_child = fixup_budget_this_child * (conflict / total_fixup_budget); - } - else - { -#if BB_HAS_NATIVE_FLOAT2 - fixup_size_this_child = child_widget->computed_size[axis] - available_space; -#else - fixup_size_this_child = child_widget->computed_size.v[axis] - available_space; -#endif - } - - fixup_size_this_child = CLAMP(0, fixup_size_this_child, fixup_budget_this_child); -#if BB_HAS_NATIVE_FLOAT2 - child_widget->computed_size[axis] = floorf(child_widget->computed_size[axis] - fixup_size_this_child); -#else - child_widget->computed_size.v[axis] = floorf(child_widget->computed_size.v[axis] - fixup_size_this_child); -#endif - } - } - } - } - - if (axis == widget->child_layout_axis) - { - f32 p = 0; - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { -#if BB_HAS_NATIVE_FLOAT2 - child_widget->computed_relative_position[axis] = p; - p += child_widget->computed_size[axis]; -#else - child_widget->computed_relative_position.v[axis] = p; - p += child_widget->computed_size.v[axis]; -#endif - } - } - } - else - { - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { -#if BB_HAS_NATIVE_FLOAT2 - child_widget->computed_relative_position[axis] = 0; -#else - child_widget->computed_relative_position.v[axis] = 0; -#endif - } - } - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - let(last_relative_rect, child_widget->relative_rect); -#if BB_HAS_NATIVE_FLOAT2 - child_widget->relative_rect.p0[axis] = child_widget->computed_relative_position[axis]; - child_widget->relative_rect.p1[axis] = child_widget->relative_rect.p0[axis] + child_widget->computed_size[axis]; -#else - child_widget->relative_rect.p0.v[axis] = child_widget->computed_relative_position.v[axis]; - child_widget->relative_rect.p1.v[axis] = child_widget->relative_rect.p0.v[axis] + child_widget->computed_size.v[axis]; -#endif - - float2 last_corner_01 = { last_relative_rect.x0, last_relative_rect.y1 }; - float2 last_corner_10 = { last_relative_rect.x1, last_relative_rect.y0 }; - float2 this_corner_01 = { child_widget->relative_rect.x0, child_widget->relative_rect.y1 }; - float2 this_corner_10 = { child_widget->relative_rect.x1, child_widget->relative_rect.y0 }; - -#if BB_HAS_NATIVE_FLOAT2 - child_widget->relative_corner_delta[CORNER_00][axis] = child_widget->relative_rect.p0[axis] - last_relative_rect.p0[axis]; - child_widget->relative_corner_delta[CORNER_01][axis] = this_corner_01[axis] - last_corner_01[axis]; - child_widget->relative_corner_delta[CORNER_10][axis] = this_corner_10[axis] - last_corner_10[axis]; - child_widget->relative_corner_delta[CORNER_11][axis] = child_widget->relative_rect.p1[axis] - last_relative_rect.p1[axis]; - - child_widget->rect.p0[axis] = widget->rect.p0[axis] + child_widget->relative_rect.p0[axis] - widget->view_offset[axis]; - child_widget->rect.p1[axis] = child_widget->rect.p0[axis] + child_widget->computed_size[axis]; - - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { - child_widget->rect.p0[axis] = floorf(child_widget->rect.p0[axis]); - child_widget->rect.p1[axis] = floorf(child_widget->rect.p1[axis]); - } -#else - child_widget->relative_corner_delta[CORNER_00].v[axis] = child_widget->relative_rect.p0.v[axis] - last_relative_rect.p0.v[axis]; - child_widget->relative_corner_delta[CORNER_01].v[axis] = this_corner_01.v[axis] - last_corner_01.v[axis]; - child_widget->relative_corner_delta[CORNER_10].v[axis] = this_corner_10.v[axis] - last_corner_10.v[axis]; - child_widget->relative_corner_delta[CORNER_11].v[axis] = child_widget->relative_rect.p1.v[axis] - last_relative_rect.p1.v[axis]; - - child_widget->rect.p0.v[axis] = widget->rect.p0.v[axis] + child_widget->relative_rect.p0.v[axis] - widget->view_offset.v[axis]; - child_widget->rect.p1.v[axis] = child_widget->rect.p0.v[axis] + child_widget->computed_size.v[axis]; - - if (!(child_widget->flags.v & (UI_WIDGET_FLAG_FLOATING_X << axis))) - { - child_widget->rect.p0.v[axis] = floorf(child_widget->rect.p0.v[axis]); - child_widget->rect.p1.v[axis] = floorf(child_widget->rect.p1.v[axis]); - } -#endif - } - - for (UI_Widget* child_widget = widget->first; child_widget; child_widget = child_widget->next) - { - ui_resolve_conflicts(child_widget); - } - } -} - -fn void ui_build_end() -{ - // Clear release button presses - for (u32 i = 0; i < array_length(ui_state->mouse_button_events); i += 1) - { - let(event, &ui_state->mouse_button_events[i]); - if (event->action == WINDOWING_EVENT_MOUSE_RELEASE) - { - event->action = WINDOWING_EVENT_MOUSE_RELAX; - } - } - - ui_pop(parent); - - ui_compute_independent_sizes(ui_state->root); - ui_compute_upward_dependent_sizes(ui_state->root); - ui_compute_downward_dependent_sizes(ui_state->root); - ui_resolve_conflicts(ui_state->root); -} - -STRUCT(WidgetIterator) -{ - UI_Widget* next; - u32 push_count; - u32 pop_count; -}; - -#define ui_widget_recurse_depth_first_preorder(widget) ui_widget_recurse_depth_first((widget), offset_of(UI_Widget, next), offset_of(UI_Widget, first)) -#define ui_widget_recurse_depth_first_postorder(widget) ui_widget_recurse_depth_first((widget), offset_of(UI_Widget, previous), offset_of(UI_Widget, last)) - -fn WidgetIterator ui_widget_recurse_depth_first(UI_Widget* widget, u64 sibling_offset, u64 child_offset) -{ - WidgetIterator it = {}; - let(child, member_from_offset(widget, UI_Widget*, child_offset)); - if (child) - { - it.next = child; - it.push_count += 1; - } - else - { - for (UI_Widget* w = widget; w; w = w->parent) - { - let(sibling, member_from_offset(w, UI_Widget*, sibling_offset)); - if (sibling) - { - it.next = sibling; - break; - } - - it.pop_count += 1; - } - } - - return it; -} - -fn void ui_draw() -{ - UI_Widget* root = ui_state->root; - - UI_Widget* widget = root; - RenderWindow* window = ui_state->render_window; - Renderer* renderer = ui_state->renderer; - - while (widget) - { - if (widget->flags.draw_background) - { - window_render_rect(window, (RectDraw) { - .colors = { widget->background_colors[0], widget->background_colors[1], widget->background_colors[2], widget->background_colors[3] }, - .vertex = widget->rect, - }); - } - - if (widget->flags.draw_text) - { - window_render_text(renderer, window, widget->text, widget->text_color, RENDER_FONT_TYPE_PROPORTIONAL, widget->rect.x0, widget->rect.y0); - } - - widget = ui_widget_recurse_depth_first_postorder(widget).next; - } -} diff --git a/bootstrap/std/ui_core.h b/bootstrap/std/ui_core.h deleted file mode 100644 index 8e83d79..0000000 --- a/bootstrap/std/ui_core.h +++ /dev/null @@ -1,223 +0,0 @@ -#pragma once - -ENUM(UI_SizeKind, u8, - UI_SIZE_PIXEL_COUNT, - UI_SIZE_PERCENTAGE, - UI_SIZE_BY_CHILDREN, - UI_SIZE_COUNT, -); - -STRUCT(UI_Size) -{ - UI_SizeKind kind; - f32 value; - f32 strictness; -}; -static_assert(sizeof(UI_Size) == 12); -decl_vb(UI_Size); - -STRUCT(UI_Key) -{ - u64 value; -}; - -STRUCT(UI_MousePosition) -{ - f64 x; - f64 y; -}; - -ENUM(UI_WidgetFlagEnum, u64, - UI_WIDGET_FLAG_DISABLED = 1 << 0, - UI_WIDGET_FLAG_MOUSE_CLICKABLE = 1 << 1, - UI_WIDGET_FLAG_KEYBOARD_PRESSABLE = 1 << 2, - UI_WIDGET_FLAG_DRAW_TEXT = 1 << 3, - UI_WIDGET_FLAG_DRAW_BACKGROUND = 1 << 4, - UI_WIDGET_FLAG_OVERFLOW_X = 1 << 5, - UI_WIDGET_FLAG_OVERFLOW_Y = 1 << 6, - UI_WIDGET_FLAG_FLOATING_X = 1 << 7, - UI_WIDGET_FLAG_FLOATING_Y = 1 << 8, -); - -UNION(UI_WidgetFlags) -{ - struct - { - u64 disabled:1; - u64 mouse_clickable:1; - u64 keyboard_pressable:1; - u64 draw_text:1; - u64 draw_background:1; - u64 overflow_x:1; - u64 overflow_y:1; - u64 floating_x:1; - u64 floating_y:1; - }; - u64 v; -}; -static_assert(sizeof(UI_WidgetFlags) == sizeof(u64)); - -STRUCT(UI_Widget) -{ - // Random category I temporarily introduce - String text; - - UI_Widget* hash_previous; - UI_Widget* hash_next; - - UI_Widget* first; - UI_Widget* last; - UI_Widget* next; - UI_Widget* previous; - UI_Widget* parent; - u64 child_count; - - UI_Key key; - - // Input parameters - UI_Size pref_size[AXIS2_COUNT]; - Axis2 child_layout_axis; - UI_WidgetFlags flags; - - // Data known after size determination happens - float2 computed_size; - float2 computed_relative_position; - - // Data known after layout computation happens - F32Interval2 relative_rect; - F32Interval2 rect; - float2 relative_corner_delta[CORNER_COUNT]; - - // Persistent data across frames - u64 last_build_touched; - float2 view_offset; - float4 background_colors[4]; - float4 text_color; -}; -decl_vbp(UI_Widget); - -STRUCT(UI_WidgetSlot) -{ - UI_Widget* first; - UI_Widget* last; -}; -declare_slice(UI_WidgetSlot); - -decl_vb(Axis2); -decl_vb(float4); - -STRUCT(UI_StateStackAutoPops) -{ - u64 parent:1; - u64 pref_width:1; - u64 pref_height:1; - u64 child_layout_axis:1; - u64 text_color:1; - u64 background_color:1; - u64 font_size:1; -}; -static_assert(sizeof(UI_StateStackAutoPops) % sizeof(u64) == 0); - -STRUCT(UI_StateStackNulls) -{ - UI_Widget* parent; - UI_Size pref_width; - UI_Size pref_height; - Axis2 child_layout_axis; - float4 text_color; - float4 background_color; - f32 font_size; -}; - -STRUCT(UI_StateStacks) -{ - VirtualBufferP(UI_Widget) parent; - VirtualBuffer(UI_Size) pref_width; - VirtualBuffer(UI_Size) pref_height; - VirtualBuffer(Axis2) child_layout_axis; - VirtualBuffer(float4) text_color; - VirtualBuffer(float4) background_color; - VirtualBuffer(f32) font_size; -}; - -STRUCT(UI_State) -{ - Arena* arena; - Arena* build_arenas[2]; - Renderer* renderer; - RenderWindow* render_window; - WindowingInstance* window; - u64 build_count; - f64 frame_time; - UI_Widget* root; - UI_MousePosition mouse_position; - Slice(UI_WidgetSlot) widget_table; - UI_Widget* free_widget_list; - u64 free_widget_count; - WindowingEventMouseButtonEvent mouse_button_events[WINDOWING_EVENT_MOUSE_BUTTON_COUNT]; - u8 focused:1; - - UI_StateStacks stacks; - UI_StateStackNulls stack_nulls; - UI_StateStackAutoPops stack_autopops; -}; - -enum -{ - UI_SignalFlag_ClickedLeft = (1 << 0), -}; - -typedef u32 UI_SignalFlags; - -STRUCT(UI_Signal) -{ - UI_Widget* widget; - union - { - UI_SignalFlags flags; - struct - { - u32 clicked_left:1; - u32 reserved:31; - }; - }; -}; - -#define ui_stack_autopop_set(field_name, value) ui_state->stack_autopops.field_name = (value) -#define ui_stack_push_impl(field_name, value, auto_pop_value) do \ -{\ - *vb_add(&ui_state->stacks.field_name, 1) = (value);\ - ui_stack_autopop_set(field_name, auto_pop_value);\ -} while (0) - -#define ui_push(field_name, value) ui_stack_push_impl(field_name, value, 0) -#define ui_push_next_only(field_name, value) ui_stack_push_impl(field_name, value, 1) -#define ui_pop(field_name) (typeof(ui_state->stacks.field_name.pointer)) ui_pop_generic((VirtualBuffer(u8)*)&ui_state->stacks.field_name, sizeof(*ui_state->stacks.field_name.pointer)) -#define ui_top(field_name) (ui_state->stacks.field_name.length ? ui_state->stacks.field_name.pointer[ui_state->stacks.field_name.length - 1] : ui_state->stack_nulls.field_name) - -fn u8* ui_pop_generic(VirtualBuffer(u8)* stack, u32 element_size) -{ - let(length, stack->length); - - assert(length > 0); - let(next_length, length - 1); - let(index, next_length); - let(result, &stack->pointer[index * element_size]); - stack->length = next_length; - - return result; -} - -fn UI_State* ui_state_allocate(Renderer* renderer, RenderWindow* window); -fn void ui_state_select(UI_State* state); -fn u8 ui_build_begin(WindowingInstance* window, f64 frame_time, WindowingEventQueue* event_queue); -fn void ui_build_end(); -fn void ui_draw(); -fn UI_Signal ui_signal_from_widget(UI_Widget* widget); -fn UI_State* ui_state_get(); - -fn UI_Widget* ui_widget_make(UI_WidgetFlags flags, String string); -fn UI_Widget* ui_widget_make_format(UI_WidgetFlags flags, const char* format, ...); -fn UI_Size ui_pixels(u32 width, f32 strictness); -fn UI_Size ui_percentage(f32 percentage, f32 strictness); -fn UI_Size ui_em(f32 value, f32 strictness); diff --git a/bootstrap/std/virtual_buffer.c b/bootstrap/std/virtual_buffer.c deleted file mode 100644 index 7df3de0..0000000 --- a/bootstrap/std/virtual_buffer.c +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -fn void vb_generic_ensure_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count) -{ - u32 old_capacity = vb->capacity; - u32 wanted_capacity = vb->length + item_count; - - if (old_capacity < wanted_capacity) - { - if (old_capacity == 0) - { - vb->pointer = os_reserve(0, item_size * UINT32_MAX, (OSReserveProtectionFlags) {}, (OSReserveMapFlags) { .priv = 1, .anon = 1, .noreserve = 1 }); - } - - let_cast(u32, old_page_capacity, align_forward_u64(old_capacity * item_size, minimum_granularity)); - let_cast(u32, new_page_capacity, align_forward_u64(wanted_capacity * item_size, minimum_granularity)); - - let(commit_size, new_page_capacity - old_page_capacity); - void* commit_pointer = vb->pointer + old_page_capacity; - - os_commit(commit_pointer, commit_size); - - let(new_capacity, new_page_capacity / item_size); - vb->capacity = new_capacity; - } -} - -fn u8* vb_generic_add_assume_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count) -{ - u32 index = vb->length; - assert(vb->capacity >= index + item_count); - vb->length = index + item_count; - return vb->pointer + (index * item_size); -} - -fn u8* vb_generic_add(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count) -{ - vb_generic_ensure_capacity(vb, item_size, item_count); - return vb_generic_add_assume_capacity(vb, item_size, item_count); -} - -fn u8* vb_append_bytes(VirtualBuffer(u8*) vb, Slice(u8) bytes) -{ - let_cast(u32, len, bytes.length); - vb_generic_ensure_capacity(vb, sizeof(u8), len); - let(pointer, vb_generic_add_assume_capacity(vb, sizeof(u8), len)); - memcpy(pointer, bytes.pointer, len); - return pointer; -} - -fn u32 vb_copy_string(VirtualBuffer(u8)* buffer, String string) -{ - let(offset, buffer->length); - let_cast(u32, length, string.length); - let(pointer, vb_add(buffer, length)); - memcpy(pointer, string.pointer, length); - return offset; -} - -fn u64 vb_copy_string_zero_terminated(VirtualBuffer(u8)* buffer, String string) -{ - assert(string.pointer[string.length] == 0); - string.length += 1; - - vb_copy_string(buffer, string); - - return string.length; -} - -fn void vb_copy_byte_repeatedly(VirtualBuffer(u8)* buffer, u8 byte, u32 times) -{ - u8* ptr = vb_generic_add(buffer, 1, times); - memset(ptr, byte, times); -} - -fn u64 vb_format(VirtualBuffer(u8)* vb, const char* format, ...) -{ - u8 buffer[4096]; - va_list args; - va_start(args, format); - let(result, format_string_va((String)array_to_slice(buffer), format, args)); - va_end(args); - - assert(result.length <= array_length(buffer)); - vb_copy_string(vb, result); - - return result.length; -} diff --git a/bootstrap/std/virtual_buffer.h b/bootstrap/std/virtual_buffer.h deleted file mode 100644 index cf0e2e3..0000000 --- a/bootstrap/std/virtual_buffer.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include - -#define VirtualBuffer(T) VirtualBuffer_ ## T -#define VirtualBufferP(T) VirtualBufferPointerTo_ ## T - -#define decl_vb_ex(T, StructName) \ -struct StructName \ -{\ - T* pointer;\ - u32 length;\ - u32 capacity;\ -};\ -typedef struct StructName StructName - -#define decl_vb(T) decl_vb_ex(T, VirtualBuffer(T)) -#define decl_vbp(T) decl_vb_ex(T*, VirtualBufferP(T)) - -decl_vb(u8); -decl_vbp(u8); -decl_vb(u16); -decl_vbp(u16); -decl_vb(u32); -decl_vbp(u32); -decl_vb(s32); -decl_vbp(s32); -decl_vb(s64); -decl_vbp(s64); -decl_vb(String); -decl_vbp(char); -decl_vb(f32); -decl_vb(f64); - -#define vb_size_of_element(vb) sizeof(*((vb)->pointer)) -#define vb_add(vb, count) (typeof((vb)->pointer)) vb_generic_add((VirtualBuffer(u8)*)(vb), (vb_size_of_element(vb)), (count)) -#define vb_add_scalar(vb, S) (S*) vb_generic_add(vb, 1, sizeof(S)) -#define vb_copy_scalar(vb, s) *vb_add_scalar(vb, typeof(s)) = s -#define vb_append_struct(vb, T, s) *(vb_add_struct(vb, T)) = s -#define vb_append_one(vb, item) (typeof((vb)->pointer)) vb_generic_append((VirtualBuffer(u8)*)(vb), &(item), (vb_size_of_element(vb)), 1) -#define vb_to_bytes(vb) (Slice(u8)) { .pointer = (u8*)((vb).pointer), .length = (vb_size_of_element(vb)) * (vb).length, } -#define vb_ensure_capacity(vb, count) vb_generic_ensure_capacity((VirtualBuffer(u8)*)(vb), vb_size_of_element(vb), (count)) -#define vb_copy_array(vb, arr) memcpy(vb_add(vb, array_length(arr)), arr, sizeof(arr)) -#define vb_add_any_array(vb, E, count) (E*)vb_generic_add(vb, vb_size_of_element(vb), sizeof(E) * count) -#define vb_copy_any_array(vb, arr) memcpy(vb_generic_add(vb, vb_size_of_element(vb), sizeof(arr)), (arr), sizeof(arr)) -#define vb_copy_any_slice(vb, slice) memcpy(vb_generic_add(vb, vb_size_of_element(vb), sizeof(*((slice).pointer)) * (slice).length), (slice).pointer, sizeof(*((slice).pointer)) * (slice).length) - -fn void vb_generic_ensure_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count); -fn u8* vb_generic_add_assume_capacity(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count); -fn u8* vb_generic_add(VirtualBuffer(u8)* vb, u32 item_size, u32 item_count); -fn u8* vb_append_bytes(VirtualBuffer(u8*) vb, Slice(u8) bytes); -fn u32 vb_copy_string(VirtualBuffer(u8)* buffer, String string); -fn u64 vb_copy_string_zero_terminated(VirtualBuffer(u8)* buffer, String string); -fn u64 vb_format(VirtualBuffer(u8)* vb, const char* format, ...); diff --git a/bootstrap/std/vulkan_rendering.c b/bootstrap/std/vulkan_rendering.c deleted file mode 100644 index a14300a..0000000 --- a/bootstrap/std/vulkan_rendering.c +++ /dev/null @@ -1,2502 +0,0 @@ -#pragma once - -#define vulkan_load_function_generic(fn, load_fn, context) fn = (PFN_ ## fn) load_fn(context, #fn) -#define vulkan_load_instance_function(instance, fn) vulkan_load_function_generic(fn, vkGetInstanceProcAddr, instance) -#define vulkan_load_device_function(device, fn) vulkan_load_function_generic(fn, vkGetDeviceProcAddr, device) - -global_variable OSLibrary vulkan_library; - -#define MAX_SWAPCHAIN_IMAGE_COUNT (16) -#define MAX_FRAME_COUNT (2) -#define MAX_DESCRIPTOR_SET_COUNT (16) -#define MAX_PUSH_CONSTANT_RANGE_COUNT (16) -#define MAX_SHADER_MODULE_COUNT_PER_PIPELINE (16) -#define MAX_DESCRIPTOR_SET_LAYOUT_COUNT (16) -#define MAX_DESCRIPTOR_SET_LAYOUT_BINDING_COUNT (16) -#define MAX_TEXTURE_COUNT (16) -#define MAX_TEXTURE_UPDATE_COUNT (32) -#define MAX_DESCRIPTOR_SET_UPDATE_COUNT (16) -#define MAX_LOCAL_BUFFER_COPY_COUNT (16) - -#define vkok(call) do {\ - VkResult _r_e_s_u_l_t_ = call; \ - if (unlikely(_r_e_s_u_l_t_ != VK_SUCCESS)) wrong_vulkan_result(_r_e_s_u_l_t_, strlit(#call), strlit(__FILE__), __LINE__); \ -} while(0) - -STRUCT(VulkanImageCreate) -{ - u32 width; - u32 height; - u32 mip_levels; - VkFormat format; - VkImageUsageFlags usage; -}; - -STRUCT(GPUMemory) -{ - VkDeviceMemory handle; - u64 size; -}; - -STRUCT(VulkanImage) -{ - VkImage handle; - VkImageView view; - GPUMemory memory; - VkFormat format; -}; - -STRUCT(GPUDrawPushConstants) -{ - u64 vertex_buffer; - f32 width; - f32 height; -}; - -STRUCT(DescriptorSetLayoutBindings) -{ - VkDescriptorSetLayoutBinding buffer[MAX_DESCRIPTOR_SET_LAYOUT_BINDING_COUNT]; - u32 count; -}; - -STRUCT(Pipeline) -{ - VkPipeline handle; - VkPipelineLayout layout; - u32 descriptor_set_count; - u32 push_constant_range_count; - DescriptorSetLayoutBindings descriptor_set_layout_bindings[MAX_DESCRIPTOR_SET_COUNT]; - VkDescriptorSetLayout descriptor_set_layouts[MAX_DESCRIPTOR_SET_COUNT]; - VkPushConstantRange push_constant_ranges[MAX_PUSH_CONSTANT_RANGE_COUNT]; -}; - -STRUCT(RectPipeline) -{ - Pipeline pipeline; -}; - -STRUCT(ImmediateContext) -{ - VkDevice device; - VkFence fence; - VkCommandBuffer command_buffer; - VkCommandPool command_pool; - VkQueue queue; -}; - -STRUCT(VulkanBuffer) -{ - VkBuffer handle; - GPUMemory memory; - u64 address; - VkDeviceSize size; - BufferType type; -}; - -STRUCT(LocalBufferCopy) -{ - VulkanBuffer destination; - VulkanBuffer source; - Slice(LocalBufferCopyRegion) regions; -}; -declare_slice(LocalBufferCopy); - -STRUCT(VertexBuffer) -{ - VulkanBuffer gpu; - VirtualBuffer(u8) cpu; - u32 count; -}; - -STRUCT(IndexBuffer) -{ - VulkanBuffer gpu; - VirtualBuffer(u32) cpu; -}; - -STRUCT(Renderer) -{ - VkAllocationCallbacks* allocator; - VkPhysicalDevice physical_device; - VkDevice device; - VkQueue graphics_queue; - u32 graphics_queue_family_index; - VkSampler sampler; - ImmediateContext immediate; - VkPhysicalDeviceMemoryProperties memory_properties; - Pipeline pipelines[BB_PIPELINE_COUNT]; - TextureAtlas fonts[RENDER_FONT_TYPE_COUNT]; -}; - -STRUCT(PipelineInstantiation) -{ - VkWriteDescriptorSet descriptor_set_update; - VkDescriptorSet descriptor_sets[MAX_DESCRIPTOR_SET_COUNT]; - VkDescriptorImageInfo texture_descriptors[MAX_TEXTURE_UPDATE_COUNT]; -}; - -STRUCT(FramePipelineInstantiation) -{ - VertexBuffer vertex_buffer; - IndexBuffer index_buffer; - VulkanBuffer transient_buffer; -}; - -STRUCT(WindowFrame) -{ - VkCommandPool command_pool; - VkCommandBuffer command_buffer; - VkSemaphore swapchain_semaphore; - VkSemaphore render_semaphore; - VkFence render_fence; - BBPipeline bound_pipeline; - VkBuffer index_buffer; - GPUDrawPushConstants push_constants; - FramePipelineInstantiation pipeline_instantiations[BB_PIPELINE_COUNT]; -}; - -STRUCT(RenderWindow) -{ - VkSwapchainKHR swapchain; - VkSurfaceKHR surface; - VkFormat swapchain_image_format; - u32 width; - u32 height; - u32 last_width; - u32 last_height; - u32 frame_index; - u32 swapchain_image_index; - u32 swapchain_image_count; - VulkanImage render_image; - VkImage swapchain_images[MAX_SWAPCHAIN_IMAGE_COUNT]; - VkImageView swapchain_image_views[MAX_SWAPCHAIN_IMAGE_COUNT]; - WindowFrame frames[MAX_FRAME_COUNT]; - PipelineInstantiation pipeline_instantiations[BB_PIPELINE_COUNT]; -}; - -STRUCT(VulkanTexture) -{ - VulkanImage image; - VkSampler sampler; -}; - -STRUCT(VulkanCopyImage) -{ - VkImage handle; - VkExtent2D extent; -}; - -STRUCT(VulkanCopyImageArgs) -{ - VulkanCopyImage source; - VulkanCopyImage destination; -}; - -global_variable Renderer renderer_memory; -global_variable RenderWindow renderer_window_memory; -global_variable VulkanTexture textures[MAX_TEXTURE_COUNT]; -global_variable u32 texture_count; -global_variable VkInstance instance; - -fn String vulkan_result_to_string(VkResult result) -{ - switch (result) - { - case_to_name(VK_, SUCCESS); - case_to_name(VK_, NOT_READY); - case_to_name(VK_, TIMEOUT); - case_to_name(VK_, EVENT_SET); - case_to_name(VK_, EVENT_RESET); - case_to_name(VK_, INCOMPLETE); - case_to_name(VK_, ERROR_OUT_OF_HOST_MEMORY); - case_to_name(VK_, ERROR_OUT_OF_DEVICE_MEMORY); - case_to_name(VK_, ERROR_INITIALIZATION_FAILED); - case_to_name(VK_, ERROR_DEVICE_LOST); - case_to_name(VK_, ERROR_MEMORY_MAP_FAILED); - case_to_name(VK_, ERROR_LAYER_NOT_PRESENT); - case_to_name(VK_, ERROR_EXTENSION_NOT_PRESENT); - case_to_name(VK_, ERROR_FEATURE_NOT_PRESENT); - case_to_name(VK_, ERROR_INCOMPATIBLE_DRIVER); - case_to_name(VK_, ERROR_TOO_MANY_OBJECTS); - case_to_name(VK_, ERROR_FORMAT_NOT_SUPPORTED); - case_to_name(VK_, ERROR_FRAGMENTED_POOL); - case_to_name(VK_, ERROR_UNKNOWN); - case_to_name(VK_, ERROR_OUT_OF_POOL_MEMORY); - case_to_name(VK_, ERROR_INVALID_EXTERNAL_HANDLE); - case_to_name(VK_, ERROR_FRAGMENTATION); - case_to_name(VK_, ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS); - case_to_name(VK_, PIPELINE_COMPILE_REQUIRED); - case_to_name(VK_, ERROR_SURFACE_LOST_KHR); - case_to_name(VK_, ERROR_NATIVE_WINDOW_IN_USE_KHR); - case_to_name(VK_, SUBOPTIMAL_KHR); - case_to_name(VK_, ERROR_OUT_OF_DATE_KHR); - case_to_name(VK_, ERROR_INCOMPATIBLE_DISPLAY_KHR); - case_to_name(VK_, ERROR_VALIDATION_FAILED_EXT); - case_to_name(VK_, ERROR_INVALID_SHADER_NV); - case_to_name(VK_, ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR); - case_to_name(VK_, ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT); - case_to_name(VK_, ERROR_NOT_PERMITTED_KHR); - case_to_name(VK_, ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT); - case_to_name(VK_, THREAD_IDLE_KHR); - case_to_name(VK_, THREAD_DONE_KHR); - case_to_name(VK_, OPERATION_DEFERRED_KHR); - case_to_name(VK_, OPERATION_NOT_DEFERRED_KHR); - case_to_name(VK_, ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR); - case_to_name(VK_, ERROR_COMPRESSION_EXHAUSTED_EXT); - //case_to_name(VK_, INCOMPATIBLE_SHADER_BINARY_EXT); - //case_to_name(VK_, PIPELINE_BINARY_MISSING_KHR); - //case_to_name(VK_, ERROR_NOT_ENOUGH_SPACE_KHR); - default: unreachable(); - } -} - -BB_NORETURN BB_COLD fn void wrong_vulkan_result(VkResult result, String call_string, String file, int line) -{ - unused(result); - unused(call_string); - unused(file); - unused(line); - - String result_name = vulkan_result_to_string(result); - panic("Wrong Vulkan result {s} at \"{s}\" {s}:{u32}\n", result_name, call_string, file, line); -} - -fn void buffer_copy_to_local_command(VkCommandBuffer command_buffer, Slice(LocalBufferCopy) copies) -{ - for (u64 i = 0; i < copies.length; i += 1) - { - let(copy, copies.pointer[i]); - let(source_buffer, ©.source); - let(destination_buffer, ©.destination); - - VkBufferCopy2 buffer_copies[MAX_LOCAL_BUFFER_COPY_COUNT]; - - for (u64 i = 0; i < copy.regions.length; i += 1) - { - let(copy_region, copy.regions.pointer[i]); - buffer_copies[i] = (VkBufferCopy2) { - .sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2, - .pNext = 0, - .srcOffset = copy_region.source_offset, - .dstOffset = copy_region.destination_offset, - .size = copy_region.size, - }; - } - - VkCopyBufferInfo2 info = { - .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2, - .pNext = 0, - .srcBuffer = source_buffer->handle, - .dstBuffer = destination_buffer->handle, - .regionCount = copy.regions.length, - .pRegions = buffer_copies, - }; - - vkCmdCopyBuffer2(command_buffer, &info); - } -} - -fn void buffer_copy_to_host(VulkanBuffer buffer, Slice(HostBufferCopy) regions) -{ - assert(buffer.type == BUFFER_TYPE_STAGING); - - let(buffer_pointer, (u8*)buffer.address); - - for (u64 i = 0; i < regions.length; i += 1) - { - let(region, regions.pointer[i]); - let(destination, buffer_pointer + region.destination_offset); - assert(destination + region.source.length <= (u8*)buffer.address + buffer.size); -#if USE_MEMCPY - memcpy(destination, region.source.pointer, region.source.length); -#else - for (u64 i = 0; i < region.source.length; i += 1) - { - destination[i] = region.source.pointer[i]; - } -#endif - } -} - -fn VkShaderStageFlags vulkan_shader_stage_from_path(String shader_binary_path) -{ - VkShaderStageFlags shader_stage; - if (string_ends_with(shader_binary_path, strlit(".vert.spv"))) - { - shader_stage = VK_SHADER_STAGE_VERTEX_BIT; - } - else if (string_ends_with(shader_binary_path, strlit(".frag.spv"))) - { - shader_stage = VK_SHADER_STAGE_FRAGMENT_BIT; - } - else - { - failed_execution(); - } - - return shader_stage; -} - -fn VkShaderStageFlags vulkan_shader_stage(ShaderStage shader_stage) -{ - VkShaderStageFlags result; - - switch (shader_stage) - { - case SHADER_STAGE_VERTEX: - result = VK_SHADER_STAGE_VERTEX_BIT; - break; - case SHADER_STAGE_FRAGMENT: - result = VK_SHADER_STAGE_FRAGMENT_BIT; - break; - } - - return result; -} - -fn VkDescriptorType vulkan_descriptor_type(DescriptorType type) -{ - VkDescriptorType result; - - switch (type) - { - case DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER: - result = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - break; - case DESCRIPTOR_TYPE_COUNT: - unreachable(); - } - - return result; -} - -fn DescriptorType descriptor_type_from_vulkan(VkDescriptorType descriptor_type) -{ - DescriptorType result; - - switch (descriptor_type) - { - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: - result = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER; - break; - default: unreachable(); - } - - return result; -} - -fn GPUMemory vk_allocate_memory(VkDevice device, const VkAllocationCallbacks* allocation_callbacks, VkPhysicalDeviceMemoryProperties memory_properties, VkMemoryRequirements memory_requirements, VkMemoryPropertyFlags flags, u8 use_device_address_bit) -{ - u32 memory_type_index; - for (memory_type_index = 0; memory_type_index < memory_properties.memoryTypeCount; memory_type_index += 1) - { - let(memory_type, memory_properties.memoryTypes[memory_type_index]); - - if ((memory_requirements.memoryTypeBits & (1 << memory_type_index)) != 0 && (memory_type.propertyFlags & flags) == flags) - { - break; - } - } - - if (memory_type_index == memory_properties.memoryTypeCount) - { - failed_execution(); - } - - VkMemoryAllocateInfo allocate_info = { - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - .pNext = 0, - .allocationSize = memory_requirements.size, - .memoryTypeIndex = memory_type_index, - }; - - VkMemoryAllocateFlagsInfo flags_info = { - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, - .pNext = 0, - .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, - .deviceMask = 1, - }; - - if (use_device_address_bit) - { - allocate_info.pNext = &flags_info; - } - - VkDeviceMemory memory = 0; - vkok(vkAllocateMemory(device, &allocate_info, allocation_callbacks, &memory)); - - return (GPUMemory) { .handle = memory, .size = allocate_info.allocationSize }; -} - -fn VulkanBuffer vk_buffer_create(VkDevice device, const VkAllocationCallbacks* allocation_callbacks, VkPhysicalDeviceMemoryProperties physical_device_memory_properties, VkDeviceSize buffer_size, VkBufferUsageFlags usage_flags, VkMemoryPropertyFlags memory_flags) -{ - VulkanBuffer result = { - .size = buffer_size, - }; - - VkBufferCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, - .pNext = 0, - .flags = 0, - .size = buffer_size, - .usage = usage_flags, - .sharingMode = VK_SHARING_MODE_EXCLUSIVE, - .queueFamilyIndexCount = 0, - .pQueueFamilyIndices = 0, - }; - vkok(vkCreateBuffer(device, &create_info, allocation_callbacks, &result.handle)); - - VkMemoryRequirements memory_requirements; - vkGetBufferMemoryRequirements(device, result.handle, &memory_requirements); - - u8 use_device_address_bit = !!(create_info.usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); - result.memory = vk_allocate_memory(device, allocation_callbacks, physical_device_memory_properties, memory_requirements, memory_flags, use_device_address_bit); - - VkDeviceSize memory_offset = 0; - vkok(vkBindBufferMemory(device, result.handle, result.memory.handle, memory_offset)); - - u8 map_memory = !!(memory_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); - assert(((map_memory | use_device_address_bit) == 0) | (map_memory == !use_device_address_bit)); - if (map_memory) - { - void* data = 0; - VkDeviceSize offset = 0; - VkMemoryMapFlags map_flags = 0; - vkok(vkMapMemory(device, result.memory.handle, offset, memory_requirements.size, map_flags, &data)); - result.address = (u64)data; - } - - if (use_device_address_bit) - { - VkBufferDeviceAddressInfo device_address_info = { - .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, - .pNext = 0, - .buffer = result.handle, - }; - result.address = vkGetBufferDeviceAddress(device, &device_address_info); - } - - return result; -} - -fn VulkanBuffer buffer_create(Renderer* renderer, u64 size, BufferType type) -{ - u8 is_dst = (type == BUFFER_TYPE_VERTEX) | (type == BUFFER_TYPE_INDEX); - u8 is_src = type == BUFFER_TYPE_STAGING; - - VkBufferUsageFlags usage = - (VK_BUFFER_USAGE_TRANSFER_DST_BIT * is_dst) | - (VK_BUFFER_USAGE_TRANSFER_SRC_BIT * is_src) | - ((VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) * (type == BUFFER_TYPE_VERTEX)) | - (VK_BUFFER_USAGE_INDEX_BUFFER_BIT * (type == BUFFER_TYPE_INDEX)); - VkMemoryPropertyFlags memory_flags = - (VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT * is_dst) | - ((VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) * is_src); - let(result, vk_buffer_create(renderer->device, renderer->allocator, renderer->memory_properties, size, usage, memory_flags)); - result.type = type; - return result; -} - -fn u8 vk_layer_is_supported(String layer_name) -{ - assert(layer_name.pointer[layer_name.length] == 0); - - VkLayerProperties layers[256]; - u32 layer_count; - - vkok(vkEnumerateInstanceLayerProperties(&layer_count, 0)); - - if (layer_count > array_length(layers)) - { - failed_execution(); - } - - vkok(vkEnumerateInstanceLayerProperties(&layer_count, layers)); - - u8 supported = 0; - for (u32 i = 0; i < layer_count; i += 1) - { - VkLayerProperties* properties = &layers[i]; - - let(candidate_layer_name, cstr(properties->layerName)); - if (s_equal(candidate_layer_name, layer_name)) - { - supported = 1; - break; - } - } - - return supported; -} - -#if BB_DEBUG - -fn String message_severity_to_string(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity) -{ - switch (message_severity) - { - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: - return strlit("VERBOSE"); - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: - return strlit("INFO"); - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: - return strlit("WARNING"); - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: - return strlit("ERROR"); - default: - unreachable(); - } -} - -fn String message_type_to_string(VkDebugUtilsMessageTypeFlagBitsEXT message_type) -{ - switch (message_type) - { - case VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT: - return strlit("GENERAL"); - case VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT: - return strlit("VALIDATION"); - case VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT: - return strlit("PERFORMANCE"); - case VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT: - return strlit("DEVICE_ADDRESS_BINDING"); - default: - unreachable(); - } - -} - -fn VkBool32 VKAPI_CALL debug_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT message_type, const VkDebugUtilsMessengerCallbackDataEXT* callback_data, void* user_data) -{ - unused(user_data); - - if (callback_data->pMessage) - { - print("Validation message ({s}) ({s}) ({cstr}): {cstr}\n", message_severity_to_string(message_severity), message_type_to_string(message_type), callback_data->pMessageIdName ? callback_data->pMessageIdName : "ID_NONE", callback_data->pMessage); - } - - if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) - { - failed_execution(); - } - - return VK_FALSE; -} - -#endif - -fn void immediate_start(ImmediateContext context) -{ - VkFence fences[] = { context.fence }; - VkCommandBufferResetFlags reset_flags = 0; - - vkok(vkResetFences(context.device, array_length(fences), fences)); - vkok(vkResetCommandBuffer(context.command_buffer, reset_flags)); - - VkCommandBufferBeginInfo command_buffer_begin_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, - .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, - }; - vkok(vkBeginCommandBuffer(context.command_buffer, &command_buffer_begin_info)); -} - -fn void immediate_end(ImmediateContext context) -{ - VkFence fences[] = { context.fence }; - - vkok(vkEndCommandBuffer(context.command_buffer)); - - VkCommandBufferSubmitInfo command_buffer_submit_infos[] = { - { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO, - .pNext = 0, - .deviceMask = 0, - .commandBuffer = context.command_buffer, - } - }; - - VkSubmitFlags submit_flags = 0; - - VkSubmitInfo2 submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, - .pNext = 0, - .flags = submit_flags, - .waitSemaphoreInfoCount = 0, - .pWaitSemaphoreInfos = 0, - .commandBufferInfoCount = array_length(command_buffer_submit_infos), - .pCommandBufferInfos = command_buffer_submit_infos, - .signalSemaphoreInfoCount = 0, - .pSignalSemaphoreInfos = 0, - } - }; - - vkok(vkQueueSubmit2(context.queue, array_length(submit_info), submit_info, context.fence)); - VkBool32 wait_all = 1; - let(timeout, ~(u64)0); - vkok(vkWaitForFences(context.device, array_length(fences), fences, wait_all, timeout)); -} - -fn VulkanImage vk_image_create(VkDevice device, const VkAllocationCallbacks* allocation_callbacks, VkPhysicalDeviceMemoryProperties memory_properties, VulkanImageCreate create) -{ - assert(create.width); - assert(create.height); - VulkanImage result = {}; - result.format = create.format; - - VkImageCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .imageType = VK_IMAGE_TYPE_2D, - .format = create.format, - .extent = { - .width = create.width, - .height = create.height, - .depth = 1, - }, - .mipLevels = create.mip_levels, - .arrayLayers = 1, - .samples = VK_SAMPLE_COUNT_1_BIT, - .tiling = VK_IMAGE_TILING_OPTIMAL, - .usage = create.usage, - .sharingMode = 0, - .queueFamilyIndexCount = 0, - .pQueueFamilyIndices = 0, - .initialLayout = 0, - }; - vkok(vkCreateImage(device, &create_info, allocation_callbacks, &result.handle)); - - VkMemoryRequirements memory_requirements; - vkGetImageMemoryRequirements(device, result.handle, &memory_requirements); - - VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - u8 use_device_address_bit = 0; - result.memory = vk_allocate_memory(device, allocation_callbacks, memory_properties, memory_requirements, flags, use_device_address_bit); - - VkDeviceSize memory_offset = 0; - vkok(vkBindImageMemory(device, result.handle, result.memory.handle, memory_offset)); - - VkImageViewCreateInfo view_create_info = { - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - .image = result.handle, - .viewType = VK_IMAGE_VIEW_TYPE_2D, - .format = create_info.format, - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = create.mip_levels, - .baseArrayLayer = 0, - .layerCount = 1, - }, - }; - - vkok(vkCreateImageView(device, &view_create_info, allocation_callbacks, &result.view)); - return result; -} - -fn void vk_image_transition(VkCommandBuffer command_buffer, VkImage image, VkImageLayout old_layout, VkImageLayout new_layout) -{ - VkImageMemoryBarrier2 image_barrier = { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, - .srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, - .srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT, - .dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, - .dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT, - .oldLayout = old_layout, - .newLayout = new_layout, - .image = image, - .subresourceRange = { - .aspectMask = (new_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL) ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = VK_REMAINING_MIP_LEVELS, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }, - }; - - VkDependencyInfo dependency_info = { - .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &image_barrier, - }; - - vkCmdPipelineBarrier2(command_buffer, &dependency_info); -} - -fn void vk_image_copy(VkCommandBuffer command_buffer, VulkanCopyImageArgs args) -{ - VkImageSubresourceLayers subresource_layers = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = 0, - .baseArrayLayer = 0, - .layerCount = 1, - }; - VkImageBlit2 blit_regions[] = { - { - .sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2, - .pNext = 0, - .srcSubresource = subresource_layers, - .srcOffsets = { - [1] = { - .x = args.source.extent.width, - .y = args.source.extent.height, - .z = 1, - }, - }, - .dstSubresource = subresource_layers, - .dstOffsets = { - [1] = { - .x = args.destination.extent.width, - .y = args.destination.extent.height, - .z = 1, - }, - }, - }, - }; - - VkBlitImageInfo2 blit_info = { - .sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2, - .pNext = 0, - .srcImage = args.source.handle, - .srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - .dstImage = args.destination.handle, - .dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - .regionCount = array_length(blit_regions), - .pRegions = blit_regions, - .filter = VK_FILTER_LINEAR, - }; - - vkCmdBlitImage2(command_buffer, &blit_info); -} - -fn Renderer* rendering_initialize(Arena* arena) -{ - Renderer* renderer = &renderer_memory; - -#ifdef __linux__ - vulkan_library = os_library_load("libvulkan.so.1"); -#elif _WIN32 - vulkan_library = os_library_load("vulkan-1.dll"); -#elif __APPLE__ - vulkan_library = os_library_load("libvulkan.dylib"); - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("libvulkan.1.dylib"); - } - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("libMoltenVK.dylib"); - } - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("vulkan.framework/vulkan"); - } - - if (!os_library_is_valid(vulkan_library)) - { - vulkan_library = os_library_load("MoltenVK.framework/MoltenVK"); - } -#endif - - if (!os_library_is_valid(vulkan_library)) - { - failed_execution(); - } - - vkGetInstanceProcAddr = os_symbol_load(vulkan_library, "vkGetInstanceProcAddr"); - if (!vkGetInstanceProcAddr) - { - failed_execution(); - } - - vulkan_load_instance_function(0, vkEnumerateInstanceVersion); - vulkan_load_instance_function(0, vkCreateInstance); - - u32 api_version = 0; - if (vkEnumerateInstanceVersion) - { - vkok(vkEnumerateInstanceVersion(&api_version)); - } - - if (!api_version) - { - if (vkCreateInstance) - { - api_version = VK_API_VERSION_1_0; - } - } - - if (!api_version) - { - failed_execution(); - } - - if (api_version < VK_API_VERSION_1_3) - { - failed_execution(); - } - - // Proceed to load Vulkan instance-level functions - vulkan_load_instance_function(0, vkEnumerateInstanceLayerProperties); - - { -#if BB_DEBUG - let(debug_layer, strlit("VK_LAYER_KHRONOS_validation")); - if (!vk_layer_is_supported(debug_layer)) - { - failed_execution(); - } - const char* layers[] = - { - string_to_c(debug_layer), - }; - let(layer_count, array_length(layers)); -#else - const char** layers = 0; - u32 layer_count = 0; -#endif - - const char* extensions[] = { -#if BB_DEBUG - VK_EXT_DEBUG_UTILS_EXTENSION_NAME, -#endif - VK_KHR_SURFACE_EXTENSION_NAME, -#ifdef VK_USE_PLATFORM_WIN32_KHR - VK_KHR_WIN32_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_XLIB_KHR - VK_KHR_XLIB_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_XCB_KHR - VK_KHR_XCB_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_WAYLAND_KHR - VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, -#endif -#ifdef VK_USE_PLATFORM_METAL_EXT - VK_EXT_METAL_SURFACE_EXTENSION_NAME, - VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, -#endif - }; - -#if BB_DEBUG - VkValidationFeatureEnableEXT enabled_validation_features[] = - { - VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT, - }; - - VkDebugUtilsMessengerCreateInfoEXT msg_ci = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, - .pNext = 0, - .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, - .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT, - .pfnUserCallback = debug_callback, - .pUserData = 0, - }; - - u8 enable_shader_debug_printf = BB_DEBUG; - - VkValidationFeaturesEXT validation_features = { - .sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, - .enabledValidationFeatureCount = array_length(enabled_validation_features), - .pEnabledValidationFeatures = enabled_validation_features, - .pNext = &msg_ci, - }; - -#endif -#if BB_DEBUG - let(pNext, enable_shader_debug_printf ? (void*)&validation_features : (void*)&msg_ci); -#else - void* pNext = 0; -#endif - VkApplicationInfo app_info = { - .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, - .apiVersion = api_version, - }; - VkInstanceCreateInfo ci = { - .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, - .pNext = pNext, -#if __APPLE__ - .flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR, -#else - .flags = 0, -#endif - .pApplicationInfo = &app_info, - .ppEnabledLayerNames = layers, - .enabledLayerCount = layer_count, - .ppEnabledExtensionNames = extensions, - .enabledExtensionCount = array_length(extensions), - }; - - vkok(vkCreateInstance(&ci, renderer->allocator, &instance)); - -#if BB_DEBUG - vulkan_load_instance_function(instance, vkCreateDebugUtilsMessengerEXT); - VkDebugUtilsMessengerEXT messenger; - vkok(vkCreateDebugUtilsMessengerEXT(instance, &msg_ci, renderer->allocator, &messenger)); -#endif - } - - vulkan_load_instance_function(instance, vkGetDeviceProcAddr); - vulkan_load_instance_function(instance, vkEnumeratePhysicalDevices); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceMemoryProperties); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceProperties); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceQueueFamilyProperties); - vulkan_load_instance_function(instance, vkCreateDevice); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceSurfaceCapabilitiesKHR); - vulkan_load_instance_function(instance, vkGetPhysicalDeviceSurfacePresentModesKHR); -#ifdef VK_USE_PLATFORM_XCB_KHR - vulkan_load_instance_function(instance, vkCreateXcbSurfaceKHR); -#endif -#ifdef VK_USE_PLATFORM_WIN32_KHR - vulkan_load_instance_function(instance, vkCreateWin32SurfaceKHR); -#endif -#ifdef VK_USE_PLATFORM_WIN32_KHR - vulkan_load_instance_function(instance, vkCreateWin32SurfaceKHR); -#endif -#ifdef VK_USE_PLATFORM_METAL_EXT - vulkan_load_instance_function(instance, vkCreateMetalSurfaceEXT); -#endif - - { - u32 physical_device_count; - VkPhysicalDevice physical_devices[256]; - vkok(vkEnumeratePhysicalDevices(instance, &physical_device_count, 0)); - - if (physical_device_count == 0) - { - failed_execution(); - } - - if (physical_device_count > array_length(physical_devices)) - { - failed_execution(); - } - - vkok(vkEnumeratePhysicalDevices(instance, &physical_device_count, physical_devices)); - - renderer->physical_device = physical_devices[0]; - } - - vkGetPhysicalDeviceMemoryProperties(renderer->physical_device, &renderer->memory_properties); - - u32 graphics_queue_family_index; - { - u32 present_queue_family_index; - VkPhysicalDeviceProperties properties; - vkGetPhysicalDeviceProperties(renderer->physical_device, &properties); - - u32 queue_count; - vkGetPhysicalDeviceQueueFamilyProperties(renderer->physical_device, &queue_count, 0); - - VkQueueFamilyProperties queue_properties[64]; - if (queue_count > array_length(queue_properties)) - { - failed_execution(); - } - - vkGetPhysicalDeviceQueueFamilyProperties(renderer->physical_device, &queue_count, queue_properties); - - for (graphics_queue_family_index = 0; graphics_queue_family_index < queue_count; graphics_queue_family_index += 1) - { - VkQueueFamilyProperties* properties = &queue_properties[graphics_queue_family_index]; - if (properties->queueFlags & VK_QUEUE_GRAPHICS_BIT) - { - break; - } - } - - if (graphics_queue_family_index == queue_count) - { - failed_execution(); - } - - present_queue_family_index = 0; - - // for (present_queue_family_index = 0; present_queue_family_index < queue_count; present_queue_family_index += 1) - // { - // VkBool32 support; - // vkok(vkGetPhysicalDeviceSurfaceSupportKHR(physical_device, present_queue_family_index, surface, &support)); - // if (support) - // { - // break; - // } - // } - - if (present_queue_family_index == queue_count) - { - failed_execution(); - } - - if (present_queue_family_index != graphics_queue_family_index) - { - failed_execution(); - } - - f32 queue_priorities[] = { 1.0f }; - VkDeviceQueueCreateInfo queue_create_infos[] = { - { - .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, - .queueFamilyIndex = graphics_queue_family_index, - .queueCount = array_length(queue_priorities), - .pQueuePriorities = queue_priorities, - }, - }; - - const char* extensions[] = - { - VK_KHR_SWAPCHAIN_EXTENSION_NAME, -#ifdef __APPLE__ - "VK_KHR_portability_subset", - VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, -#endif - }; - -#ifdef __APPLE__ - VkPhysicalDeviceDynamicRenderingFeatures dynamic_rendering_features = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, - .pNext = 0, - .dynamicRendering = VK_TRUE, - }; -#else - VkPhysicalDeviceVulkan13Features features13 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES, - .dynamicRendering = 1, - .synchronization2 = 1, - }; -#endif - - VkPhysicalDeviceVulkan12Features features12 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - .bufferDeviceAddress = 1, - .descriptorIndexing = 1, - .runtimeDescriptorArray = 1, - .shaderSampledImageArrayNonUniformIndexing = 1, -#ifdef __APPLE__ - .pNext = &dynamic_rendering_features, -#else - .pNext = &features13, -#endif - }; - - VkPhysicalDeviceFeatures2 features = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, - .features = { - }, - .pNext = &features12, - }; - - VkDeviceCreateInfo ci = { - .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, - .ppEnabledExtensionNames = extensions, - .enabledExtensionCount = array_length(extensions), - .pQueueCreateInfos = queue_create_infos, - .queueCreateInfoCount = array_length(queue_create_infos), - .pNext = &features, - }; - - vkok(vkCreateDevice(renderer->physical_device, &ci, renderer->allocator, &renderer->device)); - } - - // Load device table - vulkan_load_device_function(renderer->device, vkCreateSwapchainKHR); - vulkan_load_device_function(renderer->device, vkDestroySwapchainKHR); - vulkan_load_device_function(renderer->device, vkGetSwapchainImagesKHR); - vulkan_load_device_function(renderer->device, vkGetImageMemoryRequirements); - vulkan_load_device_function(renderer->device, vkGetBufferMemoryRequirements); - vulkan_load_device_function(renderer->device, vkMapMemory); - vulkan_load_device_function(renderer->device, vkUnmapMemory); - vulkan_load_device_function(renderer->device, vkAllocateMemory); - vulkan_load_device_function(renderer->device, vkBindImageMemory); - vulkan_load_device_function(renderer->device, vkBindBufferMemory); - vulkan_load_device_function(renderer->device, vkBindBufferMemory); - vulkan_load_device_function(renderer->device, vkGetDeviceQueue); - vulkan_load_device_function(renderer->device, vkCreateCommandPool); - vulkan_load_device_function(renderer->device, vkAllocateCommandBuffers); - vulkan_load_device_function(renderer->device, vkCreateFence); - vulkan_load_device_function(renderer->device, vkCreateSemaphore); - vulkan_load_device_function(renderer->device, vkCreateSampler); - vulkan_load_device_function(renderer->device, vkCreateShaderModule); - vulkan_load_device_function(renderer->device, vkCreateDescriptorSetLayout); - vulkan_load_device_function(renderer->device, vkCreatePipelineLayout); - vulkan_load_device_function(renderer->device, vkCreateGraphicsPipelines); - vulkan_load_device_function(renderer->device, vkCreateImage); - vulkan_load_device_function(renderer->device, vkCreateImageView); - vulkan_load_device_function(renderer->device, vkCreateBuffer); - vulkan_load_device_function(renderer->device, vkCreateDescriptorPool); - vulkan_load_device_function(renderer->device, vkAllocateDescriptorSets); - vulkan_load_device_function(renderer->device, vkResetFences); - vulkan_load_device_function(renderer->device, vkResetCommandBuffer); - vulkan_load_device_function(renderer->device, vkBeginCommandBuffer); - vulkan_load_device_function(renderer->device, vkCmdPipelineBarrier2); - vulkan_load_device_function(renderer->device, vkCmdCopyBufferToImage); - vulkan_load_device_function(renderer->device, vkEndCommandBuffer); - vulkan_load_device_function(renderer->device, vkQueueSubmit2); - vulkan_load_device_function(renderer->device, vkWaitForFences); - vulkan_load_device_function(renderer->device, vkUpdateDescriptorSets); - vulkan_load_device_function(renderer->device, vkAcquireNextImageKHR); - vulkan_load_device_function(renderer->device, vkGetBufferDeviceAddress); - vulkan_load_device_function(renderer->device, vkCmdCopyBuffer2); - vulkan_load_device_function(renderer->device, vkCmdSetViewport); - vulkan_load_device_function(renderer->device, vkCmdSetScissor); - vulkan_load_device_function(renderer->device, vkCmdBeginRendering); - vulkan_load_device_function(renderer->device, vkCmdEndRendering); - vulkan_load_device_function(renderer->device, vkCmdBindPipeline); - vulkan_load_device_function(renderer->device, vkCmdBindDescriptorSets); - vulkan_load_device_function(renderer->device, vkCmdBindIndexBuffer); - vulkan_load_device_function(renderer->device, vkCmdPushConstants); - vulkan_load_device_function(renderer->device, vkCmdDrawIndexed); - vulkan_load_device_function(renderer->device, vkCmdBlitImage2); - vulkan_load_device_function(renderer->device, vkQueuePresentKHR); - vulkan_load_device_function(renderer->device, vkDeviceWaitIdle); - vulkan_load_device_function(renderer->device, vkDestroyImageView); - vulkan_load_device_function(renderer->device, vkDestroyImage); - vulkan_load_device_function(renderer->device, vkFreeMemory); - - vkGetDeviceQueue(renderer->device, graphics_queue_family_index, 0, &renderer->graphics_queue); - - renderer->immediate.device = renderer->device; - renderer->immediate.queue = renderer->graphics_queue; - - VkCommandPoolCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, - .queueFamilyIndex = graphics_queue_family_index, - }; - vkok(vkCreateCommandPool(renderer->device, &create_info, renderer->allocator, &renderer->immediate.command_pool)); - - VkCommandBufferAllocateInfo command_buffer_allocate_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, - .commandPool = renderer->immediate.command_pool, - .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - .commandBufferCount = 1, - }; - - vkok(vkAllocateCommandBuffers(renderer->device, &command_buffer_allocate_info, &renderer->immediate.command_buffer)); - VkFenceCreateInfo fence_create_info = { - .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, - .flags = VK_FENCE_CREATE_SIGNALED_BIT, - }; - vkok(vkCreateFence(renderer->device, &fence_create_info, renderer->allocator, &renderer->immediate.fence)); - - { - VkFilter sampler_filter = VK_FILTER_LINEAR; - VkSamplerCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, - .pNext = 0, - .flags = 0, - .magFilter = sampler_filter, - .minFilter = sampler_filter, - .mipmapMode = 0, - .addressModeU = 0, - .addressModeV = 0, - .addressModeW = 0, - .mipLodBias = 0, - .anisotropyEnable = 0, - .maxAnisotropy = 0, - .compareEnable = 0, - .compareOp = 0, - .minLod = 0, - .maxLod = 0, - .borderColor = 0, - .unnormalizedCoordinates = 0, - }; - - vkok(vkCreateSampler(renderer->device, &create_info, renderer->allocator, &renderer->sampler)); - } - - String shader_binaries[] = { - strlit(BUILD_DIR "/" "rect.vert.spv"), - strlit(BUILD_DIR "/" "rect.frag.spv"), - }; - - PipelineLayoutCreate pipeline_layouts[] = { - (PipelineLayoutCreate) { - .push_constant_ranges = array_to_slice(((PushConstantRange[]){ - (PushConstantRange) { - .offset = 0, - .size = sizeof(GPUDrawPushConstants), - .stage = SHADER_STAGE_VERTEX, - }, - })), - .descriptor_set_layouts = array_to_slice(((DescriptorSetLayoutCreate[]){ - (DescriptorSetLayoutCreate) { - .bindings = array_to_slice(((DescriptorSetLayoutBinding[]) { - { - .binding = 0, - .type = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER, - .stage = SHADER_STAGE_FRAGMENT, - .count = RECT_TEXTURE_SLOT_COUNT, - }, - })), - }, - })), - }, - }; - PipelineCreate pipeline_create[] = { - (PipelineCreate) { - .shader_source_indices = array_to_slice(((u16[]){0, 1})), - .layout_index = 0, - }, - }; - GraphicsPipelinesCreate create_data = { - .layouts = array_to_slice(pipeline_layouts), - .pipelines = array_to_slice(pipeline_create), - .shader_binaries = array_to_slice(shader_binaries), - }; - let(graphics_pipeline_count, create_data.pipelines.length); - assert(graphics_pipeline_count); - let(pipeline_layout_count, create_data.layouts.length); - assert(pipeline_layout_count); - assert(pipeline_layout_count <= graphics_pipeline_count); - let(shader_count, create_data.shader_binaries.length); - - VkPipeline pipeline_handles[BB_PIPELINE_COUNT]; - VkPipelineShaderStageCreateInfo shader_create_infos[MAX_SHADER_MODULE_COUNT_PER_PIPELINE]; - VkGraphicsPipelineCreateInfo graphics_pipeline_create_infos[BB_PIPELINE_COUNT]; - - VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .vertexBindingDescriptionCount = 0, - .pVertexBindingDescriptions = 0, - .vertexAttributeDescriptionCount = 0, - .pVertexAttributeDescriptions = 0, - }; - - VkPipelineInputAssemblyStateCreateInfo input_assembly_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - .primitiveRestartEnable = VK_FALSE, - }; - - VkPipelineViewportStateCreateInfo viewport_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, - .pNext = 0, - .viewportCount = 1, - .scissorCount = 1, - }; - - VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .depthClampEnable = 0, - .rasterizerDiscardEnable = 0, - .polygonMode = VK_POLYGON_MODE_FILL, - .cullMode = VK_CULL_MODE_NONE, - .frontFace = VK_FRONT_FACE_CLOCKWISE, - .depthBiasEnable = 0, - .depthBiasConstantFactor = 0, - .depthBiasClamp = 0, - .depthBiasSlopeFactor = 0, - .lineWidth = 1.0f, - }; - - VkPipelineMultisampleStateCreateInfo multisample_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, - .sampleShadingEnable = 0, - .minSampleShading = 1.0f, - .pSampleMask = 0, - .alphaToCoverageEnable = 0, - .alphaToOneEnable = 0, - }; - - VkPipelineDepthStencilStateCreateInfo depth_stencil_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .depthTestEnable = 0, - .depthWriteEnable = 0, - .depthCompareOp = VK_COMPARE_OP_NEVER, - .depthBoundsTestEnable = 0, - .stencilTestEnable = 0, - .front = {}, - .back = {}, - .minDepthBounds = 0.0f, - .maxDepthBounds = 1.0f, - }; - - VkPipelineColorBlendAttachmentState attachments[] = { - { - .blendEnable = 1, - .srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA, - .dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, - .colorBlendOp = VK_BLEND_OP_ADD, - .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, - .dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO, - .alphaBlendOp = VK_BLEND_OP_ADD, - .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, - }, - }; - - VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .logicOpEnable = VK_FALSE, - .logicOp = VK_LOGIC_OP_COPY, - .attachmentCount = array_length(attachments), - .pAttachments = attachments, - .blendConstants = {}, - }; - - VkDynamicState states[] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR }; - - VkPipelineDynamicStateCreateInfo dynamic_state_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .dynamicStateCount = array_length(states), - .pDynamicStates = states, - }; - - // TODO: abstract away - VkFormat common_image_format = VK_FORMAT_B8G8R8A8_UNORM; - VkFormat color_attachment_formats[] = { - common_image_format, - }; - - VkPipelineRenderingCreateInfo rendering_create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, - .pNext = 0, - .viewMask = 0, - .colorAttachmentCount = array_length(color_attachment_formats), - .pColorAttachmentFormats = color_attachment_formats, - .depthAttachmentFormat = 0, - .stencilAttachmentFormat = 0, - }; - - let(shader_modules, arena_allocate(arena, VkShaderModule, shader_count)); - - for (u64 i = 0; i < shader_count; i += 1) - { - String shader_binary_path = create_data.shader_binaries.pointer[i]; - - let(binary, file_read(arena, shader_binary_path)); - - VkShaderModuleCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, - .codeSize = binary.length, - .pCode = (u32*)binary.pointer, - }; - - vkok(vkCreateShaderModule(renderer->device, &create_info, renderer->allocator, &shader_modules[i])); - } - - for (u64 pipeline_index = 0; pipeline_index < pipeline_layout_count; pipeline_index += 1) - { - let(create, create_data.layouts.pointer[pipeline_index]); - let(descriptor_set_layout_count, create.descriptor_set_layouts.length); - let(push_constant_range_count, create.push_constant_ranges.length); - let(pipeline, &renderer->pipelines[pipeline_index]); - pipeline->descriptor_set_count = descriptor_set_layout_count; - pipeline->push_constant_range_count = push_constant_range_count; - - if (descriptor_set_layout_count > MAX_DESCRIPTOR_SET_LAYOUT_COUNT) - { - failed_execution(); - } - - // u16 descriptor_type_counter[DESCRIPTOR_TYPE_COUNT] = {}; - - for (u64 descriptor_set_layout_index = 0; descriptor_set_layout_index < descriptor_set_layout_count; descriptor_set_layout_index += 1) - { - let(set_layout_create, create.descriptor_set_layouts.pointer[descriptor_set_layout_index]); - let(binding_count, set_layout_create.bindings.length); - let(descriptor_set_layout_bindings, &pipeline->descriptor_set_layout_bindings[descriptor_set_layout_index]); - descriptor_set_layout_bindings->count = binding_count; - - for (u64 binding_index = 0; binding_index < binding_count; binding_index += 1) - { - let(binding_descriptor, set_layout_create.bindings.pointer[binding_index]); - - VkDescriptorType descriptor_type = vulkan_descriptor_type(binding_descriptor.type); - - VkShaderStageFlags shader_stage = vulkan_shader_stage(binding_descriptor.stage); - - descriptor_set_layout_bindings->buffer[binding_index] = (VkDescriptorSetLayoutBinding) { - .binding = binding_descriptor.binding, - .descriptorType = descriptor_type, - .descriptorCount = binding_descriptor.count, - .stageFlags = shader_stage, - .pImmutableSamplers = 0, - }; - } - - VkDescriptorSetLayoutCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .pNext = 0, - .flags = 0, - .bindingCount = binding_count, - .pBindings = descriptor_set_layout_bindings->buffer, - }; - - vkok(vkCreateDescriptorSetLayout(renderer->device, &create_info, renderer->allocator, &pipeline->descriptor_set_layouts[descriptor_set_layout_index])); - } - - if (push_constant_range_count > MAX_PUSH_CONSTANT_RANGE_COUNT) - { - failed_execution(); - } - - for (u64 push_constant_index = 0; push_constant_index < push_constant_range_count; push_constant_index += 1) - { - let(push_constant_descriptor, create.push_constant_ranges.pointer[push_constant_index]); - pipeline->push_constant_ranges[push_constant_index] = (VkPushConstantRange) { - .stageFlags = vulkan_shader_stage(push_constant_descriptor.stage), - .offset = push_constant_descriptor.offset, - .size = push_constant_descriptor.size, - }; - } - - VkPipelineLayoutCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - .pNext = 0, - .flags = 0, - .setLayoutCount = descriptor_set_layout_count, - .pSetLayouts = pipeline->descriptor_set_layouts, - .pushConstantRangeCount = push_constant_range_count, - .pPushConstantRanges = pipeline->push_constant_ranges, - }; - - vkok(vkCreatePipelineLayout(renderer->device, &create_info, renderer->allocator, &pipeline->layout)); - } - - for (u64 i = 0; i < graphics_pipeline_count; i += 1) - { - let(create, create_data.pipelines.pointer[i]); - let(pipeline_shader_count, create.shader_source_indices.length); - if (pipeline_shader_count > MAX_SHADER_MODULE_COUNT_PER_PIPELINE) - { - failed_execution(); - } - - for (u64 i = 0; i < pipeline_shader_count; i += 1) - { - let(shader_index, create.shader_source_indices.pointer[i]); - let(shader_source_path, create_data.shader_binaries.pointer[shader_index]); - - shader_create_infos[i] = (VkPipelineShaderStageCreateInfo) { - .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - .pNext = 0, - .flags = 0, - .stage = vulkan_shader_stage_from_path(shader_source_path), - .module = shader_modules[i], - .pName = "main", - .pSpecializationInfo = 0, - }; - } - - graphics_pipeline_create_infos[i] = (VkGraphicsPipelineCreateInfo) - { - .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, - .pNext = &rendering_create_info, - .flags = 0, - .stageCount = shader_count, - .pStages = shader_create_infos, - .pVertexInputState = &vertex_input_state_create_info, - .pInputAssemblyState = &input_assembly_state_create_info, - .pTessellationState = 0, - .pViewportState = &viewport_state_create_info, - .pRasterizationState = &rasterization_state_create_info, - .pMultisampleState = &multisample_state_create_info, - .pDepthStencilState = &depth_stencil_state_create_info, - .pColorBlendState = &color_blend_state_create_info, - .pDynamicState = &dynamic_state_create_info, - .layout = renderer->pipelines[i].layout, - .renderPass = 0, - .subpass = 0, - .basePipelineHandle = 0, - .basePipelineIndex = 0, - }; - } - - VkPipelineCache pipeline_cache = 0; - vkok(vkCreateGraphicsPipelines(renderer->device, pipeline_cache, graphics_pipeline_count, graphics_pipeline_create_infos, renderer->allocator, pipeline_handles)); - - for (u32 i = 0; i < graphics_pipeline_count; i += 1) - { - renderer->pipelines[i].handle = pipeline_handles[i]; - } - - return renderer; -} - -fn void destroy_image(Renderer* renderer, VulkanImage image) -{ - vkDestroyImageView(renderer->device, image.view, renderer->allocator); - vkDestroyImage(renderer->device, image.handle, renderer->allocator); - vkFreeMemory(renderer->device, image.memory.handle, renderer->allocator); -} - -fn void swapchain_recreate(Renderer* renderer, RenderWindow* window) -{ - VkSurfaceCapabilitiesKHR surface_capabilities; - vkok(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(renderer->physical_device, window->surface, &surface_capabilities)); - - VkSwapchainKHR old_swapchain = window->swapchain; - VkImageView old_swapchain_image_views[MAX_SWAPCHAIN_IMAGE_COUNT]; - - if (old_swapchain) - { - vkok(vkDeviceWaitIdle(renderer->device)); - for (u32 i = 0; i < window->swapchain_image_count; i += 1) - { - old_swapchain_image_views[i] = window->swapchain_image_views[i]; - } - } - - u32 queue_family_indices[] = { renderer->graphics_queue_family_index }; - VkImageUsageFlags swapchain_image_usage_flags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; - window->swapchain_image_format = VK_FORMAT_B8G8R8A8_UNORM; - window->last_width = window->width; - window->last_height = window->height; - window->width = surface_capabilities.currentExtent.width; - window->height = surface_capabilities.currentExtent.height; - - VkPresentModeKHR preferred_present_mode = VK_PRESENT_MODE_IMMEDIATE_KHR; - VkPresentModeKHR present_modes[16]; - u32 present_mode_count = array_length(present_modes); - vkok(vkGetPhysicalDeviceSurfacePresentModesKHR(renderer->physical_device, window->surface, &present_mode_count, present_modes)); - - for (u32 i = 0; i < present_mode_count; i += 1) - { - if (present_modes[i] == VK_PRESENT_MODE_MAILBOX_KHR) - { - preferred_present_mode = VK_PRESENT_MODE_MAILBOX_KHR; - break; - } - } - - VkSwapchainCreateInfoKHR swapchain_create_info = { - .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, - .pNext = 0, - .flags = 0, - .surface = window->surface, - .minImageCount = surface_capabilities.minImageCount, - .imageFormat = window->swapchain_image_format, - .imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, - .imageExtent = surface_capabilities.currentExtent, - .imageArrayLayers = 1, - .imageUsage = swapchain_image_usage_flags, - .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, - .queueFamilyIndexCount = array_length(queue_family_indices), - .pQueueFamilyIndices = queue_family_indices, - .preTransform = surface_capabilities.currentTransform, - .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, - .presentMode = preferred_present_mode, - .clipped = 0, - .oldSwapchain = window->swapchain, - }; - - vkok(vkCreateSwapchainKHR(renderer->device, &swapchain_create_info, renderer->allocator, &window->swapchain)); - - assert(window->swapchain != old_swapchain); - - if (old_swapchain) - { - for (u32 i = 0; i < window->swapchain_image_count; i += 1) - { - vkDestroyImageView(renderer->device, old_swapchain_image_views[i], renderer->allocator); - } - - vkDestroySwapchainKHR(renderer->device, old_swapchain, renderer->allocator); - - destroy_image(renderer, window->render_image); - } - - { - vkok(vkGetSwapchainImagesKHR(renderer->device, window->swapchain, &window->swapchain_image_count, 0)); - - if (window->swapchain_image_count == 0) - { - failed_execution(); - } - - if (window->swapchain_image_count > array_length(window->swapchain_images)) - { - failed_execution(); - } - - vkok(vkGetSwapchainImagesKHR(renderer->device, window->swapchain, &window->swapchain_image_count, window->swapchain_images)); - - // VkImageViewUsageCreateInfo image_view_usage_create_info = { - // .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, - // .pNext = 0, - // .usage = swapchain_create_info.imageUsage, - // }; - - for (u32 i = 0; i < window->swapchain_image_count; i += 1) - { - VkImageViewCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - // .pNext = &image_view_usage_create_info, - .flags = 0, - .image = window->swapchain_images[i], - .viewType = VK_IMAGE_VIEW_TYPE_2D, - .format = swapchain_create_info.imageFormat, - .components = { - .r = VK_COMPONENT_SWIZZLE_IDENTITY, - .g = VK_COMPONENT_SWIZZLE_IDENTITY, - .b = VK_COMPONENT_SWIZZLE_IDENTITY, - .a = VK_COMPONENT_SWIZZLE_IDENTITY, - }, - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }, - }; - - vkok(vkCreateImageView(renderer->device, &create_info, renderer->allocator, &window->swapchain_image_views[i])); - } - } - - window->render_image = vk_image_create(renderer->device, renderer->allocator, renderer->memory_properties, (VulkanImageCreate) { - .width = surface_capabilities.currentExtent.width, - .height = surface_capabilities.currentExtent.height, - .mip_levels = 1, - .format = window->swapchain_image_format, - .usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, - }); -} - -fn RenderWindow* rendering_initialize_window(Renderer* renderer, WindowingInstance* window) -{ - // TODO: truly allocate - RenderWindow* render_window = &renderer_window_memory; - -#if BB_WINDOWING_BACKEND_X11 - VkXcbSurfaceCreateInfoKHR create_info = { - .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, - .pNext = 0, - .flags = 0, - .connection = xcb_connection_get(), - .window = xcb_window_from_windowing_instance(window), - }; - vkok(vkCreateXcbSurfaceKHR(instance, &create_info, renderer->allocator, &render_window->surface)); -#endif - -#if BB_WINDOWING_BACKEND_WIN32 - VkWin32SurfaceCreateInfoKHR create_info = { - .sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, - .pNext = 0, - .flags = 0, - .hinstance = windowing_connection.instance, - .hwnd = window->handle, - }; - vkok(vkCreateWin32SurfaceKHR(instance, &create_info, renderer->allocator, &render_window->surface)); -#endif - -#if BB_WINDOWING_BACKEND_COCOA - CAMetalLayer* layer = [CAMetalLayer layer]; - layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; - layer.framebufferOnly = true; - layer.frame = window.frame; - window.contentView.layer = layer; - window.opaque = true; - window.backgroundColor = nil; - - VkMetalSurfaceCreateInfoEXT create_info = { - .sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT, - .pNext = 0, - .flags = 0, - .pLayer = [CAMetalLayer layer], - }; - vkCreateMetalSurfaceEXT(instance, &create_info, renderer->allocator, &render_window->surface); -#endif - - WindowingSize window_size = windowing_get_instance_framebuffer_size(window); - - swapchain_recreate(renderer, render_window); - - for (u64 frame_index = 0; frame_index < MAX_FRAME_COUNT; frame_index += 1) - { - for (u64 pipeline_index = 0; pipeline_index < BB_PIPELINE_COUNT; pipeline_index += 1) - { - render_window->frames[frame_index].pipeline_instantiations[pipeline_index].vertex_buffer.gpu.type = BUFFER_TYPE_VERTEX; - render_window->frames[frame_index].pipeline_instantiations[pipeline_index].index_buffer.gpu.type = BUFFER_TYPE_INDEX; - render_window->frames[frame_index].pipeline_instantiations[pipeline_index].transient_buffer.type = BUFFER_TYPE_STAGING; - } - } - - for (u64 pipeline_index = 0; pipeline_index < BB_PIPELINE_COUNT; pipeline_index += 1) - { - let(pipeline_descriptor, &renderer->pipelines[pipeline_index]); - let(pipeline_instantiation, &render_window->pipeline_instantiations[pipeline_index]); - - u16 descriptor_type_counter[DESCRIPTOR_TYPE_COUNT] = {}; - - for (u64 descriptor_index = 0; descriptor_index < pipeline_descriptor->descriptor_set_count; descriptor_index += 1) - { - let(descriptor_set_layout_bindings, &pipeline_descriptor->descriptor_set_layout_bindings[descriptor_index]); - - for (u64 binding_index = 0; binding_index < descriptor_set_layout_bindings->count; binding_index += 1) - { - let(binding_descriptor, &descriptor_set_layout_bindings->buffer[binding_index]); - let(descriptor_type, descriptor_type_from_vulkan(binding_descriptor->descriptorType)); - let(counter_ptr, &descriptor_type_counter[descriptor_type]); - let(old_counter, *counter_ptr); - *counter_ptr = old_counter + binding_descriptor->descriptorCount; - } - } - - VkDescriptorPoolSize pool_sizes[DESCRIPTOR_TYPE_COUNT]; - u32 pool_size_count = 0; - - for (DescriptorType i = 0; i < DESCRIPTOR_TYPE_COUNT; i += 1) - { - let(count, descriptor_type_counter[i]); - if (count) - { - let(pool_size, &pool_sizes[pool_size_count]); - pool_size_count += 1; - - *pool_size = (VkDescriptorPoolSize) { - .type = vulkan_descriptor_type(i), - .descriptorCount = count, - }; - } - } - - VkDescriptorPoolCreateInfo create_info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, - .pNext = 0, - .flags = 0, - .maxSets = pipeline_descriptor->descriptor_set_count, - .poolSizeCount = pool_size_count, - .pPoolSizes = pool_sizes, - }; - - VkDescriptorPool descriptor_pool; - vkok(vkCreateDescriptorPool(renderer->device, &create_info, renderer->allocator, &descriptor_pool)); - - VkDescriptorSetAllocateInfo allocate_info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, - .pNext = 0, - .descriptorPool = descriptor_pool, - .descriptorSetCount = pipeline_descriptor->descriptor_set_count, - .pSetLayouts = pipeline_descriptor->descriptor_set_layouts, - }; - - vkok(vkAllocateDescriptorSets(renderer->device, &allocate_info, pipeline_instantiation->descriptor_sets)); - } - - for (u32 i = 0; i < MAX_FRAME_COUNT; i += 1) - { - VkCommandPoolCreateInfo command_pool_create_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, - .queueFamilyIndex = renderer->graphics_queue_family_index, - }; - - VkFenceCreateInfo fence_create_info = { - .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, - .flags = VK_FENCE_CREATE_SIGNALED_BIT, - }; - - VkSemaphoreCreateInfo semaphore_create_info = { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, - .flags = 0, - }; - - WindowFrame* frame = &render_window->frames[i]; - vkok(vkCreateCommandPool(renderer->device, &command_pool_create_info, renderer->allocator, &frame->command_pool)); - - VkCommandBufferAllocateInfo command_buffer_allocate_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, - .commandPool = frame->command_pool, - .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - .commandBufferCount = 1, - }; - - vkok(vkAllocateCommandBuffers(renderer->device, &command_buffer_allocate_info, &frame->command_buffer)); - vkok(vkCreateFence(renderer->device, &fence_create_info, renderer->allocator, &frame->render_fence)); - vkok(vkCreateSemaphore(renderer->device, &semaphore_create_info, renderer->allocator, &frame->render_semaphore)); - vkok(vkCreateSemaphore(renderer->device, &semaphore_create_info, renderer->allocator, &frame->swapchain_semaphore)); - frame->bound_pipeline = BB_PIPELINE_COUNT; - } - - return render_window; -} - -fn WindowFrame* window_frame(RenderWindow* window) -{ - return &window->frames[window->frame_index % MAX_FRAME_COUNT]; -} - -fn void renderer_window_frame_begin(Renderer* renderer, RenderWindow* window) -{ - let(frame, window_frame(window)); - let(timeout, ~(u64)0); - - u32 fence_count = 1; - VkBool32 wait_all = 1; - vkok(vkWaitForFences(renderer->device, fence_count, &frame->render_fence, wait_all, timeout)); - VkFence image_fence = 0; - VkResult next_image_result = vkAcquireNextImageKHR(renderer->device, window->swapchain, timeout, frame->swapchain_semaphore, image_fence, &window->swapchain_image_index); - if (next_image_result == VK_ERROR_OUT_OF_DATE_KHR) - { - swapchain_recreate(renderer, window); - } - else if (next_image_result != VK_SUCCESS && next_image_result != VK_SUBOPTIMAL_KHR) - { - vkok(next_image_result); - } - - vkok(vkResetFences(renderer->device, fence_count, &frame->render_fence)); - - VkCommandBufferResetFlags reset_flags = 0; - vkok(vkResetCommandBuffer(frame->command_buffer, reset_flags)); - - // Reset frame data - for (u32 i = 0; i < array_length(window->pipeline_instantiations); i += 1) - { - let(pipeline_instantiation, &frame->pipeline_instantiations[i]); - pipeline_instantiation->vertex_buffer.cpu.length = 0; - pipeline_instantiation->vertex_buffer.count = 0; - pipeline_instantiation->index_buffer.cpu.length = 0; - } -} - -fn void buffer_destroy(Renderer* renderer, VulkanBuffer buffer) -{ - if (buffer.handle) - { - vkDestroyBuffer(renderer->device, buffer.handle, renderer->allocator); - } - - if (buffer.memory.handle) - { - if (buffer.type == BUFFER_TYPE_STAGING) - { - vkUnmapMemory(renderer->device, buffer.memory.handle); - } - - vkFreeMemory(renderer->device, buffer.memory.handle, renderer->allocator); - } -} - -fn void buffer_ensure_capacity(Renderer* renderer, VulkanBuffer* buffer, u64 needed_size) -{ - if (unlikely(needed_size > buffer->memory.size)) - { - buffer_destroy(renderer, *buffer); - *buffer = buffer_create(renderer, needed_size, buffer->type); - } -} - -fn void renderer_window_frame_end(Renderer* renderer, RenderWindow* window) -{ - let(frame, window_frame(window)); - - VkCommandBufferBeginInfo command_buffer_begin_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, - .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, - }; - vkok(vkBeginCommandBuffer(frame->command_buffer, &command_buffer_begin_info)); - - for (u32 i = 0; i < BB_PIPELINE_COUNT; i += 1) - { - let(frame_pipeline_instantiation, &frame->pipeline_instantiations[i]); - - if (likely(frame_pipeline_instantiation->vertex_buffer.cpu.length)) - { - let(new_vertex_buffer_size, frame_pipeline_instantiation->vertex_buffer.cpu.length * sizeof(*frame_pipeline_instantiation->vertex_buffer.cpu.pointer)); - let(new_index_buffer_size, frame_pipeline_instantiation->index_buffer.cpu.length * sizeof(*frame_pipeline_instantiation->index_buffer.cpu.pointer)); - let(new_transient_buffer_size, new_vertex_buffer_size + new_index_buffer_size); - - buffer_ensure_capacity(renderer, &frame_pipeline_instantiation->transient_buffer, new_transient_buffer_size); - buffer_ensure_capacity(renderer, &frame_pipeline_instantiation->vertex_buffer.gpu, new_vertex_buffer_size); - buffer_ensure_capacity(renderer, &frame_pipeline_instantiation->index_buffer.gpu, new_index_buffer_size); - - buffer_copy_to_host(frame_pipeline_instantiation->transient_buffer, (Slice(HostBufferCopy)) array_to_slice(((HostBufferCopy[]) { - (HostBufferCopy) { - .source = (String) { - .pointer = (u8*)frame_pipeline_instantiation->vertex_buffer.cpu.pointer, - .length = new_vertex_buffer_size, - }, - .destination_offset = 0, - }, - (HostBufferCopy) { - .source = (String) { - .pointer = (u8*)frame_pipeline_instantiation->index_buffer.cpu.pointer, - .length = new_index_buffer_size, - }, - .destination_offset = new_vertex_buffer_size, - }, - }))); - - buffer_copy_to_local_command(frame->command_buffer, (Slice(LocalBufferCopy)) array_to_slice(((LocalBufferCopy[]) { - { - .destination = frame_pipeline_instantiation->vertex_buffer.gpu, - .source = frame_pipeline_instantiation->transient_buffer, - .regions = array_to_slice(((LocalBufferCopyRegion[]) { - { - .source_offset = 0, - .destination_offset = 0, - .size = new_vertex_buffer_size, - }, - })), - }, - { - .destination = frame_pipeline_instantiation->index_buffer.gpu, - .source = frame_pipeline_instantiation->transient_buffer, - .regions = array_to_slice(((LocalBufferCopyRegion[]) { - { - .source_offset = new_vertex_buffer_size, - .destination_offset = 0, - .size = new_index_buffer_size, - }, - })), - }, - }))); - } - } - - vk_image_transition(frame->command_buffer, window->render_image.handle, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - - VkViewport viewports[] = { - { - .x = 0, - .y = 0, - .width = window->width, - .height = window->height, - .minDepth = 0.0f, - .maxDepth = 1.0f, - } - }; - - u32 first_viewport = 0; - vkCmdSetViewport(frame->command_buffer, first_viewport, array_length(viewports), viewports); - - VkRect2D scissors[] = { - { - .offset = { - .x = 0, - .y = 0, - }, - .extent = { - .width = window->width, - .height = window->height, - }, - } - }; - - u32 first_scissor = 0; - vkCmdSetScissor(frame->command_buffer, first_scissor, array_length(scissors), scissors); - - VkRenderingAttachmentInfo color_attachments[] = { - { - .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, - .imageView = window->render_image.view, - .imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL, - .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - .clearValue = { .color = { .float32 = { 255.0f, 0.0f, 255.0f, 1.0f } } }, - }, - }; - - VkRenderingInfo rendering_info = { - .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, - .renderArea = { - .extent = { - .width = window->width, - .height = window->height, - }, - }, - .layerCount = 1, - .colorAttachmentCount = array_length(color_attachments), - .pColorAttachments = color_attachments, - }; - - vkCmdBeginRendering(frame->command_buffer, &rendering_info); - - for (u32 i = 0; i < BB_PIPELINE_COUNT; i += 1) - { - let(pipeline, &renderer->pipelines[i]); - let(pipeline_instantiation, &window->pipeline_instantiations[i]); - let(frame_pipeline_instantiation, &frame->pipeline_instantiations[i]); - - if (likely(frame_pipeline_instantiation->vertex_buffer.cpu.length)) - { - // Bind pipeline and descriptor sets - { - vkCmdBindPipeline(frame->command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->handle); - // print("Binding pipeline: 0x{u64}\n", pipeline->handle); - u32 dynamic_offset_count = 0; - u32* dynamic_offsets = 0; - u32 first_set = 0; - vkCmdBindDescriptorSets(frame->command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->layout, first_set, pipeline->descriptor_set_count, pipeline_instantiation->descriptor_sets, dynamic_offset_count, dynamic_offsets); - // print("Binding descriptor sets: 0x{u64}\n", pipeline_instantiation->descriptor_sets); - frame->bound_pipeline = i; - } - - // Bind index buffer - { - vkCmdBindIndexBuffer(frame->command_buffer, frame_pipeline_instantiation->index_buffer.gpu.handle, 0, VK_INDEX_TYPE_UINT32); - frame->index_buffer = frame_pipeline_instantiation->index_buffer.gpu.handle; - // print("Binding descriptor sets: 0x{u64}\n", frame->index_buffer); - } - - // Send vertex buffer and screen dimensions to the shader - GPUDrawPushConstants push_constants = { - .vertex_buffer = frame_pipeline_instantiation->vertex_buffer.gpu.address, - .width = window->width, - .height = window->height, - }; - - { - let(push_constant_range, pipeline->push_constant_ranges[0]); - vkCmdPushConstants(frame->command_buffer, pipeline->layout, push_constant_range.stageFlags, push_constant_range.offset, push_constant_range.size, &push_constants); - frame->push_constants = push_constants; - } - - vkCmdDrawIndexed(frame->command_buffer, frame_pipeline_instantiation->index_buffer.cpu.length, 1, 0, 0, 0); - } - } - - vkCmdEndRendering(frame->command_buffer); - - vk_image_transition(frame->command_buffer, window->render_image.handle, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - - VkImage swapchain_image = window->swapchain_images[window->swapchain_image_index]; - vk_image_transition(frame->command_buffer, swapchain_image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - - vk_image_copy(frame->command_buffer, (VulkanCopyImageArgs) { - .source = { - .handle = window->render_image.handle, - .extent = { - .width = window->width, - .height = window->height, - }, - }, - .destination = { - .handle = swapchain_image, - .extent = { - .width = window->width, - .height = window->height, - }, - }, - }); - - vk_image_transition(frame->command_buffer, swapchain_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - - vkok(vkEndCommandBuffer(frame->command_buffer)); - - VkCommandBufferSubmitInfo command_buffer_submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO, - .commandBuffer = frame->command_buffer, - .deviceMask = 0, - }, - }; - - VkSemaphoreSubmitInfo wait_semaphore_submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, - .semaphore = frame->swapchain_semaphore, - .stageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, - .deviceIndex = 0, - .value = 1, - }, - }; - - VkSemaphoreSubmitInfo signal_semaphore_submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, - .semaphore = frame->render_semaphore, - .stageMask = VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT, - .deviceIndex = 0, - .value = 1, - }, - }; - - VkSubmitInfo2 submit_info[] = { - { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, - .flags = 0, - .waitSemaphoreInfoCount = array_length(wait_semaphore_submit_info), - .pWaitSemaphoreInfos = wait_semaphore_submit_info, - .signalSemaphoreInfoCount = array_length(signal_semaphore_submit_info), - .pSignalSemaphoreInfos = signal_semaphore_submit_info, - .commandBufferInfoCount = array_length(command_buffer_submit_info), - .pCommandBufferInfos = command_buffer_submit_info, - }, - }; - - vkok(vkQueueSubmit2(renderer->graphics_queue, array_length(submit_info), submit_info, frame->render_fence)); - - const VkSwapchainKHR swapchains[] = { window->swapchain }; - const u32 swapchain_image_indices[] = { window->swapchain_image_index }; - const VkSemaphore wait_semaphores[] = { frame->render_semaphore }; - VkResult results[array_length(swapchains)]; - - VkPresentInfoKHR present_info = { - .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, - .waitSemaphoreCount = array_length(wait_semaphores), - .pWaitSemaphores = wait_semaphores, - .swapchainCount = array_length(swapchains), - .pSwapchains = swapchains, - .pImageIndices = swapchain_image_indices, - .pResults = results, - }; - - VkResult present_result = vkQueuePresentKHR(renderer->graphics_queue, &present_info); - - if (present_result == VK_SUCCESS) - { - for (u32 i = 0; i < array_length(results); i += 1) - { - vkok(results[i]); - } - } - else if (present_result == VK_ERROR_OUT_OF_DATE_KHR || present_result == VK_SUBOPTIMAL_KHR) - { - swapchain_recreate(renderer, window); - } - else - { - vkok(present_result); - } - - window->frame_index += 1; -} - -fn VkFormat vk_texture_format(TextureFormat format) -{ - VkFormat result; - switch (format) - { - case TEXTURE_FORMAT_R8_UNORM: - result = VK_FORMAT_R8_UNORM; - break; - case TEXTURE_FORMAT_R8G8B8A8_SRGB: - result = VK_FORMAT_R8G8B8A8_SRGB; - break; - } - - return result; -} - -fn u32 format_channel_count(TextureFormat format) -{ - switch (format) - { - case TEXTURE_FORMAT_R8_UNORM: - return 1; - case TEXTURE_FORMAT_R8G8B8A8_SRGB: - return 4; - } - - unreachable(); -} - -fn TextureIndex renderer_texture_create(Renderer* renderer, TextureMemory texture_memory) -{ - assert(texture_memory.depth == 1); - - let(texture_index, texture_count); - texture_count += 1; - let(texture, &textures[texture_index]); - texture->image = vk_image_create(renderer->device, renderer->allocator, renderer->memory_properties, (VulkanImageCreate) { - .width = texture_memory.width, - .height = texture_memory.height, - .mip_levels = 1, - .format = vk_texture_format(texture_memory.format), - .usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, - }); - texture->sampler = renderer->sampler; - - let(image_size, (u64)texture_memory.depth * texture_memory.width * texture_memory.height * format_channel_count(texture_memory.format)); - VkBufferUsageFlags buffer_usage_flags = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - VkMemoryPropertyFlags buffer_memory_flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - let(transfer_buffer, vk_buffer_create(renderer->device, renderer->allocator, renderer->memory_properties, image_size, buffer_usage_flags, buffer_memory_flags)); - memcpy((void*)transfer_buffer.address, texture_memory.pointer, image_size); - - immediate_start(renderer->immediate); - - vk_image_transition(renderer->immediate.command_buffer, texture->image.handle, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - - VkBufferImageCopy copy_regions[] = { - { - .bufferOffset = 0, - .bufferRowLength = 0, - .bufferImageHeight = 0, - .imageSubresource = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = 0, - .baseArrayLayer = 0, - .layerCount = 1, - }, - .imageOffset = { - .x = 0, - .y = 0, - .z = 0, - }, - .imageExtent = { - .width = texture_memory.width, - .height = texture_memory.height, - .depth = texture_memory.depth, - }, - } - }; - - vkCmdCopyBufferToImage(renderer->immediate.command_buffer, transfer_buffer.handle, texture->image.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, array_length(copy_regions), copy_regions); - - vk_image_transition(renderer->immediate.command_buffer, texture->image.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - - immediate_end(renderer->immediate); - - return (TextureIndex) { .value = texture_index }; -} - -fn void window_draw_indexed(RenderWindow* window, u32 index_count, u32 instance_count, u32 first_index, s32 vertex_offset, u32 first_instance) -{ - let(frame, window_frame(window)); - vkCmdDrawIndexed(frame->command_buffer, index_count, instance_count, first_index, vertex_offset, first_instance); -} - -fn void window_texture_update_begin(RenderWindow* window, BBPipeline pipeline_index, u32 descriptor_count) -{ - let(pipeline_instantiation, &window->pipeline_instantiations[pipeline_index]); - assert(descriptor_count <= array_length(pipeline_instantiation->texture_descriptors)); - - pipeline_instantiation->descriptor_set_update = (VkWriteDescriptorSet) { - .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .pNext = 0, - .dstSet = pipeline_instantiation->descriptor_sets[0], - .dstBinding = 0, - .dstArrayElement = 0, - .descriptorCount = descriptor_count, - .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - .pImageInfo = pipeline_instantiation->texture_descriptors, - .pBufferInfo = 0, - .pTexelBufferView = 0, - }; -} - -fn void window_rect_texture_update_begin(RenderWindow* window) -{ - window_texture_update_begin(window, BB_PIPELINE_RECT, RECT_TEXTURE_SLOT_COUNT); -} - -fn void window_queue_pipeline_texture_update(RenderWindow* window, BBPipeline pipeline_index, u32 resource_slot, TextureIndex texture_index) -{ - let(pipeline_instantiation, &window->pipeline_instantiations[pipeline_index]); - VkDescriptorImageInfo* descriptor_image = &pipeline_instantiation->texture_descriptors[resource_slot]; - VulkanTexture* texture = &textures[texture_index.value]; - *descriptor_image = (VkDescriptorImageInfo) { - .sampler = texture->sampler, - .imageView = texture->image.view, - .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // TODO: specify - }; -} - -fn void window_queue_rect_texture_update(RenderWindow* window, RectTextureSlot slot, TextureIndex texture_index) -{ - window_queue_pipeline_texture_update(window, BB_PIPELINE_RECT, slot, texture_index); -} - -fn void renderer_queue_font_update(Renderer* renderer, RenderWindow* window, RenderFontType type, TextureAtlas atlas) -{ - static_assert(RECT_TEXTURE_SLOT_MONOSPACE_FONT < RECT_TEXTURE_SLOT_PROPORTIONAL_FONT); - let(slot, RECT_TEXTURE_SLOT_MONOSPACE_FONT + type); - window_queue_rect_texture_update(window, slot, atlas.texture); - renderer->fonts[type] = atlas; -} - -fn void window_texture_update_end(Renderer* renderer, RenderWindow* window, BBPipeline pipeline_index) -{ - let(pipeline_instantiation, &window->pipeline_instantiations[pipeline_index]); - u32 descriptor_copy_count = 0; - VkCopyDescriptorSet* descriptor_copies = 0; - VkWriteDescriptorSet descriptor_set_writes[] = { - pipeline_instantiation->descriptor_set_update, - }; - vkUpdateDescriptorSets(renderer->device, array_length(descriptor_set_writes), descriptor_set_writes, descriptor_copy_count, descriptor_copies); -} - -fn void window_rect_texture_update_end(Renderer* renderer, RenderWindow* window) -{ - window_texture_update_end(renderer, window, BB_PIPELINE_RECT); -} - -fn u32 window_pipeline_add_vertices(RenderWindow* window, BBPipeline pipeline_index, String vertex_memory, u32 vertex_count) -{ - let(frame, window_frame(window)); - let(vertex_buffer, &frame->pipeline_instantiations[pipeline_index].vertex_buffer); - vb_copy_string(&vertex_buffer->cpu, vertex_memory); - let(vertex_offset, vertex_buffer->count); - vertex_buffer->count = vertex_offset + vertex_count; - return vertex_offset; -} - -fn void window_pipeline_add_indices(RenderWindow* window, BBPipeline pipeline_index, Slice(u32) indices) -{ - let(frame, window_frame(window)); - let(index_pointer, vb_add(&frame->pipeline_instantiations[pipeline_index].index_buffer.cpu, indices.length)); - memcpy(index_pointer, indices.pointer, indices.length * sizeof(*indices.pointer)); -} - -fn void window_render_rect(RenderWindow* window, RectDraw draw) -{ - let(p0, draw.vertex.p0); - let(uv0, draw.texture.p0); - if (draw.texture.p1.x != 0) - { - assert(draw.texture.p1.x - draw.texture.p0.x == draw.vertex.p1.x - draw.vertex.p0.x); - assert(draw.texture.p1.y - draw.texture.p0.y == draw.vertex.p1.y - draw.vertex.p0.y); - } - - let(corner_radius, 5.0f); - - let(extent, float2_sub(draw.vertex.p1, p0)); - RectVertex vertices[] = { - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = draw.texture_index, - .colors = { draw.colors[0], draw.colors[1], draw.colors[2], draw.colors[3] }, - .softness = 1.0, - .corner_radius = corner_radius, - }, - }; - - let(vertex_offset, window_pipeline_add_vertices(window, BB_PIPELINE_RECT, (String)array_to_bytes(vertices), array_length(vertices))); - - u32 indices[] = { - vertex_offset + 0, - vertex_offset + 1, - vertex_offset + 2, - vertex_offset + 1, - vertex_offset + 3, - vertex_offset + 2, - }; - - window_pipeline_add_indices(window, BB_PIPELINE_RECT, (Slice(u32))array_to_slice(indices)); -} - -// TODO: support gradient -fn void window_render_text(Renderer* renderer, RenderWindow* window, String string, float4 color, RenderFontType font_type, u32 x_offset, u32 y_offset) -{ - let(texture_atlas, &renderer->fonts[font_type]); - let(height, texture_atlas->ascent - texture_atlas->descent); - let(texture_index, texture_atlas->texture.value); - - for (u64 i = 0; i < string.length; i += 1) - { - let(ch, string.pointer[i]); - let(character, &texture_atlas->characters[ch]); - - let(uv_x, character->x); - let(uv_y, character->y); - - let(char_width, character->width); - let(char_height, character->height); - - let(pos_x, x_offset); - let(pos_y, y_offset + character->y_offset + height + texture_atlas->descent); // Offset of the height to render the character from the bottom (y + height) up (y) - vec2 p0 = { pos_x, pos_y }; - vec2 uv0 = { uv_x, uv_y }; - vec2 extent = { char_width, char_height }; - // print("P0: ({u32}, {u32}). P1: ({u32}, {u32})\n", (u32)p0.x, (u32)p0.y, (u32)p1.x, (u32)p1.y); - - RectVertex vertices[] = { - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = texture_index, - .colors = { color, color, color, color }, - .softness = 1.0, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = texture_index, - .colors = { color, color, color, color }, - .softness = 1.0, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .texture_index = texture_index, - .colors = { color, color, color, color }, - .softness = 1.0, - }, - (RectVertex) { - .p0 = p0, - .uv0 = uv0, - .extent = extent, - .colors = { color, color, color, color }, - .texture_index = texture_index, - .softness = 1.0, - }, - }; - - let(vertex_offset, window_pipeline_add_vertices(window, BB_PIPELINE_RECT, (String)array_to_bytes(vertices), array_length(vertices))); - - u32 indices[] = { - vertex_offset + 0, - vertex_offset + 1, - vertex_offset + 2, - vertex_offset + 1, - vertex_offset + 3, - vertex_offset + 2, - }; - - window_pipeline_add_indices(window, BB_PIPELINE_RECT, (Slice(u32))array_to_slice(indices)); - - u32 kerning = (texture_atlas->kerning_tables + ch * 256)[string.pointer[i + 1]]; - x_offset += character->advance + kerning; - } -} diff --git a/bootstrap/std/vulkan_rendering.h b/bootstrap/std/vulkan_rendering.h deleted file mode 100644 index c5a6893..0000000 --- a/bootstrap/std/vulkan_rendering.h +++ /dev/null @@ -1,130 +0,0 @@ -#pragma once - -#if BB_WINDOWING_BACKEND_X11 -#define VK_USE_PLATFORM_XCB_KHR -#endif - -#if BB_WINDOWING_BACKEND_COCOA -#define VK_USE_PLATFORM_METAL_EXT -#endif - -#if BB_WINDOWING_BACKEND_WIN32 -#define VK_USE_PLATFORM_WIN32_KHR -#endif - -// Code from Volk -#ifndef VK_NO_PROTOTYPES -#define VK_NO_PROTOTYPES -#endif - -#ifndef VULKAN_H_ -#if defined(VK_USE_PLATFORM_WIN32_KHR) -#include -#include - -/* When VK_USE_PLATFORM_WIN32_KHR is defined, instead of including vulkan.h directly, we include individual parts of the SDK -* This is necessary to avoid including which is very heavy - it takes 200ms to parse without WIN32_LEAN_AND_MEAN -* and 100ms to parse with it. vulkan_win32.h only needs a few symbols that are easy to redefine ourselves. -*/ -typedef unsigned long DWORD; -typedef const wchar_t* LPCWSTR; -typedef void* HANDLE; -typedef struct HINSTANCE__* HINSTANCE; -typedef struct HWND__* HWND; -typedef struct HMONITOR__* HMONITOR; -typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES; - -#include - -#ifdef VK_ENABLE_BETA_EXTENSIONS -#include -#endif -#else -#include -#endif -#endif - -#define vulkan_function_pointer(n) PFN_ ## n n -#define vulkan_global_function_pointer(n) global_variable vulkan_function_pointer(n) -// INSTANCE FUNCTIONS START -// These functions require no instance -vulkan_global_function_pointer(vkGetInstanceProcAddr); -vulkan_global_function_pointer(vkEnumerateInstanceVersion); -vulkan_global_function_pointer(vkEnumerateInstanceLayerProperties); -vulkan_global_function_pointer(vkCreateInstance); - -// These functions require an instance as a parameter -vulkan_global_function_pointer(vkGetDeviceProcAddr); -vulkan_global_function_pointer(vkCreateDebugUtilsMessengerEXT); -vulkan_global_function_pointer(vkEnumeratePhysicalDevices); -vulkan_global_function_pointer(vkGetPhysicalDeviceMemoryProperties); -vulkan_global_function_pointer(vkGetPhysicalDeviceProperties); -vulkan_global_function_pointer(vkGetPhysicalDeviceQueueFamilyProperties); -vulkan_global_function_pointer(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); -vulkan_global_function_pointer(vkGetPhysicalDeviceSurfacePresentModesKHR); -vulkan_global_function_pointer(vkCreateDevice); - -#if defined(VK_KHR_xcb_surface) -vulkan_global_function_pointer(vkCreateXcbSurfaceKHR); -#endif -#if defined(VK_KHR_win32_surface) -vulkan_global_function_pointer(vkCreateWin32SurfaceKHR); -#endif -#if defined(VK_EXT_metal_surface) -vulkan_global_function_pointer(vkCreateMetalSurfaceEXT); -#endif -// INSTANCE FUNCTIONS END - -vulkan_global_function_pointer(vkCreateSwapchainKHR); -vulkan_global_function_pointer(vkCmdCopyBuffer2); -vulkan_global_function_pointer(vkAllocateMemory); -vulkan_global_function_pointer(vkCreateBuffer); -vulkan_global_function_pointer(vkGetBufferMemoryRequirements); -vulkan_global_function_pointer(vkBindBufferMemory); -vulkan_global_function_pointer(vkMapMemory); -vulkan_global_function_pointer(vkGetBufferDeviceAddress); -vulkan_global_function_pointer(vkResetFences); -vulkan_global_function_pointer(vkResetCommandBuffer); -vulkan_global_function_pointer(vkBeginCommandBuffer); -vulkan_global_function_pointer(vkEndCommandBuffer); -vulkan_global_function_pointer(vkQueueSubmit2); -vulkan_global_function_pointer(vkWaitForFences); -vulkan_global_function_pointer(vkCreateImage); -vulkan_global_function_pointer(vkGetImageMemoryRequirements); -vulkan_global_function_pointer(vkBindImageMemory); -vulkan_global_function_pointer(vkCreateImageView); -vulkan_global_function_pointer(vkCmdPipelineBarrier2); -vulkan_global_function_pointer(vkCmdBlitImage2); -vulkan_global_function_pointer(vkGetDeviceQueue); -vulkan_global_function_pointer(vkCreateCommandPool); -vulkan_global_function_pointer(vkAllocateCommandBuffers); -vulkan_global_function_pointer(vkCreateFence); -vulkan_global_function_pointer(vkCreateSampler); -vulkan_global_function_pointer(vkCreateShaderModule); -vulkan_global_function_pointer(vkCreateDescriptorSetLayout); -vulkan_global_function_pointer(vkCreatePipelineLayout); -vulkan_global_function_pointer(vkCreateGraphicsPipelines); -vulkan_global_function_pointer(vkDestroyImageView); -vulkan_global_function_pointer(vkDestroyImage); -vulkan_global_function_pointer(vkFreeMemory); -vulkan_global_function_pointer(vkDeviceWaitIdle); -vulkan_global_function_pointer(vkDestroySwapchainKHR); -vulkan_global_function_pointer(vkGetSwapchainImagesKHR); -vulkan_global_function_pointer(vkCreateDescriptorPool); -vulkan_global_function_pointer(vkAllocateDescriptorSets); -vulkan_global_function_pointer(vkCreateSemaphore); -vulkan_global_function_pointer(vkAcquireNextImageKHR); -vulkan_global_function_pointer(vkDestroyBuffer); -vulkan_global_function_pointer(vkUnmapMemory); -vulkan_global_function_pointer(vkCmdSetViewport); -vulkan_global_function_pointer(vkCmdSetScissor); -vulkan_global_function_pointer(vkCmdBeginRendering); -vulkan_global_function_pointer(vkCmdBindPipeline); -vulkan_global_function_pointer(vkCmdBindDescriptorSets); -vulkan_global_function_pointer(vkCmdBindIndexBuffer); -vulkan_global_function_pointer(vkCmdPushConstants); -vulkan_global_function_pointer(vkCmdDrawIndexed); -vulkan_global_function_pointer(vkCmdEndRendering); -vulkan_global_function_pointer(vkQueuePresentKHR); -vulkan_global_function_pointer(vkCmdCopyBufferToImage); -vulkan_global_function_pointer(vkUpdateDescriptorSets); diff --git a/bootstrap/std/wayland_windowing.c b/bootstrap/std/wayland_windowing.c deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/wayland_windowing.c +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/wayland_windowing.h b/bootstrap/std/wayland_windowing.h deleted file mode 100644 index 6f70f09..0000000 --- a/bootstrap/std/wayland_windowing.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/bootstrap/std/win32_windowing.c b/bootstrap/std/win32_windowing.c deleted file mode 100644 index a69b074..0000000 --- a/bootstrap/std/win32_windowing.c +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#pragma comment(lib, "user32") - -fn LRESULT window_callback(HWND window, UINT message, WPARAM w_parameter, LPARAM l_parameter) -{ - return DefWindowProcW(window, message, w_parameter, l_parameter); -} - -fn u8 windowing_initialize() -{ - HINSTANCE instance = GetModuleHandleW(0); - windowing_connection.instance = instance; - WNDCLASSEXW window_class = { - .cbSize = sizeof(window_class), - .lpfnWndProc = window_callback, - .hInstance = instance, - .lpszClassName = L"window", - .hCursor = LoadCursorA(0, IDC_ARROW), - .hIcon = LoadIcon(instance, MAKEINTRESOURCE(1)), - .style = CS_VREDRAW|CS_HREDRAW, - }; - RegisterClassExW(&window_class); - windowing_connection.window_class = window_class; - return 1; -} - -fn WindowingInstance* windowing_instantiate(WindowingInstantiate instantiate) -{ - // TODO: - WindowingInstance* window = &windowing_instances[0]; - window->handle = CreateWindowExW(WS_EX_APPWINDOW, L"window", L"Bloat Buster", WS_OVERLAPPEDWINDOW | WS_SIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, instantiate.size.width, instantiate.size.height, 0, 0, windowing_connection.instance, 0); - ShowWindow(window->handle, SW_SHOW); - return window; -} - -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* instance) -{ - RECT area; - GetClientRect(instance->handle, &area); - WindowingSize size = { - .width = area.right, - .height = area.bottom, - }; - - return size; -} - -fn void windowing_poll_events() -{ - MSG msg; - HWND handle; - - while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessageW(&msg); - } -} diff --git a/bootstrap/std/win32_windowing.h b/bootstrap/std/win32_windowing.h deleted file mode 100644 index c85f335..0000000 --- a/bootstrap/std/win32_windowing.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -STRUCT(WindowingConnection) -{ - HINSTANCE instance; - WNDCLASSEXW window_class; -}; - -STRUCT(WindowingInstance) -{ - HWND handle; -}; - diff --git a/bootstrap/std/windowing.c b/bootstrap/std/windowing.c deleted file mode 100644 index 66ba161..0000000 --- a/bootstrap/std/windowing.c +++ /dev/null @@ -1,15 +0,0 @@ -#if BB_WINDOWING_BACKEND_X11 -#include -#endif - -#if BB_WINDOWING_BACKEND_WAYLAND -#include -#endif - -#if BB_WINDOWING_BACKEND_COCOA -#include -#endif - -#if BB_WINDOWING_BACKEND_WIN32 -#include -#endif diff --git a/bootstrap/std/windowing.h b/bootstrap/std/windowing.h deleted file mode 100644 index c8ec249..0000000 --- a/bootstrap/std/windowing.h +++ /dev/null @@ -1,206 +0,0 @@ -#pragma once - -#if BB_WINDOWING_BACKEND_X11 -#include -#endif - -#if BB_WINDOWING_BACKEND_WAYLAND -#include -#endif - -#if BB_WINDOWING_BACKEND_COCOA -#include -#endif - -#if BB_WINDOWING_BACKEND_WIN32 -#include -#endif - -typedef enum WindowingEventType -{ - WINDOWING_EVENT_TYPE_MOUSE_BUTTON, - WINDOWING_EVENT_TYPE_CURSOR_POSITION, - WINDOWING_EVENT_TYPE_CURSOR_ENTER, - WINDOWING_EVENT_TYPE_WINDOW_FOCUS, - WINDOWING_EVENT_TYPE_WINDOW_POSITION, - WINDOWING_EVENT_TYPE_WINDOW_CLOSE, -} WindowingEventType; - -STRUCT(WindowingEventDescriptor) -{ - u32 index:24; - WindowingEventType type:8; -}; -static_assert(sizeof(WindowingEventDescriptor) == 4); -decl_vb(WindowingEventDescriptor); - -ENUM_START(WindowingEventMouseButtonKind, u8) -{ - WINDOWING_EVENT_MOUSE_BUTTON_1 = 0, - WINDOWING_EVENT_MOUSE_BUTTON_2 = 1, - WINDOWING_EVENT_MOUSE_BUTTON_3 = 2, - WINDOWING_EVENT_MOUSE_BUTTON_4 = 3, - WINDOWING_EVENT_MOUSE_BUTTON_5 = 4, - WINDOWING_EVENT_MOUSE_BUTTON_6 = 5, - WINDOWING_EVENT_MOUSE_BUTTON_7 = 6, - WINDOWING_EVENT_MOUSE_BUTTON_8 = 7, - WINDOWING_EVENT_MOUSE_LEFT = WINDOWING_EVENT_MOUSE_BUTTON_1, - WINDOWING_EVENT_MOUSE_RIGHT = WINDOWING_EVENT_MOUSE_BUTTON_2, - WINDOWING_EVENT_MOUSE_MIDDLE = WINDOWING_EVENT_MOUSE_BUTTON_3, -} -ENUM_END(WindowingEventMouseButtonKind); -#define WINDOWING_EVENT_MOUSE_BUTTON_COUNT (WINDOWING_EVENT_MOUSE_BUTTON_8 + 1) - -ENUM_START(WindowingEventMouseButtonAction, u8) -{ - WINDOWING_EVENT_MOUSE_RELAX = 0, - WINDOWING_EVENT_MOUSE_RELEASE = 1, - WINDOWING_EVENT_MOUSE_PRESS = 2, - WINDOWING_EVENT_MOUSE_REPEAT = 3, -} ENUM_END(WindowingEventMouseButtonAction); - -STRUCT(WindowingEventMouseButtonEvent) -{ - WindowingEventMouseButtonAction action:2; - u8 mod_shift:1; - u8 mod_control:1; - u8 mod_alt:1; - u8 mod_super:1; - u8 mod_caps_lock:1; - u8 mod_num_lock:1; -}; - -STRUCT(WindowingEventMouseButton) -{ - WindowingEventMouseButtonKind button:3; - u8 reserved:5; - WindowingEventMouseButtonEvent event; -}; -static_assert(sizeof(WindowingEventMouseButton) == sizeof(u16)); -decl_vb(WindowingEventMouseButton); - -#define WINDOWING_EVENT_BITSET_SIZE (64) -STRUCT(WindowingEventBitset) -{ - u64 value; -}; -decl_vb(WindowingEventBitset); - -STRUCT(WindowingEventCursorPosition) -{ - f64 x; - f64 y; -}; -decl_vb(WindowingEventCursorPosition); - -STRUCT(WindowingEventWindowPosition) -{ - u32 x; - u32 y; -}; -decl_vb(WindowingEventWindowPosition); - -STRUCT(WindowingEventQueue) -{ - VirtualBuffer(WindowingEventDescriptor) descriptors; - VirtualBuffer(WindowingEventMouseButton) mouse_buttons; - VirtualBuffer(WindowingEventBitset) window_focuses; - u32 window_focuses_count; - u32 cursor_enter_count; - VirtualBuffer(WindowingEventBitset) cursor_enters; - VirtualBuffer(WindowingEventCursorPosition) cursor_positions; - VirtualBuffer(WindowingEventWindowPosition) window_positions; -}; - -// typedef void OSFramebufferResize(OSWindow window, void* context, u32 width, u32 height); -// typedef void OSWindowResize(OSWindow window, void* context, u32 width, u32 height); -// typedef void OSWindowRefresh(OSWindow window, void* context); -// typedef void OSWindowPosition(OSWindow window, void* context, u32 x, u32 y); -// typedef void OSWindowClose(OSWindow window, void* context); -// typedef void OSWindowFocus(OSWindow window, void* context, u8 focused); -// typedef void OSWindowIconify(OSWindow window, void* context, u8 iconified); -// typedef void OSWindowMaximize(OSWindow window, void* context, u8 maximized); -// typedef void OSWindowContentScale(OSWindow window, void* context, f32 x, f32 y); -// typedef void OSWindowKey(OSWindow window, void* context, s32 key, s32 scancode, s32 action, s32 mods); -// typedef void OSWindowCharacter(OSWindow window, void* context, u32 codepoint); -// typedef void OSWindowCharacterModifier(OSWindow window, void* context, u32 codepoint, s32 mods); -// typedef void OSWindowMouseButton(OSWindow window, void* context, s32 button, s32 action, s32 mods); -// typedef void OSWindowCursorPosition(OSWindow window, void* context, f64 x, f64 y); -// typedef void OSWindowCursorEnter(OSWindow window, void* context, u8 entered); -// typedef void OSWindowScroll(OSWindow window, void* context, f64 x, f64 y); -// typedef void OSWindowDrop(OSWindow window, void* context, CStringSlice paths); - -// STRUCT(OSWindowingCallbacks) -// { -// // OSFramebufferResize* framebuffer_resize; -// // OSWindowResize* window_resize; -// // OSWindowRefresh* window_refresh; -// // OSWindowPosition* window_position; -// // OSWindowClose* window_close; -// // OSWindowFocus* window_focus; -// // OSWindowIconify* window_iconify; -// // OSWindowMaximize* window_maximize; -// // OSWindowContentScale* window_content_scale; -// // OSWindowKey* window_key; -// // OSWindowCharacter* window_character; -// // OSWindowCharacterModifier* window_character_modifier; -// // OSWindowMouseButton* window_mouse_button; -// // OSWindowCursorPosition* window_cursor_position; -// // OSWindowCursorEnter* window_cursor_enter; -// // OSWindowScroll* window_scroll; -// // OSWindowDrop* window_drop; -// }; - -// STRUCT(OSWindowCreate) -// { -// String name; -// OSWindowSize size; -// void* context; -// // OSWindowResize* resize_callback; -// // OSWindowRefresh* refresh_callback; -// }; - -STRUCT(WindowingCursorPosition) -{ - f64 x; - f64 y; -}; - -// NEW API START -STRUCT(WindowingOffset) -{ - u32 x; - u32 y; -}; - -STRUCT(WindowingSize) -{ - u32 width; - u32 height; -}; - -STRUCT(WindowingInstantiate) -{ - String name; - WindowingOffset offset; - WindowingSize size; - void* context; -}; - -fn u8 windowing_initialize(); -fn WindowingInstance* windowing_instantiate(WindowingInstantiate instantiate); -fn void windowing_poll_events(); -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* window); -// NEW API END - - -// fn OSWindow os_window_create(OSWindowCreate create); -// fn u8 os_window_should_close(OSWindow window); -// fn OSCursorPosition os_window_cursor_position_get(OSWindow window); -// -// fn u8 os_event_queue_get_window_focus(OSEventQueue* queue, u32 index); - -#ifndef __APPLE__ -global_variable WindowingConnection windowing_connection; -global_variable WindowingInstance windowing_instances[256]; -#endif diff --git a/bootstrap/std/x11_windowing.c b/bootstrap/std/x11_windowing.c deleted file mode 100644 index 85b2718..0000000 --- a/bootstrap/std/x11_windowing.c +++ /dev/null @@ -1,197 +0,0 @@ -#pragma once - -global_variable xcb_window_t windowing_instance_handles[256]; - -typedef enum WindowingEvent : u32 -{ - WINDOWING_EVENT_CLOSE, - WINDOWING_EVENT_COUNT, -} WindowingEvent; - -fn xcb_connection_t* xcb_connection_get() -{ - return windowing_connection.handle; -} - -fn xcb_window_t xcb_window_from_windowing_instance(WindowingInstance* instance) -{ - return instance->handle; -} - -fn void x11_intern_atoms(u32 atom_count, String* names, xcb_intern_atom_cookie_t* cookies, xcb_intern_atom_reply_t** replies) -{ - xcb_connection_t* connection = windowing_connection.handle; - - for (u64 i = 0; i < atom_count; i += 1) - { - String atom_name = names[i]; - - cookies[i] = xcb_intern_atom(connection, 0, atom_name.length, string_to_c(atom_name)); - } - - for (u64 i = 0; i < atom_count; i += 1) - { - replies[i] = xcb_intern_atom_reply(connection, cookies[i], 0); - } -} - -typedef enum X11Atom -{ - X11_ATOM_WM_PROTOCOLS, - X11_ATOM_WM_DELETE_WINDOW, - X11_ATOM_COUNT, -} X11Atom; - -global_variable String atom_names[X11_ATOM_COUNT] = { - strlit("WM_PROTOCOLS"), - strlit("WM_DELETE_WINDOW"), -}; -global_variable xcb_intern_atom_reply_t* atom_replies[array_length(atom_names)]; -global_variable xcb_intern_atom_cookie_t atom_cookies[array_length(atom_names)]; - -fn u8 windowing_initialize() -{ - u8 result = 0; - - windowing_connection.handle = xcb_connect(0, 0); - if (windowing_connection.handle) - { - if (!xcb_connection_has_error(windowing_connection.handle)) - { - windowing_connection.setup = xcb_get_setup(windowing_connection.handle); - - if (windowing_connection.setup) - { - x11_intern_atoms(array_length(atom_names), atom_names, atom_cookies, atom_replies); - - if (atom_replies[X11_ATOM_WM_PROTOCOLS]) - { - if (atom_replies[X11_ATOM_WM_DELETE_WINDOW]) - { - result = 1; - } - } - } - } - } - - return result; -} - -fn WindowingInstance* windowing_instantiate(WindowingInstantiate create) -{ - xcb_connection_t* connection = windowing_connection.handle; - xcb_screen_iterator_t iter = xcb_setup_roots_iterator(windowing_connection.setup); - xcb_screen_t *screen = iter.data; - - /* Create a window */ - xcb_window_t window_handle = xcb_generate_id(connection); - - u32 i; - for (i = 0; i < array_length(windowing_instance_handles); i += 1) - { - xcb_window_t* window_handle_pointer = &windowing_instance_handles[i]; - if (!*window_handle_pointer) - { - *window_handle_pointer = window_handle; - break; - } - } - - WindowingInstance* window = &windowing_instances[i]; - window->handle = window_handle; - - u32 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; - u32 value_list[] = { - screen->black_pixel, - XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_STRUCTURE_NOTIFY - }; - - xcb_create_window( - connection, /* Connection */ - XCB_COPY_FROM_PARENT, /* Depth (same as parent) */ - window_handle, /* Window ID */ - screen->root, /* Parent window (root) */ - create.offset.x, create.offset.y, /* X, Y */ - create.size.width, create.size.height, - 10, /* Border width */ - XCB_WINDOW_CLASS_INPUT_OUTPUT, /* Class */ - screen->root_visual, /* Visual */ - value_mask, /* Value mask */ - value_list /* Value list */ - ); - - xcb_change_property(connection, XCB_PROP_MODE_REPLACE, window_handle, atom_replies[X11_ATOM_WM_PROTOCOLS]->atom, XCB_ATOM_ATOM, 32, 1, &atom_replies[X11_ATOM_WM_DELETE_WINDOW]->atom); - - xcb_map_window(connection, window_handle); - - /* Flush requests to the X server */ - xcb_flush(connection); - - return window; -} - -fn void windowing_poll_events() -{ - xcb_generic_event_t *event; - xcb_connection_t* connection = windowing_connection.handle; - - while ((event = xcb_poll_for_event(connection))) - { - switch (event->response_type & ~0x80) { - case XCB_EXPOSE: - break; - case XCB_KEY_PRESS: - break; - case XCB_CLIENT_MESSAGE: - { - let_pointer_cast(xcb_client_message_event_t, client_message_event, event); - if (client_message_event->data.data32[0] == atom_replies[X11_ATOM_WM_DELETE_WINDOW]->atom) - { - xcb_window_t window_handle = client_message_event->window; - u32 i; - u32 window_handle_count = array_length(windowing_instance_handles); - for (i = 0; i < window_handle_count; i += 1) - { - xcb_window_t* window_handle_pointer = &windowing_instance_handles[i]; - if (window_handle == *window_handle_pointer) - { - windowing_instances[i].handle = 0; - *window_handle_pointer = 0; - // TODO: For now do this - os_exit(0); - break; - } - } - - if (i == window_handle_count) - { - os_exit(1); - } - } - else - { - trap(); - } - } break; - case XCB_DESTROY_NOTIFY: - trap(); - default: - break; - } - os_free(event); - } -} - -fn WindowingSize windowing_get_instance_framebuffer_size(WindowingInstance* instance) -{ - WindowingSize result = {}; - xcb_connection_t* connection = windowing_connection.handle; - xcb_window_t window = instance->handle; - xcb_get_geometry_cookie_t cookie = xcb_get_geometry(connection, window); - xcb_get_geometry_reply_t* reply = xcb_get_geometry_reply(connection, cookie, 0); - result.width = reply->width; - result.height = reply->height; - os_free(reply); - return result; -} diff --git a/bootstrap/std/x11_windowing.h b/bootstrap/std/x11_windowing.h deleted file mode 100644 index 8369115..0000000 --- a/bootstrap/std/x11_windowing.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include - -STRUCT(WindowingConnection) -{ - xcb_connection_t* handle; - const xcb_setup_t* setup; -}; - -STRUCT(WindowingInstance) -{ - xcb_window_t handle; -}; - -fn xcb_connection_t* xcb_connection_get(); -fn xcb_window_t xcb_window_from_windowing_instance(WindowingInstance* instance); diff --git a/build.c b/build.c deleted file mode 100644 index 94bbd62..0000000 --- a/build.c +++ /dev/null @@ -1,2656 +0,0 @@ -#include -#include -#include - -#include -#include - -typedef enum C_Compiler -{ - C_COMPILER_GCC, - C_COMPILER_CLANG, - C_COMPILER_MSVC, - C_COMPILER_TCC, - C_COMPILER_COUNT, -} C_Compiler; - -global_variable char* c_compiler_names[] = { - "gcc", - "clang", - "cl", - "tcc", -}; - -typedef enum CompilerArgumentStyle -{ - COMPILER_ARGUMENT_STYLE_GNU, - COMPILER_ARGUMENT_STYLE_MSVC, - COMPILER_ARGUMENT_STYLE_COUNT, -} CompilerArgumentStyle; - -global_variable C_Compiler preferred_c_compiler = C_COMPILER_COUNT; -global_variable char** environment_pointer; - -typedef enum BuildType -{ - BUILD_TYPE_DEBUG, - BUILD_TYPE_RELEASE_SAFE, - BUILD_TYPE_RELEASE_FAST, - BUILD_TYPE_RELEASE_SMALL, - BUILD_TYPE_COUNT, -} BuildType; - -const char* build_type_strings[BUILD_TYPE_COUNT] = { - "debug", - "release_safe", - "release_fast", - "release_small", -}; - -char* optimization_switches[COMPILER_ARGUMENT_STYLE_COUNT][BUILD_TYPE_COUNT] = { - [COMPILER_ARGUMENT_STYLE_GNU] = { - [BUILD_TYPE_DEBUG] = "-O0", - [BUILD_TYPE_RELEASE_SAFE] = "-O2", - [BUILD_TYPE_RELEASE_FAST] = "-O3", - [BUILD_TYPE_RELEASE_SMALL] = "-Oz", - }, - [COMPILER_ARGUMENT_STYLE_MSVC] = { - [BUILD_TYPE_DEBUG] = "/Od", - [BUILD_TYPE_RELEASE_SAFE] = "/Ox", - [BUILD_TYPE_RELEASE_FAST] = "/O2", - [BUILD_TYPE_RELEASE_SMALL] = "/O1", - }, -}; - -STRUCT(CompileFlags) -{ - u64 colored_output:1; - u64 debug:1; - u64 error_limit:1; - u64 time_trace:1; -}; - -STRUCT(CompileOptions) -{ - String source_path; - String output_path; - String compiler_path; - RenderingBackend rendering_backend; - WindowingBackend windowing_backend; - BuildType build_type; - CompileFlags flags; -}; - -typedef enum CompilerSwitch -{ - COMPILER_SWITCH_DEBUG_INFO, - COMPILER_SWITCH_COUNT, -} CompilerSwitch; - - -global_variable char* compiler_switches[COMPILER_ARGUMENT_STYLE_COUNT][COMPILER_SWITCH_COUNT] = { - [COMPILER_ARGUMENT_STYLE_GNU] = { - [COMPILER_SWITCH_DEBUG_INFO] = "-g", - }, - [COMPILER_ARGUMENT_STYLE_MSVC] = { - [COMPILER_SWITCH_DEBUG_INFO] = "/Zi", - }, -}; - -fn C_Compiler c_compiler_from_path(String path) -{ - C_Compiler result = C_COMPILER_COUNT; - let(last_ch_slash, string_last_ch(path, '/')); - let(start, last_ch_slash); -#if _WIN32 - let(last_ch_backslash, string_last_ch(path, '\\')); - start = MIN(last_ch_slash, last_ch_backslash); -#endif - assert(start != STRING_NO_MATCH); // This ensures us the path is not just the executable name - let(compiler_name, s_get_slice(u8, path, start + 1, path.length)); - - for (C_Compiler i = 0; i < C_COMPILER_COUNT; i += 1) - { - let(candidate_compiler_name, cstr(c_compiler_names[i])); - if (string_contains(compiler_name, candidate_compiler_name)) - { - result = i; - break; - } - } - - return result; -} - -fn u8 c_compiler_is_supported_by_os(C_Compiler compiler) -{ -#ifdef __linux__ - switch (compiler) - { - case C_COMPILER_TCC: case C_COMPILER_GCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_MSVC: return 0; - case C_COMPILER_COUNT: unreachable(); - } -#elif __APPLE__ - switch (compiler) - { - case C_COMPILER_TCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_MSVC: case C_COMPILER_GCC: return 0; - case C_COMPILER_COUNT: unreachable(); - } -#elif _WIN32 - switch (compiler) - { - case C_COMPILER_MSVC: case C_COMPILER_TCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_GCC: return 0; - } -#endif - unreachable(); -} - -fn String c_compiler_to_string(C_Compiler c_compiler) -{ - switch (c_compiler) - { - case C_COMPILER_GCC: return strlit("gcc"); - case C_COMPILER_MSVC: return strlit("MSVC"); - case C_COMPILER_CLANG: return strlit("clang"); - case C_COMPILER_TCC: return strlit("tcc"); - default: unreachable(); - } -} - -// Returns the absolute path of a C compiler -fn String get_c_compiler_path(Arena* arena, BuildType build_type) -{ - String cc_path = {}; - String cc_env = os_get_environment_variable("CC"); - String path_env = os_get_environment_variable("PATH"); - String extension = {}; -#if _WIN32 - extension = strlit(".exe"); -#endif - if (cc_env.pointer) - { - cc_path = cc_env; - } - - if (!cc_path.pointer) - { -#if _WIN32 - cc_path = strlit("cl"); -#elif defined(__APPLE__) - cc_path = strlit("clang"); -#elif defined(__linux__) - cc_path = strlit("clang"); -#else -#error "Operating system not supported" -#endif - } - - let(no_path_sep, string_first_ch(cc_path, '/') == STRING_NO_MATCH); -#ifdef _WIN32 - no_path_sep = no_path_sep && string_first_ch(cc_path, '\\') == STRING_NO_MATCH; -#endif - if (no_path_sep) - { - cc_path = file_find_in_path(arena, cc_path, path_env, extension); - } - -#ifndef _WIN32 - if (cc_path.pointer) - { - u8 buffer[4096]; - let(realpath, os_realpath(cc_path, (String)array_to_slice(buffer))); - if (!s_equal(realpath, cc_path)) - { - cc_path.pointer = arena_allocate(arena, u8, realpath.length + 1); - cc_path.length = realpath.length; - memcpy(cc_path.pointer, realpath.pointer, realpath.length); - cc_path.pointer[cc_path.length] = 0; - } - } -#endif - -#if __APPLE__ - if (s_equal(cc_path, strlit("/usr/bin/cc"))) - { - cc_path = strlit("/usr/bin/clang"); - } -#endif - - if (preferred_c_compiler != C_COMPILER_COUNT && c_compiler_is_supported_by_os(preferred_c_compiler)) - { - String find_result = file_find_in_path(arena, c_compiler_to_string(preferred_c_compiler), path_env, extension); - if (find_result.pointer) - { - cc_path = find_result; - } - } - - if (!BB_CI) - { - if (build_type != BUILD_TYPE_DEBUG) - { - return strlit("/usr/lib/llvm18/bin/clang-18"); - } - } - - return cc_path; -} - -fn u8 c_compiler_supports_colored_output(C_Compiler compiler) -{ - // TODO: fix - switch (compiler) - { - case C_COMPILER_GCC: case C_COMPILER_CLANG: return 1; - case C_COMPILER_TCC: case C_COMPILER_MSVC: return 0; - default: unreachable(); - } -} - -fn char* c_compiler_get_error_limit_switch(C_Compiler compiler) -{ - // TODO: fix - switch (compiler) - { - case C_COMPILER_CLANG: return "-ferror-limit=1"; - case C_COMPILER_GCC: return "-fmax-errors=1"; - case C_COMPILER_MSVC: case C_COMPILER_TCC: return 0; - default: unreachable(); - } -} - -fn char* c_compiler_get_highest_c_standard_flag(C_Compiler compiler) -{ - switch (compiler) - { - case C_COMPILER_CLANG: case C_COMPILER_GCC: return "-std=gnu2x"; - case C_COMPILER_MSVC: return "/std:clatest"; - case C_COMPILER_TCC: return "-std=gnu2x"; // TODO: does it do anything in TCC? - default: unreachable(); - } -} - -fn RenderingBackend rendering_backend_parse_env(String env) -{ - unused(env); - todo(); -} - -fn RenderingBackend rendering_backend_pick() -{ - RenderingBackend rendering_backend = RENDERING_BACKEND_COUNT; -#if BB_CI - rendering_backend = RENDERING_BACKEND_NONE; -#else - char* env = getenv("BB_RENDERING_BACKEND"); - if (env) - { - rendering_backend = rendering_backend_parse_env(cstr(env)); - } - - if (!rendering_backend_is_valid(rendering_backend)) - { -#ifdef __linux__ - rendering_backend = RENDERING_BACKEND_VULKAN; -#elif defined(__APPLE__) - rendering_backend = RENDERING_BACKEND_METAL; -#elif _WIN32 - rendering_backend = RENDERING_BACKEND_VULKAN; -#endif - } -#endif - - return rendering_backend; -} - -fn WindowingBackend windowing_backend_parse_env(String env) -{ - unused(env); - todo(); -} - -fn WindowingBackend windowing_backend_pick() -{ - WindowingBackend windowing_backend = WINDOWING_BACKEND_COUNT; -#if BB_CI - windowing_backend = WINDOWING_BACKEND_NONE; -#else - // Only done for Linux because it is the only operating system in which two windowing backends officially coexist -#ifdef __linux__ - char* env = getenv("BB_WINDOWING_BACKEND"); - if (env) - { - windowing_backend = windowing_backend_parse_env(cstr(env)); - } -#endif - - if (!windowing_backend_is_valid(windowing_backend)) - { -#ifdef __linux__ - // Prefer X11 over Wayland because: - // 1) It works both on Wayland and on X11 desktops - // 2) It works with debugging tools like RenderDoc - windowing_backend = WINDOWING_BACKEND_X11; -#elif _WIN32 - windowing_backend = WINDOWING_BACKEND_WIN32; -#elif __APPLE__ - windowing_backend = WINDOWING_BACKEND_COCOA; -#endif - } -#endif - - return windowing_backend; -} - -fn u8 c_compiler_supports_time_trace(C_Compiler compiler) -{ - switch (compiler) - { - case C_COMPILER_CLANG: return 1; - default: return 0; - case C_COMPILER_COUNT: unreachable(); - } -} - -fn BuildType build_type_pick() -{ - String build_type_string = strlit(BB_BUILD_TYPE); - BuildType build_type; - - for (build_type = 0; build_type < BUILD_TYPE_COUNT; build_type += 1) - { - if (s_equal(build_type_string, cstr(build_type_strings[build_type]))) - { - break; - } - } - - return build_type; -} - -fn void compile_program(Arena* arena, CompileOptions options) -{ - if (!options.compiler_path.pointer) - { - char* cc_env = getenv("CC"); - if (options.flags.debug) - { - print("Could not find a valid compiler for CC: \"{cstr}\"\n", cc_env ? cc_env : ""); - print("PATH: {cstr}\n", getenv("PATH")); - } - - failed_execution(); - } - - if (options.flags.debug) - { - print("C compiler path: {s}\n", options.compiler_path); - } - - C_Compiler c_compiler = c_compiler_from_path(options.compiler_path); - if (c_compiler != C_COMPILER_COUNT) - { - String compiler_name = c_compiler_to_string(c_compiler); - if (options.flags.debug) - { - print("Identified compiler as {s}\n", compiler_name); - } - } - else - { - print("Unrecognized C compiler: {s}\n", options.compiler_path); - os_exit(1); - } - char* args[4096]; - u64 arg_i = 0; -#define add_arg(arg) args[arg_i++] = (arg) - add_arg(string_to_c(options.compiler_path)); - - if (c_compiler == C_COMPILER_MSVC) - { - add_arg("/nologo"); - } - - u8 llvm_mca = 0; - if (llvm_mca) - { - add_arg("-S"); - add_arg("-masm=intel"); - } - -#if __APPLE__ - add_arg("-x"); - add_arg("objective-c"); -#endif - - add_arg(string_to_c(options.source_path)); - - switch (c_compiler) - { - case C_COMPILER_MSVC: - { - String strings[] = { - strlit("/Fe"), - options.output_path, - }; - String arg = arena_join_string(arena, (Slice(String))array_to_slice(strings)); - add_arg(string_to_c(arg)); - - add_arg("/Fo" BUILD_DIR "\\"); - add_arg("/Fd" BUILD_DIR "\\"); - } break; - case C_COMPILER_GCC: - { - } break; - case C_COMPILER_CLANG: - { - // add_arg("-working-directory"); - // add_arg(BUILD_DIR); - // add_arg("-save-temps"); - } break; - default: break; - } - - if (c_compiler != C_COMPILER_MSVC) - { - add_arg("-o"); - add_arg(string_to_c(options.output_path)); - } - -#ifdef __linux__ - add_arg("-fuse-ld=mold"); -#endif - - add_arg("-Ibootstrap"); - add_arg("-Idependencies/stb"); - add_arg("-I" BUILD_DIR); // Include the build dir for generated files - - char* c_include_path = getenv("C_INCLUDE_PATH"); - if (c_include_path) - { - String c_include_path_string = cstr(c_include_path); - - u64 previous_i = 0; - for (u64 i = 0; i < c_include_path_string.length; i += 1) - { - u8 ch = c_include_path_string.pointer[i]; - if (ch == ':') - { - todo(); - } - } - - String strings[] = { - strlit("-I"), - s_get_slice(u8, c_include_path_string, previous_i, c_include_path_string.length), - }; - String arg = arena_join_string(arena, (Slice(String))array_to_slice(strings)); - add_arg(string_to_c(arg)); - } - - let(debug_info, options.build_type != BUILD_TYPE_RELEASE_SMALL && !llvm_mca); - if (debug_info) - { - add_arg(compiler_switches[c_compiler == C_COMPILER_MSVC][COMPILER_SWITCH_DEBUG_INFO]); - } - - if (c_compiler != C_COMPILER_TCC) - { - add_arg(optimization_switches[c_compiler == C_COMPILER_MSVC][options.build_type]); - } - - switch (options.build_type) - { - case BUILD_TYPE_COUNT: unreachable(); - case BUILD_TYPE_DEBUG: - case BUILD_TYPE_RELEASE_SAFE: - { - add_arg("-DBB_DEBUG=1"); - add_arg("-D_DEBUG=1"); - } break; - case BUILD_TYPE_RELEASE_FAST: - case BUILD_TYPE_RELEASE_SMALL: - { - add_arg("-DBB_DEBUG=0"); - add_arg("-DNDEBUG=1"); - if (c_compiler != C_COMPILER_MSVC) - { - add_arg("-fno-stack-protector"); - } - } break; - } - - if (BB_CI) - { - add_arg("-DBB_CI=1"); - } - else - { - add_arg("-DBB_CI=0"); - } - - // TODO: careful. If handing binaries built by CI to people, we need to be specially careful about this - if (c_compiler == C_COMPILER_MSVC) - { - add_arg("/arch:AVX512"); - } - else - { - add_arg("-march=native"); - } - - // Immutable options - switch (c_compiler) - { - case C_COMPILER_MSVC: - { - add_arg("/Wall"); -#if BB_ERROR_ON_WARNINGS - add_arg("/WX"); -#endif - add_arg("/wd4255"); - add_arg("/J"); - } break; - default: - { - add_arg("-pedantic"); - add_arg("-Wall"); - add_arg("-Wextra"); - add_arg("-Wpedantic"); - add_arg("-Wno-unused-function"); - add_arg("-Wno-nested-anon-types"); - add_arg("-Wno-keyword-macro"); - add_arg("-Wno-gnu-auto-type"); - add_arg("-Wno-gnu-binary-literal"); -#ifndef __APPLE__ - add_arg("-Wno-auto-decl-extensions"); -#endif - add_arg("-Wno-gnu-empty-initializer"); - add_arg("-Wno-fixed-enum-extension"); - add_arg("-Wno-overlength-strings"); - add_arg("-Wno-gnu-zero-variadic-macro-arguments"); -#if BB_ERROR_ON_WARNINGS - add_arg("-Werror"); -#endif - - add_arg("-fno-signed-char"); - add_arg("-fno-strict-aliasing"); - add_arg("-fwrapv"); - } break; - } - - if (options.flags.colored_output && c_compiler_supports_colored_output(c_compiler)) - { - add_arg("-fdiagnostics-color=auto"); - } - - if (options.flags.error_limit) - { - char* error_limit = c_compiler_get_error_limit_switch(c_compiler); - if (error_limit) - { - add_arg(error_limit); - } - } - - if (options.flags.time_trace && c_compiler_supports_time_trace(c_compiler)) - { - add_arg("-ftime-trace"); - } - - if (c_compiler == C_COMPILER_MSVC) - { - add_arg("/diagnostics:caret"); - } - else - { - add_arg("-fdiagnostics-show-option"); - } - - add_arg(c_compiler_get_highest_c_standard_flag(c_compiler)); - - switch (options.windowing_backend) - { - case WINDOWING_BACKEND_NONE: - { - add_arg("-DBB_WINDOWING_BACKEND_NONE=1"); - } break; - case WINDOWING_BACKEND_WIN32: - { - add_arg("-DBB_WINDOWING_BACKEND_WIN32=1"); - } break; - case WINDOWING_BACKEND_COCOA: - { - add_arg("-DBB_WINDOWING_BACKEND_COCOA=1"); - } break; - case WINDOWING_BACKEND_X11: - { - add_arg("-DBB_WINDOWING_BACKEND_X11=1"); - } break; - case WINDOWING_BACKEND_WAYLAND: - { - add_arg("-DBB_WINDOWING_BACKEND_WAYLAND=1"); - } break; - case WINDOWING_BACKEND_COUNT: unreachable(); - } - - switch (options.rendering_backend) - { - case RENDERING_BACKEND_NONE: - { - add_arg("-DBB_RENDERING_BACKEND_NONE=1"); - } break; - case RENDERING_BACKEND_METAL: - { - add_arg("-DBB_RENDERING_BACKEND_METAL=1"); - } break; - case RENDERING_BACKEND_DIRECTX12: - { - add_arg("-DBB_RENDERING_BACKEND_DIRECTX12=1"); - } break; - case RENDERING_BACKEND_VULKAN: - { - add_arg("-DBB_RENDERING_BACKEND_VULKAN=1"); -#if _WIN32 - char* vk_sdk_path = getenv("VK_SDK_PATH"); - if (vk_sdk_path) - { - if (c_compiler == C_COMPILER_MSVC) - { - String strings[] = { - strlit("-I"), - cstr(vk_sdk_path), - strlit("\\Include"), - }; - String arg = arena_join_string(arena, (Slice(String))array_to_slice(strings)); - add_arg(string_to_c(arg)); - } - else - { - todo(); - } - } - else - { - print("VK_SDK_PATH environment variable not found\n"); - } -#endif - } break; - case RENDERING_BACKEND_COUNT: unreachable(); - } - -#ifndef _WIN32 - add_arg("-lm"); - - String path_env = cstr(getenv("PATH")); - String llvm_config_path = executable_find_in_path(arena, strlit("llvm-config"), path_env); - u8 buffer[16*1024]; - u32 length = 0; - char* llvm_config_c = string_to_c(llvm_config_path); - { - char* arguments[] = { - llvm_config_c, - "--components", - 0, - }; - RunCommandOptions run_options = { - .stdout_stream = { - .buffer = buffer, - .length = &length, - .capacity = sizeof(buffer), - .policy = CHILD_PROCESS_STREAM_PIPE, - }, - .debug = options.flags.debug, - }; - RunCommandResult result = run_command(arena, (CStringSlice)array_to_slice(arguments), environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } - } - - { - char* argv_buffer[4096]; - argv_buffer[0] = llvm_config_c; - argv_buffer[1] = "--libs"; - u32 local_arg_i = 2; - - String llvm_components = { .pointer = buffer, .length = length }; - u32 i = 0; - while (i < length) - { - String slice = s_get_slice(u8, llvm_components, i, llvm_components.length); - u64 space_index = string_first_ch(slice, ' '); - u8 there_is_space = space_index != STRING_NO_MATCH; - u64 argument_length = unlikely(there_is_space) ? space_index : slice.length; - - String argument_slice = s_get_slice(u8, slice, 0, argument_length - !there_is_space); - argv_buffer[local_arg_i] = string_to_c(arena_duplicate_string(arena, argument_slice)); - local_arg_i += 1; - - i += argument_length + there_is_space; - } - - argv_buffer[local_arg_i] = 0; - local_arg_i += 1; - - length = 0; - - RunCommandOptions run_options = { - .stdout_stream = { - .buffer = buffer, - .length = &length, - .capacity = sizeof(buffer), - .policy = CHILD_PROCESS_STREAM_PIPE, - }, - .debug = options.flags.debug, - }; - CStringSlice arguments = { .pointer = argv_buffer, .length = local_arg_i }; - RunCommandResult result = run_command(arena, arguments, environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } - - i = 0; - - String llvm_libraries = { .pointer = buffer, .length = length }; - while (i < length) - { - String slice = s_get_slice(u8, llvm_libraries, i, llvm_libraries.length); - u64 space_index = string_first_ch(slice, ' '); - u8 there_is_space = space_index != STRING_NO_MATCH; - u64 argument_length = unlikely(there_is_space) ? space_index : slice.length; - - String argument_slice = s_get_slice(u8, slice, 0, argument_length - !there_is_space); - add_arg(string_to_c(arena_duplicate_string(arena, argument_slice))); - - i += argument_length + there_is_space; - } - } -#endif - - switch (options.windowing_backend) - { - case WINDOWING_BACKEND_NONE: - { - } break; - case WINDOWING_BACKEND_WIN32: - { - } break; - case WINDOWING_BACKEND_COCOA: - { - add_arg("-framework"); - add_arg("AppKit"); - } break; - case WINDOWING_BACKEND_X11: - { - add_arg("-lxcb"); - } break; - case WINDOWING_BACKEND_WAYLAND: - { - } break; - case WINDOWING_BACKEND_COUNT: unreachable(); - } - - switch (options.rendering_backend) - { - case RENDERING_BACKEND_NONE: - { - } break; - case RENDERING_BACKEND_METAL: - { - add_arg("-framework"); - add_arg("Metal"); - add_arg("-framework"); - add_arg("QuartzCore"); - } break; - case RENDERING_BACKEND_DIRECTX12: - { - } break; - case RENDERING_BACKEND_VULKAN: - { -#if __APPLE__ - add_arg("-framework"); - add_arg("QuartzCore"); -#endif - } break; - case RENDERING_BACKEND_COUNT: unreachable(); - } - - add_arg(0); - CStringSlice arguments = { .pointer = args, .length = arg_i }; - RunCommandOptions run_options = { - .debug = options.flags.debug, - }; - RunCommandResult result = run_command(arena, arguments, environment_pointer, run_options); - let(success, result.termination_kind == PROCESS_TERMINATION_EXIT && result.termination_code == 0); - if (!success) - { - os_exit(1); - } -} - -STRUCT(Load) -{ - u64 mask; - u8 index; - u8 size; -}; -decl_vb(Load); -declare_slice(Load); - -STRUCT(Combine) -{ - Slice(Load) loads; - u64 size; -}; - -STRUCT(Merge) -{ - Load values[2]; - u8 is_valid[2]; -}; - -typedef enum ProgramId -{ - PROGRAM_MERGE, - PROGRAM_COMBINE, - PROGRAM_LOAD, -} ProgramId; - -STRUCT(Program) -{ - union - { - Combine combine; - Load load; - Merge merge; - }; - ProgramId id; -}; - -STRUCT(Lookup) -{ - Slice(s32) indices; - SliceP(u8) words; -}; - -declare_slice(SliceP(u8)); -declare_slice(SliceP(void)); - -fn u64 pext(u64 w, u64 m) -{ - u64 result = 0; - u64 bit = 1; - - while (w != 0) - { - if ((m & 1) == 1) - { - if ((w & 1) == 1) - { - result |= bit; - } - - bit <<= 1; - } - - w >>= 1; - m >>= 1; - } - - return result; -} - -fn void n_word_mask(SliceP(u8) words, u8* mask, u8 length) -{ - for (u8 i = 0; i < length; i += 1) - { - mask[i] = 0xff; - } - - for (u8 byte = 0; byte < length; byte += 1) - { - for (u8 bit = 0; bit < 8; bit += 1) - { - u8 old = mask[byte]; - mask[byte] &= ~(u8)(1 << bit); - - u8 map[16*16][16] = {}; - u32 map_item_count = 0; - u8 candidate[16] = {}; - - for (u64 word_index = 0; word_index < words.length; word_index += 1) - { - let(word, words.pointer[word_index]); - for (u8 mask_index = 0; mask_index < length; mask_index += 1) - { - candidate[mask_index] = word[mask_index] & mask[mask_index]; - } - - u8 map_index; - for (map_index = 0; map_index < map_item_count; map_index += 1) - { - if (memcmp(map[map_index], candidate, length) == 0) - { - break; - } - } - - if (map_index != map_item_count) - { - mask[byte] = old; - break; - } - - memcpy(map[map_item_count], candidate, length); - map_item_count += 1; - } - } - } -} - -fn u64 program_lookup_size(Program program) -{ - u64 n = 0; - - switch (program.id) - { - case PROGRAM_COMBINE: - { - for (u64 i = 0; i < program.combine.loads.length; i += 1) - { - n += __builtin_popcountll(program.combine.loads.pointer[i].mask); - } - } break; - case PROGRAM_LOAD: - { - n = __builtin_popcountll(program.load.mask); - } break; - case PROGRAM_MERGE: todo(); - } - - return n; -} - -fn u64 load_load(Load load, u8* word) -{ - u64 result; - - switch (load.size) - { - case 1: result = word[load.index]; break; - case 2: result = *(u16*)&word[load.index]; break; - case 4: result = *(u32*)&word[load.index]; break; - case 8: result = *(u64*)&word[load.index]; break; - default: unreachable(); - } - - return result; -} - -fn u64 program_evaluate(Program program, u8* word) -{ - u64 result; - - switch (program.id) - { - case PROGRAM_COMBINE: - { - u64 q = 0; - u64 m = 0; - u64 shift = 0; - - for (u64 i = 0; i < program.combine.loads.length; i += 1) - { - Load load = program.combine.loads.pointer[i]; - let(qi, load_load(load, word)); - let(mi, load.mask); - - q |= qi << shift; - m |= mi << shift; - - shift += 8 * load.size; - } - - result = pext(q, m); - } break; - case PROGRAM_LOAD: - { - let(q, load_load(program.load, word)); - result = pext(q, program.load.mask); - } break; - case PROGRAM_MERGE: todo(); - } - - return result; -} - -fn Slice(s32) pdep_lookup(Arena* arena, Program program, SliceP(u8) words) -{ - let(length, 1 << program_lookup_size(program)); - let(result, arena_allocate(arena, s32, length)); - for (u64 i = 0; i < length; i += 1) - { - result[i] = -1; - } - - for (u64 i = 0; i < words.length; i += 1) - { - let(value, program_evaluate(program, words.pointer[i])); - result[value] = i; - } - - return (Slice(s32)) { .pointer = result, .length = length }; -} - -fn u8 load_trim(Load in, Load* out) -{ - u8 result = 0; - Load l; - switch (in.size) - { - case 8: - { - todo(); - } break; - case 4: - { - if ((in.mask & 0xffff) == 0) - { - l = (Load) { - .index = in.index + 4, - .size = 4, - .mask = in.mask >> 32, - }; - } - } break; - case 2: - { - if ((in.mask & 0xff) == 0) - { - todo(); - } - } break; - } - - if (result) - { - *out = l; - } - - return result; -} - -fn u8 can_merge(Load* load, u8* is_valid) -{ - if (!is_valid[0] || !is_valid[1]) - { - return 0; - } - - if ((load[0].mask & load[1].mask) == 0) - { - return 1; - } - - return 0; -} - -fn u8 new_merge(Load* loads, u8* is_valid, Merge* out) -{ - u8 result = 0; - - if (can_merge(loads, is_valid)) - { - result = 1; - *out = (Merge) - { - .values = { loads[0], loads[1] }, - .is_valid = { is_valid[0], is_valid[1] }, - }; - } - - return result; -} - -fn Program compile_mask(u8* mask, u8 mask_length) -{ - Program result = {}; - VirtualBuffer(Load) loads = {}; - const u8 load_sizes[] = {8, 4, 2, 1}; - - while (1) - { - u32 active = 0; - for (u8 i = 0; i < mask_length; i += 1) - { - active += mask[i] != 0; - } - - if (active == 0) - { - break; - } - - if (active == 1) - { - for (u8 i = 0; i < mask_length; i += 1) - { - u8 mask_byte = mask[i]; - if (mask_byte != 0) - { - *vb_add(&loads, 1) = (Load) { - .index = i, - .size = 1, - .mask = mask_byte, - }; - break; - } - } - - break; - } - - for (u8 size_index = 0; size_index < array_length(load_sizes); size_index += 1) - { - u8 size = load_sizes[size_index]; - if (size > mask_length) - { - continue; - } - - u8 best_count = 0; - u8 best_index = 0; - - for (u8 i = 0; i < mask_length - size + 1; i += 1) - { - u8 k = 0; - for (u8 mask_i = 0; mask_i < size; mask_i += 1) - { - k += mask[mask_i + i] != 0; - } - - if (k > best_count) - { - best_count = k; - best_index = i; - } - } - - if (best_count > 0) - { - Load load = { - .index = best_index, - .size = size, - }; - - for (u8 i = 0; i < size; i += 1) - { - load.mask |= (u64)mask[best_index + i] << (i * 8); - } - - *vb_add(&loads, 1) = load; - - for (u8 i = 0; i < size; i += 1) - { - mask[best_index + i] = 0; - } - - break; - } - } - } - - if (loads.length == 1) - { - while (1) - { - Load l; - if (!load_trim(loads.pointer[0], &l)) - { - break; - } - - loads.pointer[0] = l; - } - - return (Program) { - .load = loads.pointer[0], - .id = PROGRAM_LOAD, - }; - } - else if (loads.length == 2) - { - let(first, loads.pointer[0]); - let(second, loads.pointer[1]); - - let(trimmed, first); - u8 trimmed_is_valid = 1; - Merge merge_memory; - Load load_memory; - Merge merge = {}; - u8 merge_is_valid = 0; - - while (trimmed_is_valid) - { - Load merge_loads[2] = { trimmed, second }; - u8 is_valid[2] = { 1, 1 }; - Merge merge_candidate = {}; - if (new_merge(merge_loads, is_valid, &merge_candidate)) - { - merge = merge_candidate; - } - - trimmed_is_valid = load_trim(trimmed, &load_memory); - if (trimmed_is_valid) - { - trimmed = load_memory; - } - } - - if (merge_is_valid) - { - todo(); - } - } - - u64 total = 0; - for (u64 i = 0; i < loads.length; i += 1) - { - total += loads.pointer[i].size; - } - - u64 size = total < 4 ? 4 : 8; - result = (Program) { - .combine = { - .loads = { .pointer = loads.pointer, .length = loads.length }, - .size = size, - }, - .id = PROGRAM_COMBINE, - }; - return result; -} - -typedef enum TypeKind -{ - TYPE_KIND_U16, -} TypeKind; - -STRUCT(PerfectHashArguments) -{ - VirtualBuffer(u8)* file_h; - VirtualBuffer(u8)* file_c; - Slice_SliceP_u8 words_by_length; - u8* mask; - Lookup* lookups; - Program* programs; - Arena* arena; - String kind; - void** values_by_length; - TypeKind value_type; -}; - -fn void vb_indent(VirtualBuffer(u8)* buffer, u32 indentation_level) -{ - if (likely(indentation_level > 0)) - { - vb_copy_byte_repeatedly(buffer, ' ', 4 * indentation_level); - } -} - -fn String type_from_size(u8 size) -{ - String type; - switch (size) - { - case 8: type = strlit("u64"); break; - case 4: type = strlit("u32"); break; - case 2: type = strlit("u16"); break; - case 1: type = strlit("u8"); break; - default: unreachable(); - } - - return type; -} - -fn void load_write(Load load, VirtualBuffer(u8)* buffer, u32 load_name_index, u32 indentation_level, u32 length) -{ - String load_type = type_from_size(load.size); - - vb_indent(buffer, indentation_level); - vb_format(buffer, "{s} v{u32}_{u32};\n", load_type, load_name_index, length); - - vb_indent(buffer, indentation_level); - vb_format(buffer, "memcpy(&v{u32}_{u32}, &string_pointer[{u32}], {u32});\n", load_name_index, length, load.index, load.size); -} - -fn void program_write(VirtualBuffer(u8)* buffer, Program program, u32 indentation_level, u32 length) -{ - switch (program.id) - { - case PROGRAM_LOAD: - { - // Write the load - Load load = program.load; - u32 load_name_index = 0; - - load_write(load, buffer, load_name_index, indentation_level, length); - - // Write result - vb_indent(buffer, indentation_level); - vb_format(buffer, "u64 index_{u32} = _pext_u64(v{u32}_{u32}, 0x{u64:x});\n", length, load_name_index, length, load.mask); - } break; - case PROGRAM_COMBINE: - { - Combine combine = program.combine; - String combine_type_string = type_from_size(combine.size); - vb_indent(buffer, indentation_level); - vb_format(buffer, "{s} v_{u32} = 0;\n", combine_type_string, length); - - u64 shift = 0; - u64 mask = 0; - - for (u64 i = 0; i < combine.loads.length; i += 1) - { - Load load = combine.loads.pointer[i]; - mask |= load.mask << shift; - - load_write(load, buffer, (u32)i, indentation_level, length); - - vb_indent(buffer, indentation_level); - vb_format(buffer, "v_{u32} |= ({s})(v{u64}_{u32}) << {u64};\n", length, combine_type_string, i, length, shift); - - shift += 8 * load.size; - } - - // Write result - vb_indent(buffer, indentation_level); - vb_format(buffer, "u64 index_{u32} = _pext_u64(v_{u32}, 0x{u64:x});\n", length, length, mask); - } break; - case PROGRAM_MERGE: - { - todo(); - } break; - } - - // vb_indent(buffer, indentation_level); - // vb_format(buffer, "const char* word_{u32} = words_{u32}[index_{u32}];\n", length, length, length); - // vb_indent(buffer, indentation_level); - // vb_format(buffer, "let(value_{u32}, values_{u32}[index_{u32}]);\n", length, length, length); -} - -fn void perfect_hash_generate(PerfectHashArguments arguments) -{ - VirtualBuffer(u8)* h = arguments.file_h; - VirtualBuffer(u8)* c = arguments.file_c; - - String type_string; - switch (arguments.value_type) - { - case TYPE_KIND_U16: type_string = strlit("u16"); break; - } - - u64 word_character_count; - u64 value_count; - - { - u64 word_character_offset = 0; - u64 value_offset = 0; - for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - n_word_mask(words, arguments.mask, length); - Program program = compile_mask(arguments.mask, length); - arguments.programs[length] = program; - arguments.lookups[length].indices = pdep_lookup(arguments.arena, program, words); - arguments.lookups[length].words = words; - value_offset += arguments.lookups[length].indices.length; - word_character_offset += arguments.lookups[length].indices.length * length; - } - - word_character_count = word_character_offset; - value_count = value_offset; - } - - u32 indentation_level = 0; - vb_indent(h, indentation_level); - vb_format(h, "global_variable const {s} {s}_value_lut[] = {\n", type_string, arguments.kind); - - indentation_level += 1; - - for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - Lookup lookup = arguments.lookups[length]; - let(generic_values_by_length, arguments.values_by_length[length]); - - vb_indent(h, indentation_level); - vb_format(h, "// Values [{u64}]\n", length); - - if (words.length > 0) - { - for (u64 i = 0; i < lookup.indices.length; i += 1) - { - let(index, lookup.indices.pointer[i]); - vb_indent(h, indentation_level); - - if (index == -1) - { - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - vb_copy_string(h, strlit("0xffff,\n")); - } break; - } - } - else - { - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - let(value, ((u16*)generic_values_by_length)[index]); - String word = { .pointer = words.pointer[index], .length = length }; - vb_format(h, "0x{u32:x,w=4}, // {s}\n", value, word); - } break; - } - } - } - } - else - { - vb_indent(h, indentation_level); - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - vb_copy_string(h, strlit("0xffff,\n")); - } break; - } - } - } - - indentation_level -= 1; - - vb_indent(h, indentation_level); - vb_copy_string(h, strlit("};\n")); - - vb_indent(h, indentation_level); - vb_format(h, "static_assert(array_length({s}_value_lut) == {u64});\n", arguments.kind, value_count); - - assert(is_power_of_two_u64(arguments.words_by_length.length)); - u64 epi = 512 / arguments.words_by_length.length; - - String upper_names_by_batch_flag[] = { strlit("Single"), strlit("Batch") }; - String lower_names_by_batch_flag[] = { strlit("single"), strlit("batch") }; - - switch (arguments.value_type) - { - case TYPE_KIND_U16: - { - vb_format(h, "STRUCT(PextLookup{s}Result_{s})\n{\n __m512i v[2];\n};\n", upper_names_by_batch_flag[1], arguments.kind); - } break; - } - - for (u8 is_batch = 0; is_batch < 2; is_batch += 1) - { - u64 signature_length; - u8 result_type_buffer[256]; - String result_type_string; - if (is_batch) - { - result_type_string = format_string((String)array_to_slice(result_type_buffer), "PextLookupBatchResult_{s}", arguments.kind); - } - else - { - result_type_string = type_string; - } - - if (is_batch) - { - signature_length = vb_format(h, "fn {s} pext_lookup_{s}_{s}(const u8* const restrict string_base, const u32* const restrict string_offsets, const u32* const restrict string_lengths)", result_type_string, arguments.kind, lower_names_by_batch_flag[is_batch], type_string); - } - else - { - signature_length = vb_format(h, "fn {s} pext_lookup_{s}_{s}(const u8* const restrict string_pointer, u8 string_length)", result_type_string, arguments.kind, lower_names_by_batch_flag[is_batch], type_string); - } - - vb_copy_string(c, (String) { h->pointer + h->length - signature_length, .length = signature_length, }); - - vb_copy_string(h, strlit(";\n")); - - vb_copy_string(c, strlit("\n{\n")); - u32 indentation_level = 1; - - vb_indent(c, indentation_level); - if (is_batch) - { - vb_format(c, "PextLookupBatchResult_{s} result = {};\n", arguments.kind); - } - - assert(is_power_of_two_u64(arguments.words_by_length.length)); - { - vb_indent(c, indentation_level); - vb_format(c, "__m512i lengths = _mm512_set_epi{u64}(", epi); - for (s64 length = arguments.words_by_length.length - 1; length >= 0; length -= 1) - { - vb_format(c, "{u64}, ", length); - } - - c->length -= 2; - - vb_copy_string(c, strlit(");\n")); - - { - vb_indent(c, indentation_level); - assert(is_power_of_two_u64(arguments.words_by_length.length)); - vb_format(c, "__m512i raw_value_offsets = _mm512_set_epi{u64}(", epi); - let(value_offset, value_count); - for (s64 length = arguments.words_by_length.length - 1; length >= 0; length -= 1) - { - value_offset -= arguments.lookups[length].indices.length; - vb_format(c, "{u64}, ", value_offset); - } - c->length -= 2; - vb_copy_string(c, strlit(");\n")); - } - -#if 0 - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("global_variable const char words[] = {\n")); - // - // indentation_level += 1; - // - // for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - // { - // Lookup lookup = arguments.lookups[length]; - // SliceP(u8) words = arguments.words_by_length.pointer[length]; - // - // vb_indent(c, indentation_level); - // vb_format(c, "// Words [{u64}]\n", length); - // - // if (words.length > 0) - // { - // for (u64 i = 0; i < lookup.indices.length; i += 1) - // { - // let(index, lookup.indices.pointer[i]); - // - // vb_indent(c, indentation_level); - // - // if (index == -1) - // { - // *vb_add(c, 1) = '\"'; - // for (u64 i = 0; i < length; i += 1) - // { - // vb_copy_string(c, strlit("\\x00")); - // } - // - // *vb_add(c, 1) = '\"'; - // *vb_add(c, 1) = '\n'; - // } - // else - // { - // String word = { .pointer = words.pointer[index], .length = length }; - // *vb_add(c, 1) = '\"'; - // vb_copy_string(c, word); - // *vb_add(c, 1) = '\"'; - // *vb_add(c, 1) = '\n'; - // } - // } - // } - // else - // { - // vb_indent(c, indentation_level); - // *vb_add(c, 1) = '\"'; - // for (u64 i = 0; i < length; i += 1) - // { - // vb_copy_string(c, strlit("\\x00")); - // } - // - // *vb_add(c, 1) = '\"'; - // *vb_add(c, 1) = '\n'; - // } - // } - // - // indentation_level -= 1; - // - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("};\n")); - // - // vb_indent(c, indentation_level); - // vb_format(c, "static_assert(array_length(words) == {u64} + 1);\n", word_character_count); -#endif - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("u64 error_mask = 0;\n")); - - if (is_batch) - { - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("for (u32 string_index = 0; string_index < 64; string_index += 1)\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("{\n")); - - indentation_level += 1; - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("const u8* const restrict string_pointer = string_base + string_offsets[string_index];\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("u32 string_length = string_lengths[string_index];\n")); - } - - vb_indent(c, indentation_level); - vb_format(c, "__mmask{u64} length_compare_mask = _mm512_cmpeq_epi{u64}_mask(_mm512_set1_epi{u64}(string_length), lengths);\n", arguments.words_by_length.length, epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__mmask64 length_mask = _cvtu64_mask64(_cvtmask16_u32(length_compare_mask) - 1);\n")); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i word_offsets = _mm512_permutexvar_epi32(_mm512_setzero(), _mm512_maskz_compress_epi32(length_compare_mask, raw_word_offsets));\n")); - - vb_indent(c, indentation_level); - vb_format(c, "__m512i value_offsets = _mm512_permutexvar_epi{u64}(_mm512_setzero(), _mm512_maskz_compress_epi{u64}(length_compare_mask, raw_value_offsets));\n", epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i candidate_string_in_memory = _mm512_maskz_loadu_epi8(length_mask, &string_pointer[0]);\n")); - } - - for (u64 length = 0; length < arguments.words_by_length.length; length += 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - - if (words.length != 0) - { - program_write(c, arguments.programs[length], indentation_level, length); - - *vb_add(c, 1) = '\n'; - } - } - - vb_indent(c, indentation_level); - assert(is_power_of_two_u64(arguments.words_by_length.length)); - vb_format(c, "__m512i raw_indices = _mm512_set_epi{u64}(", epi); - - for (s64 length = arguments.words_by_length.length - 1; length >= 0; length -= 1) - { - SliceP(u8) words = arguments.words_by_length.pointer[length]; - if (words.length != 0) - { - vb_format(c, "index_{u64}, ", length); - } - else - { - vb_copy_string(c, strlit("0, ")); - } - } - - c->length -= 2; - vb_copy_string(c, strlit(");\n")); - - vb_indent(c, indentation_level); - vb_format(c, "__m512i indices = _mm512_permutexvar_epi{u64}(_mm512_setzero(), _mm512_maskz_compress_epi{u64}(length_compare_mask, raw_indices));\n", epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i word_indices = _mm512_add_epi32(word_offsets, indices);\n")); - - vb_indent(c, indentation_level); - vb_format(c, "__m512i value_indices = _mm512_add_epi{u64}(value_offsets, indices);\n", epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("let(word_index, _mm_extract_epi32(_mm512_extracti32x4_epi32(word_indices, 0), 0));\n")); - - vb_indent(c, indentation_level); - vb_format(c, "let(value_index, _mm_extract_epi{u64}(_mm512_extracti{u64}x{u64}_epi{u64}(value_indices, 0), 0));\n", epi, epi, (512 / 4) / epi, epi); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__m512i string_in_memory = _mm512_maskz_loadu_epi8(length_mask, &words[word_index]);\n")); - - vb_indent(c, indentation_level); - vb_format(c, "{s} value = {s}_value_lut[value_index];\n", type_string, arguments.kind); - - if (is_batch) - { - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("__mmask32 index_mask = _cvtu32_mask32(1 << string_index);\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("result.v[string_index > 31] = _mm512_mask_blend_epi16(index_mask, result.v[string_index > 31], _mm512_set1_epi16(value));\n")); - - indentation_level -= 1; - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("}\n")); - - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("return result;\n")); - } - else - { - vb_indent(c, indentation_level); - vb_copy_string(c, strlit("return value;\n")); - } - // vb_copy_string(c, strlit("u16 asd[32];\nif (string_index == 31) { _mm512_storeu_epi16(asd, result.v[0]); breakpoint(); }\n")); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("out_values[value_index] = value;\n")); - - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("__mmask64 string_compare_mask = _mm512_cmpeq_epi8_mask(candidate_string_in_memory, string_in_memory);\n")); - // - // vb_indent(c, indentation_level); - // vb_copy_string(c, strlit("error_mask |= (_cvtmask64_u64(_knot_mask64(string_compare_mask)) != 0) << string_index;\n")); - - - vb_copy_string(c, strlit("}\n")); - } -} - -STRUCT(x86_64_Register) -{ - String name; - u16 value; -}; - -typedef enum x86_64_RegisterClass : u8 -{ - REGISTER_CLASS_GPR, - REGISTER_CLASS_VECTOR, - REGISTER_CLASS_CONTROL, - REGISTER_CLASS_DEBUG, -} x86_64_RegisterClass; - -STRUCT(RegisterSpec) -{ - String name; - x86_64_RegisterClass class; - u8 raw_value; - u8 is_high:1; - u8 size; -}; - -fn x86_64_Register define_register(RegisterSpec spec) -{ - x86_64_Register reg = { - .name = spec.name, - .value = spec.raw_value, - }; - return reg; -} - -fn void metaprogram(Arena* arena) -{ - let(file, file_read(arena, strlit("bootstrap/bloat-buster/data/x86_mnemonic.dat"))); - String enum_prefix = strlit("MNEMONIC_x86_64_"); - String it = file; - VirtualBuffer(u8) generated_h = {}; - VirtualBuffer(u8) generated_c = {}; - - vb_copy_string(&generated_h, strlit("#pragma once\n\n")); - vb_copy_string(&generated_c, strlit("#pragma once\n\n")); - - vb_copy_string(&generated_h, strlit("#if defined(__x86_64__)\n")); - vb_copy_string(&generated_h, strlit("#include \n")); - vb_copy_string(&generated_h, strlit("#endif\n\n")); - - { - - STRUCT(BitsetComponent) - { - String name; - u64 bit_count; - }; - - STRUCT(ByteComponent) - { - String type_name; - String field_name; - u8 array_length; - u8 type_size; - u8 type_alignment; - u8 bit_count; - }; - - BitsetComponent bitset_components[] = { - { strlit("is_rm_register"), 1 }, - { strlit("is_reg_register"), 1 }, - { strlit("implicit_register"), 1 }, - { strlit("is_immediate"), 1 }, - { strlit("immediate_size"), 2 }, - { strlit("is_displacement"), 1 }, - { strlit("is_relative"), 1 }, - { strlit("displacement_size"), 1 }, - { strlit("rex_w"), 1 }, - { strlit("opcode_plus_register"), 1 }, - { strlit("opcode_extension"), 3 }, - { strlit("prefix_0f"), 1 }, - }; - - ByteComponent byte_components[] = { - // TODO: opcode, length -> 1 byte - { .type_name = strlit("u8"), .type_size = sizeof(u8), .type_alignment = alignof(u8), .field_name = strlit("opcode"), .array_length = 2, }, - }; - - u8 bit_offsets[array_length(bitset_components)]; - - u64 total_bit_count = 0; - for (u64 i = 0; i < array_length(bitset_components); i += 1) - { - bit_offsets[i] = total_bit_count; - total_bit_count += bitset_components[i].bit_count; - } - - u64 aligned_bit_count = next_power_of_two(total_bit_count); - if (aligned_bit_count < 8 || aligned_bit_count > 16) - { - os_exit(1); - } - - u64 alignment = aligned_bit_count / 8; - u64 bit_remainder = aligned_bit_count - total_bit_count; - - assert(aligned_bit_count % 8 == 0); - u64 total_size = aligned_bit_count / 8; - for (u64 i = 0; i < array_length(byte_components); i += 1) - { - alignment = MAX(byte_components[i].type_alignment, alignment); - total_size += byte_components[i].type_size * byte_components[i].array_length ? byte_components[i].array_length : 1; - } - - u64 aligned_total_size = next_power_of_two(align_forward_u64(total_size, alignment)); - u64 padding_bytes = aligned_total_size - total_size; - - vb_copy_string(&generated_h, strlit("STRUCT(EncodingInvariantData)\n{\n")); - - for (u64 i = 0; i < array_length(bitset_components); i += 1) - { - BitsetComponent component = bitset_components[i]; - vb_format(&generated_h, " u{u64} {s}:{u32};\n", aligned_bit_count, component.name, (u32)component.bit_count); - } - - if (bit_remainder) - { - vb_format(&generated_h, " u{u64} bit_reserved:{u64};\n", aligned_bit_count, bit_remainder); - } - - for (u64 i = 0; i < array_length(byte_components); i += 1) - { - ByteComponent component = byte_components[i]; - if (component.bit_count) - { - vb_format(&generated_h, " {s} {s}:{u32};\n", component.type_name, component.field_name, (u32)component.bit_count); - } - else if (component.array_length) - { - vb_format(&generated_h, " {s} {s}[{u32}];\n", component.type_name, component.field_name, (u32)component.array_length); - } - else - { - vb_format(&generated_h, " {s} {s};\n", component.type_name, component.field_name); - } - } - - if (padding_bytes) - { - vb_format(&generated_h, " u8 byte_reserved[{u64}];\n", padding_bytes); - } - - vb_copy_string(&generated_h, strlit("};\n\nstatic_assert(sizeof(EncodingInvariantData) <= sizeof(u64));\n\n")); - - for (u64 i = 0; i < array_length(bitset_components); i += 1) - { - vb_format(&generated_h, "#define {s}_bit_offset ({u64})\n", bitset_components[i].name, (u64)bit_offsets[i]); - } - - *vb_add(&generated_h, 1) = '\n'; - } - - vb_copy_string(&generated_h, strlit("typedef enum Mnemonic_x86_64\n{\n")); - VirtualBufferP(u8) mnemonic_names_by_length_buffer[16] = {}; - VirtualBuffer(u16) mnemonic_values_by_length_buffer[array_length(mnemonic_names_by_length_buffer)] = {}; - SliceP(u8) mnemonic_names_by_length[array_length(mnemonic_names_by_length_buffer)] = {}; - void* mnemonic_values_by_length[array_length(mnemonic_names_by_length_buffer)] = {}; - vb_copy_string(&generated_c, strlit("fn String mnemonic_x86_64_to_string(Mnemonic_x86_64 mnemonic)\n{\n switch (mnemonic)\n {\n")); - - u16 mnemonic_index = 0; - - while (it.length) - { - let(next_eol_index, string_first_ch(it, '\n')); - if (next_eol_index == STRING_NO_MATCH) - { - todo(); - } - - String mnemonic = { .pointer = it.pointer, .length = next_eol_index }; - *vb_add(&mnemonic_names_by_length_buffer[mnemonic.length], 1) = mnemonic.pointer; - *vb_add(&mnemonic_values_by_length_buffer[mnemonic.length], 1) = mnemonic_index; - - // Generated h - vb_copy_string(&generated_h, strlit(" ")); - vb_copy_string(&generated_h, enum_prefix); - vb_copy_string(&generated_h, mnemonic); - vb_format(&generated_h, " = 0x{u32:x,w=4},\n", mnemonic_index); - mnemonic_index += 1; - - // Generated c - vb_copy_string(&generated_c, strlit(" case ")); - vb_copy_string(&generated_c, enum_prefix); - vb_copy_string(&generated_c, mnemonic); - vb_copy_string(&generated_c, strlit(": return strlit(\"")); - vb_copy_string(&generated_c, mnemonic); - vb_copy_string(&generated_c, strlit("\");\n")); - - it = s_get_slice(u8, it, next_eol_index + 1, it.length); - } - - vb_copy_string(&generated_h, strlit("} Mnemonic_x86_64;\n")); - vb_format(&generated_h, "#define mnemonic_x86_64_count ({u32})\n", mnemonic_index); - - vb_copy_string(&generated_c, strlit(" }\n}\n")); - - for (u32 i = 0; i < array_length(mnemonic_names_by_length_buffer); i += 1) - { - mnemonic_names_by_length[i] = (SliceP(u8)) { .pointer = mnemonic_names_by_length_buffer[i].pointer, .length = mnemonic_names_by_length_buffer[i].length }; - mnemonic_values_by_length[i] = mnemonic_values_by_length_buffer[i].pointer; - } - - { - { - u8 mask[array_length(mnemonic_names_by_length)]; - Lookup lookups[array_length(mnemonic_names_by_length)]; - Program programs[array_length(mnemonic_names_by_length)]; - PerfectHashArguments perfect_hash = { - .file_h = &generated_h, - .file_c = &generated_c, - .words_by_length = array_to_slice(mnemonic_names_by_length), - .values_by_length = mnemonic_values_by_length, - .value_type = TYPE_KIND_U16, - .mask = mask, - .lookups = lookups, - .programs = programs, - .arena = arena, - .kind = strlit("mnemonic"), - }; - - perfect_hash_generate(perfect_hash); - } - - { -#define reg(n, v, c, ...) define_register((RegisterSpec) { .name = strlit(n), .raw_value = (v), .class = REGISTER_CLASS_ ## c, __VA_ARGS__ }) -#define regs(n, v, c, s, ...) define_register((RegisterSpec) { .name = strlit(n), .raw_value = (v), .class = (REGISTER_CLASS_ ## c), .size = (s), __VA_ARGS__ }) - x86_64_Register gpr_registers[] = { - regs("al", 0b000, GPR, 0), - regs("ah", 0b000, GPR, 1, .is_high = 1), - regs("ax", 0b000, GPR, 1), - regs("eax", 0b000, GPR, 2), - regs("rax", 0b000, GPR, 3), - - regs("cl", 0b0001, GPR, 0), - regs("ch", 0b0001, GPR, 1, .is_high = 1), - regs("cx", 0b0001, GPR, 1), - regs("ecx", 0b0001, GPR, 2), - regs("rcx", 0b0001, GPR, 3), - - regs("dl", 0b0010, GPR, 0), - regs("dh", 0b0010, GPR, 1, .is_high = 1), - regs("dx", 0b0010, GPR, 1), - regs("edx", 0b0010, GPR, 2), - regs("rdx", 0b0010, GPR, 3), - - regs("bl", 0b0011, GPR, 0), - regs("bh", 0b0011, GPR, 1, .is_high = 1), - regs("bx", 0b0011, GPR, 1), - regs("ebx", 0b0011, GPR, 2), - regs("rbx", 0b0011, GPR, 3), - - regs("spl", 0b0100, GPR, 0), - regs("sp", 0b0100, GPR, 1), - regs("esp", 0b0100, GPR, 2), - regs("rsp", 0b0100, GPR, 3), - - regs("bpl", 0b0101, GPR, 0), - regs("bp", 0b0101, GPR, 1), - regs("ebp", 0b0101, GPR, 2), - regs("rbp", 0b0101, GPR, 3), - - regs("sil", 0b0110, GPR, 0), - regs("si", 0b0110, GPR, 1), - regs("esi", 0b0110, GPR, 2), - regs("rsi", 0b0110, GPR, 3), - - regs("dil", 0b0111, GPR, 0), - regs("di", 0b0111, GPR, 1), - regs("edi", 0b0111, GPR, 2), - regs("rdi", 0b0111, GPR, 3), - - regs("r8l", 0b1000, GPR, 0), - regs("r8w", 0b1000, GPR, 1), - regs("r8d", 0b1000, GPR, 2), - regs("r8", 0b1000, GPR, 3), - - regs("r9l", 0b1001, GPR, 0), - regs("r9w", 0b1001, GPR, 1), - regs("r9d", 0b1001, GPR, 2), - regs("r9", 0b1001, GPR, 3), - - regs("r10l", 0b1010, GPR, 0), - regs("r10w", 0b1010, GPR, 1), - regs("r10d", 0b1010, GPR, 2), - regs("r10", 0b1010, GPR, 3), - - regs("r11l", 0b1011, GPR, 0), - regs("r11w", 0b1011, GPR, 1), - regs("r11d", 0b1011, GPR, 2), - regs("r11", 0b1011, GPR, 3), - - regs("r12l", 0b1100, GPR, 0), - regs("r12w", 0b1100, GPR, 1), - regs("r12d", 0b1100, GPR, 2), - regs("r12", 0b1100, GPR, 3), - - regs("r13l", 0b1101, GPR, 0), - regs("r13w", 0b1101, GPR, 1), - regs("r13d", 0b1101, GPR, 2), - regs("r13", 0b1101, GPR, 3), - - regs("r14l", 0b1110, GPR, 0), - regs("r14w", 0b1110, GPR, 1), - regs("r14d", 0b1110, GPR, 2), - regs("r14", 0b1110, GPR, 3), - - regs("r15l", 0b1111, GPR, 0), - regs("r15w", 0b1111, GPR, 1), - regs("r15d", 0b1111, GPR, 2), - regs("r15", 0b1111, GPR, 3), - }; - - VirtualBufferP(u8) register_names_by_length_buffer[8] = {}; - VirtualBuffer(u16) register_values_by_length_buffer[array_length(register_names_by_length_buffer)] = {}; - SliceP(u8) register_names_by_length[array_length(register_names_by_length_buffer)] = {}; - void* register_values_by_length[array_length(register_names_by_length_buffer)] = {}; - - vb_copy_string(&generated_h, strlit("typedef enum x86_64_Register : u16\n{\n")); - - for (u32 i = 0; i < array_length(gpr_registers); i += 1) - { - x86_64_Register reg = gpr_registers[i]; - *vb_add(®ister_names_by_length_buffer[reg.name.length], 1) = reg.name.pointer; - *vb_add(®ister_values_by_length_buffer[reg.name.length], 1) = reg.value; - vb_format(&generated_h, " REGISTER_X86_64_{s} = 0x{u32:x,w=4},\n", reg.name, reg.value); - } - - u8 vector_registers[32][3][5]; - - for (u8 i = 0; i < 32; i += 1) - { - for (u8 size = 0; size < 3; size += 1) - { - u8 decimal_digit_high = i / 10; - u8 decimal_digit_low = i % 10; - u8 decimal_digit_high_character = decimal_digit_high + '0'; - u8 decimal_digit_low_character = decimal_digit_low + '0'; - - vector_registers[i][size][0] = 'x' + size; - vector_registers[i][size][1] = 'm'; - vector_registers[i][size][2] = 'm'; - vector_registers[i][size][3] = decimal_digit_high ? decimal_digit_high_character : decimal_digit_low_character; - vector_registers[i][size][4] = decimal_digit_low_character; - RegisterSpec spec = { .name = { .pointer = vector_registers[i][size], .length = 4 + (decimal_digit_high != 0) }, .raw_value = i, .class = REGISTER_CLASS_VECTOR, .size = size, }; - let(reg, define_register(spec)); - *vb_add(®ister_names_by_length_buffer[reg.name.length], 1) = reg.name.pointer; - *vb_add(®ister_values_by_length_buffer[reg.name.length], 1) = reg.value; - vb_format(&generated_h, " REGISTER_X86_64_{s} = 0x{u32:x,w=4},\n", reg.name, reg.value); - } - } - - vb_copy_string(&generated_h, strlit("} x86_64_Register;\n")); - - for (u32 i = 0; i < array_length(register_names_by_length_buffer); i += 1) - { - register_names_by_length[i] = (SliceP(u8)) { .pointer = register_names_by_length_buffer[i].pointer, .length = register_names_by_length_buffer[i].length }; - register_values_by_length[i] = register_values_by_length_buffer[i].pointer; - } - - u8 mask[array_length(register_names_by_length)]; - Lookup lookups[array_length(register_names_by_length)]; - Program programs[array_length(register_names_by_length)]; - PerfectHashArguments perfect_hash = { - .file_h = &generated_h, - .file_c = &generated_c, - .words_by_length = array_to_slice(register_names_by_length), - .values_by_length = register_values_by_length, - .value_type = TYPE_KIND_U16, - .mask = mask, - .lookups = lookups, - .programs = programs, - .arena = arena, - .kind = strlit("register"), - }; - - perfect_hash_generate(perfect_hash); - } - } - - String generated_h_slice = { .pointer = generated_h.pointer, .length = generated_h.length }; - String generated_c_slice = { .pointer = generated_c.pointer, .length = generated_c.length }; - - { - FileWriteOptions options = { - .path = strlit(BUILD_DIR "/generated.h"), - .content = generated_h_slice, - }; - file_write(options); - } - - { - FileWriteOptions options = { - .path = strlit(BUILD_DIR "/generated.c"), - .content = generated_c_slice, - }; - file_write(options); - } -} - -STRUCT(Parser) -{ - u8* pointer; - u32 length; - u32 i; -}; - -fn String parse_mnemonic(Parser* parser) -{ - u32 start = parser->i; - u8* pointer = parser->pointer; - String result = { .pointer = pointer + start }; - - while (1) - { - u32 i = parser->i; - u8 ch = pointer[i]; - u8 ch_is_alphanumeric = is_alphanumeric(ch); - parser->i = i + ch_is_alphanumeric; - if (!ch_is_alphanumeric) - { - break; - } - } - - result.length = parser->i - start; - - return result; -} - -fn String parse_identifier(Parser* parser) -{ - u32 start = parser->i; - u8* pointer = parser->pointer; - String result = { .pointer = parser->pointer + parser->i }; - - while (1) - { - u32 i = parser->i; - u8 ch = pointer[i]; - u8 is_identifier_ch = is_alphanumeric(ch) | (ch == '_'); - parser->i = i + is_identifier_ch; - if (!is_identifier_ch) - { - break; - } - } - - result.length = parser->i - start; - - return result; -} - -fn u8 consume_character(Parser* parser, u8 expected_ch) -{ - u32 i = parser->i; - u8 ch = parser->pointer[i]; - let(is_expected_ch, unlikely((ch == expected_ch) & (i < parser->length))); - let(new_parser_i, i + is_expected_ch); - parser->i = new_parser_i; - return new_parser_i - i; -} - -fn void expect_character(Parser* parser, u8 expected_ch) -{ - if (!likely(consume_character(parser, expected_ch))) - { - print("Expected character failed!\n"); - os_exit(1); - } -} - - -fn u8 get_ch(Parser* parser) -{ - assert(parser->i < parser->length); - return parser->pointer[parser->i]; -} - -fn u8 expect_decimal_digit(Parser* parser) -{ - u32 i = parser->i; - assert(i < parser->length); - u8 ch = parser->pointer[i]; - u8 is_decimal_digit = (ch >= '0') & (ch <= '9'); - parser->i = i + is_decimal_digit; - if (likely(is_decimal_digit)) - { - return ch - '0'; - } - else - { - print("Expect integer digit failed!\n"); - os_exit(1); - } -} - -fn u8 consume_hex_byte(Parser* parser, u8* hex_byte) -{ - u32 i = parser->i; - assert(i < parser->length - 1); - u8* pointer = parser->pointer; - u8 high_ch = pointer[i]; - u8 low_ch = pointer[i + 1]; - u8 is_high_digit_hex = is_hex_digit(high_ch); - u8 is_low_digit_hex = is_hex_digit(low_ch); - u8 is_hex_byte = is_high_digit_hex & is_low_digit_hex; - parser->i = i + (2 * is_hex_byte); - u8 result = is_hex_byte; - if (likely(result)) - { - u8 high_int = hex_ch_to_int(high_ch); - u8 low_int = hex_ch_to_int(low_ch); - u8 byte = (high_int << 4) | low_int; - *hex_byte = byte; - } - - return result; -} - -fn u8 expect_hex_byte(Parser* parser) -{ - u8 result; - if (!consume_hex_byte(parser, &result)) - { - print("Expect hex byte failed!\n"); - os_exit(1); - } - - return result; -} - -// TODO: this might be a perf bottleneck -fn u8 consume_tab(Parser* parser) -{ - u8 space0 = consume_character(parser, ' '); - u8 space1 = consume_character(parser, ' '); - u8 space2 = consume_character(parser, ' '); - u8 space3 = consume_character(parser, ' '); - u8 result = (space0 + space1) + (space2 + space3); - return result == 4; -} - -typedef enum InstructionClass -{ - INSTRUCTION_CLASS_BASE_ARITHMETIC, - INSTRUCTION_CLASS_UNSIGNED_ADD_FLAG, - INSTRUCTION_CLASS_BITTEST, - INSTRUCTION_CLASS_CMOV, - INSTRUCTION_CLASS_JCC, - INSTRUCTION_CLASS_ROTATE, - INSTRUCTION_CLASS_SHIFT, - INSTRUCTION_CLASS_SETCC, -} InstructionClass; - -fn String parse_encoding_type(Parser* parser) -{ - u32 i = parser->i; - while (1) - { - u8 ch = get_ch(parser); - u8 is_valid_encoding_type_ch = is_lower(ch) | (ch == '-'); - parser->i += is_valid_encoding_type_ch; - if (is_valid_encoding_type_ch) - { - if (parser->i - i > 4) - { - todo(); - } - } - else - { - break; - } - } - - u64 length = parser->i - i; - if (length == 0) - { - todo(); - } - if (length > 4) - { - todo(); - } - - String result = { .pointer = parser->pointer + i, .length = length }; - return result; -} - -fn void parse_encoding_details(Parser* parser) -{ - expect_character(parser, '['); - String encoding_type = parse_encoding_type(parser); - expect_character(parser, ':'); - expect_character(parser, ' '); - - while (!consume_character(parser, ']')) - { - // Parser encoding atom - u8 byte; - if (consume_hex_byte(parser, &byte)) - { - u8 ch = get_ch(parser); - u8 is_plus = ch == '+'; - parser->i += is_plus; - if (unlikely(is_plus)) - { - expect_character(parser, 'r'); - } - } - else - { - String identifier = parse_identifier(parser); - if (identifier.length) - { - if (identifier.pointer[0] == 'i') - { - assert(identifier.length == 2); - u8 imm_byte = identifier.pointer[1]; - u8 is_valid_imm_byte = ((imm_byte == 'b') | (imm_byte == 'w')) | ((imm_byte == 'd') | (imm_byte == 'q')); - if (!likely(is_valid_imm_byte)) - { - print("Bad immediate value\n"); - os_exit(1); - } - } - else if (s_equal(identifier, strlit("rex"))) - { - expect_character(parser, '.'); - u8 rex_ch = get_ch(parser); - u8 is_valid_rex_ch = ((rex_ch == 'w') | (rex_ch == 'r')) | ((rex_ch == 'x') | (rex_ch == 'b')); - parser->i += is_valid_rex_ch; - if (!likely(is_valid_rex_ch)) - { - todo(); - } - } - else if (string_starts_with(identifier, strlit("rel"))) - { - // todo - } - else - { - todo(); - } - } - else - { - u8 ch = get_ch(parser); - switch (ch) - { - case '/': - { - parser->i += 1; - if (consume_character(parser, 'r')) - { - // TODO - } - else - { - expect_decimal_digit(parser); - } - } break; - default: - todo(); - } - } - } - - consume_character(parser, ' '); - } -} - -fn void parse_encoding(Parser* parser) -{ - u8 first_ch = get_ch(parser); - u32 start = parser->i; - if (first_ch != '[') - { - while (1) - { - u32 i = parser->i; - String operand = parse_mnemonic(parser); - assert(operand.length); - if (consume_character(parser, ',')) - { - expect_character(parser, ' '); - } - else - { - break; - } - } - - expect_character(parser, ' '); - } - - parse_encoding_details(parser); -} - -fn void parse_instruction_table(Arena* arena) -{ - String file = file_read(arena, strlit("bootstrap/bloat-buster/data/instructions.dat")); - Parser parser_memory = { - .pointer = file.pointer, - .length = file.length, - }; - Parser* parser = &parser_memory; - - VirtualBuffer(u8) file_memory = {}; - VirtualBuffer(u8)* f = &file_memory; - - let_cast(u32, file_length, file.length); - while (parser->i < file_length) - { - String mnemonic = parse_mnemonic(parser); - expect_character(parser, ':'); - - if (consume_character(parser, '\n')) - { - while (consume_tab(parser)) - { - parse_encoding(parser); - expect_character(parser, '\n'); - } - } - else if (consume_character(parser, ' ')) - { - u8 next_ch = get_ch(parser); - switch (next_ch) - { - case '[': - { - parse_encoding_details(parser); - } break; - default: - { - String identifier = parse_identifier(parser); - if (s_equal(identifier, strlit("class"))) - { - expect_character(parser, ' '); - String class_identifier = parse_identifier(parser); - InstructionClass instruction_class; - - if (s_equal(class_identifier, strlit("base_arithmetic"))) - { - instruction_class = INSTRUCTION_CLASS_BASE_ARITHMETIC; - } - else if (s_equal(class_identifier, strlit("unsigned_add_flag"))) - { - instruction_class = INSTRUCTION_CLASS_UNSIGNED_ADD_FLAG; - } - else if (s_equal(class_identifier, strlit("bittest"))) - { - instruction_class = INSTRUCTION_CLASS_BITTEST; - } - else if (s_equal(class_identifier, strlit("cmov"))) - { - instruction_class = INSTRUCTION_CLASS_CMOV; - } - else if (s_equal(class_identifier, strlit("jcc"))) - { - instruction_class = INSTRUCTION_CLASS_JCC; - } - else if (s_equal(class_identifier, strlit("rotate"))) - { - instruction_class = INSTRUCTION_CLASS_ROTATE; - } - else if (s_equal(class_identifier, strlit("shift"))) - { - instruction_class = INSTRUCTION_CLASS_SHIFT; - } - else if (s_equal(class_identifier, strlit("setcc"))) - { - instruction_class = INSTRUCTION_CLASS_SETCC; - } - else - { - todo(); - } - - switch (instruction_class) - { - case INSTRUCTION_CLASS_BASE_ARITHMETIC: - { - u8 opcodes[3]; - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - opcodes[0] = expect_hex_byte(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - opcodes[1] = expect_hex_byte(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - opcodes[2] = expect_hex_byte(parser); - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_UNSIGNED_ADD_FLAG: - { - expect_character(parser, '('); - u8 opcode = expect_hex_byte(parser); - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_BITTEST: - { - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - expect_character(parser, ','); - expect_character(parser, ' '); - - u8 opcode = expect_hex_byte(parser); - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_CMOV: - { - } break; - case INSTRUCTION_CLASS_JCC: - { - } break; - case INSTRUCTION_CLASS_ROTATE: - { - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_SHIFT: - { - expect_character(parser, '('); - - expect_character(parser, '/'); - u8 imm_digit = expect_decimal_digit(parser); - - expect_character(parser, ')'); - } break; - case INSTRUCTION_CLASS_SETCC: - { - } break; - } - } - else - { - parser->i -= identifier.length; - parse_encoding(parser); - } - } break; - } - - expect_character(parser, '\n'); - } - else - { - todo(); - } - } -} - -int main(int argc, char* argv[], char** envp) -{ - environment_pointer = envp; - Arena* arena = arena_initialize_default(KB(64)); - metaprogram(arena); - parse_instruction_table(arena); - BuildType build_type = build_type_pick(); - CompileOptions compile_options = { - .compiler_path = get_c_compiler_path(arena, build_type), - .source_path = strlit("bootstrap/bloat-buster/bb.c"), - .output_path = strlit("cache/bb" EXECUTABLE_EXTENSION), - .windowing_backend = windowing_backend_pick(), - .rendering_backend = rendering_backend_pick(), - .build_type = build_type, - .flags = { - .colored_output = 1, - .error_limit = BB_ERROR_LIMIT, - .debug = BB_CI, - .time_trace = BB_TIMETRACE, - }, - }; - compile_program(arena, compile_options); - return 0; -} diff --git a/dependencies/stb/.gitignore b/dependencies/stb/.gitignore deleted file mode 100644 index 8cc774f..0000000 --- a/dependencies/stb/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.o -*.obj -*.exe diff --git a/dependencies/stb/LICENSE b/dependencies/stb/LICENSE deleted file mode 100644 index a77ae91..0000000 --- a/dependencies/stb/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -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/dependencies/stb/stb_image.h b/dependencies/stb/stb_image.h deleted file mode 100644 index 9eedabe..0000000 --- a/dependencies/stb/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 -#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 -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 -#include // ptrdiff_t on osx -#include -#include -#include - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp, pow -#endif - -#ifndef STBI_NO_STDIO -#include -#endif - -#ifndef STBI_ASSERT -#include -#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 -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 - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include // __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 -#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<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; ytype) { - default: - return stbi__errpuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;xchannel,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; ichannel,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;ichannel,dest,value); - } else { // Raw - ++count; - if (count>left) return stbi__errpuc("bad file","scanline overrun"); - - for(i=0;ichannel,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/dependencies/stb/stb_truetype.h b/dependencies/stb/stb_truetype.h deleted file mode 100644 index 2a710a7..0000000 --- a/dependencies/stb/stb_truetype.h +++ /dev/null @@ -1,5089 +0,0 @@ -// stb_truetype.h - v1.26 - public domain -// authored from 2009-2021 by Sean Barrett / RAD Game Tools -// -// ======================================================================= -// -// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES -// -// This library does no range checking of the offsets found in the file, -// meaning an attacker can use it to read arbitrary memory. -// -// ======================================================================= -// -// This library processes TrueType files: -// parse files -// extract glyph metrics -// extract glyph shapes -// render glyphs to one-channel bitmaps with antialiasing (box filter) -// render glyphs to one-channel SDF bitmaps (signed-distance field/function) -// -// Todo: -// non-MS cmaps -// crashproof on bad data -// hinting? (no longer patented) -// cleartype-style AA? -// optimize: use simple memory allocator for intermediates -// optimize: build edge-list directly from curves -// optimize: rasterize directly from curves? -// -// ADDITIONAL CONTRIBUTORS -// -// Mikko Mononen: compound shape support, more cmap formats -// Tor Andersson: kerning, subpixel rendering -// Dougall Johnson: OpenType / Type 2 font handling -// Daniel Ribeiro Maciel: basic GPOS-based kerning -// -// Misc other: -// Ryan Gordon -// Simon Glass -// github:IntellectualKitty -// Imanol Celaya -// Daniel Ribeiro Maciel -// -// Bug/warning reports/fixes: -// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe -// Cass Everitt Martins Mozeiko github:aloucks -// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam -// Brian Hook Omar Cornut github:vassvik -// Walter van Niftrik Ryan Griege -// David Gow Peter LaValle -// David Given Sergey Popov -// Ivan-Assen Ivanov Giumo X. Clanjor -// Anthony Pesch Higor Euripedes -// Johan Duparc Thomas Fields -// Hou Qiming Derek Vinyard -// Rob Loach Cort Stratton -// Kenney Phillis Jr. Brian Costabile -// Ken Voskuil (kaesve) Yakov Galka -// -// VERSION HISTORY -// -// 1.26 (2021-08-28) fix broken rasterizer -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// variant PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// -// Full history can be found at the end of this file. -// -// LICENSE -// -// See end of file for license information. -// -// USAGE -// -// Include this file in whatever places need to refer to it. In ONE C/C++ -// file, write: -// #define STB_TRUETYPE_IMPLEMENTATION -// before the #include of this file. This expands out the actual -// implementation into that C/C++ file. -// -// To make the implementation private to the file that generates the implementation, -// #define STBTT_STATIC -// -// Simple 3D API (don't ship this, but it's fine for tools and quick start) -// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture -// stbtt_GetBakedQuad() -- compute quad to draw for a given char -// -// Improved 3D API (more shippable): -// #include "stb_rect_pack.h" -- optional, but you really want it -// stbtt_PackBegin() -// stbtt_PackSetOversampling() -- for improved quality on small fonts -// stbtt_PackFontRanges() -- pack and renders -// stbtt_PackEnd() -// stbtt_GetPackedQuad() -// -// "Load" a font file from a memory buffer (you have to keep the buffer loaded) -// stbtt_InitFont() -// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections -// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections -// -// Render a unicode codepoint to a bitmap -// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap -// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide -// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be -// -// Character advance/positioning -// stbtt_GetCodepointHMetrics() -// stbtt_GetFontVMetrics() -// stbtt_GetFontVMetricsOS2() -// stbtt_GetCodepointKernAdvance() -// -// Starting with version 1.06, the rasterizer was replaced with a new, -// faster and generally-more-precise rasterizer. The new rasterizer more -// accurately measures pixel coverage for anti-aliasing, except in the case -// where multiple shapes overlap, in which case it overestimates the AA pixel -// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If -// this turns out to be a problem, you can re-enable the old rasterizer with -// #define STBTT_RASTERIZER_VERSION 1 -// which will incur about a 15% speed hit. -// -// ADDITIONAL DOCUMENTATION -// -// Immediately after this block comment are a series of sample programs. -// -// After the sample programs is the "header file" section. This section -// includes documentation for each API function. -// -// Some important concepts to understand to use this library: -// -// Codepoint -// Characters are defined by unicode codepoints, e.g. 65 is -// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is -// the hiragana for "ma". -// -// Glyph -// A visual character shape (every codepoint is rendered as -// some glyph) -// -// Glyph index -// A font-specific integer ID representing a glyph -// -// Baseline -// Glyph shapes are defined relative to a baseline, which is the -// bottom of uppercase characters. Characters extend both above -// and below the baseline. -// -// Current Point -// As you draw text to the screen, you keep track of a "current point" -// which is the origin of each character. The current point's vertical -// position is the baseline. Even "baked fonts" use this model. -// -// Vertical Font Metrics -// The vertical qualities of the font, used to vertically position -// and space the characters. See docs for stbtt_GetFontVMetrics. -// -// Font Size in Pixels or Points -// The preferred interface for specifying font sizes in stb_truetype -// is to specify how tall the font's vertical extent should be in pixels. -// If that sounds good enough, skip the next paragraph. -// -// Most font APIs instead use "points", which are a common typographic -// measurement for describing font size, defined as 72 points per inch. -// stb_truetype provides a point API for compatibility. However, true -// "per inch" conventions don't make much sense on computer displays -// since different monitors have different number of pixels per -// inch. For example, Windows traditionally uses a convention that -// there are 96 pixels per inch, thus making 'inch' measurements have -// nothing to do with inches, and thus effectively defining a point to -// be 1.333 pixels. Additionally, the TrueType font data provides -// an explicit scale factor to scale a given font's glyphs to points, -// but the author has observed that this scale factor is often wrong -// for non-commercial fonts, thus making fonts scaled in points -// according to the TrueType spec incoherently sized in practice. -// -// DETAILED USAGE: -// -// Scale: -// Select how high you want the font to be, in points or pixels. -// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute -// a scale factor SF that will be used by all other functions. -// -// Baseline: -// You need to select a y-coordinate that is the baseline of where -// your text will appear. Call GetFontBoundingBox to get the baseline-relative -// bounding box for all characters. SF*-y0 will be the distance in pixels -// that the worst-case character could extend above the baseline, so if -// you want the top edge of characters to appear at the top of the -// screen where y=0, then you would set the baseline to SF*-y0. -// -// Current point: -// Set the current point where the first character will appear. The -// first character could extend left of the current point; this is font -// dependent. You can either choose a current point that is the leftmost -// point and hope, or add some padding, or check the bounding box or -// left-side-bearing of the first character to be displayed and set -// the current point based on that. -// -// Displaying a character: -// Compute the bounding box of the character. It will contain signed values -// relative to . I.e. if it returns x0,y0,x1,y1, -// then the character should be displayed in the rectangle from -// to = 32 && *text < 128) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 - glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); - glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); - glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); - glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); - } - ++text; - } - glEnd(); -} -#endif -// -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program (this compiles): get a single bitmap, print as ASCII art -// -#if 0 -#include -#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation -#include "stb_truetype.h" - -char ttf_buffer[1<<25]; - -int main(int argc, char **argv) -{ - stbtt_fontinfo font; - unsigned char *bitmap; - int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); - - fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); - - stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); - bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); - - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) - putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); - putchar('\n'); - } - return 0; -} -#endif -// -// Output: -// -// .ii. -// @@@@@@. -// V@Mio@@o -// :i. V@V -// :oM@@M -// :@@@MM@M -// @@o o@M -// :@@. M@M -// @@@o@@@@ -// :M@@V:@@. -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program: print "Hello World!" banner, with bugs -// -#if 0 -char buffer[24<<20]; -unsigned char screen[20][79]; - -int main(int arg, char **argv) -{ - stbtt_fontinfo font; - int i,j,ascent,baseline,ch=0; - float scale, xpos=2; // leave a little padding in case the character extends left - char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness - - fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); - stbtt_InitFont(&font, buffer, 0); - - scale = stbtt_ScaleForPixelHeight(&font, 15); - stbtt_GetFontVMetrics(&font, &ascent,0,0); - baseline = (int) (ascent*scale); - - while (text[ch]) { - int advance,lsb,x0,y0,x1,y1; - float x_shift = xpos - (float) floor(xpos); - stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); - stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); - stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); - // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong - // because this API is really for baking character bitmaps into textures. if you want to render - // a sequence of characters, you really need to render each bitmap to a temp buffer, then - // "alpha blend" that into the working buffer - xpos += (advance * scale); - if (text[ch+1]) - xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); - ++ch; - } - - for (j=0; j < 20; ++j) { - for (i=0; i < 78; ++i) - putchar(" .:ioVM@"[screen[j][i]>>5]); - putchar('\n'); - } - - return 0; -} -#endif - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//// -//// INTEGRATION WITH YOUR CODEBASE -//// -//// The following sections allow you to supply alternate definitions -//// of C library functions used by stb_truetype, e.g. if you don't -//// link with the C runtime library. - -#ifdef STB_TRUETYPE_IMPLEMENTATION - // #define your own (u)stbtt_int8/16/32 before including to override this - #ifndef stbtt_uint8 - typedef unsigned char stbtt_uint8; - typedef signed char stbtt_int8; - typedef unsigned short stbtt_uint16; - typedef signed short stbtt_int16; - typedef unsigned int stbtt_uint32; - typedef signed int stbtt_int32; - #endif - - typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; - typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; - - // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h - #ifndef STBTT_ifloor - #include - #define STBTT_ifloor(x) ((int) floor(x)) - #define STBTT_iceil(x) ((int) ceil(x)) - #endif - - #ifndef STBTT_sqrt - #include - #define STBTT_sqrt(x) sqrt(x) - #define STBTT_pow(x,y) pow(x,y) - #endif - - #ifndef STBTT_fmod - #include - #define STBTT_fmod(x,y) fmod(x,y) - #endif - - #ifndef STBTT_cos - #include - #define STBTT_cos(x) cos(x) - #define STBTT_acos(x) acos(x) - #endif - - #ifndef STBTT_fabs - #include - #define STBTT_fabs(x) fabs(x) - #endif - - // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h - #ifndef STBTT_malloc - #include - #define STBTT_malloc(x,u) ((void)(u),malloc(x)) - #define STBTT_free(x,u) ((void)(u),free(x)) - #endif - - #ifndef STBTT_assert - #include - #define STBTT_assert(x) assert(x) - #endif - - #ifndef STBTT_strlen - #include - #define STBTT_strlen(x) strlen(x) - #endif - - #ifndef STBTT_memcpy - #include - #define STBTT_memcpy memcpy - #define STBTT_memset memset - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// INTERFACE -//// -//// - -#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ -#define __STB_INCLUDE_STB_TRUETYPE_H__ - -#ifdef STBTT_STATIC -#define STBTT_DEF static -#else -#define STBTT_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// private structure -typedef struct -{ - unsigned char *data; - int cursor; - int size; -} stbtt__buf; - -////////////////////////////////////////////////////////////////////////////// -// -// TEXTURE BAKING API -// -// If you use this API, you only have to call two functions ever. -// - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; -} stbtt_bakedchar; - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata); // you allocate this, it's num_chars long -// if return is positive, the first unused row of the bitmap -// if return is negative, returns the negative of the number of characters that fit -// if return is 0, no characters fit and no rows were used -// This uses a very crappy packing. - -typedef struct -{ - float x0,y0,s0,t0; // top-left - float x1,y1,s1,t1; // bottom-right -} stbtt_aligned_quad; - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier -// Call GetBakedQuad with char_index = 'character - first_char', and it -// creates the quad you need to draw and advances the current position. -// -// The coordinate system used assumes y increases downwards. -// -// Characters will extend both above and below the current position; -// see discussion of "BASELINE" above. -// -// It's inefficient; you might want to c&p it and optimize it. - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); -// Query the font vertical metrics without having to create a font first. - - -////////////////////////////////////////////////////////////////////////////// -// -// NEW TEXTURE BAKING API -// -// This provides options for packing multiple fonts into one atlas, not -// perfectly but better than nothing. - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; - float xoff2,yoff2; -} stbtt_packedchar; - -typedef struct stbtt_pack_context stbtt_pack_context; -typedef struct stbtt_fontinfo stbtt_fontinfo; -#ifndef STB_RECT_PACK_VERSION -typedef struct stbrp_rect stbrp_rect; -#endif - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); -// Initializes a packing context stored in the passed-in stbtt_pack_context. -// Future calls using this context will pack characters into the bitmap passed -// in here: a 1-channel bitmap that is width * height. stride_in_bytes is -// the distance from one row to the next (or 0 to mean they are packed tightly -// together). "padding" is the amount of padding to leave between each -// character (normally you want '1' for bitmaps you'll use as textures with -// bilinear filtering). -// -// Returns 0 on failure, 1 on success. - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); -// Cleans up the packing context and frees all memory. - -#define STBTT_POINT_SIZE(x) (-(x)) - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); -// Creates character bitmaps from the font_index'th font found in fontdata (use -// font_index=0 if you don't know what that is). It creates num_chars_in_range -// bitmaps for characters with unicode values starting at first_unicode_char_in_range -// and increasing. Data for how to render them is stored in chardata_for_range; -// pass these to stbtt_GetPackedQuad to get back renderable quads. -// -// font_size is the full height of the character from ascender to descender, -// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed -// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() -// and pass that result as 'font_size': -// ..., 20 , ... // font max minus min y is 20 pixels tall -// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall - -typedef struct -{ - float font_size; - int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint - int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints - int num_chars; - stbtt_packedchar *chardata_for_range; // output - unsigned char h_oversample, v_oversample; // don't set these, they're used internally -} stbtt_pack_range; - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); -// Creates character bitmaps from multiple ranges of characters stored in -// ranges. This will usually create a better-packed bitmap than multiple -// calls to stbtt_PackFontRange. Note that you can call this multiple -// times within a single PackBegin/PackEnd. - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); -// Oversampling a font increases the quality by allowing higher-quality subpixel -// positioning, and is especially valuable at smaller text sizes. -// -// This function sets the amount of oversampling for all following calls to -// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given -// pack context. The default (no oversampling) is achieved by h_oversample=1 -// and v_oversample=1. The total number of pixels required is -// h_oversample*v_oversample larger than the default; for example, 2x2 -// oversampling requires 4x the storage of 1x1. For best results, render -// oversampled textures with bilinear filtering. Look at the readme in -// stb/tests/oversample for information about oversampled fonts -// -// To use with PackFontRangesGather etc., you must set it before calls -// call to PackFontRangesGatherRects. - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); -// If skip != 0, this tells stb_truetype to skip any codepoints for which -// there is no corresponding glyph. If skip=0, which is the default, then -// codepoints without a glyph recived the font's "missing character" glyph, -// typically an empty box by convention. - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int align_to_integer); - -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -// Calling these functions in sequence is roughly equivalent to calling -// stbtt_PackFontRanges(). If you more control over the packing of multiple -// fonts, or if you want to pack custom data into a font texture, take a look -// at the source to of stbtt_PackFontRanges() and create a custom version -// using these functions, e.g. call GatherRects multiple times, -// building up a single array of rects, then call PackRects once, -// then call RenderIntoRects repeatedly. This may result in a -// better packing than calling PackFontRanges multiple times -// (or it may not). - -// this is an opaque structure that you shouldn't mess with which holds -// all the context needed from PackBegin to PackEnd. -struct stbtt_pack_context { - void *user_allocator_context; - void *pack_info; - int width; - int height; - int stride_in_bytes; - int padding; - int skip_missing; - unsigned int h_oversample, v_oversample; - unsigned char *pixels; - void *nodes; -}; - -////////////////////////////////////////////////////////////////////////////// -// -// FONT LOADING -// -// - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); -// This function will determine the number of fonts in a font file. TrueType -// collection (.ttc) files may contain multiple fonts, while TrueType font -// (.ttf) files only contain one font. The number of fonts can be used for -// indexing with the previous function where the index is between zero and one -// less than the total fonts. If an error occurs, -1 is returned. - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); -// Each .ttf/.ttc file may have more than one font. Each font has a sequential -// index number starting from 0. Call this function to get the font offset for -// a given index; it returns -1 if the index is out of range. A regular .ttf -// file will only define one font and it always be at offset 0, so it will -// return '0' for index 0, and -1 for all other indices. - -// The following structure is defined publicly so you can declare one on -// the stack or as a global or etc, but you should treat it as opaque. -struct stbtt_fontinfo -{ - void * userdata; - unsigned char * data; // pointer to .ttf file - int fontstart; // offset of start of font - - int numGlyphs; // number of glyphs, needed for range checking - - int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf - int index_map; // a cmap mapping for our chosen character encoding - int indexToLocFormat; // format needed to map from glyph index to glyph - - stbtt__buf cff; // cff font data - stbtt__buf charstrings; // the charstring index - stbtt__buf gsubrs; // global charstring subroutines index - stbtt__buf subrs; // private charstring subroutines index - stbtt__buf fontdicts; // array of font dicts - stbtt__buf fdselect; // map from glyph to fontdict -}; - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); -// Given an offset into the file that defines a font, this function builds -// the necessary cached info for the rest of the system. You must allocate -// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't -// need to do anything special to free it, because the contents are pure -// value data with no additional data structures. Returns 0 on failure. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER TO GLYPH-INDEX CONVERSIOn - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); -// If you're going to perform multiple operations on the same character -// and you want a speed-up, call this function with the character you're -// going to process, then use glyph-based functions instead of the -// codepoint-based functions. -// Returns 0 if the character codepoint is not defined in the font. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER PROPERTIES -// - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose "height" is 'pixels' tall. -// Height is measured as the distance from the highest ascender to the lowest -// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics -// and computing: -// scale = pixels / (ascent - descent) -// so if you prefer to measure height by the ascent only, use a similar calculation. - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose EM size is mapped to -// 'pixels' tall. This is probably what traditional APIs compute, but -// I'm not positive. - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); -// ascent is the coordinate above the baseline the font extends; descent -// is the coordinate below the baseline the font extends (i.e. it is typically negative) -// lineGap is the spacing between one row's descent and the next row's ascent... -// so you should advance the vertical position by "*ascent - *descent + *lineGap" -// these are expressed in unscaled coordinates, so you must multiply by -// the scale factor for a given size - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); -// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 -// table (specific to MS/Windows TTF files). -// -// Returns 1 on success (table present), 0 on failure. - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); -// the bounding box around all possible characters - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); -// leftSideBearing is the offset from the current horizontal position to the left edge of the character -// advanceWidth is the offset from the current horizontal position to the next horizontal position -// these are expressed in unscaled coordinates - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); -// an additional amount to add to the 'advance' value between ch1 and ch2 - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); -// Gets the bounding box of the visible part of the glyph, in unscaled coordinates - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); -// as above, but takes one or more glyph indices for greater efficiency - -typedef struct stbtt_kerningentry -{ - int glyph1; // use stbtt_FindGlyphIndex - int glyph2; - int advance; -} stbtt_kerningentry; - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); -// Retrieves a complete list of all of the kerning pairs provided by the font -// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. -// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) - -////////////////////////////////////////////////////////////////////////////// -// -// GLYPH SHAPES (you probably don't need these, but they have to go before -// the bitmaps for C declaration-order reasons) -// - -#ifndef STBTT_vmove // you can predefine these to use different values (but why?) - enum { - STBTT_vmove=1, - STBTT_vline, - STBTT_vcurve, - STBTT_vcubic - }; -#endif - -#ifndef stbtt_vertex // you can predefine this to use different values - // (we share this with other code at RAD) - #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file - typedef struct - { - stbtt_vertex_type x,y,cx,cy,cx1,cy1; - unsigned char type,padding; - } stbtt_vertex; -#endif - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); -// returns non-zero if nothing is drawn for this glyph - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); -// returns # of vertices and fills *vertices with the pointer to them -// these are expressed in "unscaled" coordinates -// -// The shape is a series of contours. Each one starts with -// a STBTT_moveto, then consists of a series of mixed -// STBTT_lineto and STBTT_curveto segments. A lineto -// draws a line from previous endpoint to its x,y; a curveto -// draws a quadratic bezier from previous endpoint to -// its x,y, using cx,cy as the bezier control point. - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); -// frees the data allocated above - -STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); -// fills svg with the character's SVG data. -// returns data size or 0 if SVG not found. - -////////////////////////////////////////////////////////////////////////////// -// -// BITMAP RENDERING -// - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); -// frees the bitmap allocated below - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// allocates a large-enough single-channel 8bpp bitmap and renders the -// specified character/glyph at the specified scale into it, with -// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). -// *width & *height are filled out with the width & height of the bitmap, -// which is stored left-to-right, top-to-bottom. -// -// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); -// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap -// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap -// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the -// width and height and positioning info for it first. - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); -// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); -// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering -// is performed (see stbtt_PackSetOversampling) - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -// get the bbox of the bitmap centered around the glyph origin; so the -// bitmap width is ix1-ix0, height is iy1-iy0, and location to place -// the bitmap top left is (leftSideBearing*scale,iy0). -// (Note that the bitmap uses y-increases-down, but the shape uses -// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); -// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel -// shift for the character - -// the following functions are equivalent to the above functions, but operate -// on glyph indices instead of Unicode codepoints (for efficiency) -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); - - -// @TODO: don't expose this structure -typedef struct -{ - int w,h,stride; - unsigned char *pixels; -} stbtt__bitmap; - -// rasterize a shape with quadratic beziers into a bitmap -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into - float flatness_in_pixels, // allowable error of curve in pixels - stbtt_vertex *vertices, // array of vertices defining shape - int num_verts, // number of vertices in above array - float scale_x, float scale_y, // scale applied to input vertices - float shift_x, float shift_y, // translation applied to input vertices - int x_off, int y_off, // another translation applied to input - int invert, // if non-zero, vertically flip shape - void *userdata); // context for to STBTT_MALLOC - -////////////////////////////////////////////////////////////////////////////// -// -// Signed Distance Function (or Field) rendering - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); -// frees the SDF bitmap allocated below - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -// These functions compute a discretized SDF field for a single character, suitable for storing -// in a single-channel texture, sampling with bilinear filtering, and testing against -// larger than some threshold to produce scalable fonts. -// info -- the font -// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap -// glyph/codepoint -- the character to generate the SDF for -// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), -// which allows effects like bit outlines -// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) -// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) -// if positive, > onedge_value is inside; if negative, < onedge_value is inside -// width,height -- output height & width of the SDF bitmap (including padding) -// xoff,yoff -- output origin of the character -// return value -- a 2D array of bytes 0..255, width*height in size -// -// pixel_dist_scale & onedge_value are a scale & bias that allows you to make -// optimal use of the limited 0..255 for your application, trading off precision -// and special effects. SDF values outside the range 0..255 are clamped to 0..255. -// -// Example: -// scale = stbtt_ScaleForPixelHeight(22) -// padding = 5 -// onedge_value = 180 -// pixel_dist_scale = 180/5.0 = 36.0 -// -// This will create an SDF bitmap in which the character is about 22 pixels -// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled -// shape, sample the SDF at each pixel and fill the pixel if the SDF value -// is greater than or equal to 180/255. (You'll actually want to antialias, -// which is beyond the scope of this example.) Additionally, you can compute -// offset outlines (e.g. to stroke the character border inside & outside, -// or only outside). For example, to fill outside the character up to 3 SDF -// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above -// choice of variables maps a range from 5 pixels outside the shape to -// 2 pixels inside the shape to 0..255; this is intended primarily for apply -// outside effects only (the interior range is needed to allow proper -// antialiasing of the font at *smaller* sizes) -// -// The function computes the SDF analytically at each SDF pixel, not by e.g. -// building a higher-res bitmap and approximating it. In theory the quality -// should be as high as possible for an SDF of this size & representation, but -// unclear if this is true in practice (perhaps building a higher-res bitmap -// and computing from that can allow drop-out prevention). -// -// The algorithm has not been optimized at all, so expect it to be slow -// if computing lots of characters or very large sizes. - - - -////////////////////////////////////////////////////////////////////////////// -// -// Finding the right font... -// -// You should really just solve this offline, keep your own tables -// of what font is what, and don't try to get it out of the .ttf file. -// That's because getting it out of the .ttf file is really hard, because -// the names in the file can appear in many possible encodings, in many -// possible languages, and e.g. if you need a case-insensitive comparison, -// the details of that depend on the encoding & language in a complex way -// (actually underspecified in truetype, but also gigantic). -// -// But you can use the provided functions in two possible ways: -// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on -// unicode-encoded names to try to find the font you want; -// you can run this before calling stbtt_InitFont() -// -// stbtt_GetFontNameString() lets you get any of the various strings -// from the file yourself and do your own comparisons on them. -// You have to have called stbtt_InitFont() first. - - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); -// returns the offset (not index) of the font that matches, or -1 if none -// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". -// if you use any other flag, use a font name like "Arial"; this checks -// the 'macStyle' header field; i don't know if fonts set this consistently -#define STBTT_MACSTYLE_DONTCARE 0 -#define STBTT_MACSTYLE_BOLD 1 -#define STBTT_MACSTYLE_ITALIC 2 -#define STBTT_MACSTYLE_UNDERSCORE 4 -#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); -// returns 1/0 whether the first string interpreted as utf8 is identical to -// the second string interpreted as big-endian utf16... useful for strings from next func - -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); -// returns the string (which may be big-endian double byte, e.g. for unicode) -// and puts the length in bytes in *length. -// -// some of the values for the IDs are below; for more see the truetype spec: -// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html -// http://www.microsoft.com/typography/otspec/name.htm - -enum { // platformID - STBTT_PLATFORM_ID_UNICODE =0, - STBTT_PLATFORM_ID_MAC =1, - STBTT_PLATFORM_ID_ISO =2, - STBTT_PLATFORM_ID_MICROSOFT =3 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_UNICODE - STBTT_UNICODE_EID_UNICODE_1_0 =0, - STBTT_UNICODE_EID_UNICODE_1_1 =1, - STBTT_UNICODE_EID_ISO_10646 =2, - STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, - STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT - STBTT_MS_EID_SYMBOL =0, - STBTT_MS_EID_UNICODE_BMP =1, - STBTT_MS_EID_SHIFTJIS =2, - STBTT_MS_EID_UNICODE_FULL =10 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes - STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, - STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, - STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, - STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 -}; - -enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... - // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs - STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, - STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, - STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, - STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, - STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, - STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D -}; - -enum { // languageID for STBTT_PLATFORM_ID_MAC - STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, - STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, - STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, - STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , - STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , - STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, - STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 -}; - -#ifdef __cplusplus -} -#endif - -#endif // __STB_INCLUDE_STB_TRUETYPE_H__ - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// IMPLEMENTATION -//// -//// - -#ifdef STB_TRUETYPE_IMPLEMENTATION - -#ifndef STBTT_MAX_OVERSAMPLE -#define STBTT_MAX_OVERSAMPLE 8 -#endif - -#if STBTT_MAX_OVERSAMPLE > 255 -#error "STBTT_MAX_OVERSAMPLE cannot be > 255" -#endif - -typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; - -#ifndef STBTT_RASTERIZER_VERSION -#define STBTT_RASTERIZER_VERSION 2 -#endif - -#ifdef _MSC_VER -#define STBTT__NOTUSED(v) (void)(v) -#else -#define STBTT__NOTUSED(v) (void)sizeof(v) -#endif - -////////////////////////////////////////////////////////////////////////// -// -// stbtt__buf helpers to parse data from file -// - -static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor++]; -} - -static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor]; -} - -static void stbtt__buf_seek(stbtt__buf *b, int o) -{ - STBTT_assert(!(o > b->size || o < 0)); - b->cursor = (o > b->size || o < 0) ? b->size : o; -} - -static void stbtt__buf_skip(stbtt__buf *b, int o) -{ - stbtt__buf_seek(b, b->cursor + o); -} - -static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) -{ - stbtt_uint32 v = 0; - int i; - STBTT_assert(n >= 1 && n <= 4); - for (i = 0; i < n; i++) - v = (v << 8) | stbtt__buf_get8(b); - return v; -} - -static stbtt__buf stbtt__new_buf(const void *p, size_t size) -{ - stbtt__buf r; - STBTT_assert(size < 0x40000000); - r.data = (stbtt_uint8*) p; - r.size = (int) size; - r.cursor = 0; - return r; -} - -#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) -#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) - -static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) -{ - stbtt__buf r = stbtt__new_buf(NULL, 0); - if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; - r.data = b->data + o; - r.size = s; - return r; -} - -static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) -{ - int count, start, offsize; - start = b->cursor; - count = stbtt__buf_get16(b); - if (count) { - offsize = stbtt__buf_get8(b); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(b, offsize * count); - stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); - } - return stbtt__buf_range(b, start, b->cursor - start); -} - -static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) -{ - int b0 = stbtt__buf_get8(b); - if (b0 >= 32 && b0 <= 246) return b0 - 139; - else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; - else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; - else if (b0 == 28) return stbtt__buf_get16(b); - else if (b0 == 29) return stbtt__buf_get32(b); - STBTT_assert(0); - return 0; -} - -static void stbtt__cff_skip_operand(stbtt__buf *b) { - int v, b0 = stbtt__buf_peek8(b); - STBTT_assert(b0 >= 28); - if (b0 == 30) { - stbtt__buf_skip(b, 1); - while (b->cursor < b->size) { - v = stbtt__buf_get8(b); - if ((v & 0xF) == 0xF || (v >> 4) == 0xF) - break; - } - } else { - stbtt__cff_int(b); - } -} - -static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) -{ - stbtt__buf_seek(b, 0); - while (b->cursor < b->size) { - int start = b->cursor, end, op; - while (stbtt__buf_peek8(b) >= 28) - stbtt__cff_skip_operand(b); - end = b->cursor; - op = stbtt__buf_get8(b); - if (op == 12) op = stbtt__buf_get8(b) | 0x100; - if (op == key) return stbtt__buf_range(b, start, end-start); - } - return stbtt__buf_range(b, 0, 0); -} - -static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) -{ - int i; - stbtt__buf operands = stbtt__dict_get(b, key); - for (i = 0; i < outcount && operands.cursor < operands.size; i++) - out[i] = stbtt__cff_int(&operands); -} - -static int stbtt__cff_index_count(stbtt__buf *b) -{ - stbtt__buf_seek(b, 0); - return stbtt__buf_get16(b); -} - -static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) -{ - int count, offsize, start, end; - stbtt__buf_seek(&b, 0); - count = stbtt__buf_get16(&b); - offsize = stbtt__buf_get8(&b); - STBTT_assert(i >= 0 && i < count); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(&b, i*offsize); - start = stbtt__buf_get(&b, offsize); - end = stbtt__buf_get(&b, offsize); - return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); -} - -////////////////////////////////////////////////////////////////////////// -// -// accessors to parse data from file -// - -// on platforms that don't allow misaligned reads, if we want to allow -// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE - -#define ttBYTE(p) (* (stbtt_uint8 *) (p)) -#define ttCHAR(p) (* (stbtt_int8 *) (p)) -#define ttFixed(p) ttLONG(p) - -static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } -static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } - -#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) -#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) - -static int stbtt__isfont(stbtt_uint8 *font) -{ - // check the version number - if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 - if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! - if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF - if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 - if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts - return 0; -} - -// @OPTIMIZE: binary search -static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) -{ - stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); - stbtt_uint32 tabledir = fontstart + 12; - stbtt_int32 i; - for (i=0; i < num_tables; ++i) { - stbtt_uint32 loc = tabledir + 16*i; - if (stbtt_tag(data+loc+0, tag)) - return ttULONG(data+loc+8); - } - return 0; -} - -static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) -{ - // if it's just a font, there's only one valid index - if (stbtt__isfont(font_collection)) - return index == 0 ? 0 : -1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - stbtt_int32 n = ttLONG(font_collection+8); - if (index >= n) - return -1; - return ttULONG(font_collection+12+index*4); - } - } - return -1; -} - -static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) -{ - // if it's just a font, there's only one valid font - if (stbtt__isfont(font_collection)) - return 1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - return ttLONG(font_collection+8); - } - } - return 0; -} - -static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) -{ - stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; - stbtt__buf pdict; - stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); - if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); - pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); - stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); - if (!subrsoff) return stbtt__new_buf(NULL, 0); - stbtt__buf_seek(&cff, private_loc[1]+subrsoff); - return stbtt__cff_get_index(&cff); -} - -// since most people won't use this, find this table the first time it's needed -static int stbtt__get_svg(stbtt_fontinfo *info) -{ - stbtt_uint32 t; - if (info->svg < 0) { - t = stbtt__find_table(info->data, info->fontstart, "SVG "); - if (t) { - stbtt_uint32 offset = ttULONG(info->data + t + 2); - info->svg = t + offset; - } else { - info->svg = 0; - } - } - return info->svg; -} - -static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) -{ - stbtt_uint32 cmap, t; - stbtt_int32 i,numTables; - - info->data = data; - info->fontstart = fontstart; - info->cff = stbtt__new_buf(NULL, 0); - - cmap = stbtt__find_table(data, fontstart, "cmap"); // required - info->loca = stbtt__find_table(data, fontstart, "loca"); // required - info->head = stbtt__find_table(data, fontstart, "head"); // required - info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required - info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required - info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required - info->kern = stbtt__find_table(data, fontstart, "kern"); // not required - info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required - - if (!cmap || !info->head || !info->hhea || !info->hmtx) - return 0; - if (info->glyf) { - // required for truetype - if (!info->loca) return 0; - } else { - // initialization for CFF / Type2 fonts (OTF) - stbtt__buf b, topdict, topdictidx; - stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; - stbtt_uint32 cff; - - cff = stbtt__find_table(data, fontstart, "CFF "); - if (!cff) return 0; - - info->fontdicts = stbtt__new_buf(NULL, 0); - info->fdselect = stbtt__new_buf(NULL, 0); - - // @TODO this should use size from table (not 512MB) - info->cff = stbtt__new_buf(data+cff, 512*1024*1024); - b = info->cff; - - // read the header - stbtt__buf_skip(&b, 2); - stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize - - // @TODO the name INDEX could list multiple fonts, - // but we just use the first one. - stbtt__cff_get_index(&b); // name INDEX - topdictidx = stbtt__cff_get_index(&b); - topdict = stbtt__cff_index_get(topdictidx, 0); - stbtt__cff_get_index(&b); // string INDEX - info->gsubrs = stbtt__cff_get_index(&b); - - stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); - stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); - stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); - stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); - info->subrs = stbtt__get_subrs(b, topdict); - - // we only support Type 2 charstrings - if (cstype != 2) return 0; - if (charstrings == 0) return 0; - - if (fdarrayoff) { - // looks like a CID font - if (!fdselectoff) return 0; - stbtt__buf_seek(&b, fdarrayoff); - info->fontdicts = stbtt__cff_get_index(&b); - info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); - } - - stbtt__buf_seek(&b, charstrings); - info->charstrings = stbtt__cff_get_index(&b); - } - - t = stbtt__find_table(data, fontstart, "maxp"); - if (t) - info->numGlyphs = ttUSHORT(data+t+4); - else - info->numGlyphs = 0xffff; - - info->svg = -1; - - // find a cmap encoding table we understand *now* to avoid searching - // later. (todo: could make this installable) - // the same regardless of glyph. - numTables = ttUSHORT(data + cmap + 2); - info->index_map = 0; - for (i=0; i < numTables; ++i) { - stbtt_uint32 encoding_record = cmap + 4 + 8 * i; - // find an encoding we understand: - switch(ttUSHORT(data+encoding_record)) { - case STBTT_PLATFORM_ID_MICROSOFT: - switch (ttUSHORT(data+encoding_record+2)) { - case STBTT_MS_EID_UNICODE_BMP: - case STBTT_MS_EID_UNICODE_FULL: - // MS/Unicode - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - break; - case STBTT_PLATFORM_ID_UNICODE: - // Mac/iOS has these - // all the encodingIDs are unicode, so we don't bother to check it - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - } - if (info->index_map == 0) - return 0; - - info->indexToLocFormat = ttUSHORT(data+info->head + 50); - return 1; -} - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) -{ - stbtt_uint8 *data = info->data; - stbtt_uint32 index_map = info->index_map; - - stbtt_uint16 format = ttUSHORT(data + index_map + 0); - if (format == 0) { // apple byte encoding - stbtt_int32 bytes = ttUSHORT(data + index_map + 2); - if (unicode_codepoint < bytes-6) - return ttBYTE(data + index_map + 6 + unicode_codepoint); - return 0; - } else if (format == 6) { - stbtt_uint32 first = ttUSHORT(data + index_map + 6); - stbtt_uint32 count = ttUSHORT(data + index_map + 8); - if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) - return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); - return 0; - } else if (format == 2) { - STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean - return 0; - } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges - stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; - stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; - stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); - stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; - - // do a binary search of the segments - stbtt_uint32 endCount = index_map + 14; - stbtt_uint32 search = endCount; - - if (unicode_codepoint > 0xffff) - return 0; - - // they lie from endCount .. endCount + segCount - // but searchRange is the nearest power of two, so... - if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) - search += rangeShift*2; - - // now decrement to bias correctly to find smallest - search -= 2; - while (entrySelector) { - stbtt_uint16 end; - searchRange >>= 1; - end = ttUSHORT(data + search + searchRange*2); - if (unicode_codepoint > end) - search += searchRange*2; - --entrySelector; - } - search += 2; - - { - stbtt_uint16 offset, start, last; - stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); - - start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); - last = ttUSHORT(data + endCount + 2*item); - if (unicode_codepoint < start || unicode_codepoint > last) - return 0; - - offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); - if (offset == 0) - return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); - - return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); - } - } else if (format == 12 || format == 13) { - stbtt_uint32 ngroups = ttULONG(data+index_map+12); - stbtt_int32 low,high; - low = 0; high = (stbtt_int32)ngroups; - // Binary search the right group. - while (low < high) { - stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high - stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); - stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); - if ((stbtt_uint32) unicode_codepoint < start_char) - high = mid; - else if ((stbtt_uint32) unicode_codepoint > end_char) - low = mid+1; - else { - stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); - if (format == 12) - return start_glyph + unicode_codepoint-start_char; - else // format == 13 - return start_glyph; - } - } - return 0; // not found - } - // @TODO - STBTT_assert(0); - return 0; -} - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) -{ - return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); -} - -static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) -{ - v->type = type; - v->x = (stbtt_int16) x; - v->y = (stbtt_int16) y; - v->cx = (stbtt_int16) cx; - v->cy = (stbtt_int16) cy; -} - -static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) -{ - int g1,g2; - - STBTT_assert(!info->cff.size); - - if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range - if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format - - if (info->indexToLocFormat == 0) { - g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; - g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; - } else { - g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); - g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); - } - - return g1==g2 ? -1 : g1; // if length is 0, return -1 -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); - -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - if (info->cff.size) { - stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); - } else { - int g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 0; - - if (x0) *x0 = ttSHORT(info->data + g + 2); - if (y0) *y0 = ttSHORT(info->data + g + 4); - if (x1) *x1 = ttSHORT(info->data + g + 6); - if (y1) *y1 = ttSHORT(info->data + g + 8); - } - return 1; -} - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) -{ - return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); -} - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt_int16 numberOfContours; - int g; - if (info->cff.size) - return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; - g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 1; - numberOfContours = ttSHORT(info->data + g); - return numberOfContours == 0; -} - -static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, - stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) -{ - if (start_off) { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); - } - return num_vertices; -} - -static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - stbtt_int16 numberOfContours; - stbtt_uint8 *endPtsOfContours; - stbtt_uint8 *data = info->data; - stbtt_vertex *vertices=0; - int num_vertices=0; - int g = stbtt__GetGlyfOffset(info, glyph_index); - - *pvertices = NULL; - - if (g < 0) return 0; - - numberOfContours = ttSHORT(data + g); - - if (numberOfContours > 0) { - stbtt_uint8 flags=0,flagcount; - stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; - stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; - stbtt_uint8 *points; - endPtsOfContours = (data + g + 10); - ins = ttUSHORT(data + g + 10 + numberOfContours * 2); - points = data + g + 10 + numberOfContours * 2 + 2 + ins; - - n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); - - m = n + 2*numberOfContours; // a loose bound on how many vertices we might need - vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); - if (vertices == 0) - return 0; - - next_move = 0; - flagcount=0; - - // in first pass, we load uninterpreted data into the allocated array - // above, shifted to the end of the array so we won't overwrite it when - // we create our final data starting from the front - - off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated - - // first load flags - - for (i=0; i < n; ++i) { - if (flagcount == 0) { - flags = *points++; - if (flags & 8) - flagcount = *points++; - } else - --flagcount; - vertices[off+i].type = flags; - } - - // now load x coordinates - x=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 2) { - stbtt_int16 dx = *points++; - x += (flags & 16) ? dx : -dx; // ??? - } else { - if (!(flags & 16)) { - x = x + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].x = (stbtt_int16) x; - } - - // now load y coordinates - y=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 4) { - stbtt_int16 dy = *points++; - y += (flags & 32) ? dy : -dy; // ??? - } else { - if (!(flags & 32)) { - y = y + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].y = (stbtt_int16) y; - } - - // now convert them to our format - num_vertices=0; - sx = sy = cx = cy = scx = scy = 0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - x = (stbtt_int16) vertices[off+i].x; - y = (stbtt_int16) vertices[off+i].y; - - if (next_move == i) { - if (i != 0) - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - - // now start the new one - start_off = !(flags & 1); - if (start_off) { - // if we start off with an off-curve point, then when we need to find a point on the curve - // where we can start, and we need to save some state for when we wraparound. - scx = x; - scy = y; - if (!(vertices[off+i+1].type & 1)) { - // next point is also a curve point, so interpolate an on-point curve - sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; - sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; - } else { - // otherwise just use the next point as our start point - sx = (stbtt_int32) vertices[off+i+1].x; - sy = (stbtt_int32) vertices[off+i+1].y; - ++i; // we're using point i+1 as the starting point, so skip it - } - } else { - sx = x; - sy = y; - } - stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); - was_off = 0; - next_move = 1 + ttUSHORT(endPtsOfContours+j*2); - ++j; - } else { - if (!(flags & 1)) { // if it's a curve - if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); - cx = x; - cy = y; - was_off = 1; - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); - was_off = 0; - } - } - } - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - } else if (numberOfContours < 0) { - // Compound shapes. - int more = 1; - stbtt_uint8 *comp = data + g + 10; - num_vertices = 0; - vertices = 0; - while (more) { - stbtt_uint16 flags, gidx; - int comp_num_verts = 0, i; - stbtt_vertex *comp_verts = 0, *tmp = 0; - float mtx[6] = {1,0,0,1,0,0}, m, n; - - flags = ttSHORT(comp); comp+=2; - gidx = ttSHORT(comp); comp+=2; - - if (flags & 2) { // XY values - if (flags & 1) { // shorts - mtx[4] = ttSHORT(comp); comp+=2; - mtx[5] = ttSHORT(comp); comp+=2; - } else { - mtx[4] = ttCHAR(comp); comp+=1; - mtx[5] = ttCHAR(comp); comp+=1; - } - } - else { - // @TODO handle matching point - STBTT_assert(0); - } - if (flags & (1<<3)) { // WE_HAVE_A_SCALE - mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } - - // Find transformation scales. - m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); - n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); - - // Get indexed glyph. - comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); - if (comp_num_verts > 0) { - // Transform vertices. - for (i = 0; i < comp_num_verts; ++i) { - stbtt_vertex* v = &comp_verts[i]; - stbtt_vertex_type x,y; - x=v->x; y=v->y; - v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - x=v->cx; y=v->cy; - v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - } - // Append vertices. - tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); - if (!tmp) { - if (vertices) STBTT_free(vertices, info->userdata); - if (comp_verts) STBTT_free(comp_verts, info->userdata); - return 0; - } - if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); - STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); - if (vertices) STBTT_free(vertices, info->userdata); - vertices = tmp; - STBTT_free(comp_verts, info->userdata); - num_vertices += comp_num_verts; - } - // More components ? - more = flags & (1<<5); - } - } else { - // numberOfCounters == 0, do nothing - } - - *pvertices = vertices; - return num_vertices; -} - -typedef struct -{ - int bounds; - int started; - float first_x, first_y; - float x, y; - stbtt_int32 min_x, max_x, min_y, max_y; - - stbtt_vertex *pvertices; - int num_vertices; -} stbtt__csctx; - -#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} - -static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) -{ - if (x > c->max_x || !c->started) c->max_x = x; - if (y > c->max_y || !c->started) c->max_y = y; - if (x < c->min_x || !c->started) c->min_x = x; - if (y < c->min_y || !c->started) c->min_y = y; - c->started = 1; -} - -static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) -{ - if (c->bounds) { - stbtt__track_vertex(c, x, y); - if (type == STBTT_vcubic) { - stbtt__track_vertex(c, cx, cy); - stbtt__track_vertex(c, cx1, cy1); - } - } else { - stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); - c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; - c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; - } - c->num_vertices++; -} - -static void stbtt__csctx_close_shape(stbtt__csctx *ctx) -{ - if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) -{ - stbtt__csctx_close_shape(ctx); - ctx->first_x = ctx->x = ctx->x + dx; - ctx->first_y = ctx->y = ctx->y + dy; - stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) -{ - ctx->x += dx; - ctx->y += dy; - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) -{ - float cx1 = ctx->x + dx1; - float cy1 = ctx->y + dy1; - float cx2 = cx1 + dx2; - float cy2 = cy1 + dy2; - ctx->x = cx2 + dx3; - ctx->y = cy2 + dy3; - stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); -} - -static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) -{ - int count = stbtt__cff_index_count(&idx); - int bias = 107; - if (count >= 33900) - bias = 32768; - else if (count >= 1240) - bias = 1131; - n += bias; - if (n < 0 || n >= count) - return stbtt__new_buf(NULL, 0); - return stbtt__cff_index_get(idx, n); -} - -static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt__buf fdselect = info->fdselect; - int nranges, start, end, v, fmt, fdselector = -1, i; - - stbtt__buf_seek(&fdselect, 0); - fmt = stbtt__buf_get8(&fdselect); - if (fmt == 0) { - // untested - stbtt__buf_skip(&fdselect, glyph_index); - fdselector = stbtt__buf_get8(&fdselect); - } else if (fmt == 3) { - nranges = stbtt__buf_get16(&fdselect); - start = stbtt__buf_get16(&fdselect); - for (i = 0; i < nranges; i++) { - v = stbtt__buf_get8(&fdselect); - end = stbtt__buf_get16(&fdselect); - if (glyph_index >= start && glyph_index < end) { - fdselector = v; - break; - } - start = end; - } - } - if (fdselector == -1) stbtt__new_buf(NULL, 0); - return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); -} - -static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) -{ - int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; - int has_subrs = 0, clear_stack; - float s[48]; - stbtt__buf subr_stack[10], subrs = info->subrs, b; - float f; - -#define STBTT__CSERR(s) (0) - - // this currently ignores the initial width value, which isn't needed if we have hmtx - b = stbtt__cff_index_get(info->charstrings, glyph_index); - while (b.cursor < b.size) { - i = 0; - clear_stack = 1; - b0 = stbtt__buf_get8(&b); - switch (b0) { - // @TODO implement hinting - case 0x13: // hintmask - case 0x14: // cntrmask - if (in_header) - maskbits += (sp / 2); // implicit "vstem" - in_header = 0; - stbtt__buf_skip(&b, (maskbits + 7) / 8); - break; - - case 0x01: // hstem - case 0x03: // vstem - case 0x12: // hstemhm - case 0x17: // vstemhm - maskbits += (sp / 2); - break; - - case 0x15: // rmoveto - in_header = 0; - if (sp < 2) return STBTT__CSERR("rmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); - break; - case 0x04: // vmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("vmoveto stack"); - stbtt__csctx_rmove_to(c, 0, s[sp-1]); - break; - case 0x16: // hmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("hmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-1], 0); - break; - - case 0x05: // rlineto - if (sp < 2) return STBTT__CSERR("rlineto stack"); - for (; i + 1 < sp; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical - // starting from a different place. - - case 0x07: // vlineto - if (sp < 1) return STBTT__CSERR("vlineto stack"); - goto vlineto; - case 0x06: // hlineto - if (sp < 1) return STBTT__CSERR("hlineto stack"); - for (;;) { - if (i >= sp) break; - stbtt__csctx_rline_to(c, s[i], 0); - i++; - vlineto: - if (i >= sp) break; - stbtt__csctx_rline_to(c, 0, s[i]); - i++; - } - break; - - case 0x1F: // hvcurveto - if (sp < 4) return STBTT__CSERR("hvcurveto stack"); - goto hvcurveto; - case 0x1E: // vhcurveto - if (sp < 4) return STBTT__CSERR("vhcurveto stack"); - for (;;) { - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); - i += 4; - hvcurveto: - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); - i += 4; - } - break; - - case 0x08: // rrcurveto - if (sp < 6) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x18: // rcurveline - if (sp < 8) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp - 2; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - case 0x19: // rlinecurve - if (sp < 8) return STBTT__CSERR("rlinecurve stack"); - for (; i + 1 < sp - 6; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x1A: // vvcurveto - case 0x1B: // hhcurveto - if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); - f = 0.0; - if (sp & 1) { f = s[i]; i++; } - for (; i + 3 < sp; i += 4) { - if (b0 == 0x1B) - stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); - else - stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); - f = 0.0; - } - break; - - case 0x0A: // callsubr - if (!has_subrs) { - if (info->fdselect.size) - subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); - has_subrs = 1; - } - // FALLTHROUGH - case 0x1D: // callgsubr - if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); - v = (int) s[--sp]; - if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); - subr_stack[subr_stack_height++] = b; - b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); - if (b.size == 0) return STBTT__CSERR("subr not found"); - b.cursor = 0; - clear_stack = 0; - break; - - case 0x0B: // return - if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); - b = subr_stack[--subr_stack_height]; - clear_stack = 0; - break; - - case 0x0E: // endchar - stbtt__csctx_close_shape(c); - return 1; - - case 0x0C: { // two-byte escape - float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; - float dx, dy; - int b1 = stbtt__buf_get8(&b); - switch (b1) { - // @TODO These "flex" implementations ignore the flex-depth and resolution, - // and always draw beziers. - case 0x22: // hflex - if (sp < 7) return STBTT__CSERR("hflex stack"); - dx1 = s[0]; - dx2 = s[1]; - dy2 = s[2]; - dx3 = s[3]; - dx4 = s[4]; - dx5 = s[5]; - dx6 = s[6]; - stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); - break; - - case 0x23: // flex - if (sp < 13) return STBTT__CSERR("flex stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = s[10]; - dy6 = s[11]; - //fd is s[12] - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - case 0x24: // hflex1 - if (sp < 9) return STBTT__CSERR("hflex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dx4 = s[5]; - dx5 = s[6]; - dy5 = s[7]; - dx6 = s[8]; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); - break; - - case 0x25: // flex1 - if (sp < 11) return STBTT__CSERR("flex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = dy6 = s[10]; - dx = dx1+dx2+dx3+dx4+dx5; - dy = dy1+dy2+dy3+dy4+dy5; - if (STBTT_fabs(dx) > STBTT_fabs(dy)) - dy6 = -dy; - else - dx6 = -dx; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - default: - return STBTT__CSERR("unimplemented"); - } - } break; - - default: - if (b0 != 255 && b0 != 28 && b0 < 32) - return STBTT__CSERR("reserved operator"); - - // push immediate - if (b0 == 255) { - f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; - } else { - stbtt__buf_skip(&b, -1); - f = (float)(stbtt_int16)stbtt__cff_int(&b); - } - if (sp >= 48) return STBTT__CSERR("push stack overflow"); - s[sp++] = f; - clear_stack = 0; - break; - } - if (clear_stack) sp = 0; - } - return STBTT__CSERR("no endchar"); - -#undef STBTT__CSERR -} - -static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - // runs the charstring twice, once to count and once to output (to avoid realloc) - stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); - stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); - if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { - *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); - output_ctx.pvertices = *pvertices; - if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { - STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); - return output_ctx.num_vertices; - } - } - *pvertices = NULL; - return 0; -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - stbtt__csctx c = STBTT__CSCTX_INIT(1); - int r = stbtt__run_charstring(info, glyph_index, &c); - if (x0) *x0 = r ? c.min_x : 0; - if (y0) *y0 = r ? c.min_y : 0; - if (x1) *x1 = r ? c.max_x : 0; - if (y1) *y1 = r ? c.max_y : 0; - return r ? c.num_vertices : 0; -} - -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - if (!info->cff.size) - return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); - else - return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); -} - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) -{ - stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); - if (glyph_index < numOfLongHorMetrics) { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); - } else { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); - } -} - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) -{ - stbtt_uint8 *data = info->data + info->kern; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - return ttUSHORT(data+10); -} - -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) -{ - stbtt_uint8 *data = info->data + info->kern; - int k, length; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - length = ttUSHORT(data+10); - if (table_length < length) - length = table_length; - - for (k = 0; k < length; k++) - { - table[k].glyph1 = ttUSHORT(data+18+(k*6)); - table[k].glyph2 = ttUSHORT(data+20+(k*6)); - table[k].advance = ttSHORT(data+22+(k*6)); - } - - return length; -} - -static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint8 *data = info->data + info->kern; - stbtt_uint32 needle, straw; - int l, r, m; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - l = 0; - r = ttUSHORT(data+10) - 1; - needle = glyph1 << 16 | glyph2; - while (l <= r) { - m = (l + r) >> 1; - straw = ttULONG(data+18+(m*6)); // note: unaligned read - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else - return ttSHORT(data+22+(m*6)); - } - return 0; -} - -static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) -{ - stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); - switch (coverageFormat) { - case 1: { - stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); - - // Binary search. - stbtt_int32 l=0, r=glyphCount-1, m; - int straw, needle=glyph; - while (l <= r) { - stbtt_uint8 *glyphArray = coverageTable + 4; - stbtt_uint16 glyphID; - m = (l + r) >> 1; - glyphID = ttUSHORT(glyphArray + 2 * m); - straw = glyphID; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - return m; - } - } - break; - } - - case 2: { - stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); - stbtt_uint8 *rangeArray = coverageTable + 4; - - // Binary search. - stbtt_int32 l=0, r=rangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *rangeRecord; - m = (l + r) >> 1; - rangeRecord = rangeArray + 6 * m; - strawStart = ttUSHORT(rangeRecord); - strawEnd = ttUSHORT(rangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else { - stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); - return startCoverageIndex + glyph - strawStart; - } - } - break; - } - - default: return -1; // unsupported - } - - return -1; -} - -static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) -{ - stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); - switch (classDefFormat) - { - case 1: { - stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); - stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); - stbtt_uint8 *classDef1ValueArray = classDefTable + 6; - - if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) - return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); - break; - } - - case 2: { - stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); - stbtt_uint8 *classRangeRecords = classDefTable + 4; - - // Binary search. - stbtt_int32 l=0, r=classRangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *classRangeRecord; - m = (l + r) >> 1; - classRangeRecord = classRangeRecords + 6 * m; - strawStart = ttUSHORT(classRangeRecord); - strawEnd = ttUSHORT(classRangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else - return (stbtt_int32)ttUSHORT(classRangeRecord + 4); - } - break; - } - - default: - return -1; // Unsupported definition type, return an error. - } - - // "All glyphs not assigned to a class fall into class 0". (OpenType spec) - return 0; -} - -// Define to STBTT_assert(x) if you want to break on unimplemented formats. -#define STBTT_GPOS_TODO_assert(x) - -static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint16 lookupListOffset; - stbtt_uint8 *lookupList; - stbtt_uint16 lookupCount; - stbtt_uint8 *data; - stbtt_int32 i, sti; - - if (!info->gpos) return 0; - - data = info->data + info->gpos; - - if (ttUSHORT(data+0) != 1) return 0; // Major version 1 - if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 - - lookupListOffset = ttUSHORT(data+8); - lookupList = data + lookupListOffset; - lookupCount = ttUSHORT(lookupList); - - for (i=0; i= pairSetCount) return 0; - - needle=glyph2; - r=pairValueCount-1; - l=0; - - // Binary search. - while (l <= r) { - stbtt_uint16 secondGlyph; - stbtt_uint8 *pairValue; - m = (l + r) >> 1; - pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; - secondGlyph = ttUSHORT(pairValue); - straw = secondGlyph; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - stbtt_int16 xAdvance = ttSHORT(pairValue + 2); - return xAdvance; - } - } - } else - return 0; - break; - } - - case 2: { - stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); - stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); - if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? - stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); - stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); - int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); - int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); - - stbtt_uint16 class1Count = ttUSHORT(table + 12); - stbtt_uint16 class2Count = ttUSHORT(table + 14); - stbtt_uint8 *class1Records, *class2Records; - stbtt_int16 xAdvance; - - if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed - if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed - - class1Records = table + 16; - class2Records = class1Records + 2 * (glyph1class * class2Count); - xAdvance = ttSHORT(class2Records + 2 * glyph2class); - return xAdvance; - } else - return 0; - break; - } - - default: - return 0; // Unsupported position format - } - } - } - - return 0; -} - -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) -{ - int xAdvance = 0; - - if (info->gpos) - xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); - else if (info->kern) - xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); - - return xAdvance; -} - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) -{ - if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs - return 0; - return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); -} - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) -{ - stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); -} - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) -{ - if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); - if (descent) *descent = ttSHORT(info->data+info->hhea + 6); - if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); -} - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) -{ - int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); - if (!tab) - return 0; - if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); - if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); - if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); - return 1; -} - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) -{ - *x0 = ttSHORT(info->data + info->head + 36); - *y0 = ttSHORT(info->data + info->head + 38); - *x1 = ttSHORT(info->data + info->head + 40); - *y1 = ttSHORT(info->data + info->head + 42); -} - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) -{ - int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); - return (float) height / fheight; -} - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) -{ - int unitsPerEm = ttUSHORT(info->data + info->head + 18); - return pixels / unitsPerEm; -} - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) -{ - STBTT_free(v, info->userdata); -} - -STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) -{ - int i; - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); - - int numEntries = ttUSHORT(svg_doc_list); - stbtt_uint8 *svg_docs = svg_doc_list + 2; - - for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) - return svg_doc; - } - return 0; -} - -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) -{ - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc; - - if (info->svg == 0) - return 0; - - svg_doc = stbtt_FindSVGDoc(info, gl); - if (svg_doc != NULL) { - *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); - return ttULONG(svg_doc + 8); - } else { - return 0; - } -} - -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) -{ - return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); -} - -////////////////////////////////////////////////////////////////////////////// -// -// antialiasing software rasterizer -// - -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning - if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { - // e.g. space character - if (ix0) *ix0 = 0; - if (iy0) *iy0 = 0; - if (ix1) *ix1 = 0; - if (iy1) *iy1 = 0; - } else { - // move to integral bboxes (treating pixels as little squares, what pixels get touched)? - if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); - if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); - if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); - if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); - } -} - -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); -} - -////////////////////////////////////////////////////////////////////////////// -// -// Rasterizer - -typedef struct stbtt__hheap_chunk -{ - struct stbtt__hheap_chunk *next; -} stbtt__hheap_chunk; - -typedef struct stbtt__hheap -{ - struct stbtt__hheap_chunk *head; - void *first_free; - int num_remaining_in_head_chunk; -} stbtt__hheap; - -static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) -{ - if (hh->first_free) { - void *p = hh->first_free; - hh->first_free = * (void **) p; - return p; - } else { - if (hh->num_remaining_in_head_chunk == 0) { - int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); - stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); - if (c == NULL) - return NULL; - c->next = hh->head; - hh->head = c; - hh->num_remaining_in_head_chunk = count; - } - --hh->num_remaining_in_head_chunk; - return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; - } -} - -static void stbtt__hheap_free(stbtt__hheap *hh, void *p) -{ - *(void **) p = hh->first_free; - hh->first_free = p; -} - -static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) -{ - stbtt__hheap_chunk *c = hh->head; - while (c) { - stbtt__hheap_chunk *n = c->next; - STBTT_free(c, userdata); - c = n; - } -} - -typedef struct stbtt__edge { - float x0,y0, x1,y1; - int invert; -} stbtt__edge; - - -typedef struct stbtt__active_edge -{ - struct stbtt__active_edge *next; - #if STBTT_RASTERIZER_VERSION==1 - int x,dx; - float ey; - int direction; - #elif STBTT_RASTERIZER_VERSION==2 - float fx,fdx,fdy; - float direction; - float sy; - float ey; - #else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" - #endif -} stbtt__active_edge; - -#if STBTT_RASTERIZER_VERSION == 1 -#define STBTT_FIXSHIFT 10 -#define STBTT_FIX (1 << STBTT_FIXSHIFT) -#define STBTT_FIXMASK (STBTT_FIX-1) - -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - if (!z) return z; - - // round dx down to avoid overshooting - if (dxdy < 0) - z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); - else - z->dx = STBTT_ifloor(STBTT_FIX * dxdy); - - z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount - z->x -= off_x * STBTT_FIX; - - z->ey = e->y1; - z->next = 0; - z->direction = e->invert ? 1 : -1; - return z; -} -#elif STBTT_RASTERIZER_VERSION == 2 -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - //STBTT_assert(e->y0 <= start_point); - if (!z) return z; - z->fdx = dxdy; - z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; - z->fx = e->x0 + dxdy * (start_point - e->y0); - z->fx -= off_x; - z->direction = e->invert ? 1.0f : -1.0f; - z->sy = e->y0; - z->ey = e->y1; - z->next = 0; - return z; -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#if STBTT_RASTERIZER_VERSION == 1 -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) -{ - // non-zero winding fill - int x0=0, w=0; - - while (e) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w += e->direction; - } else { - int x1 = e->x; w += e->direction; - // if we went to zero, we need to draw - if (w == 0) { - int i = x0 >> STBTT_FIXSHIFT; - int j = x1 >> STBTT_FIXSHIFT; - - if (i < len && j >= 0) { - if (i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); - } else { - if (i >= 0) // add antialiasing for x0 - scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); - else - i = -1; // clip - - if (j < len) // add antialiasing for x1 - scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); - else - j = len; // clip - - for (++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = scanline[i] + (stbtt_uint8) max_weight; - } - } - } - } - - e = e->next; - } -} - -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0; - int max_weight = (255 / vsubsample); // weight per vertical scanline - int s; // vertical subsample index - unsigned char scanline_data[512], *scanline; - - if (result->w > 512) - scanline = (unsigned char *) STBTT_malloc(result->w, userdata); - else - scanline = scanline_data; - - y = off_y * vsubsample; - e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; - - while (j < result->h) { - STBTT_memset(scanline, 0, result->w); - for (s=0; s < vsubsample; ++s) { - // find center of pixel for this scanline - float scan_y = y + 0.5f; - stbtt__active_edge **step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for(;;) { - int changed=0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - stbtt__active_edge *t = *step; - stbtt__active_edge *q = t->next; - - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while (e->y0 <= scan_y) { - if (e->y1 > scan_y) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); - if (z != NULL) { - // find insertion point - if (active == NULL) - active = z; - else if (z->x < active->x) { - // insert at front - z->next = active; - active = z; - } else { - // find thing to insert AFTER - stbtt__active_edge *p = active; - while (p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - } - ++e; - } - - // now process all active edges in XOR fashion - if (active) - stbtt__fill_active_edges(scanline, result->w, active, max_weight); - - ++y; - } - STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} - -#elif STBTT_RASTERIZER_VERSION == 2 - -// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 -// (i.e. it has already been clipped to those) -static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) -{ - if (y0 == y1) return; - STBTT_assert(y0 < y1); - STBTT_assert(e->sy <= e->ey); - if (y0 > e->ey) return; - if (y1 < e->sy) return; - if (y0 < e->sy) { - x0 += (x1-x0) * (e->sy - y0) / (y1-y0); - y0 = e->sy; - } - if (y1 > e->ey) { - x1 += (x1-x0) * (e->ey - y1) / (y1-y0); - y1 = e->ey; - } - - if (x0 == x) - { - STBTT_assert(x1 <= x+1); - } - else if (x0 == x+1) - { - STBTT_assert(x1 >= x); - } - else if (x0 <= x) - { - STBTT_assert(x1 <= x); - } - else if (x0 >= x+1) - { - STBTT_assert(x1 >= x+1); - } - else - { - STBTT_assert(x1 >= x && x1 <= x+1); - } - - if (x0 <= x && x1 <= x) - scanline[x] += e->direction * (y1-y0); - else if (x0 >= x+1 && x1 >= x+1) - ; - else { - STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); - scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position - } -} - -static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) -{ - STBTT_assert(top_width >= 0); - STBTT_assert(bottom_width >= 0); - return (top_width + bottom_width) / 2.0f * height; -} - -static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) -{ - return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); -} - -static float stbtt__sized_triangle_area(float height, float width) -{ - return height * width / 2; -} - -static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) -{ - float y_bottom = y_top+1; - - while (e) { - // brute force every pixel - - // compute intersection points with top & bottom - STBTT_assert(e->ey >= y_top); - - if (e->fdx == 0) { - float x0 = e->fx; - if (x0 < len) { - if (x0 >= 0) { - stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); - stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); - } else { - stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); - } - } - } else { - float x0 = e->fx; - float dx = e->fdx; - float xb = x0 + dx; - float x_top, x_bottom; - float sy0,sy1; - float dy = e->fdy; - STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); - - // compute endpoints of line segment clipped to this scanline (if the - // line segment starts on this scanline. x0 is the intersection of the - // line with y_top, but that may be off the line segment. - if (e->sy > y_top) { - x_top = x0 + dx * (e->sy - y_top); - sy0 = e->sy; - } else { - x_top = x0; - sy0 = y_top; - } - if (e->ey < y_bottom) { - x_bottom = x0 + dx * (e->ey - y_top); - sy1 = e->ey; - } else { - x_bottom = xb; - sy1 = y_bottom; - } - - if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { - // from here on, we don't have to range check x values - - if ((int) x_top == (int) x_bottom) { - float height; - // simple case, only spans one pixel - int x = (int) x_top; - height = (sy1 - sy0) * e->direction; - STBTT_assert(x >= 0 && x < len); - scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); - scanline_fill[x] += height; // everything right of this pixel is filled - } else { - int x,x1,x2; - float y_crossing, y_final, step, sign, area; - // covers 2+ pixels - if (x_top > x_bottom) { - // flip scanline vertically; signed area is the same - float t; - sy0 = y_bottom - (sy0 - y_top); - sy1 = y_bottom - (sy1 - y_top); - t = sy0, sy0 = sy1, sy1 = t; - t = x_bottom, x_bottom = x_top, x_top = t; - dx = -dx; - dy = -dy; - t = x0, x0 = xb, xb = t; - } - STBTT_assert(dy >= 0); - STBTT_assert(dx >= 0); - - x1 = (int) x_top; - x2 = (int) x_bottom; - // compute intersection with y axis at x1+1 - y_crossing = y_top + dy * (x1+1 - x0); - - // compute intersection with y axis at x2 - y_final = y_top + dy * (x2 - x0); - - // x1 x_top x2 x_bottom - // y_top +------|-----+------------+------------+--------|---+------------+ - // | | | | | | - // | | | | | | - // sy0 | Txxxxx|............|............|............|............| - // y_crossing | *xxxxx.......|............|............|............| - // | | xxxxx..|............|............|............| - // | | /- xx*xxxx........|............|............| - // | | dy < | xxxxxx..|............|............| - // y_final | | \- | xx*xxx.........|............| - // sy1 | | | | xxxxxB...|............| - // | | | | | | - // | | | | | | - // y_bottom +------------+------------+------------+------------+------------+ - // - // goal is to measure the area covered by '.' in each pixel - - // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 - // @TODO: maybe test against sy1 rather than y_bottom? - if (y_crossing > y_bottom) - y_crossing = y_bottom; - - sign = e->direction; - - // area of the rectangle covered from sy0..y_crossing - area = sign * (y_crossing-sy0); - - // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) - scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); - - // check if final y_crossing is blown up; no test case for this - if (y_final > y_bottom) { - y_final = y_bottom; - dy = (y_final - y_crossing ) / (x2 - (x1+1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom - } - - // in second pixel, area covered by line segment found in first pixel - // is always a rectangle 1 wide * the height of that line segment; this - // is exactly what the variable 'area' stores. it also gets a contribution - // from the line segment within it. the THIRD pixel will get the first - // pixel's rectangle contribution, the second pixel's rectangle contribution, - // and its own contribution. the 'own contribution' is the same in every pixel except - // the leftmost and rightmost, a trapezoid that slides down in each pixel. - // the second pixel's contribution to the third pixel will be the - // rectangle 1 wide times the height change in the second pixel, which is dy. - - step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, - // which multiplied by 1-pixel-width is how much pixel area changes for each step in x - // so the area advances by 'step' every time - - for (x = x1+1; x < x2; ++x) { - scanline[x] += area + step/2; // area of trapezoid is 1*step/2 - area += step; - } - STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down - STBTT_assert(sy1 > y_final-0.01f); - - // area covered in the last pixel is the rectangle from all the pixels to the left, - // plus the trapezoid filled by the line segment in this pixel all the way to the right edge - scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); - - // the rest of the line is filled based on the total height of the line segment in this pixel - scanline_fill[x2] += sign * (sy1-sy0); - } - } else { - // if edge goes outside of box we're drawing, we require - // clipping logic. since this does not match the intended use - // of this library, we use a different, very slow brute - // force implementation - // note though that this does happen some of the time because - // x_top and x_bottom can be extrapolated at the top & bottom of - // the shape and actually lie outside the bounding box - int x; - for (x=0; x < len; ++x) { - // cases: - // - // there can be up to two intersections with the pixel. any intersection - // with left or right edges can be handled by splitting into two (or three) - // regions. intersections with top & bottom do not necessitate case-wise logic. - // - // the old way of doing this found the intersections with the left & right edges, - // then used some simple logic to produce up to three segments in sorted order - // from top-to-bottom. however, this had a problem: if an x edge was epsilon - // across the x border, then the corresponding y position might not be distinct - // from the other y segment, and it might ignored as an empty segment. to avoid - // that, we need to explicitly produce segments based on x positions. - - // rename variables to clearly-defined pairs - float y0 = y_top; - float x1 = (float) (x); - float x2 = (float) (x+1); - float x3 = xb; - float y3 = y_bottom; - - // x = e->x + e->dx * (y-y_top) - // (y-y_top) = (x - e->x) / e->dx - // y = (x - e->x) / e->dx + y_top - float y1 = (x - x0) / dx + y_top; - float y2 = (x+1 - x0) / dx + y_top; - - if (x0 < x1 && x3 > x2) { // three segments descending down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x1 && x0 > x2) { // three segments descending down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else { // one segment - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); - } - } - } - } - e = e->next; - } -} - -// directly AA rasterize edges w/o supersampling -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0, i; - float scanline_data[129], *scanline, *scanline2; - - STBTT__NOTUSED(vsubsample); - - if (result->w > 64) - scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); - else - scanline = scanline_data; - - scanline2 = scanline + result->w; - - y = off_y; - e[n].y0 = (float) (off_y + result->h) + 1; - - while (j < result->h) { - // find center of pixel for this scanline - float scan_y_top = y + 0.0f; - float scan_y_bottom = y + 1.0f; - stbtt__active_edge **step = &active; - - STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); - STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); - - // update all active edges; - // remove all active edges that terminate before the top of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y_top) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - step = &((*step)->next); // advance through list - } - } - - // insert all edges that start before the bottom of this scanline - while (e->y0 <= scan_y_bottom) { - if (e->y0 != e->y1) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); - if (z != NULL) { - if (j == 0 && off_y != 0) { - if (z->ey < scan_y_top) { - // this can happen due to subpixel positioning and some kind of fp rounding error i think - z->ey = scan_y_top; - } - } - STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds - // insert at front - z->next = active; - active = z; - } - } - ++e; - } - - // now process all active edges - if (active) - stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); - - { - float sum = 0; - for (i=0; i < result->w; ++i) { - float k; - int m; - sum += scanline2[i]; - k = scanline[i] + sum; - k = (float) STBTT_fabs(k)*255 + 0.5f; - m = (int) k; - if (m > 255) m = 255; - result->pixels[j*result->stride + i] = (unsigned char) m; - } - } - // advance all the edges - step = &active; - while (*step) { - stbtt__active_edge *z = *step; - z->fx += z->fdx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - - ++y; - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) - -static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) -{ - int i,j; - for (i=1; i < n; ++i) { - stbtt__edge t = p[i], *a = &t; - j = i; - while (j > 0) { - stbtt__edge *b = &p[j-1]; - int c = STBTT__COMPARE(a,b); - if (!c) break; - p[j] = p[j-1]; - --j; - } - if (i != j) - p[j] = t; - } -} - -static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) -{ - /* threshold for transitioning to insertion sort */ - while (n > 12) { - stbtt__edge t; - int c01,c12,c,m,i,j; - - /* compute median of three */ - m = n >> 1; - c01 = STBTT__COMPARE(&p[0],&p[m]); - c12 = STBTT__COMPARE(&p[m],&p[n-1]); - /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ - if (c01 != c12) { - /* otherwise, we'll need to swap something else to middle */ - int z; - c = STBTT__COMPARE(&p[0],&p[n-1]); - /* 0>mid && midn => n; 0 0 */ - /* 0n: 0>n => 0; 0 n */ - z = (c == c12) ? 0 : n-1; - t = p[z]; - p[z] = p[m]; - p[m] = t; - } - /* now p[m] is the median-of-three */ - /* swap it to the beginning so it won't move around */ - t = p[0]; - p[0] = p[m]; - p[m] = t; - - /* partition loop */ - i=1; - j=n-1; - for(;;) { - /* handling of equality is crucial here */ - /* for sentinels & efficiency with duplicates */ - for (;;++i) { - if (!STBTT__COMPARE(&p[i], &p[0])) break; - } - for (;;--j) { - if (!STBTT__COMPARE(&p[0], &p[j])) break; - } - /* make sure we haven't crossed */ - if (i >= j) break; - t = p[i]; - p[i] = p[j]; - p[j] = t; - - ++i; - --j; - } - /* recurse on smaller side, iterate on larger */ - if (j < (n-i)) { - stbtt__sort_edges_quicksort(p,j); - p = p+i; - n = n-i; - } else { - stbtt__sort_edges_quicksort(p+i, n-i); - n = j; - } - } -} - -static void stbtt__sort_edges(stbtt__edge *p, int n) -{ - stbtt__sort_edges_quicksort(p, n); - stbtt__sort_edges_ins_sort(p, n); -} - -typedef struct -{ - float x,y; -} stbtt__point; - -static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) -{ - float y_scale_inv = invert ? -scale_y : scale_y; - stbtt__edge *e; - int n,i,j,k,m; -#if STBTT_RASTERIZER_VERSION == 1 - int vsubsample = result->h < 8 ? 15 : 5; -#elif STBTT_RASTERIZER_VERSION == 2 - int vsubsample = 1; -#else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - // vsubsample should divide 255 evenly; otherwise we won't reach full opacity - - // now we have to blow out the windings into explicit edge lists - n = 0; - for (i=0; i < windings; ++i) - n += wcount[i]; - - e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel - if (e == 0) return; - n = 0; - - m=0; - for (i=0; i < windings; ++i) { - stbtt__point *p = pts + m; - m += wcount[i]; - j = wcount[i]-1; - for (k=0; k < wcount[i]; j=k++) { - int a=k,b=j; - // skip the edge if horizontal - if (p[j].y == p[k].y) - continue; - // add edge from j to k to the list - e[n].invert = 0; - if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { - e[n].invert = 1; - a=j,b=k; - } - e[n].x0 = p[a].x * scale_x + shift_x; - e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; - e[n].x1 = p[b].x * scale_x + shift_x; - e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; - ++n; - } - } - - // now sort the edges by their highest point (should snap to integer, and then by x) - //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); - stbtt__sort_edges(e, n); - - // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule - stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); - - STBTT_free(e, userdata); -} - -static void stbtt__add_point(stbtt__point *points, int n, float x, float y) -{ - if (!points) return; // during first pass, it's unallocated - points[n].x = x; - points[n].y = y; -} - -// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching -static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) -{ - // midpoint - float mx = (x0 + 2*x1 + x2)/4; - float my = (y0 + 2*y1 + y2)/4; - // versus directly drawn line - float dx = (x0+x2)/2 - mx; - float dy = (y0+y2)/2 - my; - if (n > 16) // 65536 segments on one curve better be enough! - return 1; - if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA - stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x2,y2); - *num_points = *num_points+1; - } - return 1; -} - -static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) -{ - // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough - float dx0 = x1-x0; - float dy0 = y1-y0; - float dx1 = x2-x1; - float dy1 = y2-y1; - float dx2 = x3-x2; - float dy2 = y3-y2; - float dx = x3-x0; - float dy = y3-y0; - float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); - float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); - float flatness_squared = longlen*longlen-shortlen*shortlen; - - if (n > 16) // 65536 segments on one curve better be enough! - return; - - if (flatness_squared > objspace_flatness_squared) { - float x01 = (x0+x1)/2; - float y01 = (y0+y1)/2; - float x12 = (x1+x2)/2; - float y12 = (y1+y2)/2; - float x23 = (x2+x3)/2; - float y23 = (y2+y3)/2; - - float xa = (x01+x12)/2; - float ya = (y01+y12)/2; - float xb = (x12+x23)/2; - float yb = (y12+y23)/2; - - float mx = (xa+xb)/2; - float my = (ya+yb)/2; - - stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x3,y3); - *num_points = *num_points+1; - } -} - -// returns number of contours -static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) -{ - stbtt__point *points=0; - int num_points=0; - - float objspace_flatness_squared = objspace_flatness * objspace_flatness; - int i,n=0,start=0, pass; - - // count how many "moves" there are to get the contour count - for (i=0; i < num_verts; ++i) - if (vertices[i].type == STBTT_vmove) - ++n; - - *num_contours = n; - if (n == 0) return 0; - - *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); - - if (*contour_lengths == 0) { - *num_contours = 0; - return 0; - } - - // make two passes through the points so we don't need to realloc - for (pass=0; pass < 2; ++pass) { - float x=0,y=0; - if (pass == 1) { - points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); - if (points == NULL) goto error; - } - num_points = 0; - n= -1; - for (i=0; i < num_verts; ++i) { - switch (vertices[i].type) { - case STBTT_vmove: - // start the next contour - if (n >= 0) - (*contour_lengths)[n] = num_points - start; - ++n; - start = num_points; - - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x,y); - break; - case STBTT_vline: - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vcurve: - stbtt__tesselate_curve(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - case STBTT_vcubic: - stbtt__tesselate_cubic(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].cx1, vertices[i].cy1, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - } - } - (*contour_lengths)[n] = num_points - start; - } - - return points; -error: - STBTT_free(points, userdata); - STBTT_free(*contour_lengths, userdata); - *contour_lengths = 0; - *num_contours = 0; - return NULL; -} - -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) -{ - float scale = scale_x > scale_y ? scale_y : scale_x; - int winding_count = 0; - int *winding_lengths = NULL; - stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); - if (windings) { - stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); - STBTT_free(winding_lengths, userdata); - STBTT_free(windings, userdata); - } -} - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - int ix0,iy0,ix1,iy1; - stbtt__bitmap gbm; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - - if (scale_x == 0) scale_x = scale_y; - if (scale_y == 0) { - if (scale_x == 0) { - STBTT_free(vertices, info->userdata); - return NULL; - } - scale_y = scale_x; - } - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); - - // now we get the size - gbm.w = (ix1 - ix0); - gbm.h = (iy1 - iy0); - gbm.pixels = NULL; // in case we error - - if (width ) *width = gbm.w; - if (height) *height = gbm.h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - if (gbm.w && gbm.h) { - gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); - if (gbm.pixels) { - gbm.stride = gbm.w; - - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - } - } - STBTT_free(vertices, info->userdata); - return gbm.pixels; -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) -{ - int ix0,iy0; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - stbtt__bitmap gbm; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); - gbm.pixels = output; - gbm.w = out_w; - gbm.h = out_h; - gbm.stride = out_stride; - - if (gbm.w && gbm.h) - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); - - STBTT_free(vertices, info->userdata); -} - -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) -{ - stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); -} - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-CRAPPY packing to keep source code small - -static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata) -{ - float scale; - int x,y,bottom_y, i; - stbtt_fontinfo f; - f.userdata = NULL; - if (!stbtt_InitFont(&f, data, offset)) - return -1; - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - x=y=1; - bottom_y = 1; - - scale = stbtt_ScaleForPixelHeight(&f, pixel_height); - - for (i=0; i < num_chars; ++i) { - int advance, lsb, x0,y0,x1,y1,gw,gh; - int g = stbtt_FindGlyphIndex(&f, first_char + i); - stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); - stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); - gw = x1-x0; - gh = y1-y0; - if (x + gw + 1 >= pw) - y = bottom_y, x = 1; // advance to next row - if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row - return -i; - STBTT_assert(x+gw < pw); - STBTT_assert(y+gh < ph); - stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); - chardata[i].x0 = (stbtt_int16) x; - chardata[i].y0 = (stbtt_int16) y; - chardata[i].x1 = (stbtt_int16) (x + gw); - chardata[i].y1 = (stbtt_int16) (y + gh); - chardata[i].xadvance = scale * advance; - chardata[i].xoff = (float) x0; - chardata[i].yoff = (float) y0; - x = x + gw + 1; - if (y+gh+1 > bottom_y) - bottom_y = y+gh+1; - } - return bottom_y; -} - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) -{ - float d3d_bias = opengl_fillrule ? 0 : -0.5f; - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_bakedchar *b = chardata + char_index; - int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); - int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); - - q->x0 = round_x + d3d_bias; - q->y0 = round_y + d3d_bias; - q->x1 = round_x + b->x1 - b->x0 + d3d_bias; - q->y1 = round_y + b->y1 - b->y0 + d3d_bias; - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// rectangle packing replacement routines if you don't have stb_rect_pack.h -// - -#ifndef STB_RECT_PACK_VERSION - -typedef int stbrp_coord; - -//////////////////////////////////////////////////////////////////////////////////// -// // -// // -// COMPILER WARNING ?!?!? // -// // -// // -// if you get a compile warning due to these symbols being defined more than // -// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // -// // -//////////////////////////////////////////////////////////////////////////////////// - -typedef struct -{ - int width,height; - int x,y,bottom_y; -} stbrp_context; - -typedef struct -{ - unsigned char x; -} stbrp_node; - -struct stbrp_rect -{ - stbrp_coord x,y; - int id,w,h,was_packed; -}; - -static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) -{ - con->width = pw; - con->height = ph; - con->x = 0; - con->y = 0; - con->bottom_y = 0; - STBTT__NOTUSED(nodes); - STBTT__NOTUSED(num_nodes); -} - -static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) -{ - int i; - for (i=0; i < num_rects; ++i) { - if (con->x + rects[i].w > con->width) { - con->x = 0; - con->y = con->bottom_y; - } - if (con->y + rects[i].h > con->height) - break; - rects[i].x = con->x; - rects[i].y = con->y; - rects[i].was_packed = 1; - con->x += rects[i].w; - if (con->y + rects[i].h > con->bottom_y) - con->bottom_y = con->y + rects[i].h; - } - for ( ; i < num_rects; ++i) - rects[i].was_packed = 0; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If -// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) -{ - stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); - int num_nodes = pw - padding; - stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); - - if (context == NULL || nodes == NULL) { - if (context != NULL) STBTT_free(context, alloc_context); - if (nodes != NULL) STBTT_free(nodes , alloc_context); - return 0; - } - - spc->user_allocator_context = alloc_context; - spc->width = pw; - spc->height = ph; - spc->pixels = pixels; - spc->pack_info = context; - spc->nodes = nodes; - spc->padding = padding; - spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; - spc->h_oversample = 1; - spc->v_oversample = 1; - spc->skip_missing = 0; - - stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); - - if (pixels) - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - - return 1; -} - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) -{ - STBTT_free(spc->nodes , spc->user_allocator_context); - STBTT_free(spc->pack_info, spc->user_allocator_context); -} - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) -{ - STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); - STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); - if (h_oversample <= STBTT_MAX_OVERSAMPLE) - spc->h_oversample = h_oversample; - if (v_oversample <= STBTT_MAX_OVERSAMPLE) - spc->v_oversample = v_oversample; -} - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) -{ - spc->skip_missing = skip; -} - -#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) - -static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_w = w - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < h; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < w; ++i) { - STBTT_assert(pixels[i] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i] = (unsigned char) (total / kernel_width); - } - - pixels += stride_in_bytes; - } -} - -static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_h = h - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < w; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < h; ++i) { - STBTT_assert(pixels[i*stride_in_bytes] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - - pixels += 1; - } -} - -static float stbtt__oversample_shift(int oversample) -{ - if (!oversample) - return 0.0f; - - // The prefilter is a box filter of width "oversample", - // which shifts phase by (oversample - 1)/2 pixels in - // oversampled space. We want to shift in the opposite - // direction to counter this. - return (float)-(oversample - 1) / (2.0f * (float)oversample); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k; - int missing_glyph_added = 0; - - k=0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - ranges[i].h_oversample = (unsigned char) spc->h_oversample; - ranges[i].v_oversample = (unsigned char) spc->v_oversample; - for (j=0; j < ranges[i].num_chars; ++j) { - int x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { - rects[k].w = rects[k].h = 0; - } else { - stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - &x0,&y0,&x1,&y1); - rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); - rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); - if (glyph == 0) - missing_glyph_added = 1; - } - ++k; - } - } - - return k; -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, - output, - out_w - (prefilter_x - 1), - out_h - (prefilter_y - 1), - out_stride, - scale_x, - scale_y, - shift_x, - shift_y, - glyph); - - if (prefilter_x > 1) - stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); - - if (prefilter_y > 1) - stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); - - *sub_x = stbtt__oversample_shift(prefilter_x); - *sub_y = stbtt__oversample_shift(prefilter_y); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k, missing_glyph = -1, return_value = 1; - - // save current values - int old_h_over = spc->h_oversample; - int old_v_over = spc->v_oversample; - - k = 0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - float recip_h,recip_v,sub_x,sub_y; - spc->h_oversample = ranges[i].h_oversample; - spc->v_oversample = ranges[i].v_oversample; - recip_h = 1.0f / spc->h_oversample; - recip_v = 1.0f / spc->v_oversample; - sub_x = stbtt__oversample_shift(spc->h_oversample); - sub_y = stbtt__oversample_shift(spc->v_oversample); - for (j=0; j < ranges[i].num_chars; ++j) { - stbrp_rect *r = &rects[k]; - if (r->was_packed && r->w != 0 && r->h != 0) { - stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; - int advance, lsb, x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbrp_coord pad = (stbrp_coord) spc->padding; - - // pad on left and top - r->x += pad; - r->y += pad; - r->w -= pad; - r->h -= pad; - stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); - stbtt_GetGlyphBitmapBox(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - &x0,&y0,&x1,&y1); - stbtt_MakeGlyphBitmapSubpixel(info, - spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w - spc->h_oversample+1, - r->h - spc->v_oversample+1, - spc->stride_in_bytes, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - glyph); - - if (spc->h_oversample > 1) - stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->h_oversample); - - if (spc->v_oversample > 1) - stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->v_oversample); - - bc->x0 = (stbtt_int16) r->x; - bc->y0 = (stbtt_int16) r->y; - bc->x1 = (stbtt_int16) (r->x + r->w); - bc->y1 = (stbtt_int16) (r->y + r->h); - bc->xadvance = scale * advance; - bc->xoff = (float) x0 * recip_h + sub_x; - bc->yoff = (float) y0 * recip_v + sub_y; - bc->xoff2 = (x0 + r->w) * recip_h + sub_x; - bc->yoff2 = (y0 + r->h) * recip_v + sub_y; - - if (glyph == 0) - missing_glyph = j; - } else if (spc->skip_missing) { - return_value = 0; - } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { - ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; - } else { - return_value = 0; // if any fail, report failure - } - - ++k; - } - } - - // restore original values - spc->h_oversample = old_h_over; - spc->v_oversample = old_v_over; - - return return_value; -} - -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) -{ - stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); -} - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) -{ - stbtt_fontinfo info; - int i,j,n, return_value = 1; - //stbrp_context *context = (stbrp_context *) spc->pack_info; - stbrp_rect *rects; - - // flag all characters as NOT packed - for (i=0; i < num_ranges; ++i) - for (j=0; j < ranges[i].num_chars; ++j) - ranges[i].chardata_for_range[j].x0 = - ranges[i].chardata_for_range[j].y0 = - ranges[i].chardata_for_range[j].x1 = - ranges[i].chardata_for_range[j].y1 = 0; - - n = 0; - for (i=0; i < num_ranges; ++i) - n += ranges[i].num_chars; - - rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); - if (rects == NULL) - return 0; - - info.userdata = spc->user_allocator_context; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); - - n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); - - stbtt_PackFontRangesPackRects(spc, rects, n); - - return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); - - STBTT_free(rects, spc->user_allocator_context); - return return_value; -} - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) -{ - stbtt_pack_range range; - range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; - range.array_of_unicode_codepoints = NULL; - range.num_chars = num_chars_in_range; - range.chardata_for_range = chardata_for_range; - range.font_size = font_size; - return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); -} - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) -{ - int i_ascent, i_descent, i_lineGap; - float scale; - stbtt_fontinfo info; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); - scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); - stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); - *ascent = (float) i_ascent * scale; - *descent = (float) i_descent * scale; - *lineGap = (float) i_lineGap * scale; -} - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) -{ - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_packedchar *b = chardata + char_index; - - if (align_to_integer) { - float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); - float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); - q->x0 = x; - q->y0 = y; - q->x1 = x + b->xoff2 - b->xoff; - q->y1 = y + b->yoff2 - b->yoff; - } else { - q->x0 = *xpos + b->xoff; - q->y0 = *ypos + b->yoff; - q->x1 = *xpos + b->xoff2; - q->y1 = *ypos + b->yoff2; - } - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// sdf computation -// - -#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) -#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) - -static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) -{ - float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; - float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; - float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; - float roperp = orig[1]*ray[0] - orig[0]*ray[1]; - - float a = q0perp - 2*q1perp + q2perp; - float b = q1perp - q0perp; - float c = q0perp - roperp; - - float s0 = 0., s1 = 0.; - int num_s = 0; - - if (a != 0.0) { - float discr = b*b - a*c; - if (discr > 0.0) { - float rcpna = -1 / a; - float d = (float) STBTT_sqrt(discr); - s0 = (b+d) * rcpna; - s1 = (b-d) * rcpna; - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { - if (num_s == 0) s0 = s1; - ++num_s; - } - } - } else { - // 2*b*s + c = 0 - // s = -c / (2*b) - s0 = c / (-2 * b); - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - } - - if (num_s == 0) - return 0; - else { - float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); - float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; - - float q0d = q0[0]*rayn_x + q0[1]*rayn_y; - float q1d = q1[0]*rayn_x + q1[1]*rayn_y; - float q2d = q2[0]*rayn_x + q2[1]*rayn_y; - float rod = orig[0]*rayn_x + orig[1]*rayn_y; - - float q10d = q1d - q0d; - float q20d = q2d - q0d; - float q0rd = q0d - rod; - - hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; - hits[0][1] = a*s0+b; - - if (num_s > 1) { - hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; - hits[1][1] = a*s1+b; - return 2; - } else { - return 1; - } - } -} - -static int equal(float *a, float *b) -{ - return (a[0] == b[0] && a[1] == b[1]); -} - -static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) -{ - int i; - float orig[2], ray[2] = { 1, 0 }; - float y_frac; - int winding = 0; - - // make sure y never passes through a vertex of the shape - y_frac = (float) STBTT_fmod(y, 1.0f); - if (y_frac < 0.01f) - y += 0.01f; - else if (y_frac > 0.99f) - y -= 0.01f; - - orig[0] = x; - orig[1] = y; - - // test a ray from (-infinity,y) to (x,y) - for (i=0; i < nverts; ++i) { - if (verts[i].type == STBTT_vline) { - int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; - int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } - if (verts[i].type == STBTT_vcurve) { - int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; - int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; - int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; - int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); - int by = STBTT_max(y0,STBTT_max(y1,y2)); - if (y > ay && y < by && x > ax) { - float q0[2],q1[2],q2[2]; - float hits[2][2]; - q0[0] = (float)x0; - q0[1] = (float)y0; - q1[0] = (float)x1; - q1[1] = (float)y1; - q2[0] = (float)x2; - q2[1] = (float)y2; - if (equal(q0,q1) || equal(q1,q2)) { - x0 = (int)verts[i-1].x; - y0 = (int)verts[i-1].y; - x1 = (int)verts[i ].x; - y1 = (int)verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } else { - int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); - if (num_hits >= 1) - if (hits[0][0] < 0) - winding += (hits[0][1] < 0 ? -1 : 1); - if (num_hits >= 2) - if (hits[1][0] < 0) - winding += (hits[1][1] < 0 ? -1 : 1); - } - } - } - } - return winding; -} - -static float stbtt__cuberoot( float x ) -{ - if (x<0) - return -(float) STBTT_pow(-x,1.0f/3.0f); - else - return (float) STBTT_pow( x,1.0f/3.0f); -} - -// x^3 + a*x^2 + b*x + c = 0 -static int stbtt__solve_cubic(float a, float b, float c, float* r) -{ - float s = -a / 3; - float p = b - a*a / 3; - float q = a * (2*a*a - 9*b) / 27 + c; - float p3 = p*p*p; - float d = q*q + 4*p3 / 27; - if (d >= 0) { - float z = (float) STBTT_sqrt(d); - float u = (-q + z) / 2; - float v = (-q - z) / 2; - u = stbtt__cuberoot(u); - v = stbtt__cuberoot(v); - r[0] = s + u + v; - return 1; - } else { - float u = (float) STBTT_sqrt(-p/3); - float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative - float m = (float) STBTT_cos(v); - float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; - r[0] = s + u * 2 * m; - r[1] = s - u * (m + n); - r[2] = s - u * (m - n); - - //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? - //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); - //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); - return 3; - } -} - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - float scale_x = scale, scale_y = scale; - int ix0,iy0,ix1,iy1; - int w,h; - unsigned char *data; - - if (scale == 0) return NULL; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); - - // if empty, return NULL - if (ix0 == ix1 || iy0 == iy1) - return NULL; - - ix0 -= padding; - iy0 -= padding; - ix1 += padding; - iy1 += padding; - - w = (ix1 - ix0); - h = (iy1 - iy0); - - if (width ) *width = w; - if (height) *height = h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - // invert for y-downwards bitmaps - scale_y = -scale_y; - - { - // distance from singular values (in the same units as the pixel grid) - const float eps = 1./1024, eps2 = eps*eps; - int x,y,i,j; - float *precompute; - stbtt_vertex *verts; - int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); - data = (unsigned char *) STBTT_malloc(w * h, info->userdata); - precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); - - for (i=0,j=num_verts-1; i < num_verts; j=i++) { - if (verts[i].type == STBTT_vline) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; - float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); - precompute[i] = (dist < eps) ? 0.0f : 1.0f / dist; - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; - float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; - float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float len2 = bx*bx + by*by; - if (len2 >= eps2) - precompute[i] = 1.0f / len2; - else - precompute[i] = 0.0f; - } else - precompute[i] = 0.0f; - } - - for (y=iy0; y < iy1; ++y) { - for (x=ix0; x < ix1; ++x) { - float val; - float min_dist = 999999.0f; - float sx = (float) x + 0.5f; - float sy = (float) y + 0.5f; - float x_gspace = (sx / scale_x); - float y_gspace = (sy / scale_y); - - int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path - - for (i=0; i < num_verts; ++i) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - - if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { - float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; - - float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - // coarse culling against bbox - //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && - // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) - dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; - STBTT_assert(i != 0); - if (dist < min_dist) { - // check position along line - // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) - // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) - float dx = x1-x0, dy = y1-y0; - float px = x0-sx, py = y0-sy; - // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy - // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve - float t = -(px*dx + py*dy) / (dx*dx + dy*dy); - if (t >= 0.0f && t <= 1.0f) - min_dist = dist; - } - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; - float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; - float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); - float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); - float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); - float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); - // coarse culling against bbox to avoid computing cubic unnecessarily - if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { - int num=0; - float ax = x1-x0, ay = y1-y0; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float mx = x0 - sx, my = y0 - sy; - float res[3] = {0.f,0.f,0.f}; - float px,py,t,it,dist2; - float a_inv = precompute[i]; - if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula - float a = 3*(ax*bx + ay*by); - float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); - float c = mx*ax+my*ay; - if (STBTT_fabs(a) < eps2) { // if a is 0, it's linear - if (STBTT_fabs(b) >= eps2) { - res[num++] = -c/b; - } - } else { - float discriminant = b*b - 4*a*c; - if (discriminant < 0) - num = 0; - else { - float root = (float) STBTT_sqrt(discriminant); - res[0] = (-b - root)/(2*a); - res[1] = (-b + root)/(2*a); - num = 2; // don't bother distinguishing 1-solution case, as code below will still work - } - } - } else { - float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point - float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; - float d = (mx*ax+my*ay) * a_inv; - num = stbtt__solve_cubic(b, c, d, res); - } - dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { - t = res[0], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { - t = res[1], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { - t = res[2], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - } - } - } - if (winding == 0) - min_dist = -min_dist; // if outside the shape, value is negative - val = onedge_value + pixel_dist_scale * min_dist; - if (val < 0) - val = 0; - else if (val > 255) - val = 255; - data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; - } - } - STBTT_free(precompute, info->userdata); - STBTT_free(verts, info->userdata); - } - return data; -} - -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -////////////////////////////////////////////////////////////////////////////// -// -// font name matching -- recommended not to use this -// - -// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) -{ - stbtt_int32 i=0; - - // convert utf16 to utf8 and compare the results while converting - while (len2) { - stbtt_uint16 ch = s2[0]*256 + s2[1]; - if (ch < 0x80) { - if (i >= len1) return -1; - if (s1[i++] != ch) return -1; - } else if (ch < 0x800) { - if (i+1 >= len1) return -1; - if (s1[i++] != 0xc0 + (ch >> 6)) return -1; - if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; - } else if (ch >= 0xd800 && ch < 0xdc00) { - stbtt_uint32 c; - stbtt_uint16 ch2 = s2[2]*256 + s2[3]; - if (i+3 >= len1) return -1; - c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; - if (s1[i++] != 0xf0 + (c >> 18)) return -1; - if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; - s2 += 2; // plus another 2 below - len2 -= 2; - } else if (ch >= 0xdc00 && ch < 0xe000) { - return -1; - } else { - if (i+2 >= len1) return -1; - if (s1[i++] != 0xe0 + (ch >> 12)) return -1; - if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; - } - s2 += 2; - len2 -= 2; - } - return i; -} - -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); -} - -// returns results in whatever encoding you request... but note that 2-byte encodings -// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) -{ - stbtt_int32 i,count,stringOffset; - stbtt_uint8 *fc = font->data; - stbtt_uint32 offset = font->fontstart; - stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return NULL; - - count = ttUSHORT(fc+nm+2); - stringOffset = nm + ttUSHORT(fc+nm+4); - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) - && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { - *length = ttUSHORT(fc+loc+8); - return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); - } - } - return NULL; -} - -static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) -{ - stbtt_int32 i; - stbtt_int32 count = ttUSHORT(fc+nm+2); - stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); - - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - stbtt_int32 id = ttUSHORT(fc+loc+6); - if (id == target_id) { - // find the encoding - stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); - - // is this a Unicode encoding? - if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { - stbtt_int32 slen = ttUSHORT(fc+loc+8); - stbtt_int32 off = ttUSHORT(fc+loc+10); - - // check if there's a prefix match - stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); - if (matchlen >= 0) { - // check for target_id+1 immediately following, with same encoding & language - if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { - slen = ttUSHORT(fc+loc+12+8); - off = ttUSHORT(fc+loc+12+10); - if (slen == 0) { - if (matchlen == nlen) - return 1; - } else if (matchlen < nlen && name[matchlen] == ' ') { - ++matchlen; - if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) - return 1; - } - } else { - // if nothing immediately following - if (matchlen == nlen) - return 1; - } - } - } - - // @TODO handle other encodings - } - } - return 0; -} - -static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) -{ - stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); - stbtt_uint32 nm,hd; - if (!stbtt__isfont(fc+offset)) return 0; - - // check italics/bold/underline flags in macStyle... - if (flags) { - hd = stbtt__find_table(fc, offset, "head"); - if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; - } - - nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return 0; - - if (flags) { - // if we checked the macStyle flags, then just check the family and ignore the subfamily - if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } else { - if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - - return 0; -} - -static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) -{ - stbtt_int32 i; - for (i=0;;++i) { - stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); - if (off < 0) return off; - if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) - return off; - } -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, - float pixel_height, unsigned char *pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar *chardata) -{ - return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); -} - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); -} - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) -{ - return stbtt_GetNumberOfFonts_internal((unsigned char *) data); -} - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) -{ - return stbtt_InitFont_internal(info, (unsigned char *) data, offset); -} - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) -{ - return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); -} - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#endif // STB_TRUETYPE_IMPLEMENTATION - - -// FULL VERSION HISTORY -// -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) allow user-defined fabs() replacement -// fix memory leak if fontsize=0.0 -// fix warning from duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// allow PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) -// also more precise AA rasterizer, except if shapes overlap -// remove need for STBTT_sort -// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC -// 1.04 (2015-04-15) typo in example -// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes -// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ -// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match -// non-oversampled; STBTT_POINT_SIZE for packed case only -// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling -// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) -// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID -// 0.8b (2014-07-07) fix a warning -// 0.8 (2014-05-25) fix a few more warnings -// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back -// 0.6c (2012-07-24) improve documentation -// 0.6b (2012-07-20) fix a few more warnings -// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, -// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty -// 0.5 (2011-12-09) bugfixes: -// subpixel glyph renderer computed wrong bounding box -// first vertex of shape can be off-curve (FreeSans) -// 0.4b (2011-12-03) fixed an error in the font baking example -// 0.4 (2011-12-01) kerning, subpixel rendering (tor) -// bugfixes for: -// codepoint-to-glyph conversion using table fmt=12 -// codepoint-to-glyph conversion using table fmt=4 -// stbtt_GetBakedQuad with non-square texture (Zer) -// updated Hello World! sample to use kerning and subpixel -// fixed some warnings -// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) -// userdata, malloc-from-userdata, non-zero fill (stb) -// 0.2 (2009-03-11) Fix unsigned/signed char warnings -// 0.1 (2009-03-09) First public release -// - -/* ------------------------------------------------------------------------------- -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/licenses/raw_pdb/LICENSE.txt b/licenses/raw_pdb/LICENSE.txt deleted file mode 100644 index 64f57fd..0000000 --- a/licenses/raw_pdb/LICENSE.txt +++ /dev/null @@ -1,27 +0,0 @@ -// This license belongs to https://github.com/MolecularMatters/raw_pdb - -BSD 2-Clause License - -Copyright 2011-2022, Molecular Matters GmbH -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/simple/LICENSE.txt b/licenses/simple/LICENSE.txt deleted file mode 100644 index 68028c0..0000000 --- a/licenses/simple/LICENSE.txt +++ /dev/null @@ -1,203 +0,0 @@ -// This license belongs to https://github.com/SeaOfNodes/Simple - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/licenses/tb/LICENSE.txt b/licenses/tb/LICENSE.txt deleted file mode 100644 index bc5f291..0000000 --- a/licenses/tb/LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -// This license belongs to https://github.com/RealNeGate/Cuik - -MIT License - -Copyright (c) 2021 Yasser Arguelles Snape - -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.