diff --git a/.clang-format b/.clang-format index 18c50583..f7a9e21e 100644 --- a/.clang-format +++ b/.clang-format @@ -7,28 +7,41 @@ BasedOnStyle: LLVM IndentWidth: 4 UseTab: Never -BreakBeforeBraces: Linux +# === Struct/Union/Class member indentation === +# These options control indentation of struct members to ensure consistent +# 4-space indentation for all struct/union/class members +IndentAccessModifiers: false +AccessModifierOffset: 0 +NamespaceIndentation: All +IndentPPDirectives: BeforeHash + +BreakBeforeBraces: Attach BraceWrapping: AfterControlStatement: false - AfterFunction: true + AfterFunction: false AfterClass: false AfterStruct: false + # AfterStruct: false keeps struct opening brace on same line (K&R style) + # Struct members will still be indented with IndentWidth: 4 AfterUnion: false AfterNamespace: false AfterEnum: false BeforeCatch: false BeforeElse: false IndentBraces: false + # IndentBraces: false ensures braces themselves are not indented, + # but content inside braces respects IndentWidth setting -ContinuationIndentWidth: 0 -AlignAfterOpenBracket: false AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AllowShortBlocksOnASingleLine: Always -IndentCaseLabels: false -SpaceAfterCStyleCast: true +# AllowShortFunctionsOnASingleLine: None enforces function bodies +# to always be on separate lines, following K&R convention AllowShortFunctionsOnASingleLine: None -ColumnLimit: 80 + +IndentCaseLabels: true +SpaceAfterCStyleCast: false +ColumnLimit: 150 MaxEmptyLinesToKeep: 1 Cpp11BracedListStyle: false AlignTrailingComments: true @@ -39,7 +52,9 @@ IncludeBlocks: Regroup IncludeCategories: - Regex: '<[[:alnum:].]+>' Priority: 1 + # System headers (angle brackets) have highest priority - Regex: '.*' Priority: 2 + # Project headers (quotes) have lower priority SortIncludes: CaseSensitive AlignEscapedNewlines: Left \ No newline at end of file diff --git a/COMPILING.md b/COMPILING.md index 5b2833af..8b832fcf 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -2,10 +2,8 @@ Horizon OC Compilation Instructions 1. Install devkitpro (https://devkitpro.org/wiki/Getting_Started) with switch-dev 2. Set up a development enviorment for compiling Atmosphere (https://github.com/Atmosphere-NX/Atmosphere/blob/master/docs/building.md) -3. Install GNU make and ENSURE THAT YOUR ENVIORMENT HAS A PYTHON3 COMMAND AVAILABLE! -4. Git clone atmosphere (git clone https://github.com/Atmosphere-NX/Atmosphere.git) -5. Clone the Horizon OC develop branch (git clone https://github.com/Horizon-OC/Horizon-OC.git --recurse-submodules) -6. Create a new folder named "build" in the horizon oc repo -7. Copy atmosphere files into that build folder -8. Copy Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp to build/stratosphere/loader/source/ldr_process_creation.cpp, replacing any files if prompted -9. Run ./build.sh in the root directory +3. Git clone atmosphere (git clone https://github.com/Atmosphere-NX/Atmosphere.git) +4. Clone the Horizon OC develop branch (``git clone https://github.com/Horizon-OC/Horizon-OC.git --recurse-submodules``) +5. Create a new folder named ``build`` in the horizon oc repo +6. Copy atmosphere files into that build folder +7. Run ./build.sh in the root directory diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 3fd708bf..9a32305c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -156,30 +156,60 @@ volatile CustomizeTable C = { }, .marikoGpuVoltArray = { - AUTO /* 76 */, - AUTO /* 153 */, - AUTO /* 230 */, - AUTO /* 307 */, - AUTO /* 384 */, - AUTO /* 460 */, - AUTO /* 537 */, - AUTO /* 614 */, - AUTO /* 691 */, - AUTO /* 768 */, - AUTO /* 844 */, - AUTO /* 921 */, - AUTO /* 998 */, - AUTO /* 1075 */, - AUTO /* 1152 (SLT / HiOPT Only!) */, - AUTO /* 1228 (HiOPT Only!) */, - DEACTIVATED_GPU_FREQ /* 1267 (Disabled by default) */, - DEACTIVATED_GPU_FREQ /* 1305 (Disabled by default) */, - DEACTIVATED_GPU_FREQ /* 1344 (Disabled by default) */, - DEACTIVATED_GPU_FREQ /* 1382 (Disabled by default) */, - DEACTIVATED_GPU_FREQ /* 1420 (Disabled by default) */, - DEACTIVATED_GPU_FREQ /* 1459 (Disabled by default) */, - DEACTIVATED_GPU_FREQ /* 1497 (Disabled by default) */, - DEACTIVATED_GPU_FREQ /* 1536 (Disabled by default) */, + AUTO /* 76 */, + AUTO /* 153 */, + AUTO /* 230 */, + AUTO /* 307 */, + AUTO /* 384 */, + AUTO /* 460 */, + AUTO /* 537 */, + AUTO /* 614 */, + AUTO /* 691 */, + AUTO /* 768 */, + AUTO /* 844 */, + AUTO /* 921 */, + AUTO /* 998 */, + AUTO /* 1075 */, + AUTO /* 1152 (HioPT / High UV only!) */, + AUTO /* 1228 (High UV Only!) */, + DEACTIVATED_GPU_FREQ /* 1267 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1305 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1344 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1382 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1420 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1459 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1497 (Disabled by default) */, + DEACTIVATED_GPU_FREQ /* 1536 (Disabled by default) */, +}, + +/* Override soc voltage brackets. */ +.marikoSocVoltArray = { + 0 /* >= 1866 */, + 0 /* >= 2000 */, + 0 /* >= 2133 */, + 0 /* >= 2200 */, + 0 /* >= 2266 */, + 0 /* >= 2333 */, + 0 /* >= 2400 */, + 0 /* >= 2433 */, + 0 /* >= 2466 */, + 0 /* >= 2533 */, + 0 /* >= 2566 */, + 0 /* >= 2600 */, + 0 /* >= 2666 */, + 0 /* >= 2700 */, + 0 /* >= 2733 */, + 0 /* >= 2766 */, + 0 /* >= 2800 */, + 0 /* >= 2833 */, + 0 /* >= 2900 */, + 0 /* >= 2933 */, + 0 /* >= 3000 */, + 0 /* >= 3033 */, + 0 /* >= 3100 */, + 0 /* >= 3133 */, + 0 /* >= 3166 */, + 0 /* >= 3200 */, }, /* Advanced. */ @@ -478,7 +508,7 @@ volatile CustomizeTable C = { }, .marikoGpuDvfsTableSLT = { - { 76800, {}, { 590000, } }, + { 76800, {}, { 590000, } }, { 153600, {}, { 590000, } }, { 230400, {}, { 590000, } }, { 307200, {}, { 590000, } }, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index 6408eb17..94a79bf6 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -21,7 +21,7 @@ #pragma once #define CUST_REV 4 -#define KIP_VERSION 240 +#define KIP_VERSION 241 #include "oc_common.hpp" #include "pcv/pcv_common.hpp" @@ -123,6 +123,7 @@ struct CustomizeTable { u32 eristaGpuVoltArray[27]; u32 marikoGpuVoltArray[24]; + s32 marikoSocVoltArray[26]; u32 fineTune_t6_tRTW; u32 fineTune_t7_tWTR; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp index 2482c80c..614f9151 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_common.hpp @@ -73,7 +73,7 @@ namespace ams::ldr::hoc::pcv { u32 unk_0; struct div_nmp *div_nmp; u32 unk_1[4]; - void (*unk_fn)(u64* unk_struct); // set_defaults? + void (*unk_fn)(u64 *unk_struct); // set_defaults? }; struct __attribute__((packed)) dvfs_rail { @@ -90,7 +90,7 @@ namespace ams::ldr::hoc::pcv { struct __attribute__((packed)) regulator { u64 id; - const char* name; + const char *name; u32 type; union { struct { @@ -148,7 +148,7 @@ namespace ams::ldr::hoc::pcv { size_t GetDvfsTableEntryCount(T *table_head) { using NT = std::remove_const_t>; - auto is_empty = [](NT* entry) { + auto is_empty = [](NT *entry) { u8 *m = reinterpret_cast(entry); for (size_t i = 0; i < sizeof(NT); i++) { if (*(m + i)) { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp index b453aea0..0197bc5a 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp @@ -257,7 +257,7 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); /* Accept imperfection or prepare for suffering. */ - #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) + // #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) // WRITE_PARAM_ALL_REG(table, emc_einput, einput); // WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); @@ -282,7 +282,7 @@ namespace ams::ldr::hoc::pcv::erista { // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); // table->dram_timings.rl = RL; - #endif + // #endif constexpr double MC_ARB_DIV = 4.0; constexpr u32 MC_ARB_SFA = 2; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp index 05e1246b..4c5280ec 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp @@ -815,7 +815,6 @@ namespace ams::ldr::hoc::pcv::mariko { s32 max0 = 1050; s32 max1 = 1025; s32 max2 = 1000; - s32 voltAdd = 25 * C.emcDvbShift; if (C.marikoSocVmax && C.marikoSocVmax > 1000) { max0 = C.marikoSocVmax; @@ -825,15 +824,23 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr s32 MinVolt = 637; - auto ClampVolt = [&](s32 value, s32 max) { + auto ClampVolt = [&](s32 value, s32 max, s32 voltAdd) { return std::clamp(value + voltAdd, MinVolt, max); }; - auto DvbVolt = [&](s32 zero, s32 one, s32 two) { + auto DvbVolt = [&](s32 zero, s32 one, s32 two, u32 index) { + const s32 overrideVoltage = C.marikoSocVoltArray[index]; + s32 voltAdd = 25 * C.emcDvbShift; + + if (overrideVoltage) { + zero = one = two = overrideVoltage; + voltAdd = 0; + } + return std::array{ - ClampVolt(zero, max0), - ClampVolt(one, max1), - ClampVolt(two, max2) + ClampVolt(zero, max0, voltAdd), + ClampVolt(one, max1, voltAdd), + ClampVolt(two, max2, voltAdd) }; }; @@ -841,39 +848,45 @@ namespace ams::ldr::hoc::pcv::mariko { static_cast((v)[0]), \ static_cast((v)[1]), \ static_cast((v)[2]) + + #define DVB_OC(one, zero, two, idx) \ + DVB(DvbVolt(one, zero, two, idx)) + DvbEntry emcDvbOcTableBrackets[] = { - { 204000, { 637, 637, 637, }, }, - { 1331200, { 650, 637, 637, }, }, - { 1600000, { 675, 650, 637, }, }, - { 1866000, { DVB(DvbVolt( 700, 675, 650)) }, }, - { 2000000, { DVB(DvbVolt( 712, 687, 662)) }, }, - { 2133000, { DVB(DvbVolt( 725, 700, 675)) }, }, - { 2200000, { DVB(DvbVolt( 737, 712, 687)) }, }, - { 2266000, { DVB(DvbVolt( 750, 725, 700)) }, }, - { 2333000, { DVB(DvbVolt( 762, 737, 712)) }, }, - { 2400000, { DVB(DvbVolt( 775, 750, 725)) }, }, - { 2433000, { DVB(DvbVolt( 787, 762, 737)) }, }, - { 2466000, { DVB(DvbVolt( 800, 775, 750)) }, }, - { 2533000, { DVB(DvbVolt( 812, 787, 762)) }, }, - { 2566000, { DVB(DvbVolt( 825, 800, 775)) }, }, - { 2600000, { DVB(DvbVolt( 837, 812, 787)) }, }, - { 2666000, { DVB(DvbVolt( 850, 825, 800)) }, }, - { 2700000, { DVB(DvbVolt( 875, 850, 825)) }, }, - { 2733000, { DVB(DvbVolt( 887, 862, 837)) }, }, - { 2766000, { DVB(DvbVolt( 912, 887, 862)) }, }, - { 2800000, { DVB(DvbVolt( 925, 900, 875)) }, }, - { 2833000, { DVB(DvbVolt( 937, 912, 887)) }, }, - { 2900000, { DVB(DvbVolt( 950, 925, 900)) }, }, - { 2933000, { DVB(DvbVolt( 962, 937, 912)) }, }, - { 3000000, { DVB(DvbVolt( 975, 950, 925)) }, }, - { 3033000, { DVB(DvbVolt( 987, 962, 937)) }, }, - { 3100000, { DVB(DvbVolt(1000, 975, 950)) }, }, - { 3133000, { DVB(DvbVolt(1025, 1000, 975)) }, }, - { 3166000, { DVB(DvbVolt(1037, 1012, 987)) }, }, - { 3200000, { DVB(DvbVolt(1050, 1025, 1000)) }, }, - { ~0u, { }, }, + { 204000, { 637, 637, 637, }, }, + { 1331200, { 650, 637, 637, }, }, + { 1600000, { 675, 650, 637, }, }, + { 1866000, { DVB_OC( 700, 675, 650, 0) }, }, + { 2000000, { DVB_OC( 712, 687, 662, 1) }, }, + { 2133000, { DVB_OC( 725, 700, 675, 2) }, }, + { 2200000, { DVB_OC( 737, 712, 687, 3) }, }, + { 2266000, { DVB_OC( 750, 725, 700, 4) }, }, + { 2333000, { DVB_OC( 762, 737, 712, 5) }, }, + { 2400000, { DVB_OC( 775, 750, 725, 6) }, }, + { 2433000, { DVB_OC( 787, 762, 737, 7) }, }, + { 2466000, { DVB_OC( 800, 775, 750, 8) }, }, + { 2533000, { DVB_OC( 812, 787, 762, 9) }, }, + { 2566000, { DVB_OC( 825, 800, 775, 10) }, }, + { 2600000, { DVB_OC( 837, 812, 787, 11) }, }, + { 2666000, { DVB_OC( 850, 825, 800, 12) }, }, + { 2700000, { DVB_OC( 875, 850, 825, 13) }, }, + { 2733000, { DVB_OC( 887, 862, 837, 14) }, }, + { 2766000, { DVB_OC( 912, 887, 862, 15) }, }, + { 2800000, { DVB_OC( 925, 900, 875, 16) }, }, + { 2833000, { DVB_OC( 937, 912, 887, 17) }, }, + { 2900000, { DVB_OC( 950, 925, 900, 18) }, }, + { 2933000, { DVB_OC( 962, 937, 912, 19) }, }, + { 3000000, { DVB_OC( 975, 950, 925, 20) }, }, + { 3033000, { DVB_OC( 987, 962, 937, 21) }, }, + { 3100000, { DVB_OC(1000, 975, 950, 22) }, }, + { 3133000, { DVB_OC(1025, 1000, 975, 23) }, }, + { 3166000, { DVB_OC(1037, 1012, 987, 24) }, }, + { 3200000, { DVB_OC(1050, 1025, 1000, 25) }, }, + { ~0u, { }, }, }; #undef DVB + #undef DVB_OC + DvbEntry emcDvbTableOc[newEmcList.size()]; u32 bracketIndex = 0; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp index 15917d0e..38b8c657 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp @@ -20,7 +20,7 @@ namespace ams::ldr::hoc::ptm { - Result CpuPtmBoost(perf_conf_entry* entry) { + Result CpuPtmBoost(perf_conf_entry *entry) { bool isMariko = (spl::GetSocType() == spl::SocType_Mariko); if (!C.eristaCpuBoostClock || !C.marikoCpuBoostClock) { @@ -35,19 +35,19 @@ namespace ams::ldr::hoc::ptm { R_SUCCEED(); } - Result MemPtm(perf_conf_entry* entry) { + Result MemPtm(perf_conf_entry *entry) { PATCH_OFFSET(&(entry->emc_freq_1), memPtmLimit); PATCH_OFFSET(&(entry->emc_freq_2), memPtmLimit); R_SUCCEED(); } - bool PtmEntryIsValid(perf_conf_entry* entry) { + bool PtmEntryIsValid(perf_conf_entry *entry) { return (entry->cpu_freq_1 == entry->cpu_freq_2 && entry->gpu_freq_1 == entry->gpu_freq_2 && entry->emc_freq_1 == entry->emc_freq_2); } - bool PtmTablePatternFn(u32* ptr) { - perf_conf_entry* entry = reinterpret_cast(ptr); + bool PtmTablePatternFn(u32 *ptr) { + perf_conf_entry *entry = reinterpret_cast(ptr); if (!PtmEntryIsValid(entry)) { return false; } @@ -56,9 +56,9 @@ namespace ams::ldr::hoc::ptm { } void Patch(uintptr_t mapped_nso, size_t nso_size) { - perf_conf_entry* confTable = nullptr; + perf_conf_entry *confTable = nullptr; for (uintptr_t ptr = mapped_nso; ptr <= mapped_nso + nso_size - sizeof(perf_conf_entry) * entryCnt; ptr += sizeof(u32)) { - u32* ptr32 = reinterpret_cast(ptr); + u32 *ptr32 = reinterpret_cast(ptr); if (PtmTablePatternFn(ptr32)) { confTable = reinterpret_cast(ptr); break; diff --git a/Source/MemTesterNX/.gitignore b/Source/MemTesterNX/.gitignore deleted file mode 100644 index 3044e05c..00000000 --- a/Source/MemTesterNX/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.DS_Store -build/ -*.elf -*.nacp -*.nro \ No newline at end of file diff --git a/Source/MemTesterNX/LICENSE b/Source/MemTesterNX/LICENSE deleted file mode 100644 index d159169d..00000000 --- a/Source/MemTesterNX/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/Source/MemTesterNX/Makefile b/Source/MemTesterNX/Makefile deleted file mode 100644 index 8534105f..00000000 --- a/Source/MemTesterNX/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -#--------------------------------------------------------------------------------- -.SUFFIXES: -#--------------------------------------------------------------------------------- - -ifeq ($(strip $(DEVKITPRO)),) -$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") -endif - -TOPDIR ?= $(CURDIR) -include $(DEVKITPRO)/libnx/switch_rules - -#--------------------------------------------------------------------------------- -# TARGET is the name of the output -# BUILD is the directory where object files & intermediate files will be placed -# SOURCES is a list of directories containing source code -# DATA is a list of directories containing data files -# INCLUDES is a list of directories containing header files -# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) -# -# NO_ICON: if set to anything, do not use icon. -# NO_NACP: if set to anything, no .nacp file is generated. -# APP_TITLE is the name of the app stored in the .nacp file (Optional) -# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) -# APP_VERSION is the version of the app stored in the .nacp file (Optional) -# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) -# ICON is the filename of the icon (.jpg), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .jpg -# - icon.jpg -# - /default_icon.jpg -# -# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .json -# - config.json -# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead -# of a homebrew executable (.nro). This is intended to be used for sysmodules. -# NACP building is skipped as well. -#--------------------------------------------------------------------------------- -TARGET := $(notdir $(CURDIR)) -BUILD := build -SOURCES := source -DATA := data -INCLUDES := include -#ROMFS := romfs - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE -fPIC - -CFLAGS := -g -Wall -O2 -ffunction-sections \ - $(ARCH) $(DEFINES) - -CFLAGS += $(INCLUDE) -D__SWITCH__ - -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions - -ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) - -LIBS := -lnx - -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(PORTLIBS) $(LIBNX) - - -#--------------------------------------------------------------------------------- -# no real need to edit anything past this point unless you need to add additional -# rules for different file extensions -#--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- - -export OUTPUT := $(CURDIR)/$(TARGET) -export TOPDIR := $(CURDIR) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) - -export DEPSDIR := $(CURDIR)/$(BUILD) - -CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) -CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) -SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- -else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------- - -export OFILES_BIN := $(addsuffix .o,$(BINFILES)) -export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) -export OFILES := $(OFILES_BIN) $(OFILES_SRC) -export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) - -export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) - -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) - -ifeq ($(strip $(CONFIG_JSON)),) - jsons := $(wildcard *.json) - ifneq (,$(findstring $(TARGET).json,$(jsons))) - export APP_JSON := $(TOPDIR)/$(TARGET).json - else - ifneq (,$(findstring config.json,$(jsons))) - export APP_JSON := $(TOPDIR)/config.json - endif - endif -else - export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) -endif - -ifeq ($(strip $(ICON)),) - icons := $(wildcard *.jpg) - ifneq (,$(findstring $(TARGET).jpg,$(icons))) - export APP_ICON := $(TOPDIR)/$(TARGET).jpg - else - ifneq (,$(findstring icon.jpg,$(icons))) - export APP_ICON := $(TOPDIR)/icon.jpg - endif - endif -else - export APP_ICON := $(TOPDIR)/$(ICON) -endif - -ifeq ($(strip $(NO_ICON)),) - export NROFLAGS += --icon=$(APP_ICON) -endif - -ifeq ($(strip $(NO_NACP)),) - export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp -endif - -ifneq ($(APP_TITLEID),) - export NACPFLAGS += --titleid=$(APP_TITLEID) -endif - -ifneq ($(ROMFS),) - export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) -endif - -.PHONY: $(BUILD) clean all - -#--------------------------------------------------------------------------------- -all: $(BUILD) - -$(BUILD): - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile - -#--------------------------------------------------------------------------------- -clean: - @echo clean ... -ifeq ($(strip $(APP_JSON)),) - @rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf -else - @rm -fr $(BUILD) $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf -endif - - -#--------------------------------------------------------------------------------- -else -.PHONY: all - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -ifeq ($(strip $(APP_JSON)),) - -all : $(OUTPUT).nro - -ifeq ($(strip $(NO_NACP)),) -$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp -else -$(OUTPUT).nro : $(OUTPUT).elf -endif - -else - -all : $(OUTPUT).nsp - -$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm - -$(OUTPUT).nso : $(OUTPUT).elf - -endif - -$(OUTPUT).elf : $(OFILES) - -$(OFILES_SRC) : $(HFILES_BIN) - -#--------------------------------------------------------------------------------- -# you need a rule like this for each extension you use as binary data -#--------------------------------------------------------------------------------- -%.bin.o %_bin.h : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/Source/MemTesterNX/source/main.c b/Source/MemTesterNX/source/main.c deleted file mode 100644 index 12dc8ae7..00000000 --- a/Source/MemTesterNX/source/main.c +++ /dev/null @@ -1,496 +0,0 @@ -/* - * MemTesterNX - * based on memtester version 4 - * - * Very simple but very effective user-space memory tester. - * Originally by Simon Kirby - * Version 2 by Charles Cazabon - * Version 3 not publicly released. - * Version 4 rewrite: - * Copyright (C) 2004-2020 Charles Cazabon - * Licensed under the terms of the GNU General Public License version 2 (only). - * See the file COPYING for details. - * - */ - - #define __version__ "4.5.1-multithread" - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include // for int64_t etc - - #include "types.h" - #include "sizes.h" - #include "tests.h" - #include - - /* Some helpful typedefs used throughout the file (used by original code) */ - typedef unsigned long long ull; - typedef unsigned long ul; - - /* number of bits in a machine word printed in the header */ - #define MACHINE_BITS ((int)(sizeof(void*) * 8)) - - PadState pad; - unsigned short dividend = 1; - - void waitForAnyKey() { - while (appletMainLoop()) - { - padUpdate(&pad); - - u64 kDown = padGetButtonsDown(&pad); - - if (kDown) - break; - - consoleUpdate(NULL); - } - } - - void ShowErr(const char* err, const char* details, Result rc) { - AppletStorage errStor; - LibAppletArgs args; - AppletHolder currentApplet; - - appletCreateLibraryApplet(¤tApplet, AppletId_LibraryAppletError, LibAppletMode_AllForeground); - libappletArgsCreate(&args, 1); - libappletArgsPush(&args, ¤tApplet); - appletCreateStorage(&errStor, 0x1018); - u8 argBuf[0x1018] = {0}; - argBuf[0] = 1; - - /* keep existing packing used by original code */ - *(u64*)&argBuf[8] = (((rc & 0x1ffu) + 2000) | (((rc >> 9) & 0x1fff & 0x1fffll) << 32)); - strcpy((char*) &argBuf[24], err); - strcpy((char*) &argBuf[0x818], details); - appletStorageWrite(&errStor, 0, argBuf, 0x1018); - appletHolderPushInData(¤tApplet, &errStor); - - appletHolderStart(¤tApplet); - appletHolderJoin(¤tApplet); - appletHolderClose(¤tApplet); - appletHolderRequestExit(¤tApplet); - } - - double gettime(void) - { - struct timeval tv; - gettimeofday(&tv, NULL); - return (double)((int64_t)tv.tv_sec * 1000000 + tv.tv_usec) / 1000000.; - } - - struct test tests[] = { - { "Random Value", test_random_value }, - { "Compare XOR", test_xor_comparison }, - { "Compare SUB", test_sub_comparison }, - { "Compare MUL", test_mul_comparison }, - { "Compare DIV", test_div_comparison }, - { "Compare OR", test_or_comparison }, - { "Compare AND", test_and_comparison }, - { "Sequential Increment", test_seqinc_comparison }, - { "Solid Bits", test_solidbits_comparison }, - { "Block Sequential", test_blockseq_comparison }, - { "Checkerboard", test_checkerboard_comparison }, - { "Bit Spread", test_bitspread_comparison }, - { "Bit Flip (Slow)", test_bitflip_comparison }, - { "Walking Ones", test_walkbits1_comparison }, - { "Walking Zeroes", test_walkbits0_comparison }, - #ifdef TEST_NARROW_WRITES - { "8-bit Writes", test_8bit_wide_random }, - { "16-bit Writes", test_16bit_wide_random }, - #endif - { NULL, NULL } - }; - - struct test stress_tests[] = { - { "Stress memcpy x128", test_stress_memcpy }, - { "Stress memset x128", test_stress_memset }, - { "Stress memcmp x 32", test_stress_memcmp }, - { NULL, NULL } - }; - - int memtester_pagesize(void) { - printf("using pagesize of 4096\n"); - return 4096; - } - - /* Global vars - so tests have access to this information */ - int use_phys = 0; - off_t physaddrbase = 0; - int testJobId[4] = {0}; - int testWorkerReport[4] = {0}; - size_t bufsize[4], wantbytes[4]; - void volatile *aligned[4]; - Thread threads[5]; - struct test* test_select = tests; - - void testWorker(int div) - { - /* Wait until main sets this worker to ready (-2) */ - while (testJobId[div] != -2) - svcSleepThread(10000000ULL); - - while (true) - { - int currentJobId = -1; - - /* Wait until main moves us to the stuck-address job (-1) */ - while (testJobId[div] != currentJobId) - svcSleepThread(10000000ULL); - - /* Stuck address test: bufsize is in bytes, test_stuck_address expects count in ul units */ - if (!test_stuck_address(aligned[div], bufsize[div] / sizeof(ul))) - { - testWorkerReport[div] = 1; - currentJobId++; - } - else - { - testWorkerReport[div] = -1; - return; - } - - /* Now iterate over the selected tests */ - while (test_select[currentJobId].name) - { - while (testJobId[div] != currentJobId) - svcSleepThread(10000000ULL); - - /* Ensure second pointer argument is a pointer (not integer) */ - void volatile *second_ptr = (void volatile *)((size_t)aligned[div] + bufsize[div] / 2); - int test_rc = test_select[currentJobId].fp(aligned[div], second_ptr, (bufsize[div] / sizeof(ul)) / 2); - if (!test_rc) - { - testWorkerReport[div] = 1; - currentJobId++; - } - else - { - testWorkerReport[div] = -1; - return; - } - } - } - } - - void testWorker0(void*) { testWorker(0); } - void testWorker1(void*) { testWorker(1); } - void testWorker2(void*) { testWorker(2); } - void testWorker3(void*) { testWorker(3); } - - void* workers[] = { - testWorker0, - testWorker1, - testWorker2, - testWorker3, - }; - - void LblUpdate() - { - smInitialize(); - lblInitialize(); - LblBacklightSwitchStatus lblstatus = LblBacklightSwitchStatus_Disabled; - lblGetBacklightSwitchStatus(&lblstatus); - if (lblstatus) { - lblSwitchBacklightOff(0); - } else { - lblSwitchBacklightOn(0); - } - lblExit(); - smExit(); - } - - void keyListener() - { - while (true) - { - padUpdate(&pad); - u64 kDown = padGetButtonsDown(&pad); - if (kDown & HidNpadButton_Minus) - { - LblUpdate(); - } - svcSleepThread(10000000ULL); - } - } - - // Main program entrypoint - int main(int argc, char* argv[]) - { - if(appletGetAppletType() != AppletType_Application) { - ShowErr("Running in applet mode\nMemTesterNX requires full memory mode.\nPlease launch hbmenu by holding R on an APP (e.g. a game) NOT an applet (e.g. Gallery)", "", 0); - return 0; - } - - appletReportUserIsActive(); - - consoleInit(NULL); - - padConfigureInput(1, HidNpadStyleSet_NpadStandard); - - padInitializeDefault(&pad); - - ull loop; - size_t i; - unsigned short div, testThreads = 3; - size_t pagesize, wantraw, wantbytes_orig; - ptrdiff_t pagesizemask; - void volatile *buf[4]; - int memshift; - ull totalmem = 0; - int numOfMallocs = 0; - bool isDevKit8GB = false; - - printf("MemTesterNX version " __version__ " (%d-bit)\n"\ - "Based on memtester. Copyright (C) 2001-2020 Charles Cazabon, 2021 KazushiMe.\n"\ - "Licensed under the GNU General Public License version 2 (only).\n\n"\ - "Support full RAM test (up to 8GB) with 3-4 threads.\n"\ - "It will be looping forever until error occurs or user exits to HOME screen.\n\n"\ - "Press A: long test\n"\ - "Press X: fast test\n"\ - "Press Y: stress DRAM (memcpy, memset and memcmp)\n"\ - "Press any other key: exit\n\n", - MACHINE_BITS); - - while (appletMainLoop()) - { - padUpdate(&pad); - - u64 kDown = padGetButtonsDown(&pad); - - if (kDown & HidNpadButton_A) - { - break; - } - else if (kDown & HidNpadButton_X) - { - dividend = 4; - break; - } - else if (kDown & HidNpadButton_Y) - { - dividend = 16; - test_select = stress_tests; - break; - } - else if (kDown) - { - consoleExit(NULL); - exit(0); - } - - consoleUpdate(NULL); - } - - // Disable auto sleep and request CPU Boost mode - appletSetAutoSleepDisabled(true); - appletSetCpuBoostMode(ApmCpuBoostMode_FastLoad); - - pagesize = memtester_pagesize(); - pagesizemask = (ptrdiff_t) ~(pagesize - 1); - printf("pagesizemask is 0x%tx\n", pagesizemask); - consoleUpdate(NULL); - - memshift = 20; /* megabytes */ - wantraw = 2048; // HOS limit - - wantbytes_orig = ((size_t) wantraw << memshift); - - // Allocate as much RAM as possible. - for (div = 0; div <= 3; div++) - { - buf[div] = NULL; - wantbytes[div] = wantbytes_orig; - - while (!buf[div] && wantbytes[div]) { - buf[div] = (void volatile *) malloc(wantbytes[div]); - if (!buf[div]) - wantbytes[div] -= pagesize; - } - - totalmem += wantbytes[div]; - - if ((wantbytes[div] >> memshift) < 2047) - { - numOfMallocs = div + 1; - break; - } - } - - for (div = 0; div < numOfMallocs; div++) - { - free((void *)buf[div]); - } - - // Unknown: Not sure if devkit could use full 8GB in application space - if ((totalmem >> memshift) > 3 * 2047) - { - isDevKit8GB = true; - testThreads = 4; - } - - // Create workers - for (div = 0; div < testThreads; div++) - { - Result rc; - rc = threadCreate(&threads[div], workers[div], NULL, NULL, 0x1000, 0x2C, div == 3 ? -2 : div); - if (R_FAILED(rc)) - { - printf("Fatal: threadCreate[%d] failed: 0x%X\n", div, rc); - consoleUpdate(NULL); - } - else - { - totalmem -= 0x1000; - } - } - - // keyListener - { - const int kl = testThreads; - Result rc = threadCreate(&threads[kl], keyListener, NULL, NULL, 0x1000, 0x20, -2); - if (R_FAILED(rc)) - { - printf("Fatal: threadCreate[%d] failed: 0x%X\n", kl, rc); - consoleUpdate(NULL); - } - threadStart(&threads[kl]); - } - - printf("\nTotal RAM available: %lluMB\n\n", (unsigned long long)(totalmem >> memshift)); - consoleUpdate(NULL); - - // Redistribute RAM allocation equally to testThreads workers - for (div = 0; div < testThreads; div++) - { - buf[div] = NULL; - if (isDevKit8GB) - { - if (div != 3) - wantbytes[div] = totalmem / 3; - else - wantbytes[div] = 2047 << memshift; /* convert MB to bytes */ - } - else - { - wantbytes[div] = totalmem / testThreads; - } - - while (!buf[div] && wantbytes[div]) { - buf[div] = (void volatile *) malloc(wantbytes[div]); - if (!buf[div]) - wantbytes[div] -= pagesize; - } - - bufsize[div] = wantbytes[div]; - - /* Do alignment here as well */ - if ((size_t) buf[div] % pagesize) { - aligned[div] = (void volatile *) (((size_t) buf[div] & pagesizemask) + pagesize); - bufsize[div] -= ((size_t) aligned[div] - (size_t) buf[div]); - } else { - aligned[div] = buf[div]; - } - - printf("Alloc %d: got %lluMB (%llu bytes)\n", div+1, (unsigned long long)(wantbytes[div] >> memshift), (unsigned long long)wantbytes[div]); - consoleUpdate(NULL); - } - - // Start workers - for (div = 0; div < testThreads; div++) - { - Result rc; - rc = threadStart(&threads[div]); - if (R_FAILED(rc)) - { - printf("Fatal: threadStart[%d] failed: 0x%X\n", div, rc); - consoleUpdate(NULL); - } - } - - for(loop=1;;loop++) - { - // Set testJobId to -2 (Ready) - for (int j = 0; j < testThreads; j++) - testJobId[j] = -2; - - printf("Loop %llu:\n", (unsigned long long)loop); - - // Stuck address (-1) - printf(" %-20s: ", "Stuck Address"); - consoleUpdate(NULL); - for (int j = 0; j < testThreads; j++) - testJobId[j] = -1; - - for (int j = 0; j < testThreads; ) - { - switch (testWorkerReport[j]) - { - case 0: - svcSleepThread(10000000ULL); - break; - case -1: - printf("Alloc %d/%d: Error detected!\nPress any key to exit.\n", j+1, testThreads); - consoleUpdate(NULL); - waitForAnyKey(); - consoleExit(NULL); - return 0; - case 1: - testWorkerReport[j] = 0; - j++; - continue; - } - } - printf("ok\n"); - consoleUpdate(NULL); - - // tests[] - for (i = 0 ;; i++) { - if (!test_select[i].name) - break; - - printf(" %-20s: ...", test_select[i].name); - consoleUpdate(NULL); - for (int j = 0; j < testThreads; j++) - testJobId[j] = (int)i; - - double start_sec = gettime(); - for (int j = 0; j < testThreads; ) - { - switch (testWorkerReport[j]) - { - case 0: - svcSleepThread(10000000ULL); - continue; - case -1: - printf("Alloc %d/%d: Error detected!\nPress any key to exit.\n", j+1, testThreads); - consoleUpdate(NULL); - waitForAnyKey(); - consoleExit(NULL); - return 0; - case 1: - testWorkerReport[j] = 0; - j++; - continue; - } - } - double end_sec = gettime(); - printf("\b\b\bok! finished in %.1fs\n", end_sec - start_sec); - consoleUpdate(NULL); - } - } - - // Deinitialize and clean up resources used by the console (important!) - consoleExit(NULL); - return 0; - } - \ No newline at end of file diff --git a/Source/MemTesterNX/source/memtester.h b/Source/MemTesterNX/source/memtester.h deleted file mode 100755 index 2116eb86..00000000 --- a/Source/MemTesterNX/source/memtester.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Very simple (yet, for some reason, very effective) memory tester. - * Originally by Simon Kirby - * Version 2 by Charles Cazabon - * Version 3 not publicly released. - * Version 4 rewrite: - * Copyright (C) 2004-2020 Charles Cazabon - * Licensed under the terms of the GNU General Public License version 2 (only). - * See the file COPYING for details. - * - * This file contains the declarations for external variables from the main file. - * See other comments in that file. - * - */ - -#include - -/* extern declarations. */ - -extern int use_phys; -extern off_t physaddrbase; - diff --git a/Source/MemTesterNX/source/sizes.h b/Source/MemTesterNX/source/sizes.h deleted file mode 100755 index cd1c3adc..00000000 --- a/Source/MemTesterNX/source/sizes.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Very simple but very effective user-space memory tester. - * Originally by Simon Kirby - * Version 2 by Charles Cazabon - * Version 3 not publicly released. - * Version 4 rewrite: - * Copyright (C) 2004-2012 Charles Cazabon - * Licensed under the terms of the GNU General Public License version 2 (only). - * See the file COPYING for details. - * - * This file contains some macro definitions for handling 32/64 bit platforms. - * - */ - -#include - -#define rand32() ((unsigned int) rand() | ( (unsigned int) rand() << 16)) - -#if (ULONG_MAX == 4294967295UL) - #define rand_ul() rand32() - #define UL_ONEBITS 0xffffffff - #define UL_LEN 32 - #define CHECKERBOARD1 0x55555555 - #define CHECKERBOARD2 0xaaaaaaaa - #define UL_BYTE(x) ((x | x << 8 | x << 16 | x << 24)) -#elif (ULONG_MAX == 18446744073709551615ULL) - #define rand64() (((ul) rand32()) << 32 | ((ul) rand32())) - #define rand_ul() rand64() - #define UL_ONEBITS 0xffffffffffffffffUL - #define UL_LEN 64 - #define CHECKERBOARD1 0x5555555555555555 - #define CHECKERBOARD2 0xaaaaaaaaaaaaaaaa - #define UL_BYTE(x) (((ul)x | (ul)x<<8 | (ul)x<<16 | (ul)x<<24 | (ul)x<<32 | (ul)x<<40 | (ul)x<<48 | (ul)x<<56)) -#else - #error long on this platform is not 32 or 64 bits -#endif - - diff --git a/Source/MemTesterNX/source/tests.c b/Source/MemTesterNX/source/tests.c deleted file mode 100755 index 7b5f07a3..00000000 --- a/Source/MemTesterNX/source/tests.c +++ /dev/null @@ -1,532 +0,0 @@ -/* - * Very simple but very effective user-space memory tester. - * Originally by Simon Kirby - * Version 2 by Charles Cazabon - * Version 3 not publicly released. - * Version 4 rewrite: - * Copyright (C) 2004-2020 Charles Cazabon - * Licensed under the terms of the GNU General Public License version 2 (only). - * See the file COPYING for details. - * - * This file contains the functions for the actual tests, called from the - * main routine in memtester.c. See other comments in that file. - * - */ - -#include -#include -#include -#include -#include - -#include "tests.h" -#include "types.h" -#include "sizes.h" -#include "memtester.h" -#include - -extern unsigned short dividend; - -char progress[] = "-\\|/"; -#define PROGRESSLEN 4 -#define PROGRESSOFTEN 2000000 -#define ONE 0x00000001L - -union { - unsigned char bytes[UL_LEN/8]; - ul val; -} mword8; - -union { - unsigned short u16s[UL_LEN/16]; - ul val; -} mword16; - -/* Function definitions. */ - -int compare_regions(ulv *bufa, ulv *bufb, size_t count) { - int r = 0; - size_t i; - ulv *p1 = bufa; - ulv *p2 = bufb; - // off_t physaddr; - - for (i = 0; i < count; i++, p1++, p2++) { - if (*p1 != *p2) { - // if (use_phys) { - // physaddr = physaddrbase + (i * sizeof(ul)); - // printf("FAILURE: 0x%08lx != 0x%08lx at physical address 0x%08lx.\n", (ul) *p1, (ul) *p2, physaddr); - // } else { - // printf("FAILURE: 0x%08lx != 0x%08lx at offset 0x%08lx.\n", (ul) *p1, (ul) *p2, (ul) (i * sizeof(ul))); - // } - /* // printf("Skipping to next test..."); */ - r = -1; - } - } - return r; -} - -int test_stuck_address(ulv *bufa, size_t count) { - ulv *p1 = bufa; - unsigned int j; - size_t i; - // off_t physaddr; - - // printf(" "); - for (j = 0; j < (16 / dividend) ; j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - p1 = (ulv *) bufa; - // printf("setting %3u", j); - for (i = 0; i < count; i++) { - *p1 = ((j + i) % 2) == 0 ? (ul) p1 : ~((ul) p1); - *p1++; - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", j); - p1 = (ulv *) bufa; - for (i = 0; i < count; i++, p1++) { - if (*p1 != (((j + i) % 2) == 0 ? (ul) p1 : ~((ul) p1))) { - // if (use_phys) { - // physaddr = physaddrbase + (i * sizeof(ul)); - // printf("FAILURE: possible bad address line at physical address 0x%08lx.\n", physaddr); - // } else { - // printf("FAILURE: possible bad address line at offset 0x%08lx.\n", (ul) (i * sizeof(ul))); - // } - // printf("Skipping to next test...\n"); - return -1; - } - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -int test_stress_memcpy(ulv *bufa, ulv *bufb, size_t count) { - unsigned int j; - - int q = rand_ul(); - memset((void*)bufa, q, count*sizeof(ul)); - memset((void*)bufb, q, count*sizeof(ul)); - - for (j = 0; j < 128; j++) { - memcpy((void*)bufa, (void*)bufb, count*sizeof(ul)); - } - return memcmp((void*)bufa, (void*)bufb, count*sizeof(ul)); -} - -int test_stress_memset(ulv *bufa, ulv *bufb, size_t count) { - unsigned int j; - - for (j = 0; j < 128; j++) { - int q = rand_ul(); - memset((void*)bufa, q, count*sizeof(ul)); - memset((void*)bufb, q, count*sizeof(ul)); - } - return memcmp((void*)bufa, (void*)bufb, count*sizeof(ul)); -} - -int test_stress_memcmp(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j; - - int q = rand_ul(); - memset((void*)bufa, q, count*sizeof(ul)); - memset((void*)bufb, q, count*sizeof(ul)); - - int rc = 0; - - for (j = 0; j < 32; j++) { - // Trick compiler so that it won't skip memcmp - *p1++ = *p2++ = rand_ul(); - rc = memcmp((void*)bufa, (void*)bufb, count*sizeof(ul)); - if (rc) - return rc; - } - return rc; -} - -int test_random_value(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - // ul j = 0; - size_t i; - - // putchar(' '); - for (i = 0; i < count; i++) { - *p1++ = *p2++ = rand_ul(); - if (!(i % PROGRESSOFTEN)) { - // putchar('\b'); - // putchar(progress[++j % PROGRESSLEN]); - } - } - // printf("\b \b"); - return compare_regions(bufa, bufb, count); -} - -int test_xor_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - size_t i; - ul q = rand_ul(); - - for (i = 0; i < count; i++) { - *p1++ ^= q; - *p2++ ^= q; - } - return compare_regions(bufa, bufb, count); -} - -int test_sub_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - size_t i; - ul q = rand_ul(); - - for (i = 0; i < count; i++) { - *p1++ -= q; - *p2++ -= q; - } - return compare_regions(bufa, bufb, count); -} - -int test_mul_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - size_t i; - ul q = rand_ul(); - - for (i = 0; i < count; i++) { - *p1++ *= q; - *p2++ *= q; - } - return compare_regions(bufa, bufb, count); -} - -int test_div_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - size_t i; - ul q = rand_ul(); - - for (i = 0; i < count; i++) { - if (!q) { - q++; - } - *p1++ /= q; - *p2++ /= q; - } - return compare_regions(bufa, bufb, count); -} - -int test_or_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - size_t i; - ul q = rand_ul(); - - for (i = 0; i < count; i++) { - *p1++ |= q; - *p2++ |= q; - } - return compare_regions(bufa, bufb, count); -} - -int test_and_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - size_t i; - ul q = rand_ul(); - - for (i = 0; i < count; i++) { - *p1++ &= q; - *p2++ &= q; - } - return compare_regions(bufa, bufb, count); -} - -int test_seqinc_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - size_t i; - ul q = rand_ul(); - - for (i = 0; i < count; i++) { - *p1++ = *p2++ = (i + q); - } - return compare_regions(bufa, bufb, count); -} - -int test_solidbits_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j; - ul q; - size_t i; - - // printf(" "); - for (j = 0; j < (64 / dividend / dividend); j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - q = (j % 2) == 0 ? UL_ONEBITS : 0; - // printf("setting %3u", j); - p1 = (ulv *) bufa; - p2 = (ulv *) bufb; - for (i = 0; i < count; i++) { - *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", j); - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -int test_checkerboard_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j; - ul q; - size_t i; - - // printf(" "); - for (j = 0; j < (64 / dividend / dividend); j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - q = (j % 2) == 0 ? CHECKERBOARD1 : CHECKERBOARD2; - // printf("setting %3u", j); - p1 = (ulv *) bufa; - p2 = (ulv *) bufb; - for (i = 0; i < count; i++) { - *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", j); - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -int test_blockseq_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j; - size_t i; - - // printf(" "); - for (j = 0; j < (64 / dividend / dividend) ; j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - p1 = (ulv *) bufa; - p2 = (ulv *) bufb; - // printf("setting %3u", j); - for (i = 0; i < count; i++) { - *p1++ = *p2++ = (ul) UL_BYTE(j); - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", j); - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -int test_walkbits0_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j; - size_t i; - - // printf(" "); - for (j = 0; j < (UL_LEN * 2 / dividend / dividend); j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - p1 = (ulv *) bufa; - p2 = (ulv *) bufb; - // printf("setting %3u", j); - for (i = 0; i < count; i++) { - if (j < UL_LEN) { /* Walk it up. */ - *p1++ = *p2++ = ONE << j; - } else { /* Walk it back down. */ - *p1++ = *p2++ = ONE << (UL_LEN * 2 - j - 1); - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", j); - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -int test_walkbits1_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j; - size_t i; - - // printf(" "); - for (j = 0; j < (UL_LEN * 2 / dividend / dividend); j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - p1 = (ulv *) bufa; - p2 = (ulv *) bufb; - // printf("setting %3u", j); - for (i = 0; i < count; i++) { - if (j < UL_LEN) { /* Walk it up. */ - *p1++ = *p2++ = UL_ONEBITS ^ (ONE << j); - } else { /* Walk it back down. */ - *p1++ = *p2++ = UL_ONEBITS ^ (ONE << (UL_LEN * 2 - j - 1)); - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", j); - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -int test_bitspread_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j; - size_t i; - - // printf(" "); - for (j = 0; j < (UL_LEN * 2 / dividend / dividend); j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - p1 = (ulv *) bufa; - p2 = (ulv *) bufb; - // printf("setting %3u", j); - for (i = 0; i < count; i++) { - if (j < UL_LEN) { /* Walk it up. */ - *p1++ = *p2++ = (i % 2 == 0) - ? (ONE << j) | (ONE << (j + 2)) - : UL_ONEBITS ^ ((ONE << j) - | (ONE << (j + 2))); - } else { /* Walk it back down. */ - *p1++ = *p2++ = (i % 2 == 0) - ? (ONE << (UL_LEN * 2 - 1 - j)) | (ONE << (UL_LEN * 2 + 1 - j)) - : UL_ONEBITS ^ (ONE << (UL_LEN * 2 - 1 - j) - | (ONE << (UL_LEN * 2 + 1 - j))); - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", j); - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -int test_bitflip_comparison(ulv *bufa, ulv *bufb, size_t count) { - ulv *p1 = bufa; - ulv *p2 = bufb; - unsigned int j, k; - ul q; - size_t i; - - // printf(" "); - for (k = 0; k < (UL_LEN / dividend / dividend); k++) { - q = ONE << k; - for (j = 0; j < 8; j++) { - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - q = ~q; - // printf("setting %3u", k * 8 + j); - p1 = (ulv *) bufa; - p2 = (ulv *) bufb; - for (i = 0; i < count; i++) { - *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; - } - // printf("\b\b\b\b\b\b\b\b\b\b\b"); - // printf("testing %3u", k * 8 + j); - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - } - // printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); - return 0; -} - -#ifdef TEST_NARROW_WRITES -int test_8bit_wide_random(ulv* bufa, ulv* bufb, size_t count) { - u8v *p1, *t; - ulv *p2; - int attempt; - unsigned int b, j = 0; - size_t i; - - // putchar(' '); - for (attempt = 0; attempt < 2; attempt++) { - if (attempt & 1) { - p1 = (u8v *) bufa; - p2 = bufb; - } else { - p1 = (u8v *) bufb; - p2 = bufa; - } - for (i = 0; i < count; i++) { - t = mword8.bytes; - *p2++ = mword8.val = rand_ul(); - for (b=0; b < UL_LEN/8; b++) { - *p1++ = *t++; - } - if (!(i % PROGRESSOFTEN)) { - // putchar('\b'); - // putchar(progress[++j % PROGRESSLEN]); - } - } - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b \b"); - return 0; -} - -int test_16bit_wide_random(ulv* bufa, ulv* bufb, size_t count) { - u16v *p1, *t; - ulv *p2; - int attempt; - unsigned int b, j = 0; - size_t i; - - // putchar( ' ' ); - for (attempt = 0; attempt < 2; attempt++) { - if (attempt & 1) { - p1 = (u16v *) bufa; - p2 = bufb; - } else { - p1 = (u16v *) bufb; - p2 = bufa; - } - for (i = 0; i < count; i++) { - t = mword16.u16s; - *p2++ = mword16.val = rand_ul(); - for (b = 0; b < UL_LEN/16; b++) { - *p1++ = *t++; - } - if (!(i % PROGRESSOFTEN)) { - // putchar('\b'); - // putchar(progress[++j % PROGRESSLEN]); - } - } - if (compare_regions(bufa, bufb, count)) { - return -1; - } - } - // printf("\b \b"); - return 0; -} -#endif diff --git a/Source/MemTesterNX/source/tests.h b/Source/MemTesterNX/source/tests.h deleted file mode 100755 index e4990abb..00000000 --- a/Source/MemTesterNX/source/tests.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Very simple yet very effective memory tester. - * Originally by Simon Kirby - * Version 2 by Charles Cazabon - * Version 3 not publicly released. - * Version 4 rewrite: - * Copyright (C) 2004-2020 Charles Cazabon - * Licensed under the terms of the GNU General Public License version 2 (only). - * See the file COPYING for details. - * - * This file contains the declarations for the functions for the actual tests, - * called from the main routine in memtester.c. See other comments in that - * file. - * - */ - -/* Function declaration. */ - -int test_stuck_address(unsigned long volatile *bufa, size_t count); -int test_random_value(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_xor_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_sub_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_mul_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_div_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_or_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_and_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_seqinc_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_solidbits_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_checkerboard_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_blockseq_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_walkbits0_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_walkbits1_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_bitspread_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_bitflip_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -#ifdef TEST_NARROW_WRITES -int test_8bit_wide_random(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_16bit_wide_random(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -#endif - -int test_stress_memcpy(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_stress_memset(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); -int test_stress_memcmp(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); \ No newline at end of file diff --git a/Source/MemTesterNX/source/types.h b/Source/MemTesterNX/source/types.h deleted file mode 100755 index 4cb41c3c..00000000 --- a/Source/MemTesterNX/source/types.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Very simple but very effective user-space memory tester. - * Originally by Simon Kirby - * Version 2 by Charles Cazabon - * Version 3 not publicly released. - * Version 4 rewrite: - * Copyright (C) 2004-2020 Charles Cazabon - * Licensed under the terms of the GNU General Public License version 2 (only). - * See the file COPYING for details. - * - * This file contains typedefs, structure, and union definitions. - * - */ - -#include "sizes.h" - -typedef unsigned long ul; -typedef unsigned long long ull; -typedef unsigned long volatile ulv; -typedef unsigned char volatile u8v; -typedef unsigned short volatile u16v; - -struct test { - char *name; - int (*fp)(); -}; diff --git a/Source/TinyMemBenchNX/LICENSE.txt b/Source/Membench-NX/LICENSE.txt similarity index 100% rename from Source/TinyMemBenchNX/LICENSE.txt rename to Source/Membench-NX/LICENSE.txt diff --git a/Source/TinyMemBenchNX/Makefile b/Source/Membench-NX/Makefile similarity index 97% rename from Source/TinyMemBenchNX/Makefile rename to Source/Membench-NX/Makefile index 797dba7b..00db41ea 100644 --- a/Source/TinyMemBenchNX/Makefile +++ b/Source/Membench-NX/Makefile @@ -43,9 +43,11 @@ SOURCES := source DATA := data INCLUDES := include #ROMFS := romfs -APP_AUTHOR := hanai3Bi +APP_TITLE := Membench-NX +APP_VERSION := 1.0.0 +APP_AUTHOR := KazushiMe, CtCaer and Horizon-OC -TARGET_VERSION := 0.4.11 +TARGET_VERSION := 1.0.0 #--------------------------------------------------------------------------------- # options for code generation @@ -62,7 +64,7 @@ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions ASFLAGS := -g $(ARCH) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -pthread -LIBS := -lnx -lm +LIBS := -lGLESv2 -lEGL -lglapi -ldrm_nouveau -lstdc++ -lnx -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/Source/Membench-NX/Membench-NX.elf b/Source/Membench-NX/Membench-NX.elf new file mode 100644 index 00000000..d2af2599 Binary files /dev/null and b/Source/Membench-NX/Membench-NX.elf differ diff --git a/Source/Membench-NX/Membench-NX.nacp b/Source/Membench-NX/Membench-NX.nacp new file mode 100644 index 00000000..40398b81 Binary files /dev/null and b/Source/Membench-NX/Membench-NX.nacp differ diff --git a/Source/Membench-NX/Membench-NX.nro b/Source/Membench-NX/Membench-NX.nro new file mode 100644 index 00000000..af694f58 Binary files /dev/null and b/Source/Membench-NX/Membench-NX.nro differ diff --git a/Source/Membench-NX/icon.jpg b/Source/Membench-NX/icon.jpg new file mode 100644 index 00000000..0cd003b7 Binary files /dev/null and b/Source/Membench-NX/icon.jpg differ diff --git a/Source/TinyMemBenchNX/readme.txt b/Source/Membench-NX/readme.txt similarity index 100% rename from Source/TinyMemBenchNX/readme.txt rename to Source/Membench-NX/readme.txt diff --git a/Source/Membench-NX/source/aarch64-asm.h b/Source/Membench-NX/source/aarch64-asm.h new file mode 100644 index 00000000..c7c9b875 --- /dev/null +++ b/Source/Membench-NX/source/aarch64-asm.h @@ -0,0 +1,54 @@ +/* + * Copyright © 2016 Siarhei Siamashka + * + * 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 (including the next + * paragraph) 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. + */ + +#ifndef __AARCH64_ASM_H__ +#define __AARCH64_ASM_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void aligned_block_read_ldp_x_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_read_ldp_q_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_copy_ldpstp_x_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_copy_ldpstp_q_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_copy_ld1st1_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); + +void aligned_block_copy_ldpstp_q_pf32_l2strm_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_copy_ldpstp_q_pf64_l2strm_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_copy_ldpstp_q_pf32_l1keep_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_copy_ldpstp_q_pf64_l1keep_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); + +void aligned_block_fill_stp_x_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_fill_stp_q_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); + +void aligned_block_fill_stnp_x_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); +void aligned_block_fill_stnp_q_aarch64(int64_t *__restrict dst, int64_t *__restrict src, int size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Source/TinyMemBenchNX/source/aarch64-asm.s b/Source/Membench-NX/source/aarch64-asm.s old mode 100755 new mode 100644 similarity index 100% rename from Source/TinyMemBenchNX/source/aarch64-asm.s rename to Source/Membench-NX/source/aarch64-asm.s diff --git a/Source/Membench-NX/source/gpu_bw.c b/Source/Membench-NX/source/gpu_bw.c new file mode 100644 index 00000000..52449e0d --- /dev/null +++ b/Source/Membench-NX/source/gpu_bw.c @@ -0,0 +1,263 @@ +/* + * gpu_bw.c - GPU bandwidth benchmark + * Mirrors FUN_71000667e0 / FUN_7100056130 from decompiled binary exactly. + */ + +#include +#include +#include +#include + +#include "gpu_bw.h" +#include +#include +#include + +static EGLDisplay s_display = EGL_NO_DISPLAY; +static EGLContext s_context = EGL_NO_CONTEXT; + +static bool egl_init(void) { + s_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (s_display == EGL_NO_DISPLAY) { + printf("EGL: no display\n"); + consoleUpdate(NULL); + return false; + } + if (!eglInitialize(s_display, NULL, NULL)) { + printf("EGL: initialize failed (0x%x)\n", eglGetError()); + consoleUpdate(NULL); + return false; + } + if (!eglBindAPI(EGL_OPENGL_API)) { + printf("EGL: bindAPI(OPENGL) failed (0x%x)\n", eglGetError()); + consoleUpdate(NULL); + return false; + } + + const char *exts = eglQueryString(s_display, EGL_EXTENSIONS); + if (!exts || !strstr(exts, "EGL_KHR_surfaceless_context")) { + printf("EGL: no surfaceless_context\n"); + consoleUpdate(NULL); + return false; + } + + static const EGLint cfg_attribs[] = { + EGL_RENDERABLE_TYPE, + EGL_OPENGL_BIT, + EGL_RED_SIZE, + 8, + EGL_GREEN_SIZE, + 8, + EGL_BLUE_SIZE, + 8, + EGL_ALPHA_SIZE, + 8, + EGL_DEPTH_SIZE, + 24, + EGL_STENCIL_SIZE, + 8, + EGL_NONE, + }; + EGLConfig cfg; + EGLint n; + if (!eglChooseConfig(s_display, cfg_attribs, &cfg, 1, &n) || !n) { + printf("EGL: chooseConfig failed n=%d (0x%x)\n", (int)n, eglGetError()); + consoleUpdate(NULL); + return false; + } + + static const EGLint ctx_attribs[] = { + EGL_CONTEXT_MAJOR_VERSION_KHR, 4, EGL_CONTEXT_MINOR_VERSION_KHR, 3, EGL_NONE, + }; + s_context = eglCreateContext(s_display, cfg, EGL_NO_CONTEXT, ctx_attribs); + if (s_context == EGL_NO_CONTEXT) { + printf("EGL: createContext failed (0x%x)\n", eglGetError()); + consoleUpdate(NULL); + return false; + } + + if (eglMakeCurrent(s_display, EGL_NO_SURFACE, EGL_NO_SURFACE, s_context) != EGL_TRUE) { + printf("EGL: makeCurrent failed (0x%x)\n", eglGetError()); + consoleUpdate(NULL); + return false; + } + return true; +} + +static void egl_exit(void) { + eglMakeCurrent(s_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (s_context != EGL_NO_CONTEXT) { + eglDestroyContext(s_display, s_context); + s_context = EGL_NO_CONTEXT; + } + if (s_display != EGL_NO_DISPLAY) { + eglTerminate(s_display); + s_display = EGL_NO_DISPLAY; + } +} + +static GLuint compile_compute(const char *src, const char *name) { + GLuint sh = glCreateShader(GL_COMPUTE_SHADER); + glShaderSource(sh, 1, &src, NULL); + glCompileShader(sh); + GLint ok = 0; + glGetShaderiv(sh, GL_COMPILE_STATUS, &ok); + if (!ok) { + char log[256] = { 0 }; + glGetShaderInfoLog(sh, sizeof(log), NULL, log); + printf("Compute shader compile failed: %s\n", log[0] ? log : name); + glDeleteShader(sh); + return 0; + } + GLuint prog = glCreateProgram(); + glAttachShader(prog, sh); + glLinkProgram(prog); + glDeleteShader(sh); + glGetProgramiv(prog, GL_LINK_STATUS, &ok); + if (!ok) { + glDeleteProgram(prog); + return 0; + } + return prog; +} + +/* + * Mirrors FUN_7100056130: + * - one warmup dispatch + glFinish (before timing) + * - `loops` timed dispatches + glFinish + * - cntpct_el0 timing (19.2 MHz, ticks * 625/12/1e9 = seconds) + * - returns (buf_bytes * loops) / elapsed / 1e6 [MB/s] + */ +static double run_pass(GLuint prog, GLuint ssbo_src, GLuint ssbo_dst, size_t buf_bytes, int loops) { + GLuint groups = (GLuint)(buf_bytes >> 10); + + glUseProgram(prog); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo_src); + if (ssbo_dst) + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, ssbo_dst); + + glDispatchCompute(groups, 1, 1); + glFinish(); + if (glGetError() != GL_NO_ERROR) + return 0.0; + + uint64_t t0, t1; + asm volatile("mrs %0, cntpct_el0" : "=r"(t0)); + for (int i = 0; i < loops; i++) + glDispatchCompute(groups, 1, 1); + glFinish(); + asm volatile("mrs %0, cntpct_el0" : "=r"(t1)); + + if (glGetError() != GL_NO_ERROR) + return 0.0; + + double elapsed = (double)(t1 - t0) * 625.0 / 12.0 / 1000000000.0; + if (elapsed <= 0.0) + return 0.0; + return ((double)buf_bytes * (double)loops) / elapsed / 1000000.0; +} + +bool gpu_bw_run(bool is_4gb, double *copy_out, double *read_out, double *write_out) { + /* Exact GLSL sources from binary — desktop GL 4.3 */ + static const char *src_copy = "\n#version 430\n" + "layout(std430, binding = 0) buffer srcBuffer { volatile uint src[]; };\n" + "layout(std430, binding = 1) buffer dstBuffer { volatile uint dst[]; };\n" + "layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;\n" + "void main() {\n" + " dst[gl_GlobalInvocationID.x] = src[gl_GlobalInvocationID.x];\n" + "}\n"; + + static const char *src_read = "\n#version 430\n" + "layout(std430, binding = 0) buffer srcBuffer { volatile uint src[]; };\n" + "shared uint tmp;\n" + "layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;\n" + "void main() {\n" + " tmp |= src[gl_GlobalInvocationID.x];\n" + "}\n"; + + static const char *src_write = "\n#version 430\n" + "layout(std430, binding = 0) buffer srcBuffer { volatile uint src[]; };\n" + "layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;\n" + "void main() {\n" + " src[gl_GlobalInvocationID.x] = 0xAAAAAAAAu;\n" + "}\n"; + + if (!egl_init()) { + printf("Failed to initialize EGL/GL for GPU benchmark.\n"); + consoleUpdate(NULL); + return false; + } + + GLint max_ssbo = 0; + glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_ssbo); + if (max_ssbo < 1) { + printf("Failed to query GPU SSBO size.\n"); + consoleUpdate(NULL); + egl_exit(); + return false; + } + + size_t buf_bytes = (size_t)max_ssbo; + if (buf_bytes > 0x8000000) + buf_bytes = 0x8000000; + if (!is_4gb) + buf_bytes >>= 1; + buf_bytes &= ~(size_t)0x3FF; + + if (buf_bytes < 0x400) { + printf("GPU benchmark buffer is too small.\n"); + consoleUpdate(NULL); + egl_exit(); + return false; + } + + int loops = is_4gb ? 400 : 800; + int wloops = loops / 10; + + GLuint prog_copy = compile_compute(src_copy, "GPU Copy"); + GLuint prog_read = compile_compute(src_read, "GPU Read"); + GLuint prog_write = compile_compute(src_write, "GPU Write"); + if (!prog_copy || !prog_read || !prog_write) { + if (prog_copy) + glDeleteProgram(prog_copy); + if (prog_read) + glDeleteProgram(prog_read); + if (prog_write) + glDeleteProgram(prog_write); + egl_exit(); + return false; + } + + GLuint ssbo[2] = { 0, 0 }; + glGenBuffers(2, ssbo); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[0]); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)buf_bytes, NULL, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[1]); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)buf_bytes, NULL, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + if (glGetError() != GL_NO_ERROR) { + printf("Failed to allocate GPU buffers!\n"); + consoleUpdate(NULL); + glDeleteBuffers(2, ssbo); + glDeleteProgram(prog_copy); + glDeleteProgram(prog_read); + glDeleteProgram(prog_write); + egl_exit(); + return false; + } + + /* Pass order mirrors binary: warmup write+read, timed copy/read/write */ + run_pass(prog_write, ssbo[0], 0, buf_bytes, wloops); + run_pass(prog_read, ssbo[0], 0, buf_bytes, wloops); + + *copy_out = run_pass(prog_copy, ssbo[0], ssbo[1], buf_bytes, loops); + *read_out = run_pass(prog_read, ssbo[0], 0, buf_bytes, loops); + *write_out = run_pass(prog_write, ssbo[0], 0, buf_bytes, loops); + + glDeleteBuffers(2, ssbo); + glDeleteProgram(prog_copy); + glDeleteProgram(prog_read); + glDeleteProgram(prog_write); + egl_exit(); + return true; +} diff --git a/Source/Membench-NX/source/gpu_bw.h b/Source/Membench-NX/source/gpu_bw.h new file mode 100644 index 00000000..ff6b0ae5 --- /dev/null +++ b/Source/Membench-NX/source/gpu_bw.h @@ -0,0 +1,4 @@ +#pragma once +#include + +bool gpu_bw_run(bool is_4gb, double *copy_out, double *read_out, double *write_out); diff --git a/Source/Membench-NX/source/main.c b/Source/Membench-NX/source/main.c new file mode 100644 index 00000000..aa533ac4 --- /dev/null +++ b/Source/Membench-NX/source/main.c @@ -0,0 +1,422 @@ +/* + * Copyright © 2011 Siarhei Siamashka + * Copyright (c) 20xx KazushiMe + * Copyright (c) 2025 Souldbminer + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define SIZE (32 * 1024 * 1024) +#ifndef MAXREPEATS + #define MAXREPEATS 10 +#endif +#ifndef LATBENCH_COUNT + #define LATBENCH_COUNT 10000000 +#endif +#define ALIGN_PADDING 0x100000 +#define CACHE_LINE_SIZE 128 + +#include + +#include "gpu_bw.h" + +#define YEL "\033[1;92m" +#define GRN "\033[1;92m" +#define RST "\033[0m" + +PadState pad; + +// Threads + +struct f_data { + void (*func)(int64_t *, int64_t *, int); + int64_t *arg1; + int64_t *arg2; + int arg3; +}; + +pthread_cond_t p_ready, p_start; +pthread_mutex_t p_lock; +pthread_t *p_worker = NULL; +struct f_data *worker_data = NULL; +int p_worker_not_ready, p_workers_ready; + +void *thread_func(void *data) { + struct f_data *d = data; + pthread_mutex_lock(&p_lock); + p_worker_not_ready--; + if (!p_worker_not_ready) + pthread_cond_signal(&p_ready); + while (p_workers_ready != 1) + pthread_cond_wait(&p_start, &p_lock); + pthread_mutex_unlock(&p_lock); + (d->func)(d->arg1, d->arg2, d->arg3); + pthread_exit(NULL); +} + +static void parallel_run(void) { + pthread_mutex_lock(&p_lock); + p_workers_ready = 1; + pthread_mutex_unlock(&p_lock); + pthread_cond_broadcast(&p_start); +} + +static void parallel_init(int threads) { + pthread_attr_t attr; + pthread_cond_init(&p_ready, NULL); + pthread_cond_init(&p_start, NULL); + pthread_mutex_init(&p_lock, NULL); + p_worker_not_ready = threads; + p_workers_ready = 0; + pthread_attr_init(&attr); + if (!p_worker || !worker_data) { + p_worker = malloc(threads * sizeof(pthread_t)); + worker_data = malloc(threads * sizeof(struct f_data)); + } + for (int i = 0; i < threads; i++) + pthread_create(p_worker + i, &attr, thread_func, worker_data + i); + pthread_mutex_lock(&p_lock); + while (p_worker_not_ready != 0) + pthread_cond_wait(&p_ready, &p_lock); + pthread_mutex_unlock(&p_lock); +} + +// memops + +void aligned_block_copy(int64_t *__restrict dst_, int64_t *__restrict src, int size) { + volatile int64_t *dst = dst_; + int64_t t1, t2, t3, t4; + while ((size -= 64) >= 0) { + t1 = *src++; + t2 = *src++; + t3 = *src++; + t4 = *src++; + *dst++ = t1; + *dst++ = t2; + *dst++ = t3; + *dst++ = t4; + t1 = *src++; + t2 = *src++; + t3 = *src++; + t4 = *src++; + *dst++ = t1; + *dst++ = t2; + *dst++ = t3; + *dst++ = t4; + } +} + +void aligned_block_fetch(int64_t *__restrict dst, int64_t *__restrict src_, int size) { + volatile int64_t *src = src_; + (void)dst; + while ((size -= 64) >= 0) { + *src++; + *src++; + *src++; + *src++; + *src++; + *src++; + *src++; + *src++; + } +} + +void aligned_block_fill(int64_t *__restrict dst_, int64_t *__restrict src, int size) { + volatile int64_t *dst = dst_; + int64_t data = *src; + while ((size -= 64) >= 0) { + *dst++ = data; + *dst++ = data; + *dst++ = data; + *dst++ = data; + *dst++ = data; + *dst++ = data; + *dst++ = data; + *dst++ = data; + } +} + +double gettime(void) { + struct timeval tv; + gettimeofday(&tv, NULL); + return (double)((int64_t)tv.tv_sec * 1000000 + tv.tv_usec) / 1000000.; +} + +static double bandwidth_bench_helper(int threads, int64_t *dstbuf, int64_t *srcbuf, int size, void (*f)(int64_t *, int64_t *, int)) { + int i, loopcount, innerloopcount, n; + double t, t1, t2, speed, maxspeed, s, s0, s1, s2; + + s = s0 = s1 = s2 = 0.; + maxspeed = 0.; + for (n = 0; n < MAXREPEATS; n++) { + loopcount = 0; + innerloopcount = 1; + t = 0.; + do { + loopcount += innerloopcount; + for (i = 0; i < innerloopcount; i++) { + parallel_init(threads); + for (int pt = 0; pt < threads; pt++) { + (worker_data + pt)->func = f; + (worker_data + pt)->arg1 = dstbuf + size * pt / sizeof(int64_t); + (worker_data + pt)->arg2 = srcbuf + size * pt / sizeof(int64_t); + (worker_data + pt)->arg3 = size; + } + t1 = gettime(); + parallel_run(); + for (int pt = 0; pt < threads; pt++) + pthread_join(p_worker[pt], NULL); + t2 = gettime(); + t += t2 - t1; + } + innerloopcount *= 2; + } while (t < 0.5); + + speed = (double)size * threads * loopcount / t / 1000000.; + s0 += 1.; + s1 += speed; + s2 += speed * speed; + if (speed > maxspeed) + maxspeed = speed; + if (s0 > 2.) { + s = sqrt((s0 * s2 - s1 * s1) / (s0 * (s0 - 1))); + if (s < maxspeed / 1000.) + break; + } + } + return maxspeed; +} + +static char *align_up(char *ptr, int align) { + return (char *)(((uintptr_t)ptr + align - 1) & ~(uintptr_t)(align - 1)); +} + +void *alloc_nonaliased_buffers(void **buf1_, int size1, void **buf2_, int size2, void **buf3_, int size3) { + char **buf1 = (char **)buf1_, **buf2 = (char **)buf2_, **buf3 = (char **)buf3_; + int mask = (ALIGN_PADDING - 1) & ~(CACHE_LINE_SIZE - 1); + char *buf = malloc(size1 + size2 + size3 + 9 * ALIGN_PADDING); + char *ptr = buf; + memset(buf, 0xCC, size1 + size2 + size3 + 9 * ALIGN_PADDING); + ptr = align_up(ptr, ALIGN_PADDING); + if (buf1) { + *buf1 = ptr + (0xAAAAAAAA & mask); + ptr = align_up(*buf1 + size1, ALIGN_PADDING); + } + if (buf2) { + *buf2 = ptr + (0x55555555 & mask); + ptr = align_up(*buf2 + size2, ALIGN_PADDING); + } + if (buf3) { + *buf3 = ptr + (0xCCCCCCCC & mask); + } + return buf; +} + +#pragma GCC diagnostic push +static void __attribute__((noinline)) random_read_test(char *buf, int count, int nbits) { + uint32_t seed = 0; + uintptr_t mask = (1 << nbits) - 1; + uint32_t v; +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" + static volatile uint32_t dummy; +#define RMA() \ + seed = seed * 1103515245 + 12345; \ + v = (seed >> 16) & 0xFF; \ + seed = seed * 1103515245 + 12345; \ + v |= (seed >> 8) & 0xFF00; \ + seed = seed * 1103515245 + 12345; \ + v |= seed & 0x7FFF0000; \ + seed |= buf[v & mask]; + while (count >= 16) { + RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() RMA() count -= 16; + } + dummy = seed; +#undef RMA +} +#pragma GCC diagnostic pop + +static double latency_measure(char *buf, int nbits, int count) { + double t_noaccess = 0, t_before, t_after, t, xs1 = 0, xs2 = 0, min_t = 0; + double xs; + int n; + + for (n = 1; n <= MAXREPEATS; n++) { + t_before = gettime(); + random_read_test(buf, count, 1); + t_after = gettime(); + if (n == 1 || t_after - t_before < t_noaccess) + t_noaccess = t_after - t_before; + } + + for (n = 1; n <= MAXREPEATS; n++) { + t_before = gettime(); + random_read_test(buf, count, nbits); + t_after = gettime(); + t = t_after - t_before - t_noaccess; + if (t < 0) + t = 0; + xs1 += t; + xs2 += t * t; + if (n == 1 || t < min_t) + min_t = t; + if (n > 2) { + xs = sqrt((xs2 * n - xs1 * xs1) / (n * (n - 1))); + if (xs < min_t / 1000.) + break; + } + } + return min_t * 1000000000.0 / count; +} + +static void latency_bench(double *l2_out, double *ram_out) { + char *buf_alloc = malloc(0x2001000); + char *buf = (char *)(((uintptr_t)buf_alloc + 4095) & ~(uintptr_t)4095); + memset(buf, 0, 0x2000000); + + /* nbits=20 (1MB) for L2, nbits=25 (32MB) for RAM — from binary assembly */ + *l2_out = latency_measure(buf, 20, LATBENCH_COUNT); + *ram_out = latency_measure(buf, 25, LATBENCH_COUNT); + + free(buf_alloc); +} + +int main(int argc, char *argv[]) { + (void)argc; + (void)argv; + + consoleInit(NULL); + padConfigureInput(1, HidNpadStyleSet_NpadStandard); + padInitializeDefault(&pad); + + const int threads = 3; + const int size = SIZE; + bool is_4gb = (appletGetAppletType() == AppletType_Application); + +loop: + printf("Membench-NX\n\n"); + printf("Press A to run all benchmarks.\n"); + printf("Press any other key to exit.\n\n"); + consoleUpdate(NULL); + + while (appletMainLoop()) { + padUpdate(&pad); + u64 kDown = padGetButtonsDown(&pad); + if (kDown & HidNpadButton_A) + break; + if (kDown) { + consoleExit(NULL); + return 0; + } + consoleUpdate(NULL); + } + + appletSetAutoSleepDisabled(true); + consoleClear(); + + uint32_t cpu_hz = 0, gpu_hz = 0, mem_hz = 0; + if (R_SUCCEEDED(clkrstInitialize())) { + ClkrstSession s; + clkrstOpenSession(&s, PcvModuleId_CpuBus, 3); + clkrstGetClockRate(&s, &cpu_hz); + clkrstCloseSession(&s); + clkrstOpenSession(&s, PcvModuleId_GPU, 3); + clkrstGetClockRate(&s, &gpu_hz); + clkrstCloseSession(&s); + clkrstOpenSession(&s, PcvModuleId_EMC, 3); + clkrstGetClockRate(&s, &mem_hz); + clkrstCloseSession(&s); + clkrstExit(); + } + + printf("Membench-NX\n\n"); + printf("----------------------------\n"); + printf("CPU: %.1f MHz\n", cpu_hz / 1000000.0); + printf("GPU: %.1f MHz\n", gpu_hz / 1000000.0); + printf("MEM: %.1f MHz\n", mem_hz / 1000000.0); + printf("Mode: " GRN "%s" RST "\n", is_4gb ? "Application" : "Applet"); + printf("Threads: %d (max: %d)\n", threads, threads); + printf("----------------------------\n"); + consoleUpdate(NULL); + + printf("\nStarted Bandwidth benchmark via GPU...\n"); + consoleUpdate(NULL); + + double gpu_copy = 0, gpu_read = 0, gpu_write = 0; + gpu_bw_run(is_4gb, &gpu_copy, &gpu_read, &gpu_write); + + printf(" " YEL "%-40s" RST " : %8.1f MB/s\n", "GPU Copy", gpu_copy); + printf(" " YEL "%-40s" RST " : %8.1f MB/s\n", "GPU Read", gpu_read); + printf(" " YEL "%-40s" RST " : %8.1f MB/s\n", "GPU Write", gpu_write); + consoleUpdate(NULL); + + int64_t *srcbuf, *dstbuf; + void *poolbuf = alloc_nonaliased_buffers((void **)&srcbuf, size * threads, (void **)&dstbuf, size * threads, NULL, 0); + + printf("\nStarted Bandwidth benchmark with %d threads...\n", threads); + consoleUpdate(NULL); + + double cpu_copy = bandwidth_bench_helper(threads, dstbuf, srcbuf, size, aligned_block_copy); + double cpu_read = bandwidth_bench_helper(threads, dstbuf, srcbuf, size, aligned_block_fetch); + double cpu_write = bandwidth_bench_helper(threads, dstbuf, srcbuf, size, aligned_block_fill); + + printf(" " YEL "%-40s" RST " : %8.1f MB/s\n", "CPU Copy", cpu_copy); + printf(" " YEL "%-40s" RST " : %8.1f MB/s\n", "CPU Read", cpu_read); + printf(" " YEL "%-40s" RST " : %8.1f MB/s\n", "CPU Write", cpu_write); + consoleUpdate(NULL); + + free(poolbuf); + + printf("\nStarted Latency benchmark with 1 thread...\n"); + consoleUpdate(NULL); + + double l2_ns = 0, ram_ns = 0; + latency_bench(&l2_ns, &ram_ns); + + printf(" " YEL "%-40s" RST " : %8.1f ns\n", "L2", l2_ns); + printf(" " YEL "%-40s" RST " : %8.1f ns\n", "Full RAM", ram_ns); + consoleUpdate(NULL); + + appletSetAutoSleepDisabled(false); + + printf("\nPress A to continue, any other key to exit.\n"); + consoleUpdate(NULL); + + while (appletMainLoop()) { + padUpdate(&pad); + u64 kDown = padGetButtonsDown(&pad); + if (kDown & HidNpadButton_A) { + consoleClear(); + goto loop; + } + if (kDown) + break; + consoleUpdate(NULL); + } + + consoleExit(NULL); + return 0; +} diff --git a/Source/TinyMemBenchNX/.gitignore b/Source/TinyMemBenchNX/.gitignore deleted file mode 100644 index 3044e05c..00000000 --- a/Source/TinyMemBenchNX/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.DS_Store -build/ -*.elf -*.nacp -*.nro \ No newline at end of file diff --git a/Source/TinyMemBenchNX/source/aarch64-asm.h b/Source/TinyMemBenchNX/source/aarch64-asm.h deleted file mode 100644 index 8681abc2..00000000 --- a/Source/TinyMemBenchNX/source/aarch64-asm.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright © 2016 Siarhei Siamashka - * - * 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 (including the next - * paragraph) 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. - */ - -#ifndef __AARCH64_ASM_H__ -#define __AARCH64_ASM_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void aligned_block_read_ldp_x_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_read_ldp_q_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_copy_ldpstp_x_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_copy_ldpstp_q_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_copy_ld1st1_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); - -void aligned_block_copy_ldpstp_q_pf32_l2strm_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_copy_ldpstp_q_pf64_l2strm_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_copy_ldpstp_q_pf32_l1keep_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_copy_ldpstp_q_pf64_l1keep_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); - -void aligned_block_fill_stp_x_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_fill_stp_q_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); - -void aligned_block_fill_stnp_x_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); -void aligned_block_fill_stnp_q_aarch64(int64_t * __restrict dst, - int64_t * __restrict src, - int size); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/Source/TinyMemBenchNX/source/main.c b/Source/TinyMemBenchNX/source/main.c deleted file mode 100644 index f7fe42db..00000000 --- a/Source/TinyMemBenchNX/source/main.c +++ /dev/null @@ -1,1078 +0,0 @@ -/* - * Copyright © 2011 Siarhei Siamashka - * - * Copyright (c) 20xx KazushiMe - * - * 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 (including the next - * paragraph) 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. - * - * pthread fork by sun409 (https://github.com/sun409/tinymembench-pthread) - * - * Switch port by Kazushi and built with libnx. - */ - -// Include the most common headers from the C standard library -#include -#include -#include -#include -#include -#include -#include - -// Multi-thread support -#include -#include -#include - -#define __ASM_OPT_H__ -#define SIZE (32 * 1024 * 1024) -#define BLOCKSIZE 2048 -#ifndef MAXREPEATS -# define MAXREPEATS 10 -#endif -#ifndef LATBENCH_COUNT -# define LATBENCH_COUNT 10000000 -#endif - -#define ALIGN_PADDING 0x100000 -#define CACHE_LINE_SIZE 128 - -#include "aarch64-asm.h" -#include - -PadState pad; - -struct f_data -{ - void (*func)(int64_t *, int64_t *, int); - int64_t *arg1; - int64_t *arg2; - int arg3; -}; - -pthread_cond_t p_ready, p_start; -pthread_mutex_t p_lock; -pthread_t *p_worker = NULL; -struct f_data *worker_data = NULL; -int p_worker_not_ready, p_workers_ready; - -void *thread_func(void *data) -{ - struct f_data *data_ptr = data; - - pthread_mutex_lock(&p_lock); - p_worker_not_ready--; - - if (!p_worker_not_ready) - pthread_cond_signal(&p_ready); - - while (p_workers_ready != 1) - pthread_cond_wait(&p_start, &p_lock); - - pthread_mutex_unlock(&p_lock); - - (data_ptr->func)(data_ptr->arg1, data_ptr->arg2, data_ptr->arg3); - - pthread_exit(NULL); -} - -static void parallel_run(void) -{ - pthread_mutex_lock(&p_lock); - p_workers_ready = 1; - pthread_mutex_unlock(&p_lock); - pthread_cond_broadcast(&p_start); -} - -static void parallel_init(int threads) -{ - pthread_attr_t attr; - - pthread_cond_init(&p_ready, NULL); - pthread_cond_init(&p_start, NULL); - pthread_mutex_init(&p_lock, NULL); - p_worker_not_ready = threads; - p_workers_ready = 0; - pthread_attr_init(&attr); - - if (!p_worker || !worker_data) - { - p_worker = (pthread_t *)malloc(threads * sizeof(pthread_t)); - worker_data = (struct f_data *)malloc(threads * sizeof(struct f_data)); - } - - for (int i = 0; i < threads; i++) - { - pthread_create(p_worker + i, &attr, thread_func, worker_data + i); - } - - pthread_mutex_lock(&p_lock); - while (p_worker_not_ready != 0) - pthread_cond_wait(&p_ready, &p_lock); - - pthread_mutex_unlock(&p_lock); -} - -typedef struct -{ - const char *description; - int use_tmpbuf; - void (*f)(int64_t *, int64_t *, int); -} bench_info; - -static char *align_up(char *ptr, int align) -{ - return (char *)(((uintptr_t)ptr + align - 1) & ~(uintptr_t)(align - 1)); -} - -void aligned_block_copy(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t t1, t2, t3, t4; - while ((size -= 64) >= 0) - { - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - } -} - -void aligned_block_copy_backwards(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t t1, t2, t3, t4; - src += size / 8 - 1; - dst += size / 8 - 1; - while ((size -= 64) >= 0) - { - t1 = *src--; - t2 = *src--; - t3 = *src--; - t4 = *src--; - *dst-- = t1; - *dst-- = t2; - *dst-- = t3; - *dst-- = t4; - t1 = *src--; - t2 = *src--; - t3 = *src--; - t4 = *src--; - *dst-- = t1; - *dst-- = t2; - *dst-- = t3; - *dst-- = t4; - } -} - -void aligned_block_copy_backwards_bs32(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t t1, t2, t3, t4; - src += size / 8 - 8; - dst += size / 8 - 8; - while ((size -= 64) >= 0) - { - t1 = src[4]; - t2 = src[5]; - t3 = src[6]; - t4 = src[7]; - dst[4] = t1; - dst[5] = t2; - dst[6] = t3; - dst[7] = t4; - t1 = src[0]; - t2 = src[1]; - t3 = src[2]; - t4 = src[3]; - dst[0] = t1; - dst[1] = t2; - dst[2] = t3; - dst[3] = t4; - src -= 8; - dst -= 8; - } -} - -void aligned_block_copy_backwards_bs64(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t t1, t2, t3, t4; - src += size / 8 - 8; - dst += size / 8 - 8; - while ((size -= 64) >= 0) - { - t1 = src[0]; - t2 = src[1]; - t3 = src[2]; - t4 = src[3]; - dst[0] = t1; - dst[1] = t2; - dst[2] = t3; - dst[3] = t4; - t1 = src[4]; - t2 = src[5]; - t3 = src[6]; - t4 = src[7]; - dst[4] = t1; - dst[5] = t2; - dst[6] = t3; - dst[7] = t4; - src -= 8; - dst -= 8; - } -} - -void aligned_block_copy_pf32(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t t1, t2, t3, t4; - while ((size -= 64) >= 0) - { - __builtin_prefetch(src + 32, 0, 0); - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - __builtin_prefetch(src + 32, 0, 0); - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - } -} - -void aligned_block_copy_pf64(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t t1, t2, t3, t4; - while ((size -= 64) >= 0) - { - __builtin_prefetch(src + 32, 0, 0); - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - t1 = *src++; - t2 = *src++; - t3 = *src++; - t4 = *src++; - *dst++ = t1; - *dst++ = t2; - *dst++ = t3; - *dst++ = t4; - } -} - -void aligned_block_fetch(int64_t * __restrict dst, - int64_t * __restrict src_, - int size) -{ - volatile int64_t *src = src_; - while ((size -= 64) >= 0) - { - *src++; - *src++; - *src++; - *src++; - *src++; - *src++; - *src++; - *src++; - } -} - -void aligned_block_fill(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t data = *src; - while ((size -= 64) >= 0) - { - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - *dst++ = data; - } -} - -void aligned_block_fill_shuffle16(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t data = *src; - while ((size -= 64) >= 0) - { - dst[0 + 0] = data; - dst[1 + 0] = data; - dst[1 + 2] = data; - dst[0 + 2] = data; - dst[1 + 4] = data; - dst[0 + 4] = data; - dst[0 + 6] = data; - dst[1 + 6] = data; - dst += 8; - } -} - -void aligned_block_fill_shuffle32(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t data = *src; - while ((size -= 64) >= 0) - { - dst[3 + 0] = data; - dst[0 + 0] = data; - dst[2 + 0] = data; - dst[1 + 0] = data; - dst[3 + 4] = data; - dst[0 + 4] = data; - dst[2 + 4] = data; - dst[1 + 4] = data; - dst += 8; - } -} - -void aligned_block_fill_shuffle64(int64_t * __restrict dst_, - int64_t * __restrict src, - int size) -{ - volatile int64_t *dst = dst_; - int64_t data = *src; - while ((size -= 64) >= 0) - { - dst[5] = data; - dst[2] = data; - dst[7] = data; - dst[6] = data; - dst[1] = data; - dst[3] = data; - dst[0] = data; - dst[4] = data; - dst += 8; - } -} - -double gettime(void) -{ - struct timeval tv; - gettimeofday(&tv, NULL); - return (double)((int64_t)tv.tv_sec * 1000000 + tv.tv_usec) / 1000000.; -} - -static double bandwidth_bench_helper(int threads, - int64_t *dstbuf, int64_t *srcbuf, - int64_t *tmpbuf, - int size, int blocksize, - const char *indent_prefix, - int use_tmpbuf, - void (*f)(int64_t *, int64_t *, int), - const char *description) -{ - int i, j, loopcount, innerloopcount, n; - double t, t1, t2; - double speed, maxspeed; - double s, s0, s1, s2; - - /* do up to MAXREPEATS measurements */ - s = s0 = s1 = s2 = 0.; - maxspeed = 0.; - for (n = 0; n < MAXREPEATS; n++) - { - parallel_init(threads); - for (int pt = 0; pt < threads; pt++) - { - (worker_data + pt)->func = f; - (worker_data + pt)->arg1 = dstbuf + size * pt / sizeof(int64_t); - (worker_data + pt)->arg2 = srcbuf + size * pt / sizeof(int64_t); - (worker_data + pt)->arg3 = size; - } - parallel_run(); - for (int pt = 0; pt < threads; pt++) - pthread_join(p_worker[pt], NULL); - - loopcount = 0; - innerloopcount = 1; - t = 0.; - do - { - loopcount += innerloopcount; - if (use_tmpbuf) - { - for (i = 0; i < innerloopcount; i++) - { - t1 = gettime(); - for (j = 0; j < size; j += blocksize) - { - f(tmpbuf, srcbuf + j / sizeof(int64_t), blocksize); - f(dstbuf + j / sizeof(int64_t), tmpbuf, blocksize); - } - t2 = gettime(); - t += t2 - t1; - } - } - else - { - for (i = 0; i < innerloopcount; i++) - { - parallel_init(threads); - for (int pt = 0; pt < threads; ++pt) - { - (worker_data + pt)->func = f; - (worker_data + pt)->arg1 = dstbuf + size * pt / sizeof(int64_t); - (worker_data + pt)->arg2 = srcbuf + size * pt / sizeof(int64_t); - (worker_data + pt)->arg3 = size; - } - - t1 = gettime(); - parallel_run(); - for (int pt = 0; pt < threads; ++pt) - pthread_join(p_worker[pt], NULL); - t2 = gettime(); - t += t2 - t1; - } - } - innerloopcount *= 2; - } while (t < 0.5); - speed = (double)size * (use_tmpbuf ? 1 : threads) * loopcount / t / 1000000.; - - s0 += 1.; - s1 += speed; - s2 += speed * speed; - - if (speed > maxspeed) - maxspeed = speed; - - if (s0 > 2.) - { - s = sqrt((s0 * s2 - s1 * s1) / (s0 * (s0 - 1))); - if (s < maxspeed / 1000.) - break; - } - } - - if (maxspeed > 0 && s / maxspeed * 100. >= 0.1) - { - printf("%s%-40s : %8.1f MB/s (%.1f%%)\n", indent_prefix, description, - maxspeed, s / maxspeed * 100.); - } - else - { - printf("%s%-40s : %8.1f MB/s\n", indent_prefix, description, maxspeed); - } - - consoleUpdate(NULL); - return maxspeed; -} - -void bandwidth_bench(int threads, - int64_t *dstbuf, int64_t *srcbuf, int64_t *tmpbuf, - int size, int blocksize, const char *indent_prefix, - bench_info *bi) -{ - while (bi->f) - { - bandwidth_bench_helper(threads, - dstbuf, srcbuf, tmpbuf, size, blocksize, - indent_prefix, bi->use_tmpbuf, - bi->f, - bi->description); - bi++; - } -} - -void memcpy_wrapper(int64_t *dst, int64_t *src, int size) -{ - memcpy(dst, src, size); -} - -void memset_wrapper(int64_t *dst, int64_t *src, int size) -{ - memset(dst, src[0], size); -} - -static bench_info aarch64_neon[] = -{ - { "NEON LDP (READ)", 0, aligned_block_read_ldp_q_aarch64 }, - { "NEON LDP/STP copy (COPY)", 0, aligned_block_copy_ldpstp_q_aarch64 }, - { "NEON LDP/STP copy pldl2strm (32B step)", 0, aligned_block_copy_ldpstp_q_pf32_l2strm_aarch64 }, - { "NEON LDP/STP copy pldl2strm (64B step)", 0, aligned_block_copy_ldpstp_q_pf64_l2strm_aarch64 }, - { "NEON LDP/STP copy pldl1keep (32B step)", 0, aligned_block_copy_ldpstp_q_pf32_l1keep_aarch64 }, - { "NEON LDP/STP copy pldl1keep (64B step)", 0, aligned_block_copy_ldpstp_q_pf64_l1keep_aarch64 }, - { "NEON LD1/ST1 copy", 0, aligned_block_copy_ld1st1_aarch64 }, - { "NEON STP fill (WRITE)", 0, aligned_block_fill_stp_q_aarch64 }, - { "NEON STNP fill", 0, aligned_block_fill_stnp_q_aarch64 }, - { "ARM LDP", 0, aligned_block_read_ldp_x_aarch64 }, - { "ARM LDP/STP copy", 0, aligned_block_copy_ldpstp_x_aarch64 }, - { "ARM STP fill", 0, aligned_block_fill_stp_x_aarch64 }, - { "ARM STNP fill", 0, aligned_block_fill_stnp_x_aarch64 }, - { NULL, 0, NULL } -}; - -bench_info *get_asm_benchmarks(void) -{ - return aarch64_neon; -} - -static bench_info c_benchmarks[] = -{ - { "C copy backwards", 0, aligned_block_copy_backwards }, - { "C copy backwards (32B blocks)", 0, aligned_block_copy_backwards_bs32 }, - { "C copy backwards (64B blocks)", 0, aligned_block_copy_backwards_bs64 }, - { "C copy", 0, aligned_block_copy }, - { "C copy prefetched (32B step)", 0, aligned_block_copy_pf32 }, - { "C copy prefetched (64B step)", 0, aligned_block_copy_pf64 }, - // { "C 2-pass copy", 1, aligned_block_copy }, - // { "C 2-pass copy prefetched (32B step)", 1, aligned_block_copy_pf32 }, - // { "C 2-pass copy prefetched (64B step)", 1, aligned_block_copy_pf64 }, - { "C fetch", 0, aligned_block_fetch }, - { "C fill", 0, aligned_block_fill }, - { "C fill (shuffle within 16B blocks)", 0, aligned_block_fill_shuffle16 }, - { "C fill (shuffle within 32B blocks)", 0, aligned_block_fill_shuffle32 }, - { "C fill (shuffle within 64B blocks)", 0, aligned_block_fill_shuffle64 }, - { NULL, 0, NULL } -}; - -static bench_info libc_benchmarks[] = -{ - { "standard memcpy", 0, memcpy_wrapper }, - { "standard memset", 0, memset_wrapper }, - { NULL, 0, NULL } -}; - -void *alloc_four_nonaliased_buffers(void **buf1_, int size1, - void **buf2_, int size2, - void **buf3_, int size3, - void **buf4_, int size4) -{ - char **buf1 = (char **)buf1_, **buf2 = (char **)buf2_; - char **buf3 = (char **)buf3_, **buf4 = (char **)buf4_; - int antialias_pattern_mask = (ALIGN_PADDING - 1) & ~(CACHE_LINE_SIZE - 1); - char *buf, *ptr; - - if (!buf1 || size1 < 0) - size1 = 0; - if (!buf2 || size2 < 0) - size2 = 0; - if (!buf3 || size3 < 0) - size3 = 0; - if (!buf4 || size4 < 0) - size4 = 0; - - ptr = buf = - (char *)malloc(size1 + size2 + size3 + size4 + 9 * ALIGN_PADDING); - memset(buf, 0xCC, size1 + size2 + size3 + size4 + 9 * ALIGN_PADDING); - - ptr = align_up(ptr, ALIGN_PADDING); - if (buf1) - { - *buf1 = ptr + (0xAAAAAAAA & antialias_pattern_mask); - ptr = align_up(*buf1 + size1, ALIGN_PADDING); - } - if (buf2) - { - *buf2 = ptr + (0x55555555 & antialias_pattern_mask); - ptr = align_up(*buf2 + size2, ALIGN_PADDING); - } - if (buf3) - { - *buf3 = ptr + (0xCCCCCCCC & antialias_pattern_mask); - ptr = align_up(*buf3 + size3, ALIGN_PADDING); - } - if (buf4) - { - *buf4 = ptr + (0x33333333 & antialias_pattern_mask); - } - - return buf; -} - -#pragma GCC diagnostic push -static void __attribute__((noinline)) random_read_test(char *zerobuffer, - int count, int nbits) -{ - uint32_t seed = 0; - uintptr_t addrmask = (1 << nbits) - 1; - uint32_t v; - - #pragma GCC diagnostic ignored "-Wunused-but-set-variable" - static volatile uint32_t dummy; - - #define RANDOM_MEM_ACCESS() \ - seed = seed * 1103515245 + 12345; \ - v = (seed >> 16) & 0xFF; \ - seed = seed * 1103515245 + 12345; \ - v |= (seed >> 8) & 0xFF00; \ - seed = seed * 1103515245 + 12345; \ - v |= seed & 0x7FFF0000; \ - seed |= zerobuffer[v & addrmask]; - - while (count >= 16) { - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - count -= 16; - } - dummy = seed; - #undef RANDOM_MEM_ACCESS -} - -static void __attribute__((noinline)) random_dual_read_test(char *zerobuffer, - int count, int nbits) -{ - uint32_t seed = 0; - uintptr_t addrmask = (1 << nbits) - 1; - uint32_t v1, v2; - - #pragma GCC diagnostic ignored "-Wunused-but-set-variable" - static volatile uint32_t dummy; - - #define RANDOM_MEM_ACCESS() \ - seed = seed * 1103515245 + 12345; \ - v1 = (seed >> 8) & 0xFF00; \ - seed = seed * 1103515245 + 12345; \ - v2 = (seed >> 8) & 0xFF00; \ - seed = seed * 1103515245 + 12345; \ - v1 |= seed & 0x7FFF0000; \ - seed = seed * 1103515245 + 12345; \ - v2 |= seed & 0x7FFF0000; \ - seed = seed * 1103515245 + 12345; \ - v1 |= (seed >> 16) & 0xFF; \ - v2 |= (seed >> 24); \ - v2 &= addrmask; \ - v1 ^= v2; \ - seed |= zerobuffer[v2]; \ - seed += zerobuffer[v1 & addrmask]; - - while (count >= 16) { - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - RANDOM_MEM_ACCESS(); - count -= 16; - } - dummy = seed; - #undef RANDOM_MEM_ACCESS -} -#pragma GCC diagnostic pop - -static uint32_t rand32() -{ - static int seed = 0; - uint32_t hi, lo; - hi = (seed = seed * 1103515245 + 12345) >> 16; - lo = (seed = seed * 1103515245 + 12345) >> 16; - return (hi << 16) + lo; -} - -int latency_bench(int size, int count, int use_hugepage, int quick) -{ - double t, t2, t_before, t_after, t_noaccess, t_noaccess2 = 0; - double xs, xs1, xs2; - double ys, ys1, ys2; - double min_t, min_t2; - int nbits, n; - char *buffer, *buffer_alloc; -#if !defined(__linux__) || !defined(MADV_HUGEPAGE) - if (use_hugepage) - return 0; - buffer_alloc = (char *)malloc(size + 4095); - if (!buffer_alloc) - return 0; - buffer = (char *)(((uintptr_t)buffer_alloc + 4095) & ~(uintptr_t)4095); -#else - if (posix_memalign((void **)&buffer_alloc, 4 * 1024 * 1024, size) != 0) - return 0; - buffer = buffer_alloc; - if (use_hugepage && madvise(buffer, size, use_hugepage > 0 ? - MADV_HUGEPAGE : MADV_NOHUGEPAGE) != 0) - { - free(buffer_alloc); - return 0; - } -#endif - memset(buffer, 0, size); - - for (n = 1; n <= MAXREPEATS; n++) - { - t_before = gettime(); - random_read_test(buffer, count, 1); - t_after = gettime(); - if (n == 1 || t_after - t_before < t_noaccess) - t_noaccess = t_after - t_before; - - t_before = gettime(); - random_dual_read_test(buffer, count, 1); - t_after = gettime(); - if (n == 1 || t_after - t_before < t_noaccess2) - t_noaccess2 = t_after - t_before; - } - - printf("\nblock size : single random read / dual random read"); - if (use_hugepage > 0) - printf(", [MADV_HUGEPAGE]\n"); - else if (use_hugepage < 0) - printf(", [MADV_NOHUGEPAGE]\n"); - else - printf("\n"); - - consoleUpdate(NULL); - - int start = quick ? 20 : 10; - for (nbits = start; (1 << nbits) <= size; nbits++) - { - int testsize = 1 << nbits; - xs1 = xs2 = ys = ys1 = ys2 = 0; - for (n = 1; n <= MAXREPEATS; n++) - { - int testoffs = (rand32() % (size / testsize)) * testsize; - - t_before = gettime(); - random_read_test(buffer + testoffs, count, nbits); - t_after = gettime(); - t = t_after - t_before - t_noaccess; - if (t < 0) t = 0; - - xs1 += t; - xs2 += t * t; - - if (n == 1 || t < min_t) - min_t = t; - - t_before = gettime(); - random_dual_read_test(buffer + testoffs, count, nbits); - t_after = gettime(); - t2 = t_after - t_before - t_noaccess2; - if (t2 < 0) t2 = 0; - - ys1 += t2; - ys2 += t2 * t2; - - if (n == 1 || t2 < min_t2) - min_t2 = t2; - - if (n > 2) - { - xs = sqrt((xs2 * n - xs1 * xs1) / (n * (n - 1))); - ys = sqrt((ys2 * n - ys1 * ys1) / (n * (n - 1))); - if (xs < min_t / 1000. && ys < min_t2 / 1000.) - break; - } - } - printf("%10d : %6.1f ns / %6.1f ns \n", (1 << nbits), - min_t * 1000000000. / count, min_t2 * 1000000000. / count); - - consoleUpdate(NULL); - } - free(buffer_alloc); - return 1; -} - -void waitForKeyA() { - while (appletMainLoop()) - { - padUpdate(&pad); - - u64 kDown = padGetButtonsDown(&pad); - - if (kDown & HidNpadButton_A) - break; - else if(kDown) - { - consoleExit(NULL); - exit(0); - } - - consoleUpdate(NULL); - } -} - -void printClock() -{ - int res = 0; - uint32_t cpu_hz = 0, mem_hz = 0; - - ClkrstSession clkrstSession; - res = clkrstInitialize(); - if(R_FAILED(res)) { - fatalThrow(res); - } - - clkrstOpenSession(&clkrstSession, PcvModuleId_CpuBus, 3); - clkrstGetClockRate(&clkrstSession, &cpu_hz); - clkrstCloseSession(&clkrstSession); - clkrstOpenSession(&clkrstSession, PcvModuleId_EMC, 3); - clkrstGetClockRate(&clkrstSession, &mem_hz); - clkrstCloseSession(&clkrstSession); - clkrstExit(); - - printf("== CPU: %u.%u MHz ==\n== MEM: %u.%u MHz ==\n", - cpu_hz/1000000, cpu_hz/100000 - cpu_hz/1000000*10, - mem_hz/1000000, mem_hz/100000 - mem_hz/1000000*10); - consoleUpdate(NULL); -} - -// Main program entrypoint -int main(int argc, char* argv[]) -{ - consoleInit(NULL); - - printf("TinyMemBenchNX v0.4.11\n\ -(based on tinymembench-pthread, a multi-thread fork of simple benchmark for memory throughput and latency)\n\n"); - printf("Copyright (c) 2011-2016 Siarhei Siamashka\n"); - printf("Copyright (c) 2023 KazushiMe\n"); - printf("Copyright (c) 2023 hanai3Bi\n"); - printf("Copyright (c) 2025 Souldbminer\n"); - - printf("\n"); - consoleUpdate(NULL); - - padConfigureInput(1, HidNpadStyleSet_NpadStandard); - - padInitializeDefault(&pad); - - int64_t *srcbuf, *dstbuf, *tmpbuf; - void *poolbuf; - size_t bufsize = SIZE; - int threads = 0; - -loop: - printf("!!! Memory bandwidth heavily depends on CPU clock. !!!\n\n"); - printf("\ -Press A to start quick test.\n\ -Press X to start bandwidth test.\n\ -Press Y to start latency test.\n\ -Press any other key to exit.\n\n"); - consoleUpdate(NULL); - - while (appletMainLoop()) - { - padUpdate(&pad); - - u64 kDown = padGetButtonsDown(&pad); - - if (kDown & HidNpadButton_A) - { - threads = 3; - goto quick; - break; - } - else if (kDown & HidNpadButton_X) - { - threads = 3; - goto bandwidth; - break; - } - else if (kDown & HidNpadButton_Y) - { - threads = 3; - goto latency; - break; - } - else if (kDown) - { - consoleExit(NULL); - exit(0); - } - } - -quick: - - poolbuf = alloc_four_nonaliased_buffers((void **)&srcbuf, bufsize * threads, - (void **)&dstbuf, bufsize * threads, - (void **)&tmpbuf, BLOCKSIZE * threads, - NULL, 0); - - printClock(); - printf("== Thread: %d ==\n", threads); - consoleUpdate(NULL); - - bandwidth_bench(threads, dstbuf, srcbuf, tmpbuf, bufsize, BLOCKSIZE/2, " ", libc_benchmarks); - - free(poolbuf); - - int latbench_size = SIZE * 2, latbench_count = LATBENCH_COUNT; - - if (!latency_bench(latbench_size, latbench_count, -1, 1) || - !latency_bench(latbench_size, latbench_count, 1, 1)) - { - latency_bench(latbench_size, latbench_count, 0, 1); - } - - printf("\nPress A to continue, any other key to exit.\n\n"); - waitForKeyA(); - consoleClear(); - goto loop; - -bandwidth: - - printf("==========================================================================\n"); - printf("== Memory bandwidth tests ==\n"); - printf("== ==\n"); - printf("== Note 1: 1MB = 1000000 bytes ==\n"); - printf("== Note 2: Results for 'copy' tests show how many bytes can be ==\n"); - printf("== copied per second (adding together read and writen ==\n"); - printf("== bytes would have provided twice higher numbers) ==\n"); - printf("== Note 3: 2-pass copy means that we are using a small temporary buffer ==\n"); - printf("== to first fetch data into it, and only then write it to the ==\n"); - printf("== destination (source -> L1 cache, L1 cache -> destination) ==\n"); - printf("== Note 4: If sample standard deviation exceeds 0.1%%, it is shown in ==\n"); - printf("== brackets ==\n"); - printf("==========================================================================\n\n"); - - poolbuf = alloc_four_nonaliased_buffers((void **)&srcbuf, bufsize * threads, - (void **)&dstbuf, bufsize * threads, - (void **)&tmpbuf, BLOCKSIZE * threads, - NULL, 0); - - printClock(); - printf("== Thread: %d ==\n", threads); - consoleUpdate(NULL); - - bandwidth_bench(threads, dstbuf, srcbuf, tmpbuf, bufsize, BLOCKSIZE, " ", c_benchmarks); - printf(" ---\n"); - - bandwidth_bench(threads, dstbuf, srcbuf, tmpbuf, bufsize, BLOCKSIZE, " ", libc_benchmarks); - bench_info *bi = get_asm_benchmarks(); - if (bi->f) { - printf(" ---\n"); - bandwidth_bench(threads, dstbuf, srcbuf, tmpbuf, bufsize, BLOCKSIZE, " ", bi); - } - - free(poolbuf); - - printf("\nPress A to continue, any other key to exit.\n\n"); - waitForKeyA(); - consoleClear(); - goto loop; - -latency: - - latbench_size = SIZE * 2, latbench_count = LATBENCH_COUNT; - - printf("\n"); - printf("==========================================================================\n"); - printf("== Memory latency test ==\n"); - printf("== ==\n"); - printf("== Average time is measured for random memory accesses in the buffers ==\n"); - printf("== of different sizes. The larger is the buffer, the more significant ==\n"); - printf("== are relative contributions of TLB, L1/L2 cache misses and SDRAM ==\n"); - printf("== accesses. For extremely large buffer sizes we are expecting to see ==\n"); - printf("== page table walk with several requests to SDRAM for almost every ==\n"); - printf("== memory access (though 64MiB is not nearly large enough to experience ==\n"); - printf("== this effect to its fullest). ==\n"); - printf("== ==\n"); - printf("== Note 1: All the numbers are representing extra time, which needs to ==\n"); - printf("== be added to L1 cache latency. The cycle timings for L1 cache ==\n"); - printf("== latency can be usually found in the processor documentation. ==\n"); - printf("== Note 2: Dual random read means that we are simultaneously performing ==\n"); - printf("== two independent memory accesses at a time. In the case if ==\n"); - printf("== the memory subsystem can't handle multiple outstanding ==\n"); - printf("== requests, dual random read has the same timings as two ==\n"); - printf("== single reads performed one after another. ==\n"); - printf("==========================================================================\n\n"); - - consoleUpdate(NULL); - printClock(); - - if (!latency_bench(latbench_size, latbench_count, -1, 0) || - !latency_bench(latbench_size, latbench_count, 1, 0)) - { - latency_bench(latbench_size, latbench_count, 0, 0); - } - - printf("\nPress A to continue, any other key to exit.\n\n"); - waitForKeyA(); - consoleClear(); - goto loop; - - // Deinitialize and clean up resources used by the console (important!) - consoleExit(NULL); - return 0; -} diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index cb0656db..624831b3 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -47,6 +47,7 @@ typedef enum { HocClkConfigValue_ThermalThrottleThreshold, HocClkConfigValue_BatteryChargeCurrent, + HocClkConfigValue_InputCurrentLimit, HocClkConfigValue_OverwriteRefreshRate, HocClkConfigValue_MaxDisplayClockH, @@ -69,7 +70,7 @@ typedef enum { HocClkConfigValue_AulaDisplayColorPreset, HocClkConfigValue_MarikoMiddleFreqs, - + HocClkConfigValue_AutoRAMCPUOverclock, HocClkConfigValue_AutoRamCpuCpuOCFreq, HocClkConfigValue_AutoRamCpuRamOCThreshold, @@ -191,6 +192,33 @@ typedef enum { KipConfigValue_g_volt_e_1036800, KipConfigValue_g_volt_e_1075200, + KipConfigValue_g_soc_volt_1866000, + KipConfigValue_g_soc_volt_2000000, + KipConfigValue_g_soc_volt_2133000, + KipConfigValue_g_soc_volt_2200000, + KipConfigValue_g_soc_volt_2266000, + KipConfigValue_g_soc_volt_2333000, + KipConfigValue_g_soc_volt_2400000, + KipConfigValue_g_soc_volt_2433000, + KipConfigValue_g_soc_volt_2466000, + KipConfigValue_g_soc_volt_2533000, + KipConfigValue_g_soc_volt_2566000, + KipConfigValue_g_soc_volt_2600000, + KipConfigValue_g_soc_volt_2666000, + KipConfigValue_g_soc_volt_2700000, + KipConfigValue_g_soc_volt_2733000, + KipConfigValue_g_soc_volt_2766000, + KipConfigValue_g_soc_volt_2800000, + KipConfigValue_g_soc_volt_2833000, + KipConfigValue_g_soc_volt_2900000, + KipConfigValue_g_soc_volt_2933000, + KipConfigValue_g_soc_volt_3000000, + KipConfigValue_g_soc_volt_3033000, + KipConfigValue_g_soc_volt_3100000, + KipConfigValue_g_soc_volt_3133000, + KipConfigValue_g_soc_volt_3166000, + KipConfigValue_g_soc_volt_3200000, + KipConfigValue_t6_tRTW_fine_tune, KipConfigValue_t7_tWTR_fine_tune, @@ -237,6 +265,9 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case HocClkConfigValue_BatteryChargeCurrent: return pretty ? "Battery Charge Current" : "bat_charge_current"; + case HocClkConfigValue_InputCurrentLimit: + return pretty ? "Input Current Limit" : "in_curr_limit"; + case HocClkConfigValue_OverwriteRefreshRate: return pretty ? "Display Refresh Rate Changing" : "drr_changing"; @@ -464,6 +495,34 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_g_volt_e_1075200: return pretty ? "Erista GPU Volt 1075 MHz" : "g_volt_e_1075200"; case KipConfigValue_t6_tRTW_fine_tune: return pretty ? "t6 - tRTW Fine Tune" : "t6_tRTW_fine_tune"; case KipConfigValue_t7_tWTR_fine_tune: return pretty ? "t7 - tWTR Fine Tune" : "t7_tWTR_fine_tune"; + + case KipConfigValue_g_soc_volt_1866000: return pretty ? "Mariko SOC Volt 1866 MHz" : "g_soc_volt_1866000"; + case KipConfigValue_g_soc_volt_2000000: return pretty ? "Mariko SOC Volt 2000 MHz" : "g_soc_volt_2000000"; + case KipConfigValue_g_soc_volt_2133000: return pretty ? "Mariko SOC Volt 2133 MHz" : "g_soc_volt_2133000"; + case KipConfigValue_g_soc_volt_2200000: return pretty ? "Mariko SOC Volt 2200 MHz" : "g_soc_volt_2200000"; + case KipConfigValue_g_soc_volt_2266000: return pretty ? "Mariko SOC Volt 2266 MHz" : "g_soc_volt_2266000"; + case KipConfigValue_g_soc_volt_2333000: return pretty ? "Mariko SOC Volt 2333 MHz" : "g_soc_volt_2333000"; + case KipConfigValue_g_soc_volt_2400000: return pretty ? "Mariko SOC Volt 2400 MHz" : "g_soc_volt_2400000"; + case KipConfigValue_g_soc_volt_2433000: return pretty ? "Mariko SOC Volt 2433 MHz" : "g_soc_volt_2433000"; + case KipConfigValue_g_soc_volt_2466000: return pretty ? "Mariko SOC Volt 2466 MHz" : "g_soc_volt_2466000"; + case KipConfigValue_g_soc_volt_2533000: return pretty ? "Mariko SOC Volt 2533 MHz" : "g_soc_volt_2533000"; + case KipConfigValue_g_soc_volt_2566000: return pretty ? "Mariko SOC Volt 2566 MHz" : "g_soc_volt_2566000"; + case KipConfigValue_g_soc_volt_2600000: return pretty ? "Mariko SOC Volt 2600 MHz" : "g_soc_volt_2600000"; + case KipConfigValue_g_soc_volt_2666000: return pretty ? "Mariko SOC Volt 2666 MHz" : "g_soc_volt_2666000"; + case KipConfigValue_g_soc_volt_2700000: return pretty ? "Mariko SOC Volt 2700 MHz" : "g_soc_volt_2700000"; + case KipConfigValue_g_soc_volt_2733000: return pretty ? "Mariko SOC Volt 2733 MHz" : "g_soc_volt_2733000"; + case KipConfigValue_g_soc_volt_2766000: return pretty ? "Mariko SOC Volt 2766 MHz" : "g_soc_volt_2766000"; + case KipConfigValue_g_soc_volt_2800000: return pretty ? "Mariko SOC Volt 2800 MHz" : "g_soc_volt_2800000"; + case KipConfigValue_g_soc_volt_2833000: return pretty ? "Mariko SOC Volt 2833 MHz" : "g_soc_volt_2833000"; + case KipConfigValue_g_soc_volt_2900000: return pretty ? "Mariko SOC Volt 2900 MHz" : "g_soc_volt_2900000"; + case KipConfigValue_g_soc_volt_2933000: return pretty ? "Mariko SOC Volt 2933 MHz" : "g_soc_volt_2933000"; + case KipConfigValue_g_soc_volt_3000000: return pretty ? "Mariko SOC Volt 3000 MHz" : "g_soc_volt_3000000"; + case KipConfigValue_g_soc_volt_3033000: return pretty ? "Mariko SOC Volt 3033 MHz" : "g_soc_volt_3033000"; + case KipConfigValue_g_soc_volt_3100000: return pretty ? "Mariko SOC Volt 3100 MHz" : "g_soc_volt_3100000"; + case KipConfigValue_g_soc_volt_3133000: return pretty ? "Mariko SOC Volt 3133 MHz" : "g_soc_volt_3133000"; + case KipConfigValue_g_soc_volt_3166000: return pretty ? "Mariko SOC Volt 3166 MHz" : "g_soc_volt_3166000"; + case KipConfigValue_g_soc_volt_3200000: return pretty ? "Mariko SOC Volt 3200 MHz" : "g_soc_volt_3200000"; + case KipCrc32: return pretty ? "CRC32" : "crc32"; case HocClkConfigValue_IsFirstLoad: @@ -486,6 +545,7 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_UncappedClocks: case HocClkConfigValue_OverwriteBoostMode: case HocClkConfigValue_BatteryChargeCurrent: + case HocClkConfigValue_InputCurrentLimit: case HocClkConfigValue_OverwriteRefreshRate: case HocClkConfigValue_GPUScheduling: case HocClkConfigValue_LiveCpuUv: @@ -551,7 +611,7 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_MarikoMiddleFreqs: case HocClkConfigValue_AutoRAMCPUOverclock: return (input & 0x1) == input; - + case KipConfigValue_KipVersion: case KipConfigValue_custRev: // case KipConfigValue_mtcConf: @@ -652,6 +712,32 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_g_volt_e_998400: case KipConfigValue_g_volt_e_1036800: case KipConfigValue_g_volt_e_1075200: + case KipConfigValue_g_soc_volt_1866000: + case KipConfigValue_g_soc_volt_2000000: + case KipConfigValue_g_soc_volt_2133000: + case KipConfigValue_g_soc_volt_2200000: + case KipConfigValue_g_soc_volt_2266000: + case KipConfigValue_g_soc_volt_2333000: + case KipConfigValue_g_soc_volt_2400000: + case KipConfigValue_g_soc_volt_2433000: + case KipConfigValue_g_soc_volt_2466000: + case KipConfigValue_g_soc_volt_2533000: + case KipConfigValue_g_soc_volt_2566000: + case KipConfigValue_g_soc_volt_2600000: + case KipConfigValue_g_soc_volt_2666000: + case KipConfigValue_g_soc_volt_2700000: + case KipConfigValue_g_soc_volt_2733000: + case KipConfigValue_g_soc_volt_2766000: + case KipConfigValue_g_soc_volt_2800000: + case KipConfigValue_g_soc_volt_2833000: + case KipConfigValue_g_soc_volt_2900000: + case KipConfigValue_g_soc_volt_2933000: + case KipConfigValue_g_soc_volt_3000000: + case KipConfigValue_g_soc_volt_3033000: + case KipConfigValue_g_soc_volt_3100000: + case KipConfigValue_g_soc_volt_3133000: + case KipConfigValue_g_soc_volt_3166000: + case KipConfigValue_g_soc_volt_3200000: case KipConfigValue_eristaCpuVmin: case KipConfigValue_eristaCpuUnlock: case KipConfigValue_t6_tRTW_fine_tune: @@ -670,10 +756,14 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in return true; case HocClkConfigValue_BatteryChargeCurrent: return ((input >= 1024) && (input <= 3072)) || !input; + + case HocClkConfigValue_InputCurrentLimit: + return ((input >= 100) && (input <= 3000)) || !input; + case HocClkConfigValue_DisplayVoltage: return ((input >= 800) && (input <= 1325)); default: return true; } -} \ No newline at end of file +} diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index dcd9ce5d..0e50add5 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -39,7 +39,7 @@ include ${TOPDIR}/lib/libultrahand/ultrahand.mk # version control constants #--------------------------------------------------------------------------------- #TARGET_VERSION := $(shell git describe --dirty --always --tags) -APP_VERSION := 2.4.0 # ensure to set KIP_VERSION and CUST_REV in sysmodule Makefile when updating this +APP_VERSION := 2.4.1 # ensure to set KIP_VERSION and CUST_REV in sysmodule Makefile when updating this TARGET_VERSION := $(APP_VERSION) #--------------------------------------------------------------------------------- diff --git a/Source/hoc-clk/overlay/lang/de.json b/Source/hoc-clk/overlay/lang/de.json index d2eedf0b..00e05a56 100644 --- a/Source/hoc-clk/overlay/lang/de.json +++ b/Source/hoc-clk/overlay/lang/de.json @@ -1,37 +1,33 @@ { "Information": "Informationen", - "IDDQ:": "IDDQ:", - "Module: ": "Modul:", - "sys-dock status:": "Sys-Dock-Status:", - "SaltyNX status:": "SaltyNX-Status:", - "RR Display status:": "RR Anzeigestatus:", - "Wafer Position:": "Waferposition:", - "Credits": "Credits", - "Developers": "Entwickler", - "Contributors": "Mitwirkende", - "Testers": "Tester", - "Special Thanks": "Besonderer Dank", "Unknown": "Unbekannt", "Installed": "Installiert", "Not Installed": "Nicht installiert", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ", "Default": "Standard", "Do Not Override": "Nicht überschreiben", + "Do not override": "Nicht überschreiben", "Disabled": "Deaktiviert", "Enabled": "Aktiviert", - " \\ue0e3 Reset": "\\ue0e3 Zurücksetzen", - "Display": "Anzeige", - "Application changed\\n\\n": "Anwendung geändert\\n\\n", - "The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n", - "while editing was going on.": "während die Bearbeitung im Gange war.", - "Board": "Vorstand", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Aktiviert (Standard)", + "Enable": "Aktivieren", + "Fatal error": "Fataler Fehler", "Could not connect to hoc-clk sysmodule.\\n\\n": "Es konnte keine Verbindung zum hoc-clk-Systemmodul hergestellt werden.\\n\\n", "Please make sure everything is\\n\\n": "Bitte stellen Sie sicher, dass alles in Ordnung ist\\n\\n", "correctly installed and enabled.": "korrekt installiert und aktiviert.", - "Fatal error": "Fataler Fehler", + + "Edit App Profile": "App-Profil bearbeiten", + "Edit Global Profile": "Globales Profil bearbeiten", + "Temporary Overrides": "Temporäre Überschreibungen", "Temporary Overrides ": "Temporäre Überschreibungen", + "  Reset": " Zurücksetzen", + "Settings": "Einstellungen", + "About": "Über", + "Credits": "Credits", + + "Application changed\\n\\n": "Anwendung geändert\\n\\n", + "The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n", + "while editing was going on.": "während die Bearbeitung im Gange war.", + "Sleep Mode": "Schlafmodus", "Stock": "Lager", "Dev OC": "Entwickler OC", @@ -40,57 +36,74 @@ "Unsafe Max": "Unsicher max", "Absolute Max": "Absolutes Maximum", "Handheld Safe Max": "Handsafe max", - "Enable": "Aktivieren", - "Edit App Profile": "App-Profil bearbeiten", - "Edit Global Profile": "Globales Profil bearbeiten", - "Temporary Overrides": "Temporäre Überschreibungen", - "Settings": "Einstellungen", - "About": "Über", - "Compiling with minimal features": "Kompilieren mit minimalen Funktionen", + "General Settings": "Allgemeine Einstellungen", - "Governor Settings": "Gouverneurseinstellungen", + "Governor Settings": "Regler-Einstellungen", "Safety Settings": "Sicherheitseinstellungen", - "Save KIP Settings": "Speichern Sie die KIP-Einstellungen", + "Save KIP Settings": "KIP-Einstellungen speichern", "RAM Settings": "RAM-Einstellungen", "CPU Settings": "CPU-Einstellungen", "GPU Settings": "GPU-Einstellungen", "Display Settings": "Anzeigeeinstellungen", + "Experimental Settings": "Experimentelle Einstellungen", "Experimental": "Experimentell", + + " Settings marked in blue": "Blau markierte Einstellungen", + "don't require a reboot to apply!": "erfordern keinen Neustart zum Aktivieren!", + "You can also press  to show": "Drücken Sie auch  zum Anzeigen", + "information about each setting.": "von Informationen zu jeder Einstellung.", + + " Experimental Settings are incomplete ": "Experimentelle Einstellungen unvollständig", + "and may not work correctly or at all!": "und funktionieren möglicherweise gar nicht!", + "Here be dragons!": "Hier gibt es Drachen!", + + "RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus", + "RAM Display Unit": "RAM-Anzeigeeinheit", + "Polling Interval": "Abfrageintervall", + "GPU Scheduling Override Method": "GPU-Planungsüberschreibungsmethode", + "GPU Scheduling Override": "GPU-Planungsüberschreibung", + "GPU Boot Volt": "GPU Boot-Spannung", + "GPU Boot Voltage": "GPU Boot-Spannung", + "Memory Frequency Measurement Mode": "RAM-Frequenz-Messmodus", + " Overriding the charge current": "Überschreiben des Ladestroms", "can be dangerous and may cause": "kann gefährlich sein und verursachen", "damage to your battery or charger!": "Schäden an Ihrem Akku oder Ladegerät!", "Charge Current Override": "Ladestrom-Überbrückung", - "RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus", - "Polling Interval": "Abfrageintervall", + "Display Color Preset": "Farbprofil", + "Basic": "Standard", + "Saturated": "Gesättigt", + "Washed": "Verblasst", + "Natural": "Natürlich", + "Vivid": "Lebendig", + "CPU Governor Minimum Frequency": "Mindestfrequenz des CPU-Reglers", + " Usage of unsafe display": "Verwendung unsicherer Bildschirmfrequenzen", "refresh rates may cause stress": "Bildwiederholraten können Stress verursachen", "or damage to your display! ": "oder Schäden an Ihrem Display!", "Proceed at your own risk!": "Das Vorgehen erfolgt auf eigene Gefahr!", "Max Handheld Display": "Max Handheld-Display", + "Max Handheld Display Hz": "Max. Handheld-Hz", "Display Clock": "Uhr anzeigen", + " Adjust the display voltage": "Display-Spannung anpassen", + "with caution to avoid damage": "mit Vorsicht, um Schäden zu vermeiden", + "to your display panel! ": "am Display-Panel!", + "Display Voltage": "Display-Spannung", + + "Thermal Throttle Limit": "Thermische Drosselgrenze", "Official Rating": "Offizielle Bewertung", "TDP Threshold": "TDP-Schwellenwert", "Power": "Macht", - "Thermal Throttle Limit": "Thermische Drosselgrenze", "HP Mode": "HP-Modus", - "Default (Mariko)": "Standard (Mariko)", - "Default (Erista)": "Standard (Erista)", - "Rating": "Bewertung", - "Safe Max (Mariko)": "Safe Max (Mariko)", - "Safe Max (Erista)": "Safe Max (Erista)", + + "DVB Shift": "DVB-Versatz", + "SoC Max Volt": "SoC Max-Spannung", + "Step Mode": "Schritt-Modus", "RAM VDD2 Voltage": "RAM VDD2 Spannung", - "Voltage": "Spannung", "RAM VDDQ Voltage": "RAM-VDDQ-Spannung", + "Voltage": "Spannung", "RAM Frequency Editor": "RAM-Frequenzeditor", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Hoher Tacho erforderlich!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Tacho/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Tacho/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Tacho/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Tacho/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Tacho/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Tacho/PLL)", - "Ram Max Clock": "Ram Max Uhr", + "Ram Max Clock": "Ram Max Takt", "RAM Latency Editor": "RAM-Latenz-Editor", "RAM Timing Reductions": "Reduzierung des RAM-Timings", "Memory Timings": "Speicherzeiten", @@ -102,6 +115,15 @@ "Memory Latencies": "Speicherlatenzen", "Read Latency": "Leselatenz", "Write Latency": "Schreiblatenz", + "High speedo needed!": "Hoher Speedo-Wert erforderlich!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU-Boost-Takt", "CPU UV": "CPU-UV", "CPU Unlock": "CPU-Entsperrung", @@ -110,32 +132,84 @@ "CPU Max Clock": "Maximaler CPU-Takt", "Extreme UV Table": "Extremer UV-Tisch", "CPU UV Table": "CPU-UV-Tisch", - "CPU Low UV": "CPU-niedrige UV-Strahlung", - "CPU High UV": "CPU Hohe UV-Strahlung", + "CPU Low UV": "CPU niedrige UV", + "CPU High UV": "CPU hohe UV", "CPU Low VMIN": "CPU niedrig VMIN", "CPU High VMIN": "CPU hoch VMIN", + "No Undervolt": "Kein Undervolt", - "SLT Table": "SLT-Tisch", + "SLT Table": "SLT-Tabelle", "HiOPT Table": "HiOPT-Tabelle", "GPU Undervolt Table": "GPU-Unterspannungstabelle", "GPU Minimum Voltage": "GPU-Mindestspannung", - "Calculate GPU Vmin": "Berechnen Sie die GPU-Vmin", + "Calculate GPU Vmin": "GPU-Vmin berechnen", "GPU VMIN": "GPU-VMIN", "GPU Maximum Voltage": "Maximale GPU-Spannung", "GPU Voltage Offset": "GPU-Spannungsoffset", - "Do not override": "Nicht überschreiben", - "Enabled (Default)": "Aktiviert (Standard)", - "96.6% limit": "96,6 %-Grenze", - "99.7% limit": "99,7 %-Grenze", - "GPU Scheduling Override": "GPU-Planungsüberschreibung", - "Official Service": "Offizieller Dienst", "GPU DVFS Mode": "GPU-DVFS-Modus", "GPU DVFS Offset": "GPU-DVFS-Offset", "GPU Voltage Table": "GPU-Spannungstabelle", "GPU Custom Table (mV)": "Benutzerdefinierte GPU-Tabelle (mV)", + "Official Service": "Offizieller Dienst", + "96.6% limit": "96,6 %-Grenze", + "99.7% limit": "99,7 %-Grenze", + " Setting GPU Clocks past": "GPU-Takt überschreiten", + "1228MHz without a proper undervolt": "1228 MHz ohne korrekten Undervolt", + "can cause degradation or damage": "kann Degradierung oder Schäden verursachen", + "to your console!": "an Ihrer Konsole!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz ohne UV, 1152 MHz auf SLT", "or 1228MHz on HiOPT can cause ": "oder 1228 MHz auf HiOPT kann dazu führen", - "permanent damage to your Switch!": "Dauerhafter Schaden an Ihrem Switch!", + "permanent damage to your Switch!": "dauerhafter Schaden an Ihrem Switch!", "921MHz without UV and 960MHz on": "921 MHz ohne UV und 960 MHz eingeschaltet", - "SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen" + "SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen", + + "Default (Mariko)": "Standard (Mariko)", + "Default (Erista)": "Standard (Erista)", + "Rating": "Bewertung", + "Safe Max (Mariko)": "Safe Max (Mariko)", + "Safe Max (Erista)": "Safe Max (Erista)", + + "Voltages": "Spannungen", + "RAM Voltage:": "RAM-Spannung:", + "Display Voltage:": "Display-Spannung:", + "Temperatures": "Temperaturen", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Warm", + "Hot": "Heiß", + "Overheat": "Überhitzung", + "Not Patched": "Nicht gepatcht", + "Invalid": "Ungültig", + "RAM Bandwidth": "RAM-Bandbreite", + "RAM BW (Peak):": "RAM-BW (Max.):", + "RAM BW (All):": "RAM-BW (Ges.):", + "RAM BW (CPU):": "RAM-BW (CPU):", + "RAM BW (GPU):": "RAM-BW (GPU):", + "Hardware Info": "Hardware-Info", + "Console Type:": "Konsolentyp:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM-Modul: ", + "Software Info": "Software-Info", + "KIP version:": "KIP-Version:", + "sys-dock status:": "Sys-Dock-Status:", + "SaltyNX status:": "SaltyNX-Status:", + "RR Display status:": "RR Anzeigestatus:", + "Wafer Position:": "Waferposition:", + "IDDQ:": "IDDQ:", + "Module: ": "Modul:", + "Board": "Vorstand", + "Display": "Anzeige", + + "Developers": "Entwickler", + "Contributors": "Mitwirkende", + "Testers": "Tester", + "Translators": "Übersetzer", + "Special Thanks": "Besonderer Dank", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Kompilieren mit minimalen Funktionen", + "THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ" } diff --git a/Source/hoc-clk/overlay/lang/es.json b/Source/hoc-clk/overlay/lang/es.json index a938c1e3..7743bef3 100644 --- a/Source/hoc-clk/overlay/lang/es.json +++ b/Source/hoc-clk/overlay/lang/es.json @@ -1,37 +1,33 @@ { "Information": "Información", - "IDDQ:": "IDDQ:", - "Module: ": "Módulo:", - "sys-dock status:": "Estado de sys-dock:", - "SaltyNX status:": "Estado de SaltyNX:", - "RR Display status:": "Estado de pantalla RR:", - "Wafer Position:": "Posición del wafer:", - "Credits": "Créditos", - "Developers": "Desarrolladores", - "Contributors": "Colaboradores", - "Testers": "Testers", - "Special Thanks": "Agradecimientos especiales", "Unknown": "Desconocido", "Installed": "Instalado", "Not Installed": "No instalado", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LICENCIA BEER-WARE", "Default": "Predeterminado", "Do Not Override": "No sobrescribir", + "Do not override": "No sobrescribir", "Disabled": "Desactivado", "Enabled": "Activado", - " \\ue0e3 Reset": "\\ue0e3 Restablecer", - "Display": "Pantalla", - "Application changed\\n\\n": "Aplicación cambiada\\n\\n", - "The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n", - "while editing was going on.": "mientras se estaba editando.", - "Board": "Placa", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Activado (predeterminado)", + "Enable": "Activar", + "Fatal error": "Error fatal", "Could not connect to hoc-clk sysmodule.\\n\\n": "No se pudo conectar al sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Asegúrate de que todo esté\\n\\n", "correctly installed and enabled.": "correctamente instalado y activado.", - "Fatal error": "Error fatal", + + "Edit App Profile": "Editar perfil de aplicación", + "Edit Global Profile": "Editar perfil global", + "Temporary Overrides": "Ajustes temporales", "Temporary Overrides ": "Ajustes temporales", + "  Reset": " Restablecer", + "Settings": "Configuración", + "About": "Acerca de", + "Credits": "Créditos", + + "Application changed\\n\\n": "Aplicación cambiada\\n\\n", + "The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n", + "while editing was going on.": "mientras se estaba editando.", + "Sleep Mode": "Modo reposo", "Stock": "Valores de fábrica", "Dev OC": "OC de desarrollo", @@ -40,13 +36,7 @@ "Unsafe Max": "Máximo no seguro", "Absolute Max": "Máximo absoluto", "Handheld Safe Max": "Máximo seguro en portátil", - "Enable": "Activar", - "Edit App Profile": "Editar perfil de aplicación", - "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Ajustes temporales", - "Settings": "Configuración", - "About": "Acerca de", - "Compiling with minimal features": "Compilado con funciones mínimas", + "General Settings": "Configuración general", "Governor Settings": "Configuración del governor", "Safety Settings": "Configuración de seguridad", @@ -55,41 +45,64 @@ "CPU Settings": "Configuración de CPU", "GPU Settings": "Configuración de GPU", "Display Settings": "Configuración de pantalla", + "Experimental Settings": "Configuración experimental", "Experimental": "Experimental", + + " Settings marked in blue": "La configuración en azul", + "don't require a reboot to apply!": "no requiere reinicio para aplicarse.", + "You can also press  to show": "Pulsa  para mostrar", + "information about each setting.": "información sobre cada ajuste.", + + " Experimental Settings are incomplete ": "La configuración experimental está incompleta", + "and may not work correctly or at all!": "y puede que no funcione correctamente.", + "Here be dragons!": "¡Aquí hay dragones!", + + "RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM", + "RAM Display Unit": "Unidad de visualización RAM", + "Polling Interval": "Intervalo de sondeo", + "GPU Scheduling Override Method": "Método de sobrescritura del scheduling de GPU", + "GPU Scheduling Override": "Sobrescritura de scheduling de GPU", + "GPU Boot Volt": "Voltaje de arranque GPU", + "GPU Boot Voltage": "Voltaje de arranque GPU", + "Memory Frequency Measurement Mode": "Modo de medición de frecuencia de memoria", + " Overriding the charge current": "Sobrescribir la corriente de carga", "can be dangerous and may cause": "puede ser peligroso y causar", "damage to your battery or charger!": "daños a la batería o al cargador.", "Charge Current Override": "Sobrescritura de corriente de carga", - "RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM", - "Polling Interval": "Intervalo de sondeo", + "Display Color Preset": "Preajuste de color", + "Basic": "Básico", + "Saturated": "Saturado", + "Washed": "Lavado", + "Natural": "Natural", + "Vivid": "Vívido", + "CPU Governor Minimum Frequency": "Frecuencia mínima del governor de CPU", + " Usage of unsafe display": "El uso de frecuencias de pantalla", "refresh rates may cause stress": "las tasas de refresco pueden causar estrés", "or damage to your display! ": "o dañar la pantalla.", "Proceed at your own risk!": "¡Úsalo bajo tu propio riesgo!", "Max Handheld Display": "Frecuencia máxima de pantalla en portátil", + "Max Handheld Display Hz": "Hz máximo en modo portátil", "Display Clock": "Frecuencia de pantalla", + " Adjust the display voltage": "Ajusta el voltaje de pantalla", + "with caution to avoid damage": "con cuidado para evitar daños", + "to your display panel! ": "al panel de pantalla.", + "Display Voltage": "Voltaje de pantalla", + + "Thermal Throttle Limit": "Límite de thermal throttling", "Official Rating": "Valor oficial", "TDP Threshold": "Umbral de TDP", "Power": "Potencia", - "Thermal Throttle Limit": "Límite de thermal throttling", "HP Mode": "Modo alto rendimiento", - "Default (Mariko)": "Predeterminado (Mariko)", - "Default (Erista)": "Predeterminado (Erista)", - "Rating": "Valor", - "Safe Max (Mariko)": "Máximo seguro (Mariko)", - "Safe Max (Erista)": "Máximo seguro (Erista)", + + "DVB Shift": "Desplazamiento DVB", + "SoC Max Volt": "Voltaje máximo del SoC", + "Step Mode": "Modo de paso", "RAM VDD2 Voltage": "Voltaje VDD2 de RAM", - "Voltage": "Voltaje", "RAM VDDQ Voltage": "Voltaje VDDQ de RAM", + "Voltage": "Voltaje", "RAM Frequency Editor": "Editor de frecuencia de RAM", - "JEDEC.": "JEDEC", - "High speedo needed!": "¡Se necesita alto speedo!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)", "Ram Max Clock": "Frecuencia máxima de RAM", "RAM Latency Editor": "Editor de latencias de RAM", "RAM Timing Reductions": "Reducción de timings de RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latencias de memoria", "Read Latency": "Latencia de lectura", "Write Latency": "Latencia de escritura", + "High speedo needed!": "¡Se necesita alto speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)", + "JEDEC.": "JEDEC", + "CPU Boost Clock": "Frecuencia boost de CPU", "CPU UV": "Undervolt de CPU", "CPU Unlock": "Desbloqueo de CPU", @@ -114,6 +136,7 @@ "CPU High UV": "Undervolt alto de CPU", "CPU Low VMIN": "VMIN bajo de CPU", "CPU High VMIN": "VMIN alto de CPU", + "No Undervolt": "Sin undervolt", "SLT Table": "Tabla SLT", "HiOPT Table": "Tabla HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "VMIN de GPU", "GPU Maximum Voltage": "Voltaje máximo de GPU", "GPU Voltage Offset": "Offset de voltaje de GPU", - "Do not override": "No sobrescribir", - "Enabled (Default)": "Activado (predeterminado)", - "96.6% limit": "Límite 96,6%", - "99.7% limit": "Límite 99,7%", - "GPU Scheduling Override": "Sobrescritura de scheduling de GPU", - "Official Service": "Servicio oficial", "GPU DVFS Mode": "Modo DVFS de GPU", "GPU DVFS Offset": "Offset DVFS de GPU", "GPU Voltage Table": "Tabla de voltaje de GPU", "GPU Custom Table (mV)": "Tabla personalizada de GPU (mV)", + "Official Service": "Servicio oficial", + "96.6% limit": "Límite 96,6%", + "99.7% limit": "Límite 99,7%", + " Setting GPU Clocks past": "Ajustar frecuencias de GPU más allá", + "1228MHz without a proper undervolt": "1228MHz sin undervolt adecuado", + "can cause degradation or damage": "puede causar degradación o daños", + "to your console!": "a tu consola.", "1075MHz without UV, 1152MHz on SLT": "1075MHz sin undervolt, 1152MHz en SLT", "or 1228MHz on HiOPT can cause ": "o 1228MHz en HiOPT pueden causar ", "permanent damage to your Switch!": "¡daño permanente a tu Switch!", "921MHz without UV and 960MHz on": "921MHz sin undervolt y 960MHz en", - "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar " -} \ No newline at end of file + "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar ", + + "Default (Mariko)": "Predeterminado (Mariko)", + "Default (Erista)": "Predeterminado (Erista)", + "Rating": "Valor", + "Safe Max (Mariko)": "Máximo seguro (Mariko)", + "Safe Max (Erista)": "Máximo seguro (Erista)", + + "Voltages": "Voltajes", + "RAM Voltage:": "Voltaje RAM:", + "Display Voltage:": "Voltaje de pantalla:", + "Temperatures": "Temperaturas", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Cálido", + "Hot": "Caliente", + "Overheat": "Sobrecalentamiento", + "Not Patched": "Sin parche", + "Invalid": "Inválido", + "RAM Bandwidth": "Ancho de banda RAM", + "RAM BW (Peak):": "BW RAM (Pico):", + "RAM BW (All):": "BW RAM (Todo):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info de hardware", + "Console Type:": "Tipo de consola:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Módulo DRAM: ", + "Software Info": "Info de software", + "KIP version:": "Versión KIP:", + "sys-dock status:": "Estado de sys-dock:", + "SaltyNX status:": "Estado de SaltyNX:", + "RR Display status:": "Estado de pantalla RR:", + "Wafer Position:": "Posición del wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Módulo:", + "Board": "Placa", + "Display": "Pantalla", + + "Developers": "Desarrolladores", + "Contributors": "Colaboradores", + "Testers": "Testers", + "Translators": "Traductores", + "Special Thanks": "Agradecimientos especiales", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilado con funciones mínimas", + "THE BEER-WARE LICENSE": "LICENCIA BEER-WARE" +} diff --git a/Source/hoc-clk/overlay/lang/fr.json b/Source/hoc-clk/overlay/lang/fr.json index e4e41177..c8f94ed2 100644 --- a/Source/hoc-clk/overlay/lang/fr.json +++ b/Source/hoc-clk/overlay/lang/fr.json @@ -1,37 +1,33 @@ { "Information": "Informations", - "IDDQ:": "IDDQ :", - "Module: ": "Module :", - "sys-dock status:": "Statut de sys-dock :", - "SaltyNX status:": "Statut de SaltyNX :", - "RR Display status:": "Statut de l'affichage RR :", - "Wafer Position:": "Position du wafer :", - "Credits": "Crédits", - "Developers": "Développeurs", - "Contributors": "Contributeurs", - "Testers": "Testeurs", - "Special Thanks": "Remerciements spéciaux", "Unknown": "Inconnu", "Installed": "Installé", "Not Installed": "Non installé", - "X: %u Y: %u": "X : %u Y : %u", - "THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE", "Default": "Par défaut", "Do Not Override": "Ne pas remplacer", + "Do not override": "Ne pas remplacer", "Disabled": "Désactivé", "Enabled": "Activé", - " \\ue0e3 Reset": "\\ue0e3 Réinitialiser", - "Display": "Écran", - "Application changed\\n\\n": "Application modifiée\\n\\n", - "The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n", - "while editing was going on.": "pendant la modification.", - "Board": "Carte", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Activé (par défaut)", + "Enable": "Activer", + "Fatal error": "Erreur fatale", "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossible de se connecter au sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Veuillez vous assurer que tout est\\n\\n", "correctly installed and enabled.": "correctement installé et activé.", - "Fatal error": "Erreur fatale", + + "Edit App Profile": "Modifier le profil de l'app", + "Edit Global Profile": "Modifier le profil global", + "Temporary Overrides": "Forçages temporaires", "Temporary Overrides ": "Forçages temporaires ", + "  Reset": " Réinitialiser", + "Settings": "Paramètres", + "About": "À propos", + "Credits": "Crédits", + + "Application changed\\n\\n": "Application modifiée\\n\\n", + "The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n", + "while editing was going on.": "pendant la modification.", + "Sleep Mode": "Mode veille", "Stock": "D'origine", "Dev OC": "OC Développeur", @@ -40,13 +36,7 @@ "Unsafe Max": "Max non sûr", "Absolute Max": "Max absolu", "Handheld Safe Max": "Max sûr (mode portable)", - "Enable": "Activer", - "Edit App Profile": "Modifier le profil de l'app", - "Edit Global Profile": "Modifier le profil global", - "Temporary Overrides": "Forçages temporaires", - "Settings": "Paramètres", - "About": "À propos", - "Compiling with minimal features": "Compilation avec fonctionnalités minimales", + "General Settings": "Paramètres généraux", "Governor Settings": "Paramètres du gouverneur", "Safety Settings": "Paramètres de sécurité", @@ -55,41 +45,64 @@ "CPU Settings": "Paramètres CPU", "GPU Settings": "Paramètres GPU", "Display Settings": "Paramètres d'affichage", + "Experimental Settings": "Paramètres expérimentaux", "Experimental": "Expérimental", + + " Settings marked in blue": "Les paramètres en bleu", + "don't require a reboot to apply!": "ne nécessitent pas de redémarrage !", + "You can also press  to show": "Appuyez aussi sur  pour afficher", + "information about each setting.": "les informations sur chaque paramètre.", + + " Experimental Settings are incomplete ": "Les paramètres expérimentaux sont incomplets", + "and may not work correctly or at all!": "et peuvent ne pas fonctionner du tout !", + "Here be dragons!": "Ici, il y a des dragons !", + + "RAM Voltage Display Mode": "Mode d'affichage de la tension RAM", + "RAM Display Unit": "Unité d'affichage RAM", + "Polling Interval": "Intervalle d'interrogation", + "GPU Scheduling Override Method": "Méthode de Forçage de l'ordonnancement GPU", + "GPU Scheduling Override": "Forçage de l'ordonnancement GPU", + "GPU Boot Volt": "Tension d'amorçage GPU", + "GPU Boot Voltage": "Tension d'amorçage GPU", + "Memory Frequency Measurement Mode": "Mode de mesure de fréquence mémoire", + " Overriding the charge current": "Le forçage du courant de charge", "can be dangerous and may cause": "peut être dangereux et causer des", "damage to your battery or charger!": "dommages à votre batterie ou chargeur !", "Charge Current Override": "Forçage du courant de charge", - "RAM Voltage Display Mode": "Mode d'affichage de la tension RAM", - "Polling Interval": "Intervalle d'interrogation", + "Display Color Preset": "Préréglage de couleur", + "Basic": "Basique", + "Saturated": "Saturé", + "Washed": "Délavé", + "Natural": "Naturel", + "Vivid": "Vif", + "CPU Governor Minimum Frequency": "Fréquence minimale du gouverneur CPU", + " Usage of unsafe display": "L'utilisation de taux de rafraîchissement", "refresh rates may cause stress": "les taux de rafraîchissement peuvent stresser", "or damage to your display! ": "ou endommager votre écran !", "Proceed at your own risk!": "À utiliser à vos propres risques !", "Max Handheld Display": "Affichage portable max", + "Max Handheld Display Hz": "Hz max en mode portable", "Display Clock": "Fréquence d'affichage", + " Adjust the display voltage": "Réglez la tension d'affichage", + "with caution to avoid damage": "avec précaution pour éviter des dommages", + "to your display panel! ": "à votre dalle d'affichage !", + "Display Voltage": "Tension d'affichage", + + "Thermal Throttle Limit": "Limite d'étranglement thermique", "Official Rating": "Classement officiel", "TDP Threshold": "Seuil TDP", "Power": "Alimentation", - "Thermal Throttle Limit": "Limite d'étranglement thermique", "HP Mode": "Mode HP", - "Default (Mariko)": "Par défaut (Mariko)", - "Default (Erista)": "Par défaut (Erista)", - "Rating": "Évaluation", - "Safe Max (Mariko)": "Max sûr (Mariko)", - "Safe Max (Erista)": "Max sûr (Erista)", + + "DVB Shift": "Décalage DVB", + "SoC Max Volt": "Tension max SoC", + "Step Mode": "Mode pas à pas", "RAM VDD2 Voltage": "Tension RAM VDD2", - "Voltage": "Tension", "RAM VDDQ Voltage": "Tension RAM VDDQ", + "Voltage": "Tension", "RAM Frequency Editor": "Éditeur de fréquence RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Speedo élevé requis !", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)", "Ram Max Clock": "Fréquence RAM max", "RAM Latency Editor": "Éditeur de latence RAM", "RAM Timing Reductions": "Réductions des timings RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latences mémoire", "Read Latency": "Latence de lecture", "Write Latency": "Latence d'écriture", + "High speedo needed!": "Speedo élevé requis !", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Fréquence Boost CPU", "CPU UV": "UV CPU", "CPU Unlock": "Déverrouillage CPU", @@ -114,6 +136,7 @@ "CPU High UV": "UV CPU élevé", "CPU Low VMIN": "VMIN CPU faible", "CPU High VMIN": "VMIN CPU élevé", + "No Undervolt": "Aucun Undervolt", "SLT Table": "Table SLT", "HiOPT Table": "Table HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Tension GPU maximale", "GPU Voltage Offset": "Offset de tension GPU", - "Do not override": "Ne pas remplacer", - "Enabled (Default)": "Activé (par défaut)", - "96.6% limit": "Limite de 96,6 %", - "99.7% limit": "Limite de 99,7 %", - "GPU Scheduling Override": "Forçage de l'ordonnancement GPU", - "Official Service": "Service officiel", "GPU DVFS Mode": "Mode GPU DVFS", "GPU DVFS Offset": "Offset GPU DVFS", "GPU Voltage Table": "Table de tension GPU", "GPU Custom Table (mV)": "Table de GPU personnalisée (mV)", + "Official Service": "Service officiel", + "96.6% limit": "Limite de 96,6 %", + "99.7% limit": "Limite de 99,7 %", + " Setting GPU Clocks past": "Régler les fréquences GPU au-delà", + "1228MHz without a proper undervolt": "1228 MHz sans undervolt approprié", + "can cause degradation or damage": "peut causer une dégradation ou des dommages", + "to your console!": "à votre console !", "1075MHz without UV, 1152MHz on SLT": "1075 MHz sans UV, 1152 MHz sur SLT", "or 1228MHz on HiOPT can cause ": "ou 1228 MHz sur HiOPT peut causer des", "permanent damage to your Switch!": "dommages permanents à votre Switch !", "921MHz without UV and 960MHz on": "921 MHz sans UV et 960 MHz sur", - "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des" + "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des", + + "Default (Mariko)": "Par défaut (Mariko)", + "Default (Erista)": "Par défaut (Erista)", + "Rating": "Évaluation", + "Safe Max (Mariko)": "Max sûr (Mariko)", + "Safe Max (Erista)": "Max sûr (Erista)", + + "Voltages": "Tensions", + "RAM Voltage:": "Tension RAM :", + "Display Voltage:": "Tension d'affichage :", + "Temperatures": "Températures", + "PLLX Temp:": "PLLX Temp :", + "AOTAG Temp:": "AOTAG Temp :", + "BQ24193 Temp:": "BQ24193 Temp :", + "Normal": "Normal", + "Warm": "Chaud", + "Hot": "Très chaud", + "Overheat": "Surchauffe", + "Not Patched": "Non patché", + "Invalid": "Invalide", + "RAM Bandwidth": "Bande passante RAM", + "RAM BW (Peak):": "BW RAM (Pic) :", + "RAM BW (All):": "BW RAM (Tout) :", + "RAM BW (CPU):": "BW RAM (CPU) :", + "RAM BW (GPU):": "BW RAM (GPU) :", + "Hardware Info": "Infos matériel", + "Console Type:": "Type de console :", + "Speedo:": "Speedo :", + "DRAM Module: ": "Module DRAM : ", + "Software Info": "Infos logiciel", + "KIP version:": "Version KIP :", + "sys-dock status:": "Statut de sys-dock :", + "SaltyNX status:": "Statut de SaltyNX :", + "RR Display status:": "Statut de l'affichage RR :", + "Wafer Position:": "Position du wafer :", + "IDDQ:": "IDDQ :", + "Module: ": "Module :", + "Board": "Carte", + "Display": "Écran", + + "Developers": "Développeurs", + "Contributors": "Contributeurs", + "Testers": "Testeurs", + "Translators": "Traducteurs", + "Special Thanks": "Remerciements spéciaux", + + "X: %u Y: %u": "X : %u Y : %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilation avec fonctionnalités minimales", + "THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE" } diff --git a/Source/hoc-clk/overlay/lang/it.json b/Source/hoc-clk/overlay/lang/it.json index 5e65fdae..9706a9b2 100644 --- a/Source/hoc-clk/overlay/lang/it.json +++ b/Source/hoc-clk/overlay/lang/it.json @@ -1,37 +1,33 @@ { "Information": "Informazioni", - "IDDQ:": "IDDQ:", - "Module: ": "Modulo:", - "sys-dock status:": "stato di sys-dock", - "SaltyNX status:": "Stato di SaltyNX:", - "RR Display status:": "Stato del RR:", - "Wafer Position:": "Posizione nel Wafer:", - "Credits": "Crediti", - "Developers": "Sviluppatori", - "Contributors": "Collaboratori", - "Testers": "Tester", - "Special Thanks": "Un Ringraziamento Speciale", "Unknown": "Sconosciuto", "Installed": "Installato", "Not Installed": "Non installato", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE", "Default": "Predefinito", "Do Not Override": "Non Sovrascrivere", + "Do not override": "Non sovrascrivere", "Disabled": "Disabilitato", "Enabled": "Abilitato", - " \\ue0e3 Reset": "\\ue0e3 Ripristina", - "Display": "Schermo", - "Application changed\\n\\n": "Applicazione modificata\\n\\n", - "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", - "while editing was going on.": "mentre era in corso la modifica.", - "Board": "Scheda", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Abilitato (impostazione predefinita)", + "Enable": "Abilita", + "Fatal error": "Errore fatale", "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossibile connettersi al sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Assicurati che tutto sia\\n\\n", "correctly installed and enabled.": "correttamente installato e abilitato.", - "Fatal error": "Errore fatale", + + "Edit App Profile": "Modifica Profilo Dell'App", + "Edit Global Profile": "Modifica Profilo Globale", + "Temporary Overrides": "Sostituzioni Temporanee", "Temporary Overrides ": "Sostituzioni Temporanee", + "  Reset": " Ripristina", + "Settings": "Impostazioni", + "About": "A Riguardo Di", + "Credits": "Crediti", + + "Application changed\\n\\n": "Applicazione modificata\\n\\n", + "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", + "while editing was going on.": "mentre era in corso la modifica.", + "Sleep Mode": "Modalità di Sospensione", "Stock": "Originale", "Dev OC": "OC dev", @@ -40,13 +36,7 @@ "Unsafe Max": "Massimo Non Sicuro", "Absolute Max": "Massimo Assoluto", "Handheld Safe Max": "Massimo Sicuro Modalità Portatile", - "Enable": "Abilita", - "Edit App Profile": "Modifica Profilo Dell'App", - "Edit Global Profile": "Modifica Profilo Globale", - "Temporary Overrides": "Sostituzioni Temporanee", - "Settings": "Impostazioni", - "About": "A Riguardo Di", - "Compiling with minimal features": "Compilazione con funzionalità minime", + "General Settings": "Impostazioni Generali", "Governor Settings": "Impostazioni Del Governor", "Safety Settings": "Impostazioni Di Sicurezza", @@ -55,41 +45,64 @@ "CPU Settings": "Impostazioni della CPU", "GPU Settings": "Impostazioni della GPU", "Display Settings": "Impostazioni dello Schermo", + "Experimental Settings": "Impostazioni sperimentali", "Experimental": "Sperimentale", + + " Settings marked in blue": "Le impostazioni in blu", + "don't require a reboot to apply!": "non richiedono un riavvio per applicarsi!", + "You can also press  to show": "Premi anche  per mostrare", + "information about each setting.": "informazioni su ogni impostazione.", + + " Experimental Settings are incomplete ": "Le impostazioni sperimentali sono incomplete", + "and may not work correctly or at all!": "e potrebbero non funzionare correttamente!", + "Here be dragons!": "Qui ci sono draghi!", + + "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM", + "RAM Display Unit": "Unità di visualizzazione RAM", + "Polling Interval": "Intervallo di polling", + "GPU Scheduling Override Method": "Metodo di override dello scheduling GPU", + "GPU Scheduling Override": "Override dello Scheduling GPU", + "GPU Boot Volt": "Tensione di avvio GPU", + "GPU Boot Voltage": "Tensione di avvio GPU", + "Memory Frequency Measurement Mode": "Modalità di misurazione della frequenza della memoria", + " Overriding the charge current": "L'override della corrente di carica", "can be dangerous and may cause": "può essere pericoloso e può causare", "damage to your battery or charger!": "danni alla batteria o al caricabatterie!", "Charge Current Override": "Override della Corrente di Carica", - "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM", - "Polling Interval": "Intervallo di polling", + "Display Color Preset": "Preimpostazione colore", + "Basic": "Base", + "Saturated": "Saturo", + "Washed": "Sbiadito", + "Natural": "Naturale", + "Vivid": "Vivace", + "CPU Governor Minimum Frequency": "Frequenza minima del Governor della CPU", + " Usage of unsafe display": "L'uso di frequenze di aggiornamento", "refresh rates may cause stress": "le frequenze di aggiornamento possono causare stress", "or damage to your display! ": "o danni al display!", "Proceed at your own risk!": "Procedi a tuo rischio e pericolo!", "Max Handheld Display": "Display Massimo in Modalità Portatile", + "Max Handheld Display Hz": "Hz max in modalità portatile", "Display Clock": "Frequenza del Display", + " Adjust the display voltage": "Regola la tensione del display", + "with caution to avoid damage": "con cautela per evitare danni", + "to your display panel! ": "al pannello del display!", + "Display Voltage": "Tensione display", + + "Thermal Throttle Limit": "Limite Termico", "Official Rating": "Rating Ufficiale", "TDP Threshold": "Soglia TDP", "Power": "Potenza", - "Thermal Throttle Limit": "Limite Termico", "HP Mode": "Modalità HP", - "Default (Mariko)": "Predefinito (Mariko)", - "Default (Erista)": "Predefinito (Erista)", - "Rating": "Valutazione", - "Safe Max (Mariko)": "Massimo Sicuro (Mariko)", - "Safe Max (Erista)": "Massimo Sicuro (Erista)", + + "DVB Shift": "Offset DVB", + "SoC Max Volt": "Tensione massima SoC", + "Step Mode": "Modalità passo", "RAM VDD2 Voltage": "Tensione RAM VDD2", - "Voltage": "Voltaggio", "RAM VDDQ Voltage": "Voltaggio VDDQ della RAM", + "Voltage": "Voltaggio", "RAM Frequency Editor": "Editor della frequenza RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Alto Valore Speedo Necessario!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)", "Ram Max Clock": "Frequenza Massima Ram", "RAM Latency Editor": "Editor della Latenza RAM", "RAM Timing Reductions": "Riduzioni dei Timing della RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latenza della Memoria", "Read Latency": "Latenza di Lettura", "Write Latency": "Latenza di Scrittura", + "High speedo needed!": "Alto Valore Speedo Necessario!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Frequenza CPU in Boost", "CPU UV": "Undervolt CPU", "CPU Unlock": "Sblocco della CPU", @@ -114,6 +136,7 @@ "CPU High UV": "CPU UV Alta Frequenza", "CPU Low VMIN": "CPU VMIN Bassa Frequenza", "CPU High VMIN": "CPU VMIN Alta Frequenza", + "No Undervolt": "Nessun Undervolt", "SLT Table": "Tabella SLT", "HiOPT Table": "Tabella HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Voltaggio massimo della GPU", "GPU Voltage Offset": "Offset di Voltaggio della GPU", - "Do not override": "Non sovrascrivere", - "Enabled (Default)": "Abilitato (impostazione predefinita)", - "96.6% limit": "Limite del 96,6%.", - "99.7% limit": "Limite del 99,7%.", - "GPU Scheduling Override": "Override dello Scheduling GPU", - "Official Service": "Servizio ufficiale", "GPU DVFS Mode": "Modalità DVFS GPU", "GPU DVFS Offset": "Offset DVFS della GPU", "GPU Voltage Table": "Tabella delle Tensioni della GPU", "GPU Custom Table (mV)": "Tabella GPU Personalizzata (mV)", + "Official Service": "Servizio ufficiale", + "96.6% limit": "Limite del 96,6%", + "99.7% limit": "Limite del 99,7%", + " Setting GPU Clocks past": "Impostare le frequenze GPU oltre", + "1228MHz without a proper undervolt": "1228 MHz senza undervolt appropriato", + "can cause degradation or damage": "può causare degrado o danni", + "to your console!": "alla tua console!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz senza UV, 1152 MHz su SLT", "or 1228MHz on HiOPT can cause ": "o 1228 MHz su HiOPT possono causare", "permanent damage to your Switch!": "danni permanenti alla tua Switch!", "921MHz without UV and 960MHz on": "921 MHz senza UV e 960 MHz su", - "SLT or HiOPT can cause ": "SLT o HiOPT possono causare" + "SLT or HiOPT can cause ": "SLT o HiOPT possono causare", + + "Default (Mariko)": "Predefinito (Mariko)", + "Default (Erista)": "Predefinito (Erista)", + "Rating": "Valutazione", + "Safe Max (Mariko)": "Massimo Sicuro (Mariko)", + "Safe Max (Erista)": "Massimo Sicuro (Erista)", + + "Voltages": "Tensioni", + "RAM Voltage:": "Tensione RAM:", + "Display Voltage:": "Tensione display:", + "Temperatures": "Temperature", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normale", + "Warm": "Caldo", + "Hot": "Molto caldo", + "Overheat": "Surriscaldamento", + "Not Patched": "Non patchato", + "Invalid": "Non valido", + "RAM Bandwidth": "Banda RAM", + "RAM BW (Peak):": "BW RAM (Picco):", + "RAM BW (All):": "BW RAM (Tutto):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info hardware", + "Console Type:": "Tipo di console:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Modulo DRAM: ", + "Software Info": "Info software", + "KIP version:": "Versione KIP:", + "sys-dock status:": "stato di sys-dock", + "SaltyNX status:": "Stato di SaltyNX:", + "RR Display status:": "Stato del RR:", + "Wafer Position:": "Posizione nel Wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Modulo:", + "Board": "Scheda", + "Display": "Schermo", + + "Developers": "Sviluppatori", + "Contributors": "Collaboratori", + "Testers": "Tester", + "Translators": "Traduttori", + "Special Thanks": "Un Ringraziamento Speciale", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilazione con funzionalità minime", + "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE" } diff --git a/Source/hoc-clk/overlay/lang/ja.json b/Source/hoc-clk/overlay/lang/ja.json index fe415367..8dd8a981 100644 --- a/Source/hoc-clk/overlay/lang/ja.json +++ b/Source/hoc-clk/overlay/lang/ja.json @@ -1,52 +1,42 @@ { "Information": "情報", - "IDDQ:": "IDQ:", - "Module: ": "モジュール:", - "sys-dock status:": "システムドックのステータス:", - "SaltyNX status:": "SaltyNX ステータス:", - "RR Display status:": "RR 表示ステータス:", - "Wafer Position:": "ウェーハの位置:", - "Credits": "クレジット", - "Developers": "開発者", - "Contributors": "貢献者", - "Testers": "テスター", - "Special Thanks": "特別な感謝の気持ち", "Unknown": "不明", "Installed": "インストール済み", "Not Installed": "インストールされていません", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "ビール製品ライセンス", "Default": "デフォルト", "Do Not Override": "上書きしないでください", - "Disabled": "障害者", + "Do not override": "上書きしないでください", + "Disabled": "無効", "Enabled": "有効", - " \\ue0e3 Reset": "\\ue0e3 リセット", - "Display": "ディスプレイ", - "Application changed\\n\\n": "アプリケーションが変更されました\\n\\n", - "The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n", - "while editing was going on.": "編集を進めている最中でした。", - "Board": "理事会", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "有効 (デフォルト)", + "Enable": "有効にする", + "Fatal error": "致命的なエラー", "Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk sysmodule に接続できませんでした。\\n\\n", "Please make sure everything is\\n\\n": "すべてが正しいことを確認してください\\n\\n", "correctly installed and enabled.": "正しくインストールされ、有効になっています。", - "Fatal error": "致命的なエラー", + + "Edit App Profile": "アプリプロファイルの編集", + "Edit Global Profile": "グローバルプロファイルの編集", + "Temporary Overrides": "一時的なオーバーライド", "Temporary Overrides ": "一時的なオーバーライド", + "  Reset": " リセット", + "Settings": "設定", + "About": "について", + "Credits": "クレジット", + + "Application changed\\n\\n": "アプリケーションが変更されました\\n\\n", + "The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n", + "while editing was going on.": "編集を進めている最中でした。", + "Sleep Mode": "スリープモード", - "Stock": "在庫", + "Stock": "標準", "Dev OC": "開発OC", "Boost Mode": "ブーストモード", "Safe Max": "セーフマックス", "Unsafe Max": "危険なマックス", "Absolute Max": "絶対最大値", - "Handheld Safe Max": "手持ち金庫マックス", - "Enable": "有効にする", - "Edit App Profile": "アプリプロファイルの編集", - "Edit Global Profile": "グローバルプロファイルの編集", - "Temporary Overrides": "一時的なオーバーライド", - "Settings": "設定", - "About": "について", - "Compiling with minimal features": "最小限の機能でコンパイルする", + "Handheld Safe Max": "手持ち安全マックス", + "General Settings": "一般設定", "Governor Settings": "ガバナーの設定", "Safety Settings": "安全設定", @@ -55,41 +45,64 @@ "CPU Settings": "CPUの設定", "GPU Settings": "GPU設定", "Display Settings": "表示設定", + "Experimental Settings": "実験的設定", "Experimental": "実験的", + + " Settings marked in blue": "青色でマークされた設定", + "don't require a reboot to apply!": "再起動なしで適用できます!", + "You can also press  to show": " を押して表示することもできます", + "information about each setting.": "各設定の情報を。", + + " Experimental Settings are incomplete ": "実験的設定は未完成です", + "and may not work correctly or at all!": "正しく動作しない場合があります!", + "Here be dragons!": "ここにドラゴンあり!", + + "RAM Voltage Display Mode": "RAM電圧表示モード", + "RAM Display Unit": "RAM表示単位", + "Polling Interval": "ポーリング間隔", + "GPU Scheduling Override Method": "GPU スケジューリング オーバーライド メソッド", + "GPU Scheduling Override": "GPU スケジュールのオーバーライド", + "GPU Boot Volt": "GPU起動電圧", + "GPU Boot Voltage": "GPU起動電圧", + "Memory Frequency Measurement Mode": "メモリ周波数測定モード", + " Overriding the charge current": "充電電流のオーバーライド", "can be dangerous and may cause": "危険であり、原因となる可能性があります", "damage to your battery or charger!": "バッテリーまたは充電器が損傷します。", "Charge Current Override": "充電電流オーバーライド", - "RAM Voltage Display Mode": "RAM電圧表示モード", - "Polling Interval": "ポーリング間隔", + "Display Color Preset": "ディスプレイカラープリセット", + "Basic": "ベーシック", + "Saturated": "鮮やか", + "Washed": "色あせ", + "Natural": "ナチュラル", + "Vivid": "ビビッド", + "CPU Governor Minimum Frequency": "CPU ガバナの最小周波数", + " Usage of unsafe display": "危険なリフレッシュレートの使用", "refresh rates may cause stress": "リフレッシュレートがストレスを引き起こす可能性がある", "or damage to your display! ": "ディスプレイに損傷を与えてしまいます。", "Proceed at your own risk!": "自己責任で進めてください!", "Max Handheld Display": "最大ハンドヘルドディスプレイ", + "Max Handheld Display Hz": "最大ハンドヘルドHz", "Display Clock": "時計の表示", + " Adjust the display voltage": "ディスプレイ電圧を調整", + "with caution to avoid damage": "損傷を避けるため注意して", + "to your display panel! ": "ディスプレイパネルに!", + "Display Voltage": "ディスプレイ電圧", + + "Thermal Throttle Limit": "サーマルスロットル制限", "Official Rating": "公式評価", "TDP Threshold": "TDP しきい値", "Power": "パワー", - "Thermal Throttle Limit": "サーマルスロットル制限", "HP Mode": "HPモード", - "Default (Mariko)": "デフォルト(マリコ)", - "Default (Erista)": "デフォルト(エリスタ)", - "Rating": "評価", - "Safe Max (Mariko)": "セーフマックス(マリコ)", - "Safe Max (Erista)": "セーフマックス(エリスタ)", + + "DVB Shift": "DVBシフト", + "SoC Max Volt": "SoC最大電圧", + "Step Mode": "ステップモード", "RAM VDD2 Voltage": "RAM VDD2 電圧", - "Voltage": "電圧", "RAM VDDQ Voltage": "RAM VDDQ 電圧", + "Voltage": "電圧", "RAM Frequency Editor": "RAM周波数エディター", - "JEDEC.": "JEDEC。", - "High speedo needed!": "ハイスピードが必要です!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)", "Ram Max Clock": "ラムマックスクロック", "RAM Latency Editor": "RAM レイテンシ エディター", "RAM Timing Reductions": "RAM タイミングの削減", @@ -102,6 +115,15 @@ "Memory Latencies": "メモリレイテンシ", "Read Latency": "読み取りレイテンシー", "Write Latency": "書き込みレイテンシ", + "High speedo needed!": "ハイスピードが必要です!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)", + "JEDEC.": "JEDEC。", + "CPU Boost Clock": "CPUブーストクロック", "CPU UV": "CPU UV", "CPU Unlock": "CPUロック解除", @@ -111,10 +133,11 @@ "Extreme UV Table": "エクストリーム UV テーブル", "CPU UV Table": "CPU UV テーブル", "CPU Low UV": "CPU 低 UV", - "CPU High UV": "CPU 高紫外線", + "CPU High UV": "CPU 高 UV", "CPU Low VMIN": "CPU 低 VMIN", - "CPU High VMIN": "CPU の高い VMIN", - "No Undervolt": "不足電圧なし", + "CPU High VMIN": "CPU 高 VMIN", + + "No Undervolt": "アンダーボルトなし", "SLT Table": "SLTテーブル", "HiOPT Table": "HiOPT テーブル", "GPU Undervolt Table": "GPUアンダーボルトテーブル", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU最大電圧", "GPU Voltage Offset": "GPU電圧オフセット", - "Do not override": "上書きしないでください", - "Enabled (Default)": "有効 (デフォルト)", - "96.6% limit": "96.6%制限", - "99.7% limit": "99.7%制限", - "GPU Scheduling Override": "GPU スケジュールのオーバーライド", - "Official Service": "正式サービス", "GPU DVFS Mode": "GPU DVFS モード", "GPU DVFS Offset": "GPU DVFS オフセット", "GPU Voltage Table": "GPU電圧テーブル", "GPU Custom Table (mV)": "GPUカスタムテーブル(mV)", + "Official Service": "正式サービス", + "96.6% limit": "96.6%制限", + "99.7% limit": "99.7%制限", + " Setting GPU Clocks past": "GPUクロックを超えて設定", + "1228MHz without a proper undervolt": "適切なアンダーボルトなしで1228MHz", + "can cause degradation or damage": "劣化や損傷を引き起こす可能性があります", + "to your console!": "あなたのコンソールに!", "1075MHz without UV, 1152MHz on SLT": "UVなしで1075MHz、SLTで1152MHz", - "or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると、次のような問題が発生する可能性があります。", + "or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると問題が発生する可能性があります。", "permanent damage to your Switch!": "Switch に永久的なダメージを与えます!", "921MHz without UV and 960MHz on": "921MHz(UVなし)、960MHz(UVあり)", - "SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります" + "SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります", + + "Default (Mariko)": "デフォルト(マリコ)", + "Default (Erista)": "デフォルト(エリスタ)", + "Rating": "評価", + "Safe Max (Mariko)": "セーフマックス(マリコ)", + "Safe Max (Erista)": "セーフマックス(エリスタ)", + + "Voltages": "電圧", + "RAM Voltage:": "RAM電圧:", + "Display Voltage:": "ディスプレイ電圧:", + "Temperatures": "温度", + "PLLX Temp:": "PLLX 温度:", + "AOTAG Temp:": "AOTAG 温度:", + "BQ24193 Temp:": "BQ24193 温度:", + "Normal": "正常", + "Warm": "温かい", + "Hot": "熱い", + "Overheat": "過熱", + "Not Patched": "パッチなし", + "Invalid": "無効", + "RAM Bandwidth": "RAM帯域幅", + "RAM BW (Peak):": "RAM帯域(最大):", + "RAM BW (All):": "RAM帯域(全):", + "RAM BW (CPU):": "RAM帯域(CPU):", + "RAM BW (GPU):": "RAM帯域(GPU):", + "Hardware Info": "ハードウェア情報", + "Console Type:": "コンソールタイプ:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAMモジュール: ", + "Software Info": "ソフトウェア情報", + "KIP version:": "KIPバージョン:", + "sys-dock status:": "システムドックのステータス:", + "SaltyNX status:": "SaltyNX ステータス:", + "RR Display status:": "RR 表示ステータス:", + "Wafer Position:": "ウェーハの位置:", + "IDDQ:": "IDQ:", + "Module: ": "モジュール:", + "Board": "理事会", + "Display": "ディスプレイ", + + "Developers": "開発者", + "Contributors": "貢献者", + "Testers": "テスター", + "Translators": "翻訳者", + "Special Thanks": "特別な感謝の気持ち", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "最小限の機能でコンパイルする", + "THE BEER-WARE LICENSE": "ビール製品ライセンス" } diff --git a/Source/hoc-clk/overlay/lang/ko.json b/Source/hoc-clk/overlay/lang/ko.json index 09e73e66..8865d37f 100644 --- a/Source/hoc-clk/overlay/lang/ko.json +++ b/Source/hoc-clk/overlay/lang/ko.json @@ -1,52 +1,42 @@ { "Information": "정보", - "IDDQ:": "IDDQ:", - "Module: ": "모듈:", - "sys-dock status:": "sys-dock 상태:", - "SaltyNX status:": "SaltyNX 상태:", - "RR Display status:": "RR 표시 상태:", - "Wafer Position:": "웨이퍼 위치:", - "Credits": "크레딧", - "Developers": "개발자", - "Contributors": "기여자", - "Testers": "테스터", - "Special Thanks": "특별한 분", "Unknown": "알 수 없음", "Installed": "설치됨", "Not Installed": "설치되지 않음", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "맥주 제품 라이센스", "Default": "기본값", "Do Not Override": "재정의하지 마십시오", + "Do not override": "재정의하지 않음", "Disabled": "비활성화", "Enabled": "활성화됨", - " \\ue0e3 Reset": "\\ue0e3 재설정", - "Display": "디스플레이", - "Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n", - "The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n", - "while editing was going on.": "편집이 진행되는 동안.", - "Board": "보드", - "%u.%u%u mV": "%u.%u%umV", + "Enabled (Default)": "활성화됨(기본값)", + "Enable": "활성화", + "Fatal error": "치명적인 오류", "Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk 시스템 모듈에 연결할 수 없습니다.\\n\\n", "Please make sure everything is\\n\\n": "모든 것이 올바른지 확인하십시오.\\n\\n", "correctly installed and enabled.": "올바르게 설치되고 활성화되었습니다.", - "Fatal error": "치명적인 오류", + + "Edit App Profile": "앱 프로필 편집", + "Edit Global Profile": "글로벌 프로필 편집", + "Temporary Overrides": "임시 재정의", "Temporary Overrides ": "임시 재정의", + "  Reset": " 재설정", + "Settings": "설정", + "About": "소개", + "Credits": "크레딧", + + "Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n", + "The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n", + "while editing was going on.": "편집이 진행되는 동안.", + "Sleep Mode": "절전 모드", - "Stock": "주식", + "Stock": "기본 설정", "Dev OC": "개발 OC", - "Overwrite Boost Mode": "부스트 모드 덮어쓰기", + "Boost Mode": "부스트 모드", "Safe Max": "안전함 최대값", "Unsafe Max": "불안정 최대값", "Absolute Max": "절대 최대값", "Handheld Safe Max": "휴대모드 안전함 최대값", - "Enable": "활성화", - "Edit App Profile": "앱 프로필 편집", - "Edit Global Profile": "글로벌 프로필 편집", - "Temporary Overrides": "임시 재정의", - "Settings": "설정", - "About": "소개", - "Compiling with minimal features": "최소한의 기능으로 컴파일하기", + "General Settings": "일반 설정", "Governor Settings": "거버너 설정", "Safety Settings": "안전 설정", @@ -55,41 +45,64 @@ "CPU Settings": "CPU 설정", "GPU Settings": "GPU 설정", "Display Settings": "디스플레이 설정", + "Experimental Settings": "실험적 설정", "Experimental": "실험적", + + " Settings marked in blue": "파란색으로 표시된 설정은", + "don't require a reboot to apply!": "재부팅 없이 적용됩니다!", + "You can also press  to show": "을 눌러 표시할 수도 있습니다", + "information about each setting.": "각 설정에 대한 정보를.", + + " Experimental Settings are incomplete ": "실험적 설정은 미완성입니다", + "and may not work correctly or at all!": "올바르게 작동하지 않을 수 있습니다!", + "Here be dragons!": "여기에 드래곤이 있습니다!", + + "RAM Voltage Display Mode": "RAM 전압 표시 모드", + "RAM Display Unit": "RAM 표시 단위", + "Polling Interval": "폴링 간격", + "GPU Scheduling Override Method": "GPU 스케줄링 재정의 방법", + "GPU Scheduling Override": "GPU 스케줄링 재정의", + "GPU Boot Volt": "GPU 부팅 전압", + "GPU Boot Voltage": "GPU 부팅 전압", + "Memory Frequency Measurement Mode": "메모리 주파수 측정 모드", + " Overriding the charge current": "충전 전류 오버라이드", "can be dangerous and may cause": "위험할 수 있고 원인이 될 수 있습니다.", "damage to your battery or charger!": "배터리나 충전기가 손상되었습니다!", "Charge Current Override": "충전 전류 오버라이드", - "RAM Voltage Display Mode": "RAM 전압 표시 모드", - "Polling Interval": "폴링 간격", + "Display Color Preset": "디스플레이 색상 프리셋", + "Basic": "기본", + "Saturated": "채도 높음", + "Washed": "연한색", + "Natural": "자연스러움", + "Vivid": "선명함", + "CPU Governor Minimum Frequency": "CPU 거버너 최소 주파수", + " Usage of unsafe display": "안전하지 않은 주사율 사용", "refresh rates may cause stress": "디스플레이 주사율 빈도 변경은", "or damage to your display! ": "기기에 손상이 발생될 수 있습니다!", "Proceed at your own risk!": "책임하에 주의해서 사용하십시오!", "Max Handheld Display": "최대 휴대용 디스플레이", + "Max Handheld Display Hz": "최대 휴대용 Hz", "Display Clock": "디스플레이 클럭", + " Adjust the display voltage": "디스플레이 전압 조정", + "with caution to avoid damage": "손상을 피하기 위해 주의하여", + "to your display panel! ": "디스플레이 패널에!", + "Display Voltage": "디스플레이 전압", + + "Thermal Throttle Limit": "열 스로틀 한계", "Official Rating": "공식 등급", "TDP Threshold": "TDP 임계값", "Power": "힘", - "Thermal Throttle Limit": "열 스로틀 한계", "HP Mode": "HP 모드", - "Default (Mariko)": "기본값(마리코)", - "Default (Erista)": "기본값(에리스타)", - "Rating": "표준값", - "Safe Max (Mariko)": "안전함 최대치(마리코)", - "Safe Max (Erista)": "안전함 최대치(에리스타)", + + "DVB Shift": "DVB 시프트", + "SoC Max Volt": "SoC 최대 전압", + "Step Mode": "스텝 모드", "RAM VDD2 Voltage": "RAM VDD2 전압", - "Voltage": "전압", "RAM VDDQ Voltage": "RAM VDDQ 전압", + "Voltage": "전압", "RAM Frequency Editor": "RAM 주파수 편집기", - "JEDEC.": "JEDEC.", - "High speedo needed!": "높은 스피도값이 필요합니다!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (말도 안 되는 Speedo/PLL 필요)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)", "Ram Max Clock": "RAM 최대 클럭", "RAM Latency Editor": "RAM 지연 시간 편집기", "RAM Timing Reductions": "RAM 타이밍 편집기", @@ -102,6 +115,15 @@ "Memory Latencies": "메모리 지연 시간", "Read Latency": "읽기 지연 시간", "Write Latency": "쓰기 지연 시간", + "High speedo needed!": "높은 스피도값이 필요합니다!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(터무니없는 Speedo/PLL 필요)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU 부스트 클럭", "CPU UV": "CPU 언더볼트", "CPU Unlock": "CPU 잠금 해제", @@ -114,6 +136,7 @@ "CPU High UV": "CPU 고주파 언더볼트", "CPU Low VMIN": "CPU 저주파 최소 전압", "CPU High VMIN": "CPU 고주파 최소 전압", + "No Undervolt": "언더볼트 없음", "SLT Table": "SLT 테이블", "HiOPT Table": "HiOPT 테이블", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU 최대 전압", "GPU Voltage Offset": "GPU 전압 오프셋", - "Do not override": "재정의하지 않음", - "Enabled (Default)": "활성화됨(기본값)", - "96.6% limit": "96.6% 한도", - "99.7% limit": "99.7% 한도", - "GPU Scheduling Override": "GPU 스케줄링 재정의", - "Official Service": "공식 서비스", "GPU DVFS Mode": "GPU DVFS 모드", "GPU DVFS Offset": "GPU DVFS 오프셋", "GPU Voltage Table": "GPU 전압 테이블", "GPU Custom Table (mV)": "GPU 사용자 정의 테이블(mV)", + "Official Service": "공식 서비스", + "96.6% limit": "96.6% 한도", + "99.7% limit": "99.7% 한도", + " Setting GPU Clocks past": "GPU 클럭을 초과 설정", + "1228MHz without a proper undervolt": "적절한 언더볼트 없이 1228MHz", + "can cause degradation or damage": "열화 또는 손상을 유발할 수 있습니다", + "to your console!": "콘솔에!", "1075MHz without UV, 1152MHz on SLT": "UV 없이 1075MHz, SLT에서 1152MHz", "or 1228MHz on HiOPT can cause ": "또는 HiOPT에서 1228MHz를 사용하면", "permanent damage to your Switch!": "스위치가 영구적으로 손상될 수 있습니다!", "921MHz without UV and 960MHz on": "UV가 없는 경우 921MHz, 켜진 경우에는 960MHz", - "SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다." + "SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다.", + + "Default (Mariko)": "기본값(마리코)", + "Default (Erista)": "기본값(에리스타)", + "Rating": "표준값", + "Safe Max (Mariko)": "안전함 최대치(마리코)", + "Safe Max (Erista)": "안전함 최대치(에리스타)", + + "Voltages": "전압", + "RAM Voltage:": "RAM 전압:", + "Display Voltage:": "디스플레이 전압:", + "Temperatures": "온도", + "PLLX Temp:": "PLLX 온도:", + "AOTAG Temp:": "AOTAG 온도:", + "BQ24193 Temp:": "BQ24193 온도:", + "Normal": "정상", + "Warm": "따뜻함", + "Hot": "뜨거움", + "Overheat": "과열", + "Not Patched": "패치 안 됨", + "Invalid": "유효하지 않음", + "RAM Bandwidth": "RAM 대역폭", + "RAM BW (Peak):": "RAM 대역폭 (최대):", + "RAM BW (All):": "RAM 대역폭 (전체):", + "RAM BW (CPU):": "RAM 대역폭 (CPU):", + "RAM BW (GPU):": "RAM 대역폭 (GPU):", + "Hardware Info": "하드웨어 정보", + "Console Type:": "콘솔 유형:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 모듈: ", + "Software Info": "소프트웨어 정보", + "KIP version:": "KIP 버전:", + "sys-dock status:": "sys-dock 상태:", + "SaltyNX status:": "SaltyNX 상태:", + "RR Display status:": "RR 표시 상태:", + "Wafer Position:": "웨이퍼 위치:", + "IDDQ:": "IDDQ:", + "Module: ": "모듈:", + "Board": "보드", + "Display": "디스플레이", + + "Developers": "개발자", + "Contributors": "기여자", + "Testers": "테스터", + "Translators": "번역자", + "Special Thanks": "특별한 분", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%umV", + "Compiling with minimal features": "최소한의 기능으로 컴파일하기", + "THE BEER-WARE LICENSE": "맥주 제품 라이센스" } diff --git a/Source/hoc-clk/overlay/lang/nl.json b/Source/hoc-clk/overlay/lang/nl.json index 1005d3c2..5095d2be 100644 --- a/Source/hoc-clk/overlay/lang/nl.json +++ b/Source/hoc-clk/overlay/lang/nl.json @@ -1,52 +1,42 @@ { "Information": "Informatie", - "IDDQ:": "IDDQ:", - "Module: ": "module:", - "sys-dock status:": "sys-dock-status:", - "SaltyNX status:": "SaltyNX-status:", - "RR Display status:": "RR Weergavestatus:", - "Wafer Position:": "Waferpositie:", - "Credits": "Kredieten", - "Developers": "Ontwikkelaars", - "Contributors": "Bijdragers", - "Testers": "Testers", - "Special Thanks": "Speciale dank", "Unknown": "Onbekend", "Installed": "Geïnstalleerd", "Not Installed": "Niet geïnstalleerd", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN", "Default": "Standaard", "Do Not Override": "Niet overschrijven", + "Do not override": "Niet overschrijven", "Disabled": "Uitgeschakeld", "Enabled": "Ingeschakeld", - " \\ue0e3 Reset": "\\ue0e3 Opnieuw instellen", - "Display": "Weergave", - "Application changed\\n\\n": "Applicatie gewijzigd\\n\\n", - "The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n", - "while editing was going on.": "terwijl er werd bewerkt.", - "Board": "Bord", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Ingeschakeld (standaard)", + "Enable": "Inschakelen", + "Fatal error": "Fatale fout", "Could not connect to hoc-clk sysmodule.\\n\\n": "Kan geen verbinding maken met hoc-clk sysmodule.\\n\\n", "Please make sure everything is\\n\\n": "Zorg ervoor dat alles in orde is\\n\\n", "correctly installed and enabled.": "correct geïnstalleerd en ingeschakeld.", - "Fatal error": "Fatale fout", + + "Edit App Profile": "App-profiel bewerken", + "Edit Global Profile": "Globaal profiel bewerken", + "Temporary Overrides": "Tijdelijke overschrijvingen", "Temporary Overrides ": "Tijdelijke overschrijvingen", + "  Reset": " Opnieuw instellen", + "Settings": "Instellingen", + "About": "Over", + "Credits": "Kredieten", + + "Application changed\\n\\n": "Applicatie gewijzigd\\n\\n", + "The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n", + "while editing was going on.": "terwijl er werd bewerkt.", + "Sleep Mode": "Slaapmodus", "Stock": "Voorraad", "Dev OC": "Ontwikkelaar OC", "Boost Mode": "Boost-modus", "Safe Max": "Veilig Max", - "Unsafe Max": "OnveiligMax", + "Unsafe Max": "Onveilig Max", "Absolute Max": "Absoluut Max", - "Handheld Safe Max": "Handkluis Max", - "Enable": "Inschakelen", - "Edit App Profile": "App-profiel bewerken", - "Edit Global Profile": "Globaal profiel bewerken", - "Temporary Overrides": "Tijdelijke overschrijvingen", - "Settings": "Instellingen", - "About": "Over", - "Compiling with minimal features": "Compileren met minimale functies", + "Handheld Safe Max": "Handheld Veilig Max", + "General Settings": "Algemene instellingen", "Governor Settings": "Gouverneur instellingen", "Safety Settings": "Veiligheidsinstellingen", @@ -55,41 +45,64 @@ "CPU Settings": "CPU-instellingen", "GPU Settings": "GPU-instellingen", "Display Settings": "Weergave-instellingen", + "Experimental Settings": "Experimentele instellingen", "Experimental": "Experimenteel", + + " Settings marked in blue": "In blauw gemarkeerde instellingen", + "don't require a reboot to apply!": "vereisen geen herstart om toe te passen!", + "You can also press  to show": "Druk ook op  om te tonen", + "information about each setting.": "informatie over elke instelling.", + + " Experimental Settings are incomplete ": "Experimentele instellingen zijn onvolledig", + "and may not work correctly or at all!": "en werken mogelijk helemaal niet!", + "Here be dragons!": "Hier zijn draken!", + + "RAM Voltage Display Mode": "Weergavemodus RAM-spanning", + "RAM Display Unit": "RAM-weergave-eenheid", + "Polling Interval": "Polling-interval", + "GPU Scheduling Override Method": "Methode voor het overschrijven van GPU-planning", + "GPU Scheduling Override": "GPU-planning negeren", + "GPU Boot Volt": "GPU opstartspanning", + "GPU Boot Voltage": "GPU opstartspanning", + "Memory Frequency Measurement Mode": "Geheugenfrequentie-meetmodus", + " Overriding the charge current": "Het overschrijven van de laadstroom", "can be dangerous and may cause": "kan gevaarlijk zijn en kan veroorzaken", "damage to your battery or charger!": "schade aan uw accu of lader!", "Charge Current Override": "Laadstroom overschrijven", - "RAM Voltage Display Mode": "Weergavemodus RAM-spanning", - "Polling Interval": "Polling-interval", + "Display Color Preset": "Kleurvoorinstelling", + "Basic": "Basis", + "Saturated": "Verzadigd", + "Washed": "Uitgewassen", + "Natural": "Natuurlijk", + "Vivid": "Levendig", + "CPU Governor Minimum Frequency": "Minimale frequentie CPU-regelaar", + " Usage of unsafe display": "Het gebruik van onveilige schermfrequenties", "refresh rates may cause stress": "vernieuwingsfrequenties kunnen stress veroorzaken", "or damage to your display! ": "of schade aan uw display!", "Proceed at your own risk!": "Ga verder op eigen risico!", "Max Handheld Display": "Maximaal handheld-display", + "Max Handheld Display Hz": "Max handheld Hz", "Display Clock": "Klok weergeven", + " Adjust the display voltage": "Pas de displayspanning aan", + "with caution to avoid damage": "met voorzichtigheid om schade te vermijden", + "to your display panel! ": "van uw beeldschermpaneel!", + "Display Voltage": "Displayspanning", + + "Thermal Throttle Limit": "Thermische gaslimiet", "Official Rating": "Officiële beoordeling", "TDP Threshold": "TDP-drempel", "Power": "Macht", - "Thermal Throttle Limit": "Thermische gaslimiet", "HP Mode": "HP-modus", - "Default (Mariko)": "Standaard (Mariko)", - "Default (Erista)": "Standaard (Erista)", - "Rating": "Beoordeling", - "Safe Max (Mariko)": "Veilig Max (Mariko)", - "Safe Max (Erista)": "Veilige Max (Erista)", + + "DVB Shift": "DVB-verschuiving", + "SoC Max Volt": "SoC max spanning", + "Step Mode": "Stappmodus", "RAM VDD2 Voltage": "RAM VDD2-spanning", - "Voltage": "Spanning", "RAM VDDQ Voltage": "RAM VDDQ-spanning", + "Voltage": "Spanning", "RAM Frequency Editor": "RAM-frequentie-editor", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Hoge snelheid nodig!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme snelheidsmeter/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme snelheidsmeter/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme snelheidsmeter/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", "Ram Max Clock": "Ram Max-klok", "RAM Latency Editor": "RAM-latentie-editor", "RAM Timing Reductions": "RAM-timingreducties", @@ -102,6 +115,15 @@ "Memory Latencies": "Geheugenlatenties", "Read Latency": "Lees Latentie", "Write Latency": "Schrijf latentie", + "High speedo needed!": "Hoge Speedo-waarde nodig!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke Speedo/PLL nodig)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke Speedo/PLL nodig)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke Speedo/PLL nodig)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU-boostklok", "CPU UV": "CPU-UV", "CPU Unlock": "CPU-ontgrendeling", @@ -114,6 +136,7 @@ "CPU High UV": "CPU Hoge UV", "CPU Low VMIN": "CPU Lage VMIN", "CPU High VMIN": "CPU Hoge VMIN", + "No Undervolt": "Geen ondervolt", "SLT Table": "SLT-tabel", "HiOPT Table": "HiOPT-tabel", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU-VMIN", "GPU Maximum Voltage": "GPU maximale spanning", "GPU Voltage Offset": "GPU-spanningsoffset", - "Do not override": "Niet overschrijven", - "Enabled (Default)": "Ingeschakeld (standaard)", - "96.6% limit": "96,6% limiet", - "99.7% limit": "99,7% limiet", - "GPU Scheduling Override": "GPU-planning negeren", - "Official Service": "Officiële dienst", "GPU DVFS Mode": "GPU DVFS-modus", "GPU DVFS Offset": "GPU DVFS-offset", "GPU Voltage Table": "GPU-spanningstabel", "GPU Custom Table (mV)": "Aangepaste GPU-tabel (mV)", + "Official Service": "Officiële dienst", + "96.6% limit": "96,6% limiet", + "99.7% limit": "99,7% limiet", + " Setting GPU Clocks past": "GPU-klokken instellen voorbij", + "1228MHz without a proper undervolt": "1228MHz zonder goede onderspanning", + "can cause degradation or damage": "kan degradatie of schade veroorzaken", + "to your console!": "aan uw console!", "1075MHz without UV, 1152MHz on SLT": "1075MHz zonder UV, 1152MHz op SLT", "or 1228MHz on HiOPT can cause ": "of 1228MHz op HiOPT kan dit veroorzaken", "permanent damage to your Switch!": "blijvende schade aan uw Switch!", "921MHz without UV and 960MHz on": "921MHz zonder UV en 960MHz aan", - "SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken" + "SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken", + + "Default (Mariko)": "Standaard (Mariko)", + "Default (Erista)": "Standaard (Erista)", + "Rating": "Beoordeling", + "Safe Max (Mariko)": "Veilig Max (Mariko)", + "Safe Max (Erista)": "Veilige Max (Erista)", + + "Voltages": "Spanningen", + "RAM Voltage:": "RAM-spanning:", + "Display Voltage:": "Displayspanning:", + "Temperatures": "Temperaturen", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normaal", + "Warm": "Warm", + "Hot": "Heet", + "Overheat": "Oververhitting", + "Not Patched": "Niet gepatcht", + "Invalid": "Ongeldig", + "RAM Bandwidth": "RAM-bandbreedte", + "RAM BW (Peak):": "RAM-BW (Piek):", + "RAM BW (All):": "RAM-BW (Alle):", + "RAM BW (CPU):": "RAM-BW (CPU):", + "RAM BW (GPU):": "RAM-BW (GPU):", + "Hardware Info": "Hardware-info", + "Console Type:": "Consoletype:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM-module: ", + "Software Info": "Software-info", + "KIP version:": "KIP-versie:", + "sys-dock status:": "sys-dock-status:", + "SaltyNX status:": "SaltyNX-status:", + "RR Display status:": "RR Weergavestatus:", + "Wafer Position:": "Waferpositie:", + "IDDQ:": "IDDQ:", + "Module: ": "module:", + "Board": "Bord", + "Display": "Weergave", + + "Developers": "Ontwikkelaars", + "Contributors": "Bijdragers", + "Testers": "Testers", + "Translators": "Vertalers", + "Special Thanks": "Speciale dank", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compileren met minimale functies", + "THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN" } diff --git a/Source/hoc-clk/overlay/lang/pl.json b/Source/hoc-clk/overlay/lang/pl.json index 1233aa93..eecc5071 100644 --- a/Source/hoc-clk/overlay/lang/pl.json +++ b/Source/hoc-clk/overlay/lang/pl.json @@ -1,37 +1,33 @@ { "Information": "Informacje", - "IDDQ:": "IDDQ:", - "Module: ": "Moduł:", - "sys-dock status:": "stan sys-dock:", - "SaltyNX status:": "Stan SaltyNX:", - "RR Display status:": "Stan wyświetlacza:", - "Wafer Position:": "Pozycja wafla:", - "Credits": "Kredyty", - "Developers": "Deweloperzy", - "Contributors": "Współautorzy", - "Testers": "Testery", - "Special Thanks": "Specjalne podziękowania", "Unknown": "Nieznany", "Installed": "Zainstalowany", "Not Installed": "Nie zainstalowano", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE", "Default": "Domyślne", "Do Not Override": "Nie zastępuj", - "Disabled": "Niepełnosprawny", + "Do not override": "Nie zastępuj", + "Disabled": "Wyłączony", "Enabled": "Włączone", - " \\ue0e3 Reset": "\\ue0e3 Zresetuj", - "Display": "Wyświetlacz", - "Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n", - "The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n", - "while editing was going on.": "podczas gdy edycja była w toku.", - "Board": "Deska", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Włączone (domyślnie)", + "Enable": "Włącz", + "Fatal error": "Fatalny błąd", "Could not connect to hoc-clk sysmodule.\\n\\n": "Nie można połączyć się z modułem sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Upewnij się, że wszystko jest\\n\\n", "correctly installed and enabled.": "poprawnie zainstalowany i włączony.", - "Fatal error": "Fatalny błąd", + + "Edit App Profile": "Edytuj profil aplikacji", + "Edit Global Profile": "Edytuj profil globalny", + "Temporary Overrides": "Tymczasowe nadpisania", "Temporary Overrides ": "Tymczasowe nadpisania", + "  Reset": " Zresetuj", + "Settings": "Ustawienia", + "About": "O", + "Credits": "Kredyty", + + "Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n", + "The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n", + "while editing was going on.": "podczas gdy edycja była w toku.", + "Sleep Mode": "Tryb uśpienia", "Stock": "Zapas", "Dev OC": "Dev OC", @@ -39,14 +35,8 @@ "Safe Max": "Bezpieczny maks", "Unsafe Max": "Niebezpieczny maks", "Absolute Max": "Absolutny maks", - "Handheld Safe Max": "Sejf ręczny Max", - "Enable": "Włącz", - "Edit App Profile": "Edytuj profil aplikacji", - "Edit Global Profile": "Edytuj profil globalny", - "Temporary Overrides": "Tymczasowe nadpisania", - "Settings": "Ustawienia", - "About": "O", - "Compiling with minimal features": "Kompilacja z minimalnymi funkcjami", + "Handheld Safe Max": "Przenośny bezpieczny maks", + "General Settings": "Ustawienia ogólne", "Governor Settings": "Ustawienia gubernatora", "Safety Settings": "Ustawienia bezpieczeństwa", @@ -55,41 +45,64 @@ "CPU Settings": "Ustawienia procesora", "GPU Settings": "Ustawienia GPU", "Display Settings": "Ustawienia wyświetlania", + "Experimental Settings": "Ustawienia eksperymentalne", "Experimental": "Eksperymentalny", + + " Settings marked in blue": "Ustawienia zaznaczone na niebiesko", + "don't require a reboot to apply!": "nie wymagają ponownego uruchomienia!", + "You can also press  to show": "Możesz też wcisnąć  aby wyświetlić", + "information about each setting.": "informacje o każdym ustawieniu.", + + " Experimental Settings are incomplete ": "Ustawienia eksperymentalne są niekompletne", + "and may not work correctly or at all!": "i mogą w ogóle nie działać!", + "Here be dragons!": "Tu są smoki!", + + "RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM", + "RAM Display Unit": "Jednostka wyświetlania RAM", + "Polling Interval": "Interwał odpytywania", + "GPU Scheduling Override Method": "Metoda obejścia harmonogramu GPU", + "GPU Scheduling Override": "Zastąpienie harmonogramu GPU", + "GPU Boot Volt": "Napięcie startowe GPU", + "GPU Boot Voltage": "Napięcie startowe GPU", + "Memory Frequency Measurement Mode": "Tryb pomiaru częstotliwości pamięci", + " Overriding the charge current": "Nadpisanie prądu ładowania", "can be dangerous and may cause": "może być niebezpieczne i powodować", "damage to your battery or charger!": "uszkodzenie akumulatora lub ładowarki!", "Charge Current Override": "Obejście prądu ładowania", - "RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM", - "Polling Interval": "Interwał odpytywania", + "Display Color Preset": "Preset koloru", + "Basic": "Podstawowy", + "Saturated": "Nasycony", + "Washed": "Wyblakły", + "Natural": "Naturalny", + "Vivid": "Żywy", + "CPU Governor Minimum Frequency": "Minimalna częstotliwość regulatora procesora", + " Usage of unsafe display": "Użycie niebezpiecznych częstotliwości", "refresh rates may cause stress": "częstotliwości odświeżania mogą powodować stres", "or damage to your display! ": "lub uszkodzenie wyświetlacza!", "Proceed at your own risk!": "Postępuj na własne ryzyko!", "Max Handheld Display": "Maksymalny wyświetlacz ręczny", + "Max Handheld Display Hz": "Maks. Hz w trybie przenośnym", "Display Clock": "Wyświetl zegar", + " Adjust the display voltage": "Dostosuj napięcie wyświetlacza", + "with caution to avoid damage": "ostrożnie, aby uniknąć uszkodzeń", + "to your display panel! ": "panelu wyświetlacza!", + "Display Voltage": "Napięcie wyświetlacza", + + "Thermal Throttle Limit": "Limit przepustnicy termicznej", "Official Rating": "Oficjalna ocena", "TDP Threshold": "Próg TDP", "Power": "Moc", - "Thermal Throttle Limit": "Limit przepustnicy termicznej", "HP Mode": "Tryb HP", - "Default (Mariko)": "Domyślny (Mariko)", - "Default (Erista)": "Domyślny (Erista)", - "Rating": "Ocena", - "Safe Max (Mariko)": "Bezpieczny Max (Mariko)", - "Safe Max (Erista)": "Bezpieczny Max (Erista)", + + "DVB Shift": "Przesunięcie DVB", + "SoC Max Volt": "Maks. napięcie SoC", + "Step Mode": "Tryb krokowy", "RAM VDD2 Voltage": "Napięcie pamięci RAM VDD2", - "Voltage": "Napięcie", "RAM VDDQ Voltage": "Napięcie RAM VDDQ", + "Voltage": "Napięcie", "RAM Frequency Editor": "Edytor częstotliwości RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Potrzebna duża prędkość!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)", "Ram Max Clock": "Zegar Ram Max", "RAM Latency Editor": "Edytor opóźnień pamięci RAM", "RAM Timing Reductions": "Zmniejszenie taktowania pamięci RAM", @@ -100,8 +113,17 @@ "t7 tWTR Fine Tune": "t7 tWTR Dostosuj", "tWTR Fine Tune": "tWTR Dostosuj", "Memory Latencies": "Opóźnienia pamięci", - "Read Latency": "Przeczytaj Opóźnienie", + "Read Latency": "Opóźnienie odczytu", "Write Latency": "Opóźnienie zapisu", + "High speedo needed!": "Potrzebna duża wartość Speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Zegar wzmocnienia procesora", "CPU UV": "Procesor UV", "CPU Unlock": "Odblokowanie procesora", @@ -114,6 +136,7 @@ "CPU High UV": "Wysokie promieniowanie UV procesora", "CPU Low VMIN": "Niski poziom VMIN procesora", "CPU High VMIN": "Wysoki poziom VMIN procesora", + "No Undervolt": "Brak Undervolta", "SLT Table": "Stół SLT", "HiOPT Table": "Stół HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "VMIN GPU", "GPU Maximum Voltage": "Maksymalne napięcie procesora graficznego", "GPU Voltage Offset": "Przesunięcie napięcia GPU", - "Do not override": "Nie zastępuj", - "Enabled (Default)": "Włączone (domyślnie)", - "96.6% limit": "Limit 96,6%.", - "99.7% limit": "Limit 99,7%.", - "GPU Scheduling Override": "Zastąpienie harmonogramu GPU", - "Official Service": "Oficjalny serwis", "GPU DVFS Mode": "Tryb DVFS procesora graficznego", "GPU DVFS Offset": "Przesunięcie DVFS GPU", "GPU Voltage Table": "Tabela napięć GPU", "GPU Custom Table (mV)": "Tabela niestandardowa GPU (mV)", + "Official Service": "Oficjalny serwis", + "96.6% limit": "Limit 96,6%", + "99.7% limit": "Limit 99,7%", + " Setting GPU Clocks past": "Ustawianie zegarów GPU powyżej", + "1228MHz without a proper undervolt": "1228 MHz bez odpowiedniego undervolta", + "can cause degradation or damage": "może powodować degradację lub uszkodzenia", + "to your console!": "Twoją konsolę!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz bez UV, 1152 MHz na SLT", "or 1228MHz on HiOPT can cause ": "lub 1228 MHz na HiOPT może powodować", "permanent damage to your Switch!": "trwałe uszkodzenie Switcha!", "921MHz without UV and 960MHz on": "921 MHz bez UV i 960 MHz włączone", - "SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT" + "SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT", + + "Default (Mariko)": "Domyślny (Mariko)", + "Default (Erista)": "Domyślny (Erista)", + "Rating": "Ocena", + "Safe Max (Mariko)": "Bezpieczny Max (Mariko)", + "Safe Max (Erista)": "Bezpieczny Max (Erista)", + + "Voltages": "Napięcia", + "RAM Voltage:": "Napięcie RAM:", + "Display Voltage:": "Napięcie wyświetlacza:", + "Temperatures": "Temperatury", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normalny", + "Warm": "Ciepły", + "Hot": "Gorący", + "Overheat": "Przegrzanie", + "Not Patched": "Bez patcha", + "Invalid": "Nieprawidłowy", + "RAM Bandwidth": "Przepustowość RAM", + "RAM BW (Peak):": "BW RAM (Maks.):", + "RAM BW (All):": "BW RAM (Wszys.):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info o sprzęcie", + "Console Type:": "Typ konsoli:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Moduł DRAM: ", + "Software Info": "Info o oprogramowaniu", + "KIP version:": "Wersja KIP:", + "sys-dock status:": "stan sys-dock:", + "SaltyNX status:": "Stan SaltyNX:", + "RR Display status:": "Stan wyświetlacza:", + "Wafer Position:": "Pozycja wafla:", + "IDDQ:": "IDDQ:", + "Module: ": "Moduł:", + "Board": "Deska", + "Display": "Wyświetlacz", + + "Developers": "Deweloperzy", + "Contributors": "Współautorzy", + "Testers": "Testery", + "Translators": "Tłumacze", + "Special Thanks": "Specjalne podziękowania", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Kompilacja z minimalnymi funkcjami", + "THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE" } diff --git a/Source/hoc-clk/overlay/lang/pt.json b/Source/hoc-clk/overlay/lang/pt.json index fbddab17..906bab87 100644 --- a/Source/hoc-clk/overlay/lang/pt.json +++ b/Source/hoc-clk/overlay/lang/pt.json @@ -1,52 +1,42 @@ { "Information": "Informação", - "IDDQ:": "IDDQ:", - "Module: ": "Módulo:", - "sys-dock status:": "status do dock do sistema:", - "SaltyNX status:": "Status do SaltyNX:", - "RR Display status:": "Status de exibição do RR:", - "Wafer Position:": "Posição da bolacha:", - "Credits": "Créditos", - "Developers": "Desenvolvedores", - "Contributors": "Colaboradores", - "Testers": "Testadores", - "Special Thanks": "Agradecimentos especiais", "Unknown": "Desconhecido", "Installed": "Instalado", "Not Installed": "Não instalado", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA", "Default": "Padrão", "Do Not Override": "Não substituir", + "Do not override": "Não substitua", "Disabled": "Desativado", "Enabled": "Habilitado", - " \\ue0e3 Reset": "\\ue0e3 Redefinir", - "Display": "Exibição", - "Application changed\\n\\n": "Aplicativo alterado\\n\\n", - "The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n", - "while editing was going on.": "enquanto a edição estava acontecendo.", - "Board": "Conselho", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Habilitado (padrão)", + "Enable": "Habilitar", + "Fatal error": "Erro fatal", "Could not connect to hoc-clk sysmodule.\\n\\n": "Não foi possível conectar-se ao sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Verifique se tudo está\\n\\n", "correctly installed and enabled.": "corretamente instalado e ativado.", - "Fatal error": "Erro fatal", + + "Edit App Profile": "Editar perfil do aplicativo", + "Edit Global Profile": "Editar perfil global", + "Temporary Overrides": "Substituições temporárias", "Temporary Overrides ": "Substituições temporárias", + "  Reset": " Redefinir", + "Settings": "Configurações", + "About": "Sobre", + "Credits": "Créditos", + + "Application changed\\n\\n": "Aplicativo alterado\\n\\n", + "The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n", + "while editing was going on.": "enquanto a edição estava acontecendo.", + "Sleep Mode": "Modo de suspensão", - "Stock": "Estoque", + "Stock": "Padrão de fábrica", "Dev OC": "Desenvolvedor OC", "Boost Mode": "Modo de reforço", "Safe Max": "Máx. Seguro", "Unsafe Max": "Máximo inseguro", "Absolute Max": "Máximo absoluto", "Handheld Safe Max": "Portátil Seguro Máx.", - "Enable": "Habilitar", - "Edit App Profile": "Editar perfil do aplicativo", - "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Substituições temporárias", - "Settings": "Configurações", - "About": "Sobre", - "Compiling with minimal features": "Compilando com recursos mínimos", + "General Settings": "Configurações Gerais", "Governor Settings": "Configurações do Governador", "Safety Settings": "Configurações de segurança", @@ -55,42 +45,65 @@ "CPU Settings": "Configurações de CPU", "GPU Settings": "Configurações de GPU", "Display Settings": "Configurações de exibição", + "Experimental Settings": "Configurações experimentais", "Experimental": "Experimental", + + " Settings marked in blue": "Configurações marcadas em azul", + "don't require a reboot to apply!": "não requerem reinicialização para aplicar!", + "You can also press  to show": "Pressione também  para mostrar", + "information about each setting.": "informações sobre cada configuração.", + + " Experimental Settings are incomplete ": "Configurações experimentais incompletas", + "and may not work correctly or at all!": "e podem não funcionar corretamente!", + "Here be dragons!": "Aqui há dragões!", + + "RAM Voltage Display Mode": "Modo de exibição de tensão RAM", + "RAM Display Unit": "Unidade de exibição de RAM", + "Polling Interval": "Intervalo de sondagem", + "GPU Scheduling Override Method": "Método de substituição de agendamento de GPU", + "GPU Scheduling Override": "Substituição de agendamento de GPU", + "GPU Boot Volt": "Tensão de inicialização da GPU", + "GPU Boot Voltage": "Tensão de inicialização da GPU", + "Memory Frequency Measurement Mode": "Modo de medição de frequência de memória", + " Overriding the charge current": "Substituir a corrente de carga", "can be dangerous and may cause": "pode ser perigoso e causar", "damage to your battery or charger!": "danos à sua bateria ou carregador!", "Charge Current Override": "Substituição de corrente de carga", - "RAM Voltage Display Mode": "Modo de exibição de tensão RAM", - "Polling Interval": "Intervalo de votação", + "Display Color Preset": "Predefinição de cor", + "Basic": "Básico", + "Saturated": "Saturado", + "Washed": "Desbotado", + "Natural": "Natural", + "Vivid": "Vívido", + "CPU Governor Minimum Frequency": "Frequência Mínima do Governador da CPU", + " Usage of unsafe display": "O uso de frequências de tela", "refresh rates may cause stress": "taxas de atualização podem causar estresse", "or damage to your display! ": "ou danos ao seu monitor!", "Proceed at your own risk!": "Prossiga por sua conta e risco!", "Max Handheld Display": "Visor portátil máximo", + "Max Handheld Display Hz": "Hz máximo em modo portátil", "Display Clock": "Exibir relógio", + " Adjust the display voltage": "Ajuste a tensão do display", + "with caution to avoid damage": "com cuidado para evitar danos", + "to your display panel! ": "ao painel do display!", + "Display Voltage": "Tensão do display", + + "Thermal Throttle Limit": "Limite de aceleração térmica", "Official Rating": "Classificação Oficial", "TDP Threshold": "Limite de TDP", - "Power": "Poder", - "Thermal Throttle Limit": "Limite de aceleração térmica", + "Power": "Potência", "HP Mode": "Modo HP", - "Default (Mariko)": "Padrão (Mariko)", - "Default (Erista)": "Padrão (Erista)", - "Rating": "Avaliação", - "Safe Max (Mariko)": "Máximo Seguro (Mariko)", - "Safe Max (Erista)": "Seguro Max (Erista)", + + "DVB Shift": "Deslocamento DVB", + "SoC Max Volt": "Tensão máxima do SoC", + "Step Mode": "Modo passo", "RAM VDD2 Voltage": "Tensão RAM VDD2", - "Voltage": "Tensão", "RAM VDDQ Voltage": "Tensão RAM VDDQ", + "Voltage": "Tensão", "RAM Frequency Editor": "Editor de frequência RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Alta velocidade necessária!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)", - "Ram Max Clock": "Relógio máximo de Ram", + "Ram Max Clock": "Frequência máxima de Ram", "RAM Latency Editor": "Editor de latência de RAM", "RAM Timing Reductions": "Reduções de tempo de RAM", "Memory Timings": "Tempos de memória", @@ -102,6 +115,15 @@ "Memory Latencies": "Latências de memória", "Read Latency": "Latência de leitura", "Write Latency": "Latência de gravação", + "High speedo needed!": "Alto valor de Speedo necessário!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Relógio de aumento da CPU", "CPU UV": "UV da CPU", "CPU Unlock": "Desbloqueio da CPU", @@ -114,6 +136,7 @@ "CPU High UV": "CPU alta UV", "CPU Low VMIN": "CPU baixa VMIN", "CPU High VMIN": "VMIN alto da CPU", + "No Undervolt": "Sem subtensão", "SLT Table": "Tabela SLT", "HiOPT Table": "Tabela HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Tensão máxima da GPU", "GPU Voltage Offset": "Compensação de tensão da GPU", - "Do not override": "Não substitua", - "Enabled (Default)": "Habilitado (padrão)", - "96.6% limit": "Limite de 96,6%", - "99.7% limit": "Limite de 99,7%", - "GPU Scheduling Override": "Substituição de agendamento de GPU", - "Official Service": "Serviço Oficial", "GPU DVFS Mode": "Modo GPU DVFS", "GPU DVFS Offset": "Deslocamento DVFS da GPU", "GPU Voltage Table": "Tabela de tensão da GPU", "GPU Custom Table (mV)": "Tabela personalizada de GPU (mV)", + "Official Service": "Serviço Oficial", + "96.6% limit": "Limite de 96,6%", + "99.7% limit": "Limite de 99,7%", + " Setting GPU Clocks past": "Definir clocks de GPU além de", + "1228MHz without a proper undervolt": "1228MHz sem undervolt adequado", + "can cause degradation or damage": "pode causar degradação ou danos", + "to your console!": "ao seu console!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz sem UV, 1152 MHz em SLT", "or 1228MHz on HiOPT can cause ": "ou 1228 MHz em HiOPT pode causar", "permanent damage to your Switch!": "danos permanentes ao seu Switch!", "921MHz without UV and 960MHz on": "921 MHz sem UV e 960 MHz ativado", - "SLT or HiOPT can cause ": "SLT ou HiOPT podem causar" + "SLT or HiOPT can cause ": "SLT ou HiOPT podem causar", + + "Default (Mariko)": "Padrão (Mariko)", + "Default (Erista)": "Padrão (Erista)", + "Rating": "Avaliação", + "Safe Max (Mariko)": "Máximo Seguro (Mariko)", + "Safe Max (Erista)": "Seguro Max (Erista)", + + "Voltages": "Tensões", + "RAM Voltage:": "Tensão RAM:", + "Display Voltage:": "Tensão do display:", + "Temperatures": "Temperaturas", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Morno", + "Hot": "Quente", + "Overheat": "Superaquecimento", + "Not Patched": "Não corrigido", + "Invalid": "Inválido", + "RAM Bandwidth": "Largura de banda RAM", + "RAM BW (Peak):": "BW RAM (Pico):", + "RAM BW (All):": "BW RAM (Total):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info de hardware", + "Console Type:": "Tipo de console:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Módulo DRAM: ", + "Software Info": "Info de software", + "KIP version:": "Versão KIP:", + "sys-dock status:": "status do dock do sistema:", + "SaltyNX status:": "Status do SaltyNX:", + "RR Display status:": "Status de exibição do RR:", + "Wafer Position:": "Posição do wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Módulo:", + "Board": "Placa", + "Display": "Exibição", + + "Developers": "Desenvolvedores", + "Contributors": "Colaboradores", + "Testers": "Testadores", + "Translators": "Tradutores", + "Special Thanks": "Agradecimentos especiais", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilando com recursos mínimos", + "THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA" } diff --git a/Source/hoc-clk/overlay/lang/ru.json b/Source/hoc-clk/overlay/lang/ru.json index 7edb4408..3a428087 100644 --- a/Source/hoc-clk/overlay/lang/ru.json +++ b/Source/hoc-clk/overlay/lang/ru.json @@ -1,38 +1,33 @@ { "Information": "Информация", - "IDDQ:": "IDDQ:", - "Module: ": "Module:", - "sys-dock status:": "Статус sys-dock:", - "SaltyNX status:": "Статус SaltyNX:", - "RR Display status:": "Статус RR Display:", - "Wafer Position:": "Wafer Position:", - "Credits": "Благодарности", - "Developers": "Разработчики", - "Contributors": "Внесли вклад", - "Testers": "Тестеры", - "Special Thanks": "Особая благодарность", "Unknown": "Неизвестно", "Installed": "Установлено", "Not Installed": "Не установлено", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", "Default": "По умолчанию", "Do Not Override": "Не менять", + "Do not override": "Не менять", "Disabled": "Отключено", "Enabled": "Включено", - "Auto": "Авто", - " \\ue0e3 Reset": "\\ue0e3 Сброс", - "Display": "Дисплей", - "Application changed\\n\\n": "Приложение изменено\\n\\n", - "The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n", - "while editing was going on.": "пока шло редактирование.", - "Board": "Board", - "%u.%u%u mV": "%u.%u%u мВ", + "Enabled (Default)": "Включено (По умолчанию)", + "Enable": "Включено", + "Fatal error": "Фатальная ошибка", "Could not connect to hoc-clk sysmodule.\\n\\n": "Не удалось подключиться к сис-модулю hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Пожалуйста, убедитесь, что все\\n\\n", "correctly installed and enabled.": "правильно установлено и включено.", - "Fatal error": "Фатальная ошибка", + + "Edit App Profile": "Профиль приложения", + "Edit Global Profile": "Глобальный профиль", + "Temporary Overrides": "Временный профиль", "Temporary Overrides ": "Временный профиль", + "  Reset": " Сброс", + "Settings": "Настройки", + "About": "Сведения", + "Credits": "Благодарности", + + "Application changed\\n\\n": "Приложение изменено\\n\\n", + "The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n", + "while editing was going on.": "пока шло редактирование.", + "Sleep Mode": "Спящий режим", "Stock": "Стандарт", "Dev OC": "Разгон dev-кита", @@ -41,15 +36,7 @@ "Unsafe Max": "Опасный макс.", "Absolute Max": "Абсолютный макс.", "Handheld Safe Max": "Портативный безопасный макс.", - "Enable": "Включено", - "Edit App Profile": "Профиль приложения", - "Edit Global Profile": "Глобальный профиль", - "Temporary Overrides": "Временный профиль", - "Settings": "Настройки", - "About": "Сведения", - "Compiling with minimal features": "Собрано с урезанием функций", - "\uE150 Settings marked in blue": "Настройки помеченные синим", - "don't require a reboot to apply!": "Синие настройки применяются сразу!", + "General Settings": "Основные настройки", "Governor Settings": "Настройки говернора", "Safety Settings": "Настройки безопасности", @@ -58,45 +45,76 @@ "CPU Settings": "Настройки CPU", "GPU Settings": "Настройки GPU", "Display Settings": "Настройки дисплея", - "Experimental": "Экспериментальный", - "Enable Experimental Settings": "Экспериментальные настройки", - "\uE150 Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", - "and may not work correctly or at all!": "Экспериментальные настройки не", - "Here be dragons!": "закончены и могут не работать!", "Experimental Settings": "Экспериментальные", - "Live CPU Undervolt": "Мгновенный андервольт CPU", - "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", - "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", - "\uE150 Overriding the charge current": "Перезапись зарядного тока может", - "can be dangerous and may cause": "Перезапись зарядного тока может", - "damage to your battery or charger!": "повреждить аккумулятор или зарядку!", - "Charge Current Override": "Перезапись зарядного тока", + "Experimental": "Экспериментальный", + + " Settings marked in blue": "Настройки помеченные синим", + "don't require a reboot to apply!": "Синие настройки применяются сразу!", + "You can also press  to show": "Нажмите  для просмотра", + "information about each setting.": "информацию о каждом параметре.", + + " Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", + "and may not work correctly or at all!": "Экспериментальные настройки могут не работать!", + "Here be dragons!": "Здесь будут драконы!", + "RAM Voltage Display Mode": "Показ вольтажа RAM", "RAM Display Unit": "Показ единицы измерения RAM", "Polling Interval": "Интервал опроса", + + "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", + "GPU Scheduling Override": "Перезапись планировщика", + "GPU Boot Volt": "Напряжение загрузки GPU", + "GPU Boot Voltage": "Напряжение загрузки GPU", + "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", + " Overriding the charge current": "Перезапись зарядного тока может", + "can be dangerous and may cause": "Перезапись зарядного тока может", + "damage to your battery or charger!": "повреждить аккумулятор или зарядку!", + "Charge Current Override": "Перезапись зарядного тока", + "Display Color Preset": "Цветовой пресет", + "Basic": "Базовый", + "Saturated": "Насыщенный", + "Washed": "Бледный", + "Natural": "Натуральный", + "Vivid": "Яркий", + "CPU Governor Minimum Frequency": "Минимальная частота говернора CPU", - "\uE150 Usage of unsafe display": "\uE150 Использование не безопасной", + " Usage of unsafe display": "Использование не безопасной", "refresh rates may cause stress": "Не безопасная частота", "or damage to your display! ": "может повредить ваш экран", "Proceed at your own risk!": "Действуйте на свой страх и риск!", + "Max Handheld Display": "Макс. дисплей портатива", "Max Handheld Display Hz": "Макс. в портативе", "Display Clock": "Частота экрана", + " Adjust the display voltage": "Настройте напряжение экрана", + "with caution to avoid damage": "с осторожностью во избежание повреждений", + "to your display panel! ": "повреждений экрана!", + "Display Voltage": "Напряжение экрана", + + "Thermal Throttle Limit": "Предел троттлинга", "Official Rating": "Официальный рейтинг", "TDP Threshold": "Порог TDP", "Power": "Мощность", - "Thermal Throttle Limit": "Предел троттлинга", "HP Mode": "Режим HP", - "Default (Mariko)": "По умолчанию (M)", - "Default (Erista)": "По умолчанию (E)", - "Rating": "Рейтинг", - "Safe Max (Mariko)": "Сейф Макс (M)", - "Safe Max (Erista)": "Сейф Макс (E)", - "RAM VDD2 Voltage": "Вольтаж VDD2", - "Voltage": "Вольтаж", - "RAM VDDQ Voltage": "Вольтаж VDDQ", + + "DVB Shift": "DVB сдвиг", + "SoC Max Volt": "Макс. вольт SoC", "Step Mode": "Частотный шаг", + "RAM VDD2 Voltage": "Вольтаж VDD2", + "RAM VDDQ Voltage": "Вольтаж VDDQ", + "Voltage": "Вольтаж", "RAM Frequency Editor": "Редактор частоты", - "JEDEC.": "JEDEC.", + "Ram Max Clock": "Макс. частота", + "RAM Latency Editor": "Редактор задержек", + "RAM Timing Reductions": "Настройка таймингов", + "Memory Timings": "Тайминги RAM", + "Advanced": "Расширенные", + "t6 tRTW Fine Tune": "Точная настройка t6 tRTW", + "tRTW Fine Tune": "Точная настройка tRTW", + "t7 tWTR Fine Tune": "Точная настройка t7 tWTR", + "tWTR Fine Tune": "Точная настройка tWTR", + "Memory Latencies": "Задержки памяти", + "Read Latency": "Задержка чтения", + "Write Latency": "Задержка записи", "High speedo needed!": "Для высоких speedo", "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (нужны невероятные speedo/PLL)", "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (нужны невероятные speedo/PLL)", @@ -104,43 +122,8 @@ "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (нужны безумные speedo/PLL)", "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (нужны безумные speedo/PLL)", "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (нужны безумные speedo/PLL)", - "Ram Max Clock": "Макс. частота", - "RAM Latency Editor": "Редактор задержек", - "1333 Latency Max": "1333 задержка", - "1600 Latency Max": "1600 задержка", - "1866 Latency Max": "1866 задержка", - "2133 Latency Max": "2133 задержка", - "RAM Timing Reductions": "Настройка таймингов", - "Memory Timings": "Тайминги RAM", - "RAM-Timing tBreak": "Разбитие таблицы таймингов", - "Memory": "RAM", - "mem": "RAM", - "MEM": "RAM", - "Profile": "Профиль", - "Governor": "Говернор", - "Advanced": "Расширенные", - "Docked": "В доке", - "Handheld": "Портатив", - "Charging": "На зарядке", - "USB Charger": "USB Зарядка", - "PD Charger": "PD Зарядка", - "Handheld TDP": "TPD в портативе", - "Thermal Throttle": "Троттлинг", - "Uncapped Clocks": "Максимальные частоты", - "SoC DVB Shift": "SoC DVB сдвиг", - "SoC Max Volt": "Макс. вольт SoC", - "Overwrite Boost Mode": "Перезапись буста", - "Display Refresh Rate Changing": "Изменение частоты экрана", - "Low t6 tRTW": "Нижний t6 tRTW", - "Low t7 tWTR": "Нижний t7 tWTR", - "1333WL t2 RP Cap": "Предел 1333WL t2 RP", - "t6 tRTW Fine Tune": " Точная настройка t6 tRTW", - "tRTW Fine Tune": " Точная настройка tRTW", - "t7 tWTR Fine Tune": " Точная настройка t7 tWTR", - "tWTR Fine Tune": " Точная настройка tWTR", - "Memory Latencies": "Задержки памяти", - "Read Latency": "Задержка чтения", - "Write Latency": "Задержка записи", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Частота буста", "CPU UV": "Андервольт CPU", "CPU Unlock": "Разблокировка CPU", @@ -153,6 +136,7 @@ "CPU High UV": "Андервольт верхних частот", "CPU Low VMIN": "Мин. вольт. нижних частот", "CPU High VMIN": "Мин. вольт. верхних частот", + "No Undervolt": "Без андервольта", "SLT Table": "Таблица SLT", "HiOPT Table": "Таблица HiOPT", @@ -162,18 +146,71 @@ "GPU VMIN": "Мин. вольтаж", "GPU Maximum Voltage": "Макс. вольтаж", "GPU Voltage Offset": "Смещение вольтажа", - "Do not override": "Не менять", - "Enabled (Default)": "Включено (По умолчанию)", - "96.6% limit": "≤96,6%", - "99.7% limit": "≤99,7%", - "GPU Scheduling Override": "Перезапись планировщика", - "Official Service": "Официальная служба", "GPU DVFS Mode": "Режим DVFS", "GPU DVFS Offset": "Смещение DVFS", "GPU Voltage Table": "Таблица вольтажей", "GPU Custom Table (mV)": "Ручная таблица (мВ)", - "\uE150 Setting GPU Clocks past": "\uE150 Установка частот GPU выше", - "1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц", + "Official Service": "Официальная служба", + "96.6% limit": "≤96,6%", + "99.7% limit": "≤99,7%", + " Setting GPU Clocks past": "Установка частот GPU выше", + "1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц", "can cause degradation or damage": "без хорошего андервольта может", - "to your console!": "повредить вашу консоль!" + "to your console!": "повредить вашу консоль!", + "1075MHz without UV, 1152MHz on SLT": "1075 МГц без UV, 1152 МГц на SLT", + "or 1228MHz on HiOPT can cause ": "или 1228 МГц на HiOPT может привести к", + "permanent damage to your Switch!": "постоянному повреждению вашей Switch!", + "921MHz without UV and 960MHz on": "921 МГц без UV и 960 МГц на", + "SLT or HiOPT can cause ": "SLT или HiOPT могут привести к", + + "Default (Mariko)": "По умолчанию (M)", + "Default (Erista)": "По умолчанию (E)", + "Rating": "Рейтинг", + "Safe Max (Mariko)": "Сейф Макс (M)", + "Safe Max (Erista)": "Сейф Макс (E)", + + "Voltages": "Напряжения", + "RAM Voltage:": "Напряжение RAM:", + "Display Voltage:": "Напряжение дисплея:", + "Temperatures": "Температуры", + "PLLX Temp:": "PLLX Темп.:", + "AOTAG Temp:": "AOTAG Темп.:", + "BQ24193 Temp:": "BQ24193 Темп.:", + "Normal": "Нормальная", + "Warm": "Тёплая", + "Hot": "Горячая", + "Overheat": "Перегрев", + "Not Patched": "Не пропатчено", + "Invalid": "Недействительно", + "RAM Bandwidth": "Пропускная способность RAM", + "RAM BW (Peak):": "Полоса RAM (Макс.):", + "RAM BW (All):": "Полоса RAM (Всего):", + "RAM BW (CPU):": "Полоса RAM (CPU):", + "RAM BW (GPU):": "Полоса RAM (GPU):", + "Hardware Info": "Информация об оборудовании", + "Console Type:": "Тип консоли:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Модуль DRAM: ", + "Software Info": "Информация о программе", + "KIP version:": "Версия KIP:", + "sys-dock status:": "Статус sys-dock:", + "SaltyNX status:": "Статус SaltyNX:", + "RR Display status:": "Статус RR Display:", + "Wafer Position:": "Wafer Position:", + "IDDQ:": "IDDQ:", + "Module: ": "Module:", + "Board": "Board", + "Display": "Дисплей", + + "Developers": "Разработчики", + "Contributors": "Внесли вклад", + "Testers": "Тестеры", + "Translators": "Переводчики", + "Special Thanks": "Особая благодарность", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u мВ", + "Compiling with minimal features": "Собрано с урезанием функций", + "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", + "Auto": "Авто" } diff --git a/Source/hoc-clk/overlay/lang/template.json b/Source/hoc-clk/overlay/lang/template.json new file mode 100644 index 00000000..51c51c1a --- /dev/null +++ b/Source/hoc-clk/overlay/lang/template.json @@ -0,0 +1,214 @@ +{ + "Information": "", + "Unknown": "", + "Installed": "", + "Not Installed": "", + "Default": "", + "Do Not Override": "", + "Do not override": "", + "Disabled": "", + "Enabled": "", + "Enabled (Default)": "", + "Enable": "", + "Fatal error": "", + "Could not connect to hoc-clk sysmodule.\\n\\n": "", + "Please make sure everything is\\n\\n": "", + "correctly installed and enabled.": "", + + "Edit App Profile": "", + "Edit Global Profile": "", + "Temporary Overrides": "", + "Temporary Overrides ": "", + "  Reset": "", + "Settings": "", + "About": "", + "Credits": "", + + "Application changed\\n\\n": "", + "The running application changed\\n\\n": "", + "while editing was going on.": "", + + "Sleep Mode": "", + "Stock": "", + "Dev OC": "", + "Boost Mode": "", + "Safe Max": "", + "Unsafe Max": "", + "Absolute Max": "", + "Handheld Safe Max": "", + + "General Settings": "", + "Governor Settings": "", + "Safety Settings": "", + "Save KIP Settings": "", + "RAM Settings": "", + "CPU Settings": "", + "GPU Settings": "", + "Display Settings": "", + "Experimental Settings": "", + "Experimental": "", + + " Settings marked in blue": "", + "don't require a reboot to apply!": "", + "You can also press  to show": "", + "information about each setting.": "", + + " Experimental Settings are incomplete ": "", + "and may not work correctly or at all!": "", + "Here be dragons!": "", + + "RAM Voltage Display Mode": "", + "RAM Display Unit": "", + "Polling Interval": "", + + "GPU Scheduling Override Method": "", + "GPU Scheduling Override": "", + "GPU Boot Volt": "", + "GPU Boot Voltage": "", + "Memory Frequency Measurement Mode": "", + " Overriding the charge current": "", + "can be dangerous and may cause": "", + "damage to your battery or charger!": "", + "Charge Current Override": "", + "Display Color Preset": "", + "Basic": "", + "Saturated": "", + "Washed": "", + "Natural": "", + "Vivid": "", + + "CPU Governor Minimum Frequency": "", + " Usage of unsafe display": "", + "refresh rates may cause stress": "", + "or damage to your display! ": "", + "Proceed at your own risk!": "", + "Max Handheld Display": "", + "Max Handheld Display Hz": "", + "Display Clock": "", + " Adjust the display voltage": "", + "with caution to avoid damage": "", + "to your display panel! ": "", + "Display Voltage": "", + + "Thermal Throttle Limit": "", + "Official Rating": "", + "TDP Threshold": "", + "Power": "", + "HP Mode": "", + + "DVB Shift": "", + "SoC Max Volt": "", + "Step Mode": "", + "RAM VDD2 Voltage": "", + "RAM VDDQ Voltage": "", + "Voltage": "", + "RAM Frequency Editor": "", + "Ram Max Clock": "", + "RAM Latency Editor": "", + "RAM Timing Reductions": "", + "Memory Timings": "", + "Advanced": "", + "t6 tRTW Fine Tune": "", + "tRTW Fine Tune": "", + "t7 tWTR Fine Tune": "", + "tWTR Fine Tune": "", + "Memory Latencies": "", + "Read Latency": "", + "Write Latency": "", + "High speedo needed!": "", + "3333MHz (Needs extreme Speedo/PLL)": "", + "3366MHz (Needs extreme Speedo/PLL)": "", + "3400MHz (Needs extreme Speedo/PLL)": "", + "3433MHz (Needs ridiculous Speedo/PLL)": "", + "3466MHz (Needs ridiculous Speedo/PLL)": "", + "3500MHz (Needs ridiculous Speedo/PLL)": "", + "JEDEC.": "", + + "CPU Boost Clock": "", + "CPU UV": "", + "CPU Unlock": "", + "CPU VMIN": "", + "CPU Max Voltage": "", + "CPU Max Clock": "", + "Extreme UV Table": "", + "CPU UV Table": "", + "CPU Low UV": "", + "CPU High UV": "", + "CPU Low VMIN": "", + "CPU High VMIN": "", + + "No Undervolt": "", + "SLT Table": "", + "HiOPT Table": "", + "GPU Undervolt Table": "", + "GPU Minimum Voltage": "", + "Calculate GPU Vmin": "", + "GPU VMIN": "", + "GPU Maximum Voltage": "", + "GPU Voltage Offset": "", + "GPU DVFS Mode": "", + "GPU DVFS Offset": "", + "GPU Voltage Table": "", + "GPU Custom Table (mV)": "", + "Official Service": "", + "96.6% limit": "", + "99.7% limit": "", + " Setting GPU Clocks past": "", + "1228MHz without a proper undervolt": "", + "can cause degradation or damage": "", + "to your console!": "", + "1075MHz without UV, 1152MHz on SLT": "", + "or 1228MHz on HiOPT can cause ": "", + "permanent damage to your Switch!": "", + "921MHz without UV and 960MHz on": "", + "SLT or HiOPT can cause ": "", + + "Default (Mariko)": "", + "Default (Erista)": "", + "Rating": "", + "Safe Max (Mariko)": "", + "Safe Max (Erista)": "", + + "Voltages": "", + "RAM Voltage:": "", + "Display Voltage:": "", + "Temperatures": "", + "PLLX Temp:": "", + "AOTAG Temp:": "", + "BQ24193 Temp:": "", + "Normal": "", + "Warm": "", + "Hot": "", + "Overheat": "", + "Not Patched": "", + "Invalid": "", + "RAM Bandwidth": "", + "RAM BW (Peak):": "", + "RAM BW (All):": "", + "RAM BW (CPU):": "", + "RAM BW (GPU):": "", + "Hardware Info": "", + "Console Type:": "", + "Speedo:": "", + "DRAM Module: ": "", + "Software Info": "", + "KIP version:": "", + "sys-dock status:": "", + "SaltyNX status:": "", + "RR Display status:": "", + "Wafer Position:": "", + "IDDQ:": "", + "Module: ": "", + "Board": "", + "Display": "", + + "Developers": "", + "Contributors": "", + "Testers": "", + "Translators": "", + "Special Thanks": "", + + "X: %u Y: %u": "", + "%u.%u%u mV": "", + "Compiling with minimal features": "", +} diff --git a/Source/hoc-clk/overlay/lang/uk.json b/Source/hoc-clk/overlay/lang/uk.json index c0239f8a..7af7040a 100644 --- a/Source/hoc-clk/overlay/lang/uk.json +++ b/Source/hoc-clk/overlay/lang/uk.json @@ -1,52 +1,42 @@ { "Information": "Інформація", - "IDDQ:": "IDDQ:", - "Module: ": "Модуль:", - "sys-dock status:": "стан sys-dock:", - "SaltyNX status:": "Статус SaltyNX:", - "RR Display status:": "Статус дисплея RR:", - "Wafer Position:": "Позиція пластини:", - "Credits": "Кредити", - "Developers": "Розробники", - "Contributors": "Дописувачі", - "Testers": "Тестери", - "Special Thanks": "Особлива подяка", "Unknown": "Невідомий", "Installed": "встановлено", "Not Installed": "Не встановлено", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД", "Default": "За замовчуванням", "Do Not Override": "Не перевизначати", + "Do not override": "Не перевизначати", "Disabled": "Вимкнено", "Enabled": "Увімкнено", - " \\ue0e3 Reset": "\\ue0e3 Скидання", - "Display": "Дисплей", - "Application changed\\n\\n": "Додаток змінено\\n\\n", - "The running application changed\\n\\n": "Запущена програма змінена\\n\\n", - "while editing was going on.": "поки йшло редагування.", - "Board": "дошка", - "%u.%u%u mV": "%u.%u%u мВ", + "Enabled (Default)": "Увімкнено (за замовчуванням)", + "Enable": "Увімкнути", + "Fatal error": "Фатальна помилка", "Could not connect to hoc-clk sysmodule.\\n\\n": "Не вдалося підключитися до системного модуля hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Переконайтеся, що все\\n\\n", "correctly installed and enabled.": "правильно встановлено та включено.", - "Fatal error": "Фатальна помилка", + + "Edit App Profile": "Редагувати профіль програми", + "Edit Global Profile": "Редагувати глобальний профіль", + "Temporary Overrides": "Тимчасові перевизначення", "Temporary Overrides ": "Тимчасові перевизначення", + "  Reset": " Скидання", + "Settings": "Налаштування", + "About": "про", + "Credits": "Кредити", + + "Application changed\\n\\n": "Додаток змінено\\n\\n", + "The running application changed\\n\\n": "Запущена програма змінена\\n\\n", + "while editing was going on.": "поки йшло редагування.", + "Sleep Mode": "Режим сну", - "Stock": "Запас", + "Stock": "Стандарт", "Dev OC": "Розробник OC", "Boost Mode": "Режим посилення", "Safe Max": "Безпечний макс", "Unsafe Max": "Небезпечний макс", "Absolute Max": "Абсолютний макс", - "Handheld Safe Max": "Портативний сейф Макс", - "Enable": "Увімкнути", - "Edit App Profile": "Редагувати профіль програми", - "Edit Global Profile": "Редагувати глобальний профіль", - "Temporary Overrides": "Тимчасові перевизначення", - "Settings": "Налаштування", - "About": "про", - "Compiling with minimal features": "Компіляція з мінімальними можливостями", + "Handheld Safe Max": "Портативний безпечний макс", + "General Settings": "Загальні налаштування", "Governor Settings": "Налаштування губернатора", "Safety Settings": "Налаштування безпеки", @@ -55,41 +45,64 @@ "CPU Settings": "Налаштування ЦП", "GPU Settings": "Налаштування GPU", "Display Settings": "Налаштування дисплея", + "Experimental Settings": "Експериментальні налаштування", "Experimental": "Експериментальний", + + " Settings marked in blue": "Налаштування, позначені синім", + "don't require a reboot to apply!": "не потребують перезавантаження!", + "You can also press  to show": "Також натисніть  для показу", + "information about each setting.": "інформацію про кожне налаштування.", + + " Experimental Settings are incomplete ": "Експериментальні налаштування неповні", + "and may not work correctly or at all!": "і можуть взагалі не працювати!", + "Here be dragons!": "Тут є дракони!", + + "RAM Voltage Display Mode": "Режим відображення напруги RAM", + "RAM Display Unit": "Одиниця відображення RAM", + "Polling Interval": "Інтервал опитування", + "GPU Scheduling Override Method": "Метод перевизначення планування GPU", + "GPU Scheduling Override": "Перевизначення планування GPU", + "GPU Boot Volt": "Напруга завантаження GPU", + "GPU Boot Voltage": "Напруга завантаження GPU", + "Memory Frequency Measurement Mode": "Режим вимірювання частоти пам'яті", + " Overriding the charge current": "Перевизначення струму заряду", "can be dangerous and may cause": "може бути небезпечним і може спричинити", "damage to your battery or charger!": "пошкодження акумулятора або зарядного пристрою!", "Charge Current Override": "Перевизначення струму заряду", - "RAM Voltage Display Mode": "Режим відображення напруги RAM", - "Polling Interval": "Інтервал опитування", + "Display Color Preset": "Кольоровий пресет дисплея", + "Basic": "Базовий", + "Saturated": "Насичений", + "Washed": "Блідий", + "Natural": "Природний", + "Vivid": "Яскравий", + "CPU Governor Minimum Frequency": "Мінімальна частота регулятора ЦП", + " Usage of unsafe display": "Використання небезпечних частот екрана", "refresh rates may cause stress": "частоти оновлення можуть викликати стрес", "or damage to your display! ": "або пошкодження дисплея!", "Proceed at your own risk!": "Продовжуйте на свій страх і ризик!", "Max Handheld Display": "Максимальний портативний дисплей", + "Max Handheld Display Hz": "Макс. Гц в портативному режимі", "Display Clock": "Відображення годинника", + " Adjust the display voltage": "Налаштуйте напругу дисплея", + "with caution to avoid damage": "обережно, щоб уникнути пошкоджень", + "to your display panel! ": "до панелі дисплея!", + "Display Voltage": "Напруга дисплея", + + "Thermal Throttle Limit": "Термічний дросельний ліміт", "Official Rating": "Офіційний рейтинг", "TDP Threshold": "Поріг TDP", "Power": "потужність", - "Thermal Throttle Limit": "Термічний дросельний ліміт", "HP Mode": "Режим HP", - "Default (Mariko)": "За замовчуванням (Маріко)", - "Default (Erista)": "За замовчуванням (Erista)", - "Rating": "Рейтинг", - "Safe Max (Mariko)": "Сейф Макс (Маріко)", - "Safe Max (Erista)": "Сейф Макс (Еріста)", + + "DVB Shift": "DVB зсув", + "SoC Max Volt": "Макс. напруга SoC", + "Step Mode": "Покроковий режим", "RAM VDD2 Voltage": "Напруга RAM VDD2", - "Voltage": "Напруга", "RAM VDDQ Voltage": "Напруга RAM VDDQ", + "Voltage": "Напруга", "RAM Frequency Editor": "Редактор частоти оперативної пам'яті", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Потрібна висока швидкість!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)", "Ram Max Clock": "Годинник Ram Max", "RAM Latency Editor": "Редактор затримки оперативної пам'яті", "RAM Timing Reductions": "Скорочення оперативної пам'яті", @@ -100,20 +113,30 @@ "t7 tWTR Fine Tune": "t7 tWTR Точне налаштування", "tWTR Fine Tune": "Точна настройка tWTR", "Memory Latencies": "Затримки пам'яті", - "Read Latency": "Прочитати затримку", + "Read Latency": "Затримка читання", "Write Latency": "Затримка запису", + "High speedo needed!": "Потрібна висока швидкість Speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU Boost Clock", "CPU UV": "CPU UV", "CPU Unlock": "Розблокування ЦП", "CPU VMIN": "CPU VMIN", "CPU Max Voltage": "Максимальна напруга ЦП", "CPU Max Clock": "Максимальна частота ЦП", - "Extreme UV Table": "Екстремальний ультрафіолетовий стіл", + "Extreme UV Table": "Екстремальна UV таблиця", "CPU UV Table": "CPU UV Таблиця", "CPU Low UV": "CPU Low UV", "CPU High UV": "CPU High UV", "CPU Low VMIN": "CPU Low VMIN", "CPU High VMIN": "CPU High VMIN", + "No Undervolt": "Без андервольта", "SLT Table": "Таблиця SLT", "HiOPT Table": "Таблиця HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Максимальна напруга GPU", "GPU Voltage Offset": "Зсув напруги GPU", - "Do not override": "Не перевизначати", - "Enabled (Default)": "Увімкнено (за замовчуванням)", - "96.6% limit": "96,6% обмеження", - "99.7% limit": "Обмеження 99,7%.", - "GPU Scheduling Override": "Перевизначення планування GPU", - "Official Service": "Офіційний сервіс", "GPU DVFS Mode": "Режим GPU DVFS", "GPU DVFS Offset": "GPU DVFS Offset", "GPU Voltage Table": "Таблиця напруги GPU", "GPU Custom Table (mV)": "Спеціальна таблиця GPU (мВ)", + "Official Service": "Офіційний сервіс", + "96.6% limit": "96,6% обмеження", + "99.7% limit": "99,7% обмеження", + " Setting GPU Clocks past": "Встановлення тактових частот GPU вище", + "1228MHz without a proper undervolt": "1228 МГц без належного підвольту", + "can cause degradation or damage": "може спричинити деградацію або пошкодження", + "to your console!": "вашій консолі!", "1075MHz without UV, 1152MHz on SLT": "1075 МГц без УФ, 1152 МГц на SLT", "or 1228MHz on HiOPT can cause ": "або 1228 МГц на HiOPT може спричинити", - "permanent damage to your Switch!": "незворотне пошкодження вашого комутатора!", + "permanent damage to your Switch!": "незворотне пошкодження вашого Switch!", "921MHz without UV and 960MHz on": "921 МГц без УФ і 960 МГц увімкнено", - "SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити" + "SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити", + + "Default (Mariko)": "За замовчуванням (Маріко)", + "Default (Erista)": "За замовчуванням (Erista)", + "Rating": "Рейтинг", + "Safe Max (Mariko)": "Сейф Макс (Маріко)", + "Safe Max (Erista)": "Сейф Макс (Еріста)", + + "Voltages": "Напруги", + "RAM Voltage:": "Напруга RAM:", + "Display Voltage:": "Напруга дисплея:", + "Temperatures": "Температури", + "PLLX Temp:": "PLLX Темп.:", + "AOTAG Temp:": "AOTAG Темп.:", + "BQ24193 Temp:": "BQ24193 Темп.:", + "Normal": "Нормально", + "Warm": "Тепло", + "Hot": "Гаряче", + "Overheat": "Перегрів", + "Not Patched": "Не виправлено", + "Invalid": "Недійсний", + "RAM Bandwidth": "Пропускна здатність RAM", + "RAM BW (Peak):": "BW RAM (Пік):", + "RAM BW (All):": "BW RAM (Усі):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Інфо про апаратне забезпечення", + "Console Type:": "Тип консолі:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Модуль DRAM: ", + "Software Info": "Інфо про програмне забезпечення", + "KIP version:": "Версія KIP:", + "sys-dock status:": "стан sys-dock:", + "SaltyNX status:": "Статус SaltyNX:", + "RR Display status:": "Статус дисплея RR:", + "Wafer Position:": "Позиція пластини:", + "IDDQ:": "IDDQ:", + "Module: ": "Модуль:", + "Board": "дошка", + "Display": "Дисплей", + + "Developers": "Розробники", + "Contributors": "Дописувачі", + "Testers": "Тестери", + "Translators": "Перекладачі", + "Special Thanks": "Особлива подяка", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u мВ", + "Compiling with minimal features": "Компіляція з мінімальними можливостями", + "THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД" } diff --git a/Source/hoc-clk/overlay/lang/zh-cn.json b/Source/hoc-clk/overlay/lang/zh-cn.json index 53989929..a49c4d7a 100644 --- a/Source/hoc-clk/overlay/lang/zh-cn.json +++ b/Source/hoc-clk/overlay/lang/zh-cn.json @@ -1,37 +1,33 @@ { "Information": "信息", - "IDDQ:": "IDDQ:", - "Module: ": "模块: ", - "sys-dock status:": "sys-dock 状态:", - "SaltyNX status:": "SaltyNX 状态:", - "RR Display status:": "RR 显示状态:", - "Wafer Position:": "晶圆位置:", - "Credits": "致谢", - "Developers": "开发者", - "Contributors": "贡献者", - "Testers": "测试者", - "Special Thanks": "特别感谢", "Unknown": "未知", "Installed": "已安装", "Not Installed": "未安装", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "啤酒软件许可协议", "Default": "默认", "Do Not Override": "不修改", + "Do not override": "不修改", "Disabled": "已禁用", "Enabled": "已启用", - " \\ue0e3 Reset": " \\ue0e3 重置", - "Display": "显示", - "Application changed\\n\\n": "应用已变更\\n\\n", - "The running application changed\\n\\n": "正在运行的应用已变更\\n\\n", - "while editing was going on.": "编辑过程中发生变更。", - "Board": "主板", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "已启用 (默认)", + "Enable": "启用", + "Fatal error": "致命错误", "Could not connect to hoc-clk sysmodule.\\n\\n": "无法连接到 hoc-clk 系统模块。\\n\\n", "Please make sure everything is\\n\\n": "请确保所有内容均已\\n\\n", "correctly installed and enabled.": "正确安装并启用。", - "Fatal error": "致命错误", + + "Edit App Profile": "编辑应用配置", + "Edit Global Profile": "编辑全局配置", + "Temporary Overrides": "临时配置", "Temporary Overrides ": "临时配置 ", + "  Reset": " 重置", + "Settings": "设置", + "About": "关于", + "Credits": "致谢", + + "Application changed\\n\\n": "应用已变更\\n\\n", + "The running application changed\\n\\n": "正在运行的应用已变更\\n\\n", + "while editing was going on.": "编辑过程中发生变更。", + "Sleep Mode": "睡眠模式", "Stock": "原厂默认", "Dev OC": "开发者超频", @@ -40,13 +36,7 @@ "Unsafe Max": "危险最大值", "Absolute Max": "绝对最大值", "Handheld Safe Max": "掌机模式安全最大值", - "Enable": "启用", - "Edit App Profile": "编辑应用配置", - "Edit Global Profile": "编辑全局配置", - "Temporary Overrides": "临时配置", - "Settings": "设置", - "About": "关于", - "Compiling with minimal features": "以最小功能编译", + "General Settings": "通用设置", "Governor Settings": "调频器设置", "Safety Settings": "安全设置", @@ -55,61 +45,69 @@ "CPU Settings": "CPU 设置", "GPU Settings": "GPU 设置", "Display Settings": "显示设置", + "Experimental Settings": "实验性设置", "Experimental": "实验性功能", + + " Settings marked in blue": "蓝色标注的设置", + "don't require a reboot to apply!": "无需重启即可应用!", + "You can also press  to show": "也可按  查看", + "information about each setting.": "每项设置的说明。", + + " Experimental Settings are incomplete ": "实验性设置尚未完成", + "and may not work correctly or at all!": "且可能无法正常工作!", + "Here be dragons!": "此处有险!", + + "RAM Voltage Display Mode": "内存电压显示模式", + "RAM Display Unit": "内存显示单位", + "Polling Interval": "刷新间隔", + "GPU Scheduling Override Method": "GPU 调度覆盖方式", + "GPU Scheduling Override": "GPU 调度修改", + "GPU Boot Volt": "GPU 启动电压", + "GPU Boot Voltage": "GPU 启动电压", + "Memory Frequency Measurement Mode": "内存频率测量模式", + " Overriding the charge current": "修改充电电流", "can be dangerous and may cause": "存在风险,可能导致", "damage to your battery or charger!": "电池或充电器损坏!", "Charge Current Override": "充电电流修改", - "RAM Voltage Display Mode": "内存电压显示模式", - "Polling Interval": "刷新间隔", + "Display Color Preset": "显示颜色预设", + "Basic": "基础", + "Saturated": "饱和", + "Washed": "淡色", + "Natural": "自然", + "Vivid": "鲜艳", + "CPU Governor Minimum Frequency": "CPU 调频器最低频率", - "\uE150 Usage of unsafe display": "\uE150 不安全的显示屏", + " Usage of unsafe display": "不安全的显示屏", "refresh rates may cause stress": "刷新率可能会对", "or damage to your display! ": "显示屏造成压力或损坏! ", "Proceed at your own risk!": "操作风险自负!", "Max Handheld Display": "掌机模式最大显示率", + "Max Handheld Display Hz": "掌机最大显示率 Hz", "Display Clock": "显示时钟", + " Adjust the display voltage": "调整显示电压", + "with caution to avoid damage": "请谨慎以避免损坏", + "to your display panel! ": "显示屏面板!", + "Display Voltage": "显示电压", + + "Thermal Throttle Limit": "温控设置", "Official Rating": "官方额定值", "TDP Threshold": "TDP 阈值", "Power": "电源", - "Thermal Throttle Limit": "温控设置", "HP Mode": "高性能模式", - "Default (Mariko)": "默认 (Mariko)", - "Default (Erista)": "默认 (Erista)", - "Rating": "额定值", - "Safe Max (Mariko)": "安全最大值 (Mariko)", - "Safe Max (Erista)": "安全最大值 (Erista)", + + "DVB Shift": "DVB 偏移", + "SoC Max Volt": "SoC 最大电压", + "Step Mode": "步进模式", "RAM VDD2 Voltage": "内存 VDD2 电压", - "Voltage": "电压", "RAM VDDQ Voltage": "内存 VDDQ 电压", + "Voltage": "电压", "RAM Frequency Editor": "内存频率编辑器", - "JEDEC.": "JEDEC 标准。", - "High speedo needed!": "需要高 Speedo 配置!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)", "Ram Max Clock": "内存最大频率", "RAM Latency Editor": "内存延迟编辑器", "RAM Timing Reductions": "内存时序优化", "Memory Timings": "内存时序", - "Memory": "内存", - "mem": "内存", - "Governor": "调频器", "Advanced": "高级", - "Docked": "底座模式", - "Handheld": "掌机模式", - "Charging": "充电中", - "USB Charger": "USB 充电器", - "PD Charger": "PD 充电器", - "Handheld TDP": "掌机模式功耗限制", - "Thermal Throttle": "温度控制", - "Uncapped Clocks": "解除频率上限", - "Soc DVB Shift": "SoC DVB偏移", - "Overwrite Boost Mode": "接管官方CPU调度", - "Display Refresh Rate Changing": "显示刷新率变更", "t6 tRTW Fine Tune": "t6 tRTW 微调", "tRTW Fine Tune": "tRTW 微调", "t7 tWTR Fine Tune": "t7 tWTR 微调", @@ -117,6 +115,15 @@ "Memory Latencies": "内存延迟", "Read Latency": "读取延迟", "Write Latency": "写入延迟", + "High speedo needed!": "需要高 Speedo 配置!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)", + "JEDEC.": "JEDEC 标准。", + "CPU Boost Clock": "CPU 超频频率", "CPU UV": "CPU 降压", "CPU Unlock": "CPU 解锁", @@ -129,6 +136,7 @@ "CPU High UV": "CPU 高压降压", "CPU Low VMIN": "CPU 低压最低电压", "CPU High VMIN": "CPU 高压最低电压", + "No Undervolt": "不降压", "SLT Table": "SLT 表", "HiOPT Table": "HiOPT 表", @@ -138,20 +146,70 @@ "GPU VMIN": "GPU 最低电压", "GPU Maximum Voltage": "GPU 最大电压", "GPU Voltage Offset": "GPU 电压偏移", - "Do not override": "不修改", - "Enabled (Default)": "已启用 (默认)", - "96.6% limit": "96.6% 限制", - "99.7% limit": "99.7% 限制", - "GPU Scheduling Override": "GPU 调度修改", - "Official Service": "官方服务", "GPU DVFS Mode": "GPU DVFS 模式", "GPU DVFS Offset": "GPU DVFS 偏移", "GPU Voltage Table": "GPU 电压表", "GPU Custom Table (mV)": "GPU 自定义表 (mV)", - "\uE150 Setting GPU Clocks past": "\uE150 将 GPU 频率设置超过", + "Official Service": "官方服务", + "96.6% limit": "96.6% 限制", + "99.7% limit": "99.7% 限制", + " Setting GPU Clocks past": " 将 GPU 频率设置超过", + "1228MHz without a proper undervolt": "没有适当降压的 1228MHz", + "can cause degradation or damage": "可能导致损耗或损坏", + "to your console!": "您的主机!", "1075MHz without UV, 1152MHz on SLT": "1075MHz 无降压,SLT 表下 1152MHz", "or 1228MHz on HiOPT can cause ": "或 HiOPT 表下 1228MHz 可能导致 ", "permanent damage to your Switch!": "Switch 永久损坏!", "921MHz without UV and 960MHz on": "921MHz 无降压,SLT/HiOPT 表下 960MHz", - "SLT or HiOPT can cause ": "可能导致 " + "SLT or HiOPT can cause ": "可能导致 ", + + "Default (Mariko)": "默认 (Mariko)", + "Default (Erista)": "默认 (Erista)", + "Rating": "额定值", + "Safe Max (Mariko)": "安全最大值 (Mariko)", + "Safe Max (Erista)": "安全最大值 (Erista)", + + "Voltages": "电压", + "RAM Voltage:": "内存电压:", + "Display Voltage:": "显示电压:", + "Temperatures": "温度", + "PLLX Temp:": "PLLX 温度:", + "AOTAG Temp:": "AOTAG 温度:", + "BQ24193 Temp:": "BQ24193 温度:", + "Normal": "正常", + "Warm": "温热", + "Hot": "过热", + "Overheat": "严重过热", + "Not Patched": "未修补", + "Invalid": "无效", + "RAM Bandwidth": "内存带宽", + "RAM BW (Peak):": "RAM带宽(峰值):", + "RAM BW (All):": "RAM带宽(全部):", + "RAM BW (CPU):": "RAM带宽(CPU):", + "RAM BW (GPU):": "RAM带宽(GPU):", + "Hardware Info": "硬件信息", + "Console Type:": "主机类型:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 模块: ", + "Software Info": "软件信息", + "KIP version:": "KIP 版本:", + "sys-dock status:": "sys-dock 状态:", + "SaltyNX status:": "SaltyNX 状态:", + "RR Display status:": "RR 显示状态:", + "Wafer Position:": "晶圆位置:", + "IDDQ:": "IDDQ:", + "Module: ": "模块: ", + "Board": "主板", + "Display": "显示", + + "Developers": "开发者", + "Contributors": "贡献者", + "Testers": "测试者", + "Translators": "翻译", + "Special Thanks": "特别感谢", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "以最小功能编译", + "THE BEER-WARE LICENSE": "啤酒软件许可协议" } diff --git a/Source/hoc-clk/overlay/lang/zh-tw.json b/Source/hoc-clk/overlay/lang/zh-tw.json index 5a8a5dfa..75765af9 100644 --- a/Source/hoc-clk/overlay/lang/zh-tw.json +++ b/Source/hoc-clk/overlay/lang/zh-tw.json @@ -1,52 +1,42 @@ { "Information": "資訊", - "IDDQ:": "國際電話號碼:", - "Module: ": "模組:", - "sys-dock status:": "系統塢站狀態:", - "SaltyNX status:": "SaltyNX 狀態:", - "RR Display status:": "RR 顯示狀態:", - "Wafer Position:": "晶圓位置:", - "Credits": "製作人員", - "Developers": "開發商", - "Contributors": "貢獻者", - "Testers": "測試人員", - "Special Thanks": "特別感謝", "Unknown": "未知", "Installed": "已安裝", "Not Installed": "未安裝", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "啤酒製品許可證", "Default": "預設", "Do Not Override": "不要覆蓋", - "Disabled": "殘障人士", - "Enabled": "啟用", - " \\ue0e3 Reset": "\\ue0e3 重設", - "Display": "顯示", + "Do not override": "不要覆蓋", + "Disabled": "已停用", + "Enabled": "已啟用", + "Enabled (Default)": "已啟用(預設)", + "Enable": "啟用", + "Fatal error": "致命錯誤", + "Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。\\n\\n", + "Please make sure everything is\\n\\n": "請確保一切正常\\n\\n", + "correctly installed and enabled.": "正確安裝並啟用。", + + "Edit App Profile": "編輯應用程式設定檔", + "Edit Global Profile": "編輯全域設定檔", + "Temporary Overrides": "臨時覆蓋", + "Temporary Overrides ": "臨時覆蓋", + "  Reset": " 重設", + "Settings": "設定", + "About": "關於", + "Credits": "製作人員", + "Application changed\\n\\n": "應用程式已更改\\n\\n", "The running application changed\\n\\n": "正在運行的應用程式已更改\\n\\n", "while editing was going on.": "當編輯正在進行時。", - "Board": "董事會", - "%u.%u%u mV": "%u.%u%u mV", - "Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。 \\n\\n", - "Please make sure everything is\\n\\n": "請確保一切正常\\n\\n", - "correctly installed and enabled.": "正確安裝並啟用。", - "Fatal error": "致命錯誤", - "Temporary Overrides ": "臨時覆蓋", + "Sleep Mode": "睡眠模式", - "Stock": "庫存", + "Stock": "原廠預設", "Dev OC": "開發OC", "Boost Mode": "升壓模式", "Safe Max": "安全最大值", "Unsafe Max": "不安全最大值", "Absolute Max": "絕對最大值", - "Handheld Safe Max": "手持式安全最大", - "Enable": "啟用", - "Edit App Profile": "編輯應用程式設定檔", - "Edit Global Profile": "編輯全域設定檔", - "Temporary Overrides": "臨時覆蓋", - "Settings": "設定", - "About": "關於", - "Compiling with minimal features": "使用最少的功能進行編譯", + "Handheld Safe Max": "手持式安全最大值", + "General Settings": "常規設定", "Governor Settings": "調速器設定", "Safety Settings": "安全設定", @@ -55,42 +45,65 @@ "CPU Settings": "中央處理器設定", "GPU Settings": "GPU設定", "Display Settings": "顯示設定", + "Experimental Settings": "實驗性設定", "Experimental": "實驗性的", + + " Settings marked in blue": "藍色標示的設定", + "don't require a reboot to apply!": "無需重開機即可套用!", + "You can also press  to show": "也可按  顯示", + "information about each setting.": "每項設定的說明。", + + " Experimental Settings are incomplete ": "實驗性設定尚未完成", + "and may not work correctly or at all!": "且可能無法正常運作!", + "Here be dragons!": "此處有危險!", + + "RAM Voltage Display Mode": "RAM電壓顯示模式", + "RAM Display Unit": "記憶體顯示單位", + "Polling Interval": "輪詢間隔", + "GPU Scheduling Override Method": "GPU調度覆蓋方法", + "GPU Scheduling Override": "GPU 調度覆蓋", + "GPU Boot Volt": "GPU 啟動電壓", + "GPU Boot Voltage": "GPU 啟動電壓", + "Memory Frequency Measurement Mode": "記憶體頻率測量模式", + " Overriding the charge current": "覆蓋充電電流", "can be dangerous and may cause": "可能很危險並可能導致", "damage to your battery or charger!": "損壞電池或充電器!", "Charge Current Override": "充電電流覆蓋", - "RAM Voltage Display Mode": "RAM電壓顯示模式", - "Polling Interval": "輪詢間隔", + "Display Color Preset": "顯示顏色預設", + "Basic": "基本", + "Saturated": "飽和", + "Washed": "淡色", + "Natural": "自然", + "Vivid": "鮮艷", + "CPU Governor Minimum Frequency": "CPU調速器最低頻率", + " Usage of unsafe display": "不安全的顯示率", "refresh rates may cause stress": "刷新率可能會造成壓力", "or damage to your display! ": "或損壞您的顯示器!", "Proceed at your own risk!": "請自行承擔風險!", "Max Handheld Display": "最大手持顯示器", + "Max Handheld Display Hz": "最大手持顯示率 Hz", "Display Clock": "顯示時鐘", + " Adjust the display voltage": "調整顯示電壓", + "with caution to avoid damage": "請謹慎操作以避免損壞", + "to your display panel! ": "顯示面板!", + "Display Voltage": "顯示電壓", + + "Thermal Throttle Limit": "熱油門限制", "Official Rating": "官方評級", "TDP Threshold": "TDP閾值", "Power": "電源", - "Thermal Throttle Limit": "熱油門限制", - "HP Mode": "惠普模式", - "Default (Mariko)": "預設(真理子)", - "Default (Erista)": "預設(埃里斯塔)", - "Rating": "評級", - "Safe Max (Mariko)": "安全最大(真理子)", - "Safe Max (Erista)": "安全最大(埃里斯塔)", + "HP Mode": "高效能模式", + + "DVB Shift": "DVB 偏移", + "SoC Max Volt": "SoC 最大電壓", + "Step Mode": "步進模式", "RAM VDD2 Voltage": "RAM VDD2 電壓", - "Voltage": "電壓", "RAM VDDQ Voltage": "RAM VDDQ 電壓", + "Voltage": "電壓", "RAM Frequency Editor": "RAM頻率編輯器", - "JEDEC.": "JEDEC。", - "High speedo needed!": "需要高速!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)", - "Ram Max Clock": "記憶體最大時鐘", + "Ram Max Clock": "記憶體最大時脈", "RAM Latency Editor": "RAM 延遲編輯器", "RAM Timing Reductions": "RAM 時序減少", "Memory Timings": "記憶體時序", @@ -102,18 +115,28 @@ "Memory Latencies": "記憶體延遲", "Read Latency": "讀取延遲", "Write Latency": "寫入延遲", - "CPU Boost Clock": "CPU 升壓時鐘", - "CPU UV": "中央處理器紫外線", + "High speedo needed!": "需要高 Speedo 值!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)", + "JEDEC.": "JEDEC。", + + "CPU Boost Clock": "CPU 升壓時脈", + "CPU UV": "CPU 降壓", "CPU Unlock": "CPU解鎖", - "CPU VMIN": "CPU最低電壓", + "CPU VMIN": "CPU 最低電壓", "CPU Max Voltage": "CPU最大電壓", "CPU Max Clock": "CPU 最大時脈", - "Extreme UV Table": "極端紫外線表", - "CPU UV Table": "CPU UV表", - "CPU Low UV": "CPU低紫外線", - "CPU High UV": "CPU高紫外線", + "Extreme UV Table": "極限降壓表", + "CPU UV Table": "CPU 降壓表", + "CPU Low UV": "CPU 低壓降壓", + "CPU High UV": "CPU 高壓降壓", "CPU Low VMIN": "CPU 低 VMIN", "CPU High VMIN": "CPU 高 VMIN", + "No Undervolt": "無欠壓", "SLT Table": "SLT表", "HiOPT Table": "HiOPT表", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU最大電壓", "GPU Voltage Offset": "GPU電壓偏移", - "Do not override": "不要覆蓋", - "Enabled (Default)": "啟用(預設)", - "96.6% limit": "96.6%限制", - "99.7% limit": "99.7%限制", - "GPU Scheduling Override": "GPU 調度覆蓋", - "Official Service": "官方服務", "GPU DVFS Mode": "GPU DVFS 模式", "GPU DVFS Offset": "GPU DVFS 偏移", "GPU Voltage Table": "GPU電壓表", "GPU Custom Table (mV)": "GPU 自訂表 (mV)", + "Official Service": "官方服務", + "96.6% limit": "96.6%限制", + "99.7% limit": "99.7%限制", + " Setting GPU Clocks past": "將 GPU 頻率設定超過", + "1228MHz without a proper undervolt": "1228MHz 未適當降壓", + "can cause degradation or damage": "可能導致劣化或損壞", + "to your console!": "您的主機!", "1075MHz without UV, 1152MHz on SLT": "無 UV 時為 1075MHz,SLT 時為 1152MHz", "or 1228MHz on HiOPT can cause ": "或 HiOPT 上的 1228MHz 可能會導致", "permanent damage to your Switch!": "對您的 Switch 造成永久性損壞!", "921MHz without UV and 960MHz on": "無 UV 時為 921MHz,開啟時為 960MHz", - "SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致" + "SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致", + + "Default (Mariko)": "預設 (Mariko)", + "Default (Erista)": "預設 (Erista)", + "Rating": "評級", + "Safe Max (Mariko)": "安全最大值 (Mariko)", + "Safe Max (Erista)": "安全最大值 (Erista)", + + "Voltages": "電壓", + "RAM Voltage:": "記憶體電壓:", + "Display Voltage:": "顯示電壓:", + "Temperatures": "溫度", + "PLLX Temp:": "PLLX 溫度:", + "AOTAG Temp:": "AOTAG 溫度:", + "BQ24193 Temp:": "BQ24193 溫度:", + "Normal": "正常", + "Warm": "溫熱", + "Hot": "過熱", + "Overheat": "嚴重過熱", + "Not Patched": "未修補", + "Invalid": "無效", + "RAM Bandwidth": "記憶體頻寬", + "RAM BW (Peak):": "RAM頻寬(峰值):", + "RAM BW (All):": "RAM頻寬(全部):", + "RAM BW (CPU):": "RAM頻寬(CPU):", + "RAM BW (GPU):": "RAM頻寬(GPU):", + "Hardware Info": "硬體資訊", + "Console Type:": "主機類型:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 模組:", + "Software Info": "軟體資訊", + "KIP version:": "KIP 版本:", + "sys-dock status:": "系統塢站狀態:", + "SaltyNX status:": "SaltyNX 狀態:", + "RR Display status:": "RR 顯示狀態:", + "Wafer Position:": "晶圓位置:", + "IDDQ:": "IDDQ:", + "Module: ": "模組:", + "Board": "主板", + "Display": "顯示", + + "Developers": "開發商", + "Contributors": "貢獻者", + "Testers": "測試人員", + "Translators": "翻譯", + "Special Thanks": "特別感謝", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "使用最少的功能進行編譯", + "THE BEER-WARE LICENSE": "啤酒製品許可證" } diff --git a/Source/hoc-clk/overlay/src/ipc.h b/Source/hoc-clk/overlay/src/ipc.h index 04b4c56f..7f514aaa 100644 --- a/Source/hoc-clk/overlay/src/ipc.h +++ b/Source/hoc-clk/overlay/src/ipc.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,17 +24,16 @@ * -------------------------------------------------------------------------- */ - #pragma once #if defined(__cplusplus) -#include "cpp_util.hpp" + #include "cpp_util.hpp" -extern "C" -{ +extern "C" { #endif #include + #include #if defined(__cplusplus) diff --git a/Source/hoc-clk/overlay/src/main.cpp b/Source/hoc-clk/overlay/src/main.cpp index 579ae30e..80b311bd 100644 --- a/Source/hoc-clk/overlay/src/main.cpp +++ b/Source/hoc-clk/overlay/src/main.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,72 +24,62 @@ * -------------------------------------------------------------------------- */ - #define TESLA_INIT_IMPL #include + #include "ui/gui/fatal_gui.h" #include "ui/gui/main_gui.h" -class AppOverlay : public tsl::Overlay -{ +class AppOverlay : public tsl::Overlay { public: - AppOverlay() {} - ~AppOverlay() {} + AppOverlay() { + } + ~AppOverlay() { + } - //virtual void initServices() override { - // rgltrInitialize(); - //} + // virtual void initServices() override { + // rgltrInitialize(); + // } - virtual void exitServices() override { - hocclkIpcExit(); + virtual void exitServices() override { + hocclkIpcExit(); + } + + virtual std::unique_ptr loadInitialGui() override { + uint32_t apiVersion; + smInitialize(); + + tsl::hlp::ScopeGuard smGuard([] { smExit(); }); + + if (!hocclkIpcRunning()) { + return initially("hoc-clk is not running.\n\n" + "\n" + "Please make sure it is correctly\n\n" + "installed and enabled.", + ""); } - virtual std::unique_ptr loadInitialGui() override - { - uint32_t apiVersion; - smInitialize(); - - tsl::hlp::ScopeGuard smGuard([] { smExit(); }); - - if(!hocclkIpcRunning()) - { - return initially( - "hoc-clk is not running.\n\n" - "\n" - "Please make sure it is correctly\n\n" - "installed and enabled.", - "" - ); - } - - if(R_FAILED(hocclkIpcInitialize()) || R_FAILED(hocclkIpcGetAPIVersion(&apiVersion))) - { - return initially( - "Could not connect to hoc-clk.\n\n" - "\n" - "Please make sure it is correctly\n\n" - "installed and enabled.", - "" - ); - } - - if(HOCCLK_IPC_API_VERSION != apiVersion) - { - return initially( - "Overlay not compatible with\n\n" - "the running hoc-clk version.\n\n" - "\n" - "Please make sure everything is\n\n" - "installed and up to date.", - "" - ); - } - - return initially(); + if (R_FAILED(hocclkIpcInitialize()) || R_FAILED(hocclkIpcGetAPIVersion(&apiVersion))) { + return initially("Could not connect to hoc-clk.\n\n" + "\n" + "Please make sure it is correctly\n\n" + "installed and enabled.", + ""); } + + if (HOCCLK_IPC_API_VERSION != apiVersion) { + return initially("Overlay not compatible with\n\n" + "the running hoc-clk version.\n\n" + "\n" + "Please make sure everything is\n\n" + "installed and up to date.", + ""); + } + + return initially(); + } }; -int main(int argc, char **argv) -{ +int main(int argc, char **argv) { return tsl::loop(argc, argv); } diff --git a/Source/hoc-clk/overlay/src/ui/format.h b/Source/hoc-clk/overlay/src/ui/format.h index 3dc15e25..f8900b06 100644 --- a/Source/hoc-clk/overlay/src/ui/format.h +++ b/Source/hoc-clk/overlay/src/ui/format.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,20 +24,18 @@ * -------------------------------------------------------------------------- */ - #pragma once +#include #include #include -#include + #include #define FREQ_DEFAULT_TEXT "Do not override" -static inline std::string formatListFreqMHz(std::uint32_t mhz) -{ - if(mhz == 0) - { +static inline std::string formatListFreqMHz(std::uint32_t mhz) { + if (mhz == 0) { return FREQ_DEFAULT_TEXT; } @@ -45,17 +43,17 @@ static inline std::string formatListFreqMHz(std::uint32_t mhz) return std::string(buf, snprintf(buf, sizeof(buf), "%u MHz", mhz)); } -static inline std::string formatListFreqHz(uint32_t hz) { return formatListFreqMHz(hz / 1000000); } +static inline std::string formatListFreqHz(uint32_t hz) { + return formatListFreqMHz(hz / 1000000); +} -static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit) -{ - if(mhz == 0) +static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit) { + if (mhz == 0) return FREQ_DEFAULT_TEXT; uint32_t mts = mhz * 2; char buf[24]; - switch(unit) - { + switch (unit) { case RamDisplayUnit_MHz: snprintf(buf, sizeof(buf), "%u MHz", mhz); break; @@ -70,18 +68,15 @@ static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit) return buf; } -static inline std::string formatListFreqHzMem(uint32_t hz, RamDisplayUnit unit) -{ +static inline std::string formatListFreqHzMem(uint32_t hz, RamDisplayUnit unit) { return formatListFreqMem(hz / 1000000, unit); } -static inline std::string formatMemClockKhzLabel(uint32_t khz, RamDisplayUnit unit) -{ +static inline std::string formatMemClockKhzLabel(uint32_t khz, RamDisplayUnit unit) { uint32_t mhz = khz / 1000; uint32_t mts = khz / 500; char buf[32]; - switch(unit) - { + switch (unit) { case RamDisplayUnit_MHz: snprintf(buf, sizeof(buf), "%u MHz", mhz); break; diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index 3ce4f1d0..b658d161 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -41,11 +41,11 @@ tsl::elm::ListItem* ramBWItemMax = NULL; tsl::elm::ListItem* bqtempitem = NULL; tsl::elm::ListItem* aotagTempItem = NULL; tsl::elm::ListItem* cTypeItem = NULL; +tsl::elm::ListItem* creditsItem = NULL; -ImageElement* CatImage = NULL; -HideableCategoryHeader* CatHeader = NULL; -HideableCustomDrawer* CatSpacer = NULL; -int lightosClickCount = 0; +#define R_ARROW "\u2192" + +class CreditsSubMenu; AboutGui::AboutGui() { @@ -166,156 +166,19 @@ void AboutGui::listUI() this->listElement->addItem(saltyNXStatusItem); this->listElement->addItem( - new tsl::elm::CategoryHeader("Credits") + new tsl::elm::CategoryHeader("General Info") ); - this->listElement->addItem( - new tsl::elm::CategoryHeader("Developers") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Souldbminer") - ); - - // Create special clickable item for Lightos - auto lightosItem = new tsl::elm::ListItem("Lightos_"); - lightosItem->setClickListener([this](u64 keys) -> bool { + creditsItem = new tsl::elm::ListItem("Credits"); + creditsItem->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { - lightosClickCount++; - if (lightosClickCount >= 10) { - if (CatImage != NULL) CatImage->setVisible(true); - if (CatHeader != NULL) CatHeader->setVisible(true); - if (CatSpacer != NULL) CatSpacer->setVisible(true); - } + tsl::changeTo(); return true; } return false; }); - this->listElement->addItem(lightosItem); - - // ---- Contributors ---- - this->listElement->addItem( - new tsl::elm::CategoryHeader("Contributors") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Dom") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Blaise25") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("tetetete-ctrl") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("B3711") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("TDRR") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("MasaGratoR") - ); - - // ---- Testers ---- - this->listElement->addItem( - new tsl::elm::CategoryHeader("Testers") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Samybigio2011") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("arcdelta") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Miki1305") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Happy") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Winnerboi77") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Blaise25") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("WE1ZARD") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Alvise") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("agjeococh") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Xenshen") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Frost") - ); - - // ---- Special Thanks ---- - this->listElement->addItem( - new tsl::elm::CategoryHeader("Special Thanks") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("SciresM - Atmosphere CFW") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("KazushiMe - Switch OC Suite") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("hanai3Bi - Switch OC Suite & EOS") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("NaGaa95 - L4T-OC-Kernel") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("RetroNX - sys-clk") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("ppkantorski - Ultrahand") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("CtCaer - Hekate, L4T and Proper Timings") - ); - - // Create cat elements but hide them initially - CatHeader = new HideableCategoryHeader("Cat"); - CatHeader->setVisible(false); - this->listElement->addItem(CatHeader); - - CatImage = new ImageElement(CAT_DATA, CAT_WIDTH, CAT_HEIGHT); - CatImage->setVisible(false); - this->listElement->addItem(CatImage); - - CatSpacer = new HideableCustomDrawer(75); - CatSpacer->setVisible(false); - this->listElement->addItem(CatSpacer); + creditsItem->setValue(R_ARROW); + this->listElement->addItem(creditsItem); } std::string AboutGui::formatRamModule() { @@ -446,5 +309,158 @@ void AboutGui::refresh() bqtempitem->setValue(strings[10]); cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true)); - } + +class CreditsSubMenu : public AboutGui { + public: + CreditsSubMenu() { } + + protected: + ImageElement* CatImage = NULL; + HideableCategoryHeader* CatHeader = NULL; + HideableCustomDrawer* CatSpacer = NULL; + int lightosClickCount = 0; + + void listUI() override { + this->listElement->addItem( + new tsl::elm::CategoryHeader("Developers") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Souldbminer") + ); + + // Create special clickable item for Lightos + auto lightosItem = new tsl::elm::ListItem("Lightos_"); + lightosItem->setClickListener([this](u64 keys) -> bool { + if (keys & HidNpadButton_A) { + lightosClickCount++; + if (lightosClickCount >= 10) { + if (CatImage != NULL) CatImage->setVisible(true); + if (CatHeader != NULL) CatHeader->setVisible(true); + if (CatSpacer != NULL) CatSpacer->setVisible(true); + } + return true; + } + return false; + }); + this->listElement->addItem(lightosItem); + + // ---- Contributors ---- + this->listElement->addItem( + new tsl::elm::CategoryHeader("Contributors") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Dom") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Blaise25") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("tetetete-ctrl") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("B3711") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("TDRR") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("MasaGratoR") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Miki1305") + ); + + // ---- Testers ---- + this->listElement->addItem( + new tsl::elm::CategoryHeader("Testers") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Samybigio2011") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("arcdelta") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Happy") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Winnerboi77") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Blaise25") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("WE1ZARD") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Alvise") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("agjeococh") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Frost") + ); + + // ---- Special Thanks ---- + this->listElement->addItem( + new tsl::elm::CategoryHeader("Special Thanks") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("SciresM, hexkyz and Alula - Atmosphere CFW") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("KazushiMe - Switch OC Suite") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("hanai3Bi - Switch OC Suite & EOS") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("RetroNX - sys-clk") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("ppkantorski - Ultrahand") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("CtCaer - Hekate, L4T and Proper Timings") + ); + + // Create cat elements but hide them initially + CatHeader = new HideableCategoryHeader("Cat"); + CatHeader->setVisible(false); + this->listElement->addItem(CatHeader); + + CatImage = new ImageElement(CAT_DATA, CAT_WIDTH, CAT_HEIGHT); + CatImage->setVisible(false); + this->listElement->addItem(CatImage); + + CatSpacer = new HideableCustomDrawer(75); + CatSpacer->setVisible(false); + this->listElement->addItem(CatSpacer); + } + +}; diff --git a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h index 291d2164..d3e38c8d 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -28,53 +28,29 @@ #include "base_menu_gui.h" #include "freq_choice_gui.h" #include "value_choice_gui.h" -class AppProfileGui : public BaseMenuGui -{ +class AppProfileGui : public BaseMenuGui { protected: - std::uint64_t applicationId; - HocClkTitleProfileList* profileList; - void openFreqChoiceGui(tsl::elm::ListItem* listItem, HocClkProfile profile, HocClkModule module); - void addModuleListItem(HocClkProfile profile, HocClkModule module); - void addModuleListItemToggle(HocClkProfile profile, HocClkModule module); - void openValueChoiceGui( - tsl::elm::ListItem* listItem, - std::uint32_t currentValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds = ValueThresholds(), - bool enableThresholds = false, - const std::map& labels = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true - ); - std::string formatValueDisplay( - std::uint32_t value, - const std::vector& namedValues, - const std::string& suffix, - std::uint32_t divisor, - int decimalPlaces - ); - void addModuleListItemValue( - HocClkProfile profile, - HocClkModule module, - const std::string& categoryName, - std::uint32_t min, - std::uint32_t max, - std::uint32_t step, - const std::string& suffix, - std::uint32_t divisor, - int decimalPlaces, - ValueThresholds thresholds, - std::vector namedValues = {}, - bool showDefaultValue = true - ); - void addGovernorSection(HocClkProfile profile); - void addProfileUI(HocClkProfile profile); + std::uint64_t applicationId; + HocClkTitleProfileList *profileList; + void openFreqChoiceGui(tsl::elm::ListItem *listItem, HocClkProfile profile, HocClkModule module); + void addModuleListItem(HocClkProfile profile, HocClkModule module); + void addModuleListItemToggle(HocClkProfile profile, HocClkModule module); + void openValueChoiceGui(tsl::elm::ListItem *listItem, std::uint32_t currentValue, const ValueRange &range, const std::string &categoryName, + ValueChoiceListener listener, const ValueThresholds &thresholds = ValueThresholds(), bool enableThresholds = false, + const std::map &labels = {}, const std::vector &namedValues = {}, + bool showDefaultValue = true); + std::string formatValueDisplay(std::uint32_t value, const std::vector &namedValues, const std::string &suffix, std::uint32_t divisor, + int decimalPlaces); + void addModuleListItemValue(HocClkProfile profile, HocClkModule module, const std::string &categoryName, std::uint32_t min, std::uint32_t max, + std::uint32_t step, const std::string &suffix, std::uint32_t divisor, int decimalPlaces, ValueThresholds thresholds, + std::vector namedValues = {}, bool showDefaultValue = true); + void addGovernorSection(HocClkProfile profile); + void addProfileUI(HocClkProfile profile); + public: - AppProfileGui(std::uint64_t applicationId, HocClkTitleProfileList* profileList); - ~AppProfileGui(); - void listUI() override; - static void changeTo(std::uint64_t applicationId); - void update() override; + AppProfileGui(std::uint64_t applicationId, HocClkTitleProfileList *profileList); + ~AppProfileGui(); + void listUI() override; + static void changeTo(std::uint64_t applicationId); + void update() override; }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp index c8da28b0..7aee9637 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ /* -------------------------------------------------------------------------- @@ -24,16 +24,18 @@ * -------------------------------------------------------------------------- */ -#include "base_gui.h" #include "../elements/base_frame.h" +#include "base_gui.h" -void BaseFrame::draw(tsl::gfx::Renderer* renderer) { + +void BaseFrame::draw(tsl::gfx::Renderer *renderer) { tsl::elm::HeaderOverlayFrame::draw(renderer); this->gui->preDraw(renderer); } -#include #include +#include + #define LOGO_Y_REAL 65 @@ -53,8 +55,8 @@ void BaseFrame::draw(tsl::gfx::Renderer* renderer) { #define VERSION_FONT_SIZE 15 extern "C" { - extern const u8 hoc_rgba[]; - extern const u32 hoc_rgba_size; +extern const u8 hoc_rgba[]; +extern const u32 hoc_rgba_size; } std::string getVersionString() { @@ -66,19 +68,13 @@ std::string getVersionString() { return std::string(buf); } -static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color( 7, 15, 15, 15); -static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color( 2, 8, 11, 15); -static constexpr tsl::Color STATIC_TEAL = tsl::Color( 7, 15, 15, 15); +static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color(7, 15, 15, 15); +static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color(2, 8, 11, 15); +static constexpr tsl::Color STATIC_TEAL = tsl::Color(7, 15, 15, 15); const std::string name = " Horizon OC"; -static s32 drawDynamicUltraText( - tsl::gfx::Renderer* renderer, - s32 startX, - s32 y, - u32 fontSize, - const tsl::Color& staticColor, - bool useNotificationMethod = false) -{ +static s32 drawDynamicUltraText(tsl::gfx::Renderer *renderer, s32 startX, s32 y, u32 fontSize, const tsl::Color &staticColor, + bool useNotificationMethod = false) { static constexpr double cycleDuration = 1.6; s32 currentX = startX; @@ -88,10 +84,10 @@ static s32 drawDynamicUltraText( const double waveScale = 2.0 * M_PI / cycleDuration; - for (size_t i = 0; i < name.size(); i++) - { + for (size_t i = 0; i < name.size(); i++) { char letter = name[i]; - if (letter == '\0') break; + if (letter == '\0') + break; double phase = waveScale * (timeNow + i * 0.12); @@ -103,15 +99,9 @@ static s32 drawDynamicUltraText( double glow = (cos(phase * 1.5) + 1.0) * 0.5; double brightness = 0.75 + glow * 0.25; - u8 r = static_cast( - ((int)dynamicLogoRGB1.r + ((int)dynamicLogoRGB2.r - (int)dynamicLogoRGB1.r) * blend) * brightness - ); - u8 g = static_cast( - ((int)dynamicLogoRGB1.g + ((int)dynamicLogoRGB2.g - (int)dynamicLogoRGB1.g) * blend) * brightness - ); - u8 b = static_cast( - ((int)dynamicLogoRGB1.b + ((int)dynamicLogoRGB2.b - (int)dynamicLogoRGB1.b) * blend) * brightness - ); + u8 r = static_cast(((int)dynamicLogoRGB1.r + ((int)dynamicLogoRGB2.r - (int)dynamicLogoRGB1.r) * blend) * brightness); + u8 g = static_cast(((int)dynamicLogoRGB1.g + ((int)dynamicLogoRGB2.g - (int)dynamicLogoRGB1.g) * blend) * brightness); + u8 b = static_cast(((int)dynamicLogoRGB1.b + ((int)dynamicLogoRGB2.b - (int)dynamicLogoRGB1.b) * blend) * brightness); r = std::clamp(r, 0, 15); g = std::clamp(g, 0, 15); @@ -137,17 +127,10 @@ static s32 drawDynamicUltraText( return currentX; } -void BaseGui::preDraw(tsl::gfx::Renderer* renderer) { +void BaseGui::preDraw(tsl::gfx::Renderer *renderer) { renderer->drawBitmap(LOGO_X, LOGO_Y_REAL - LOGO_LABEL_FONT_SIZE, LOGO_IMG_W, LOGO_IMG_H, hoc_rgba); - drawDynamicUltraText( - renderer, - LOGO_TEXT_X, - TEXT_Y, - LOGO_LABEL_FONT_SIZE, - STATIC_TEAL, - false - ); + drawDynamicUltraText(renderer, LOGO_TEXT_X, TEXT_Y, LOGO_LABEL_FONT_SIZE, STATIC_TEAL, false); static const std::string versionStr = "Version " + getVersionString() + " \"Gaea\""; static constexpr tsl::Color versionColor(9, 9, 9, 15); @@ -166,14 +149,12 @@ void BaseGui::preDraw(tsl::gfx::Renderer* renderer) { } } -tsl::elm::Element* BaseGui::createUI() -{ - BaseFrame* rootFrame = new BaseFrame(this, this->headerHeight()); +tsl::elm::Element *BaseGui::createUI() { + BaseFrame *rootFrame = new BaseFrame(this, this->headerHeight()); rootFrame->setContent(this->baseUI()); return rootFrame; } -void BaseGui::update() -{ +void BaseGui::update() { this->refresh(); } \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_gui.h b/Source/hoc-clk/overlay/src/ui/gui/base_gui.h index 0cae8bcd..8726a526 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/base_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,32 +24,36 @@ * -------------------------------------------------------------------------- */ - #pragma once -#include -#include "../elements/base_frame.h" -#include -#include -#include #include +#include +#include +#include +#include -#include "../style.h" #include "../../ipc.h" +#include "../elements/base_frame.h" +#include "../style.h" -class BaseGui : public tsl::Gui -{ + +class BaseGui : public tsl::Gui { public: - BaseGui() {} - ~BaseGui() {} - virtual void preDraw(tsl::gfx::Renderer* renderer); - void update() override; - tsl::elm::Element* createUI() override; - virtual tsl::elm::Element* baseUI() = 0; - virtual void refresh() {} - virtual u16 headerHeight() const { return HOC_HEADER_HEIGHT; } + BaseGui() { + } + ~BaseGui() { + } + virtual void preDraw(tsl::gfx::Renderer *renderer); + void update() override; + tsl::elm::Element *createUI() override; + virtual tsl::elm::Element *baseUI() = 0; + virtual void refresh() { + } + virtual u16 headerHeight() const { + return HOC_HEADER_HEIGHT; + } + private: }; - extern std::string getVersionString(); diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp index 0d715f1a..548a2bc1 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp @@ -24,23 +24,24 @@ * -------------------------------------------------------------------------- */ - +#include "../format.h" #include "base_menu_gui.h" #include "fatal_gui.h" -#include "../format.h" + #define TOP_Y_OFFSET 15 // Cache hardware model to avoid repeated syscalls -BaseMenuGui::BaseMenuGui() : tempColors{ tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), } -{ +BaseMenuGui::BaseMenuGui() + : tempColors{ + tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), + } { tsl::initializeThemeVars(); this->context = nullptr; this->lastContextUpdate = 0; this->listElement = nullptr; - // Pre-cache hardware model during initialization IsAula(); IsMariko(); @@ -51,19 +52,19 @@ BaseMenuGui::BaseMenuGui() : tempColors{ tsl::Color(0), tsl::Color(0), tsl::Colo } BaseMenuGui::~BaseMenuGui() { - delete this->context; // delete handles nullptr automatically + delete this->context; // delete handles nullptr automatically } // Fast preDraw - just renders pre-computed strings -void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { +void BaseMenuGui::preDraw(tsl::gfx::Renderer *renderer) { BaseGui::preDraw(renderer); // All constants pre-calculated and cached - const char* labels[] = { - "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", "Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() || this->context->isUsingRetroSuper ? "OLED" : "LCD", "FPS", "RES" - }; + const char *labels[] = { "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", + "Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() || this->context->isUsingRetroSuper ? "OLED" : "LCD", + "FPS", "RES" }; - static constexpr u32 dataPositions[6] = {63-3+3, 200-1, 344-1-3, 200-1, 342-1, 321-1}; + static constexpr u32 dataPositions[6] = { 63 - 3 + 3, 200 - 1, 344 - 1 - 3, 200 - 1, 342 - 1, 321 - 1 }; static u32 labelWidths[10]; static bool positionsInitialized = false; @@ -74,14 +75,23 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { } positionsInitialized = true; } - static u32 positions[10] = {24-1, 310-labelWidths[1], 24-1, 192-labelWidths[3], 332-labelWidths[4], 24-1, 192 - labelWidths[6], 332-labelWidths[7], 192 - labelWidths[8], 332-labelWidths[9]}; + static u32 positions[10] = { 24 - 1, + 310 - labelWidths[1], + 24 - 1, + 192 - labelWidths[3], + 332 - labelWidths[4], + 24 - 1, + 192 - labelWidths[6], + 332 - labelWidths[7], + 192 - labelWidths[8], + 332 - labelWidths[9] }; - static u32 maxProfileValueWidth = renderer->getTextDimensions("USB Charger", false, SMALL_TEXT_SIZE).first; // longest word + static u32 maxProfileValueWidth = renderer->getTextDimensions("USB Charger", false, SMALL_TEXT_SIZE).first; // longest word u32 y = 91 + TOP_Y_OFFSET; // === TOP SECTION === - renderer->drawRoundedRect(14, 70-1 + TOP_Y_OFFSET, 420, 30+2, 12.0f, renderer->aWithOpacity(tsl::tableBGColor)); + renderer->drawRoundedRect(14, 70 - 1 + TOP_Y_OFFSET, 420, 30 + 2, 12.0f, renderer->aWithOpacity(tsl::tableBGColor)); // App ID - use pre-formatted string renderer->drawString(labels[0], false, positions[0], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); @@ -91,7 +101,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { renderer->drawString(labels[1], false, 423 - maxProfileValueWidth - labelWidths[1] - 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(displayStrings[1], false, 423 - maxProfileValueWidth, y, SMALL_TEXT_SIZE, tsl::infoTextColor); - y += 38; // Direct assignment instead of += 38 + y += 38; // Direct assignment instead of += 38 // === MAIN DATA SECTION === renderer->drawRoundedRect(14, 106 + TOP_Y_OFFSET, 420, 156, 10.0f, renderer->aWithOpacity(tsl::tableBGColor)); @@ -106,8 +116,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { renderer->drawString(displayStrings[3], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU renderer->drawString(displayStrings[4], false, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // MEM - y += 20; // Direct assignment (129 + 20) - + y += 20; // Direct assignment (129 + 20) renderer->drawString(displayStrings[5], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU real renderer->drawString(displayStrings[6], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU real @@ -119,19 +128,20 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { // === REAL FREQUENCIES === - y += 20; // Direct assignment (149 + 20) + y += 20; // Direct assignment (149 + 20) // === VOLTAGES === - renderer->drawString(displayStrings[8], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU voltage - renderer->drawString(displayStrings[9], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU voltage + renderer->drawString(displayStrings[8], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU voltage + renderer->drawString(displayStrings[9], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU voltage - renderer->drawStringWithColoredSections(displayStrings[10], false, {""}, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor, tsl::separatorColor); + renderer->drawStringWithColoredSections(displayStrings[10], false, { "" }, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor, + tsl::separatorColor); renderer->drawString(displayStrings[19], false, positions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU Usage renderer->drawString(displayStrings[17], false, positions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU Usage renderer->drawString(displayStrings[18], false, positions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RAM Usage - y += 22; // Direct assignment (169 + 22) + y += 22; // Direct assignment (169 + 22) // === TEMPERATURE SECTION === // Labels @@ -141,59 +151,57 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { // Temperatures with color - use pre-computed colors renderer->drawString(displayStrings[11], false, dataPositions[0] - 1, y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_SOC]); // SOC - renderer->drawString(displayStrings[12], false, dataPositions[1], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_PCB]); // PCB - renderer->drawString(displayStrings[13], false, dataPositions[2], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Skin]); // Skin + renderer->drawString(displayStrings[12], false, dataPositions[1], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_PCB]); // PCB + renderer->drawString(displayStrings[13], false, dataPositions[2], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Skin]); // Skin - y += 20; // Direct assignment (191 + 20) + y += 20; // Direct assignment (191 + 20) - renderer->drawString(displayStrings[14], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // SOC voltage + renderer->drawString(displayStrings[14], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // SOC voltage // Power labels and values - renderer->drawString(labels[8], false, positions[8]-1, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); + renderer->drawString(labels[8], false, positions[8] - 1, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(labels[9], false, positions[9], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(displayStrings[15], false, dataPositions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Power now renderer->drawString(displayStrings[16], false, dataPositions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Power avg - y+=20; + y += 20; renderer->drawString(labels[10], false, positions[2], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(displayStrings[20], false, dataPositions[0], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Battery]); // Battery - renderer->drawString(labels[12], false, positions[3], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // fan label + renderer->drawString(labels[12], false, positions[3], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // fan label - renderer->drawString(displayStrings[24], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // fan speed + renderer->drawString(displayStrings[24], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // fan speed - renderer->drawString(labels[13], false, positions[4] + 4, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // disp label + renderer->drawString(labels[13], false, positions[4] + 4, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // disp label - renderer->drawString(displayStrings[25], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // disp freq + renderer->drawString(displayStrings[25], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // disp freq - y+=20; + y += 20; - renderer->drawString(displayStrings[21], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat voltage + renderer->drawString(displayStrings[21], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat voltage renderer->drawString(displayStrings[23], false, positions[2] - 2, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat Age - if(this->context->isSaltyNXInstalled) { + if (this->context->isSaltyNXInstalled) { - renderer->drawString(labels[15], false, positions[3] + 7, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label - renderer->drawString(displayStrings[27], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES - - renderer->drawString(labels[14], false, positions[4] + 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label - renderer->drawString(displayStrings[26], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS + renderer->drawString(labels[15], false, positions[3] + 7, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label + renderer->drawString(displayStrings[27], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES + renderer->drawString(labels[14], false, positions[4] + 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label + renderer->drawString(displayStrings[26], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS } - y+=20; + y += 20; } // Optimized refresh - now does all the string formatting once per second -void BaseMenuGui::refresh() -{ +void BaseMenuGui::refresh() { const u64 ticks = armGetSystemTick(); // Use cached comparison - 1 billion nanoseconds if (armTicksToNs(ticks - this->lastContextUpdate) <= 1000000000UL) [[likely]] { - return; // Early exit for most calls + return; // Early exit for most calls } this->lastContextUpdate = ticks; @@ -224,22 +232,22 @@ void BaseMenuGui::refresh() strcpy(displayStrings[1], hocclkFormatProfile(context->profile, true)); // Current frequencies - u32 hz = context->freqs[HocClkModule_CPU]; // CPU + u32 hz = context->freqs[HocClkModule_CPU]; // CPU sprintf(displayStrings[2], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->freqs[HocClkModule_GPU]; // GPU + hz = context->freqs[HocClkModule_GPU]; // GPU sprintf(displayStrings[3], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->freqs[HocClkModule_MEM]; // MEM + hz = context->freqs[HocClkModule_MEM]; // MEM std::uint32_t unit = configList.values[HocClkConfigValue_RamDisplayUnit]; std::uint32_t mhz = hz / 1000000U; std::uint32_t mts = mhz * 2; std::uint32_t tenth = (hz / 100000U) % 10U; - if(unit == RamDisplayUnit_MTs) + if (unit == RamDisplayUnit_MTs) sprintf(displayStrings[4], "%u MT/s", mts); - else if(unit == RamDisplayUnit_MHz) + else if (unit == RamDisplayUnit_MHz) sprintf(displayStrings[4], "%u.%u MHz", mhz, tenth); - else if(unit == RamDisplayUnit_MHzMTs) { + else if (unit == RamDisplayUnit_MHzMTs) { hz = context->realFreqs[HocClkModule_MEM]; mhz = hz / 1000000U; tenth = (hz / 100000U) % 10U; @@ -247,18 +255,18 @@ void BaseMenuGui::refresh() } // Real frequencies - hz = context->realFreqs[HocClkModule_CPU]; // CPU + hz = context->realFreqs[HocClkModule_CPU]; // CPU sprintf(displayStrings[5], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->realFreqs[HocClkModule_GPU]; // GPU + hz = context->realFreqs[HocClkModule_GPU]; // GPU sprintf(displayStrings[6], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->realFreqs[HocClkModule_MEM]; // MEM + hz = context->realFreqs[HocClkModule_MEM]; // MEM unit = configList.values[HocClkConfigValue_RamDisplayUnit]; mhz = hz / 1000000U; mts = mhz * 2; tenth = (hz / 100000U) % 10U; - if(unit == RamDisplayUnit_MTs || unit == RamDisplayUnit_MHzMTs) + if (unit == RamDisplayUnit_MTs || unit == RamDisplayUnit_MHzMTs) sprintf(displayStrings[7], "%u MT/s", mts); else sprintf(displayStrings[7], "%u.%u MHz", mhz, tenth); @@ -267,12 +275,14 @@ void BaseMenuGui::refresh() sprintf(displayStrings[8], "%.1f mV", context->voltages[HocClkVoltage_CPU] / 1000.0); sprintf(displayStrings[9], "%.1f mV", context->voltages[HocClkVoltage_GPU] / 1000.0); - switch(configList.values[HocClkConfigValue_RAMVoltDisplayMode]) { + switch (configList.values[HocClkConfigValue_RAMVoltDisplayMode]) { case RamDisplayMode_VDD2: - sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, (context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U); + sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, + (context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U); break; case RamDisplayMode_VDDQ: - sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDDQ] / 1000U, (context->voltages[HocClkVoltage_EMCVDDQ] % 1000U) / 100U); + sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDDQ] / 1000U, + (context->voltages[HocClkVoltage_EMCVDDQ] % 1000U) / 100U); break; default: strcpy(displayStrings[10], "N/A"); @@ -280,15 +290,15 @@ void BaseMenuGui::refresh() } // Temperatures and pre-compute colors - u32 millis = context->temps[HocClkThermalSensor_SOC]; // SOC + u32 millis = context->temps[HocClkThermalSensor_SOC]; // SOC sprintf(displayStrings[11], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_SOC] = tsl::GradientColor(millis * 0.001f); - millis = context->temps[HocClkThermalSensor_PCB]; // PCB + millis = context->temps[HocClkThermalSensor_PCB]; // PCB sprintf(displayStrings[12], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_PCB] = tsl::GradientColor(millis * 0.001f); - millis = context->temps[HocClkThermalSensor_Skin]; // Skin + millis = context->temps[HocClkThermalSensor_Skin]; // Skin sprintf(displayStrings[13], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_Skin] = tsl::GradientColor(millis * 0.001f); @@ -296,26 +306,26 @@ void BaseMenuGui::refresh() sprintf(displayStrings[14], "%u mV", context->voltages[HocClkVoltage_SOC] / 1000U); // Power - sprintf(displayStrings[15], "%d mW", context->power[0]); // Now - sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg + sprintf(displayStrings[15], "%d mW", context->power[0]); // Now + sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg sprintf(displayStrings[17], "%u%%", context->partLoad[HocClkPartLoad_GPU] / 10); sprintf(displayStrings[18], "%u%%", context->partLoad[HocClkPartLoad_EMC] / 10); sprintf(displayStrings[19], "%u%%", context->partLoad[HocClkPartLoad_CPUMax] / 10); - millis = context->temps[HocClkThermalSensor_Battery]; // Battery + millis = context->temps[HocClkThermalSensor_Battery]; // Battery sprintf(displayStrings[20], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_Battery] = tsl::GradientColor(millis * 0.001f); - sprintf(displayStrings[21], "%d mV", context->voltages[HocClkVoltage_Battery]); // BAT AVG + sprintf(displayStrings[21], "%d mV", context->voltages[HocClkVoltage_Battery]); // BAT AVG sprintf(displayStrings[23], "%u%%", context->partLoad[HocClkPartLoad_BAT] / 1000); sprintf(displayStrings[24], "%u%%", context->partLoad[HocClkPartLoad_FAN]); sprintf(displayStrings[25], "%u Hz", context->realFreqs[HocClkModule_Display]); - if(this->context->isSaltyNXInstalled) { - if(context->fps == 254) { + if (this->context->isSaltyNXInstalled) { + if (context->fps == 254) { strcpy(displayStrings[26], "N/A"); } else { memset(displayStrings[26], 0, sizeof(displayStrings[26])); @@ -323,8 +333,8 @@ void BaseMenuGui::refresh() } } - if(this->context->isSaltyNXInstalled) { - if(context->resolutionHeight == 0) { + if (this->context->isSaltyNXInstalled) { + if (context->resolutionHeight == 0) { strcpy(displayStrings[27], "N/A"); } else { memset(displayStrings[27], 0, sizeof(displayStrings[27])); @@ -343,12 +353,10 @@ void BaseMenuGui::refresh() millis = context->temps[HocClkThermalSensor_MEM]; sprintf(displayStrings[30], "%u.%u", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_MEM] = tsl::GradientColor(millis * 0.001f); - } -tsl::elm::Element* BaseMenuGui::baseUI() -{ - auto* list = new tsl::elm::List(); +tsl::elm::Element *BaseMenuGui::baseUI() { + auto *list = new tsl::elm::List(); this->listElement = list; this->listUI(); diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h index 4554298c..eb0758ff 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,69 +24,66 @@ * -------------------------------------------------------------------------- */ - #pragma once #include "../../ipc.h" #include "base_gui.h" -class BaseMenuGui : public BaseGui -{ +class BaseMenuGui : public BaseGui { protected: - public: - // u8 dockedHighestAllowedRefreshRate = 60; - HocClkContext* context; - std::uint64_t lastContextUpdate; - HocClkConfigValueList configList; - bool g_hardwareModelCached = false; - bool g_isMariko = false; - bool g_isAula = false; - bool g_isHoag = false; - SetSysProductModel HWmodel = SetSysProductModel_Invalid; - - bool IsAula() { - if (!g_hardwareModelCached) { - setsysGetProductModel(&HWmodel); - g_hardwareModelCached = true; - } - g_isAula = (HWmodel == SetSysProductModel_Aula); - return g_isAula; - } - bool IsHoag() { - if (!g_hardwareModelCached) { - setsysGetProductModel(&HWmodel); - g_hardwareModelCached = true; - } - g_isHoag = (HWmodel == SetSysProductModel_Hoag); - return g_isHoag; - } - bool IsMariko() { - if (!g_hardwareModelCached) { - setsysGetProductModel(&HWmodel); - g_hardwareModelCached = true; - } - g_isMariko = (HWmodel == SetSysProductModel_Iowa || - HWmodel == SetSysProductModel_Hoag || - HWmodel == SetSysProductModel_Calcio || - HWmodel == SetSysProductModel_Aula); + // u8 dockedHighestAllowedRefreshRate = 60; + HocClkContext *context; + std::uint64_t lastContextUpdate; + HocClkConfigValueList configList; + bool g_hardwareModelCached = false; + bool g_isMariko = false; + bool g_isAula = false; + bool g_isHoag = false; + SetSysProductModel HWmodel = SetSysProductModel_Invalid; - return g_isMariko; + bool IsAula() { + if (!g_hardwareModelCached) { + setsysGetProductModel(&HWmodel); + g_hardwareModelCached = true; } + g_isAula = (HWmodel == SetSysProductModel_Aula); + return g_isAula; + } + bool IsHoag() { + if (!g_hardwareModelCached) { + setsysGetProductModel(&HWmodel); + g_hardwareModelCached = true; + } + g_isHoag = (HWmodel == SetSysProductModel_Hoag); + return g_isHoag; + } + bool IsMariko() { + if (!g_hardwareModelCached) { + setsysGetProductModel(&HWmodel); + g_hardwareModelCached = true; + } + g_isMariko = (HWmodel == SetSysProductModel_Iowa || HWmodel == SetSysProductModel_Hoag || HWmodel == SetSysProductModel_Calcio || + HWmodel == SetSysProductModel_Aula); - bool IsErista() { - return !IsMariko(); - } - BaseMenuGui(); - ~BaseMenuGui(); - void preDraw(tsl::gfx::Renderer* renderer) override; - tsl::elm::List* listElement; - tsl::elm::Element* baseUI() override; - void refresh() override; - virtual void listUI() = 0; - u16 headerHeight() const override { return HOC_BOX_BOTTOM + 9; } + return g_isMariko; + } + + bool IsErista() { + return !IsMariko(); + } + BaseMenuGui(); + ~BaseMenuGui(); + void preDraw(tsl::gfx::Renderer *renderer) override; + tsl::elm::List *listElement; + tsl::elm::Element *baseUI() override; + void refresh() override; + virtual void listUI() = 0; + u16 headerHeight() const override { + return HOC_BOX_BOTTOM + 9; + } private: - char displayStrings[48][32]; // Pre-formatted display strings - tsl::Color tempColors[HocClkThermalSensor_EnumMax]; // Pre-computed temperature colors + char displayStrings[48][32]; // Pre-formatted display strings + tsl::Color tempColors[HocClkThermalSensor_EnumMax]; // Pre-computed temperature colors }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/cat.h b/Source/hoc-clk/overlay/src/ui/gui/cat.h index a4c56ff4..8ab37d01 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/cat.h +++ b/Source/hoc-clk/overlay/src/ui/gui/cat.h @@ -12,4107 +12,2059 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ // this is a generated file, do not edit manually. // cat.png - 96x128 static const unsigned int CAT_WIDTH = 96; static const unsigned int CAT_HEIGHT = 128; static const unsigned char CAT_DATA[] = { - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, - 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xD6, 0xD7, 0xD4, 0xFF, 0x56, 0x57, 0x54, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x39, 0x39, 0x3B, 0xFF, - 0xB7, 0xB7, 0xB7, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, - 0xE4, 0xE5, 0xDE, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, - 0xD5, 0xD6, 0xD1, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, - 0xDF, 0xDD, 0xD9, 0xFF, 0xF0, 0xEF, 0xEB, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, - 0xE1, 0xE0, 0xDC, 0xFF, 0xDE, 0xDA, 0xD7, 0xFF, 0xD5, 0xD1, 0xCE, 0xFF, - 0xE7, 0xE3, 0xE0, 0xFF, 0xE9, 0xE5, 0xE1, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, - 0xEC, 0xE6, 0xE4, 0xFF, 0xEC, 0xE6, 0xE4, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xA3, 0xA3, 0xA1, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, 0x22, 0x21, 0x24, 0xFF, - 0x6A, 0x6A, 0x6A, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE5, 0xE7, 0xDF, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xEE, 0xEF, 0xE7, 0xFF, - 0xF0, 0xF1, 0xEA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, - 0xE6, 0xE4, 0xE0, 0xFF, 0xE6, 0xE4, 0xE0, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, - 0xD2, 0xD0, 0xCC, 0xFF, 0x9F, 0x9B, 0x98, 0xFF, 0x9D, 0x99, 0x96, 0xFF, - 0xB7, 0xB2, 0xAF, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, - 0xD9, 0xD2, 0xD0, 0xFF, 0xD9, 0xD2, 0xD0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0x77, 0x77, 0x75, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, 0x13, 0x12, 0x15, 0xFF, - 0x1E, 0x1E, 0x1E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xDD, 0xDE, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, - 0xEE, 0xEF, 0xE7, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, 0xF1, 0xF2, 0xED, 0xFF, - 0xF0, 0xF1, 0xEC, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE0, 0xDE, 0xDA, 0xFF, 0xBB, 0xB9, 0xB5, 0xFF, 0x7D, 0x7B, 0x77, 0xFF, - 0x37, 0x36, 0x32, 0xFF, 0x24, 0x20, 0x1D, 0xFF, 0x73, 0x6F, 0x6C, 0xFF, - 0xC4, 0xC0, 0xBD, 0xFF, 0xEE, 0xEA, 0xE7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, - 0xE0, 0xD9, 0xD7, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xDD, 0xDE, 0xDB, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0x5C, 0x5C, 0x5A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x13, 0x12, 0x15, 0xFF, 0x13, 0x12, 0x15, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE4, 0xE5, 0xDE, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, - 0xEC, 0xED, 0xE8, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0x70, 0x6F, 0x6B, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, - 0x10, 0x0E, 0x0A, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0xB2, 0xAE, 0xAB, 0xFF, - 0xF4, 0xF0, 0xED, 0xFF, 0xE6, 0xE2, 0xDF, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, - 0xEA, 0xE4, 0xE1, 0xFF, 0xEA, 0xE4, 0xE1, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, - 0x30, 0x30, 0x2E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x33, 0x34, 0x2F, 0xFF, - 0x21, 0x1F, 0x1B, 0xFF, 0x25, 0x23, 0x1F, 0xFF, 0x28, 0x26, 0x22, 0xFF, - 0x46, 0x45, 0x41, 0xFF, 0xBB, 0xB7, 0xB4, 0xFF, 0xED, 0xE9, 0xE6, 0xFF, - 0xEA, 0xE6, 0xE3, 0xFF, 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, - 0xDC, 0xD6, 0xD3, 0xFF, 0xE3, 0xDD, 0xDA, 0xFF, 0xF1, 0xEB, 0xE8, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, - 0x24, 0x24, 0x22, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x15, 0x15, 0x17, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x53, 0x53, 0x51, 0xFF, - 0xCF, 0xD0, 0xCB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xF5, 0xF5, 0xF0, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, - 0xD4, 0xD5, 0xD0, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x0E, 0x0D, 0x09, 0xFF, 0x0E, 0x0D, 0x09, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, - 0x9B, 0x9A, 0x96, 0xFF, 0xDD, 0xD9, 0xD6, 0xFF, 0xE3, 0xDF, 0xDC, 0xFF, - 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xDC, 0xD9, 0xFF, 0xF6, 0xEF, 0xED, 0xFF, - 0xF5, 0xEE, 0xEC, 0xFF, 0xE8, 0xE1, 0xDF, 0xFF, 0xD5, 0xCF, 0xCC, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xEA, 0xEA, 0xE8, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x13, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x26, 0x27, 0x24, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xEB, 0xEC, 0xE7, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x07, 0x08, 0x03, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x63, 0x62, 0x5E, 0xFF, - 0xC4, 0xC2, 0xBE, 0xFF, 0xE8, 0xE7, 0xE3, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, - 0xE6, 0xE4, 0xE0, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xD9, 0xD5, 0xD2, 0xFF, - 0xD0, 0xCC, 0xC9, 0xFF, 0xB7, 0xB2, 0xAF, 0xFF, 0x9C, 0x98, 0x94, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0x63, 0x63, 0x61, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x17, 0x17, 0x19, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x5D, 0x5E, 0x59, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xD6, 0xD7, 0xD2, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, - 0x97, 0x98, 0x93, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x1B, 0x1A, 0x16, 0xFF, 0x42, 0x40, 0x3C, 0xFF, 0xAE, 0xAC, 0xA8, 0xFF, - 0xE1, 0xE0, 0xDC, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, - 0xD6, 0xD4, 0xD0, 0xFF, 0xC5, 0xC4, 0xC0, 0xFF, 0x97, 0x93, 0x90, 0xFF, - 0x96, 0x92, 0x8F, 0xFF, 0xA3, 0x9F, 0x9B, 0xFF, 0xB4, 0xB0, 0xAD, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x1C, 0x1C, 0x1E, 0xFF, 0x16, 0x16, 0x18, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x86, 0x87, 0x80, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, - 0xC9, 0xCB, 0xC3, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, - 0xCC, 0xCD, 0xC8, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, - 0xE5, 0xE7, 0xDF, 0xFF, 0xEC, 0xEE, 0xE6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xE1, 0xE2, 0xDB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, - 0xF0, 0xF1, 0xEC, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xEA, 0xEB, 0xE6, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, - 0x5D, 0x5E, 0x59, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x48, 0x49, 0x44, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x4C, 0x4C, 0x48, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xD3, 0xD4, 0xCF, 0xFF, 0xB5, 0xB3, 0xAF, 0xFF, 0xAA, 0xA9, 0xA5, 0xFF, - 0x9E, 0x9C, 0x98, 0xFF, 0x93, 0x92, 0x8E, 0xFF, 0xA6, 0xA4, 0xA0, 0xFF, - 0xBB, 0xB9, 0xB5, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x4E, 0x4E, 0x4C, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x55, 0x56, 0x4F, 0xFF, - 0x58, 0x5A, 0x52, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, - 0x41, 0x42, 0x3D, 0xFF, 0x55, 0x56, 0x51, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0xA2, 0xA3, 0x9C, 0xFF, 0xC2, 0xC4, 0xBC, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xDB, 0xDC, 0xD7, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, - 0xB7, 0xB8, 0xB3, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xB3, 0xB4, 0xAF, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x9A, 0x98, 0x94, 0xFF, 0xA7, 0xA5, 0xA1, 0xFF, - 0xBA, 0xB8, 0xB4, 0xFF, 0xC6, 0xC5, 0xC1, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, - 0xD9, 0xD7, 0xD3, 0xFF, 0xE2, 0xE1, 0xDD, 0xFF, 0xE3, 0xE2, 0xDE, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE7, 0xE7, 0xE5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x53, 0x53, 0x51, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x1A, 0x1B, 0x14, 0xFF, 0x24, 0x25, 0x1E, 0xFF, - 0x2B, 0x2C, 0x25, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x35, 0x30, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, - 0x46, 0x47, 0x40, 0xFF, 0x4E, 0x4F, 0x48, 0xFF, 0x6F, 0x70, 0x69, 0xFF, - 0x8F, 0x90, 0x89, 0xFF, 0xB0, 0xB1, 0xA8, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, - 0xA5, 0xA7, 0x9F, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x45, 0x46, 0x3F, 0xFF, - 0x22, 0x23, 0x1C, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x0C, 0x0C, 0x08, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, - 0xB8, 0xB9, 0xB4, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, - 0xDD, 0xDE, 0xD9, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x55, 0x55, 0x53, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x15, 0x16, 0x0F, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, - 0x28, 0x29, 0x22, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, - 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x2B, 0xFF, 0x31, 0x32, 0x2B, 0xFF, - 0x41, 0x42, 0x3B, 0xFF, 0x44, 0x45, 0x3B, 0xFF, 0x37, 0x38, 0x2F, 0xFF, - 0x30, 0x31, 0x2A, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x21, 0x22, 0x1B, 0xFF, - 0x26, 0x28, 0x20, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x22, 0x23, 0x1E, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, - 0xDA, 0xDB, 0xD6, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0x61, 0x61, 0x5F, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x14, 0x13, 0x16, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x32, 0x33, 0x2C, 0xFF, 0x38, 0x39, 0x32, 0xFF, 0x28, 0x29, 0x22, 0xFF, - 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x29, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, - 0x2D, 0x2F, 0x27, 0xFF, 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, - 0x1C, 0x1D, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, - 0xDE, 0xDF, 0xDA, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xD2, 0xD2, 0xCE, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0x65, 0x66, 0x63, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x08, 0x08, 0x0A, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x09, 0x0A, 0x07, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x26, 0x27, 0x22, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x29, 0x2A, 0x23, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x36, 0x37, 0x30, 0xFF, - 0x38, 0x39, 0x32, 0xFF, 0x34, 0x36, 0x2C, 0xFF, 0x2A, 0x2B, 0x22, 0xFF, - 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, - 0x16, 0x17, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x85, 0x86, 0x81, 0xFF, - 0xB6, 0xB6, 0xB2, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xEF, 0xEF, 0xEB, 0xFF, 0xEB, 0xEC, 0xE7, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xDC, 0xDD, 0xD8, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0x6B, 0x6C, 0x69, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, 0x17, 0x17, 0x19, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x09, 0x0A, 0x07, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x25, 0x26, 0x21, 0xFF, - 0x2A, 0x2B, 0x24, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x22, 0x23, 0x1C, 0xFF, - 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x28, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, - 0x30, 0x31, 0x2A, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x24, 0x25, 0x1E, 0xFF, - 0x1E, 0x1F, 0x18, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x07, 0x07, 0x05, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, - 0xC6, 0xC7, 0xC2, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, - 0xD7, 0xD8, 0xD3, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x70, 0x70, 0x6E, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0E, 0x0F, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, - 0x28, 0x28, 0x24, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x2A, 0xFF, - 0x34, 0x36, 0x2E, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x2C, 0x2D, 0x26, 0xFF, - 0x2A, 0x2B, 0x24, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x1E, 0x1F, 0x18, 0xFF, - 0x1A, 0x1B, 0x14, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x53, 0x53, 0x4F, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, - 0xDD, 0xDE, 0xD9, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0x63, 0x63, 0x63, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x22, 0x22, 0x22, 0xFF, - 0x1C, 0x1C, 0x1C, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x36, 0x2E, 0xFF, 0x2F, 0x30, 0x29, 0xFF, - 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1A, 0x1E, 0x18, 0xFF, - 0x13, 0x17, 0x11, 0xFF, 0x10, 0x13, 0x0D, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x15, 0x17, 0x16, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x02, 0x05, 0x01, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, - 0xC5, 0xC6, 0xC1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x64, 0x64, 0x64, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x22, 0x23, 0x1E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x32, 0x33, 0x2C, 0xFF, - 0x28, 0x2C, 0x26, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x26, 0x29, 0x24, 0xFF, - 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x1D, 0x20, 0x1A, 0xFF, - 0x16, 0x19, 0x13, 0xFF, 0x11, 0x14, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x09, 0x0B, 0x0A, 0xFF, 0x0A, 0x0C, 0x0C, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x25, 0x27, 0x26, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x66, 0x66, 0x66, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x32, 0x33, 0x2C, 0xFF, 0x34, 0x36, 0x2E, 0xFF, - 0x28, 0x2C, 0x26, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2B, 0x2E, 0x28, 0xFF, - 0x2C, 0x2F, 0x29, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x20, 0x23, 0x1E, 0xFF, - 0x19, 0x1C, 0x17, 0xFF, 0x15, 0x18, 0x12, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x0C, 0x0F, 0x0E, 0xFF, - 0x2C, 0x2E, 0x2D, 0xFF, 0x80, 0x80, 0x7E, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, - 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, - 0xD3, 0xD3, 0xD1, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, - 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0x69, 0x69, 0x69, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, - 0x27, 0x2A, 0x25, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2F, 0x33, 0x2D, 0xFF, - 0x32, 0x35, 0x2F, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1A, 0x1E, 0x18, 0xFF, 0x17, 0x1A, 0x14, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x08, 0x0A, 0x09, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x32, 0x34, 0x33, 0xFF, 0x81, 0x82, 0x7F, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, - 0xC8, 0xC9, 0xC2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, - 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, - 0xBF, 0xC0, 0xBB, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, - 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, - 0xD2, 0xD2, 0xCE, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x6A, 0x6A, 0x6A, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x25, 0x26, 0x23, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x32, 0x33, 0x2E, 0xFF, - 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, - 0x25, 0x28, 0x22, 0xFF, 0x2D, 0x30, 0x2D, 0xFF, 0x25, 0x28, 0x24, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, - 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x0C, 0x0E, 0x10, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x17, 0x19, 0x18, 0xFF, - 0x4C, 0x4F, 0x4E, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, - 0xCD, 0xCE, 0xC7, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, - 0xE0, 0xE1, 0xDA, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xC9, 0xCB, 0xC3, 0xFF, 0xBA, 0xBB, 0xB4, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, - 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, - 0xB8, 0xB9, 0xB4, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, - 0xC7, 0xC8, 0xC3, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, - 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x69, 0x69, 0x69, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x23, 0x23, 0x21, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x2D, 0x30, 0x2B, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, - 0x21, 0x25, 0x1F, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x24, 0x26, 0x23, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x11, 0x14, 0x11, 0xFF, - 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x0C, 0x0E, 0x10, 0xFF, 0x1C, 0x1E, 0x1F, 0xFF, 0x20, 0x23, 0x22, 0xFF, - 0x6C, 0x6E, 0x6D, 0xFF, 0xB6, 0xB6, 0xB4, 0xFF, 0xCE, 0xCF, 0xCA, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, - 0xDE, 0xE0, 0xD8, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xD5, 0xD6, 0xCF, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, - 0xC0, 0xC1, 0xBA, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, - 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, - 0xBE, 0xBF, 0xBA, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, - 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0x65, 0x65, 0x65, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x1F, 0x20, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, - 0x32, 0x35, 0x2F, 0xFF, 0x2C, 0x2F, 0x29, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1D, 0x20, 0x1A, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x21, 0x24, 0x21, 0xFF, - 0x1D, 0x1F, 0x1C, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x19, 0x1B, 0x1D, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, - 0x91, 0x94, 0x93, 0xFF, 0xCC, 0xCC, 0xCA, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xCC, 0xCD, 0xC6, 0xFF, 0xC6, 0xC7, 0xC0, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, - 0xA8, 0xA9, 0xA2, 0xFF, 0x93, 0x94, 0x8D, 0xFF, 0x82, 0x84, 0x7C, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, - 0xB4, 0xB5, 0xB0, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC2, 0xC3, 0xBE, 0xFF, - 0xCB, 0xCB, 0xC7, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, - 0xDD, 0xDE, 0xDB, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, 0x63, 0x63, 0x63, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0D, 0x0C, 0x0F, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x1D, 0x1D, 0x1B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, - 0x35, 0x38, 0x33, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x21, 0x25, 0x1F, 0xFF, - 0x19, 0x1C, 0x17, 0xFF, 0x23, 0x25, 0x22, 0xFF, 0x20, 0x23, 0x20, 0xFF, - 0x1E, 0x21, 0x1D, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x12, 0x14, 0x16, 0xFF, 0x1D, 0x1F, 0x20, 0xFF, 0x4B, 0x4E, 0x4D, 0xFF, - 0xBB, 0xBD, 0xBD, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xDC, 0xDD, 0xD6, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, - 0xDE, 0xE0, 0xD6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, - 0xBF, 0xC0, 0xB9, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, - 0x90, 0x92, 0x8A, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x66, 0x68, 0x60, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, - 0xB2, 0xB3, 0xAC, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, - 0xBB, 0xBC, 0xB7, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, - 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD6, 0xD7, 0xD4, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xC5, 0xC5, 0xC3, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, - 0xDA, 0xDA, 0xD8, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x3B, 0x3C, 0x39, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x24, 0x25, 0x20, 0xFF, - 0x30, 0x34, 0x2E, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, - 0x1E, 0x21, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x12, 0x14, 0x16, 0xFF, 0x20, 0x22, 0x24, 0xFF, 0x91, 0x94, 0x93, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xDB, 0xDC, 0xD3, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, - 0xDE, 0xE0, 0xD6, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD2, 0xD3, 0xCC, 0xFF, 0xC7, 0xC8, 0xC1, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, - 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x96, 0x97, 0x90, 0xFF, - 0x7D, 0x7E, 0x77, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, - 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, - 0xB0, 0xB1, 0xAA, 0xFF, 0xB1, 0xB2, 0xAB, 0xFF, 0xB0, 0xB1, 0xAA, 0xFF, - 0xB6, 0xB6, 0xB2, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, - 0xCD, 0xCE, 0xC9, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, - 0xD6, 0xD7, 0xD2, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, - 0xC2, 0xC3, 0xC0, 0xFF, 0xB4, 0xB5, 0xB2, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, - 0xB7, 0xB7, 0xB5, 0xFF, 0x7E, 0x7E, 0x7C, 0xFF, 0x29, 0x29, 0x27, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, - 0x21, 0x25, 0x1F, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, - 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x16, 0x18, 0x19, 0xFF, 0x24, 0x26, 0x27, 0xFF, 0x6F, 0x72, 0x71, 0xFF, - 0x95, 0x97, 0x96, 0xFF, 0xCB, 0xCB, 0xC9, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, - 0xE1, 0xE2, 0xDB, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, - 0xDD, 0xDF, 0xD5, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, - 0xC9, 0xCB, 0xC3, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, - 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, 0x74, 0x76, 0x6E, 0xFF, - 0x61, 0x62, 0x5B, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x50, 0x52, 0x4A, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xAC, 0xAD, 0xA8, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA5, 0xFF, - 0xAB, 0xAC, 0xA5, 0xFF, 0xAC, 0xAD, 0xA6, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, - 0xBB, 0xBC, 0xB7, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, - 0xC4, 0xC4, 0xC0, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, - 0xCE, 0xCE, 0xCC, 0xFF, 0xBF, 0xBF, 0xBD, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, - 0xAF, 0xAF, 0xAD, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAA, 0xAA, 0xA8, 0xFF, - 0x9A, 0x9A, 0x98, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x1E, 0x21, 0x1B, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x27, 0x2A, 0x25, 0xFF, - 0x23, 0x26, 0x20, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, - 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x13, 0x16, 0x13, 0xFF, - 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x0E, 0x10, 0x11, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x42, 0x44, 0x44, 0xFF, - 0x71, 0x73, 0x72, 0xFF, 0xBD, 0xBD, 0xBB, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, - 0xCF, 0xD0, 0xC9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, - 0xDD, 0xDF, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, - 0xC0, 0xC1, 0xBA, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, - 0x8D, 0x8E, 0x87, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x56, 0x57, 0x50, 0xFF, - 0x4B, 0x4C, 0x44, 0xFF, 0x53, 0x54, 0x4D, 0xFF, 0x69, 0x6A, 0x63, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, - 0xA8, 0xA9, 0xA2, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, - 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, - 0xB8, 0xB8, 0xB6, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x9E, 0x9F, 0x9C, 0xFF, - 0x96, 0x97, 0x94, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, - 0x7A, 0x7B, 0x78, 0xFF, 0x3D, 0x3D, 0x3B, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x15, 0x18, 0x12, 0xFF, 0x1E, 0x21, 0x1B, 0xFF, 0x24, 0x27, 0x21, 0xFF, - 0x25, 0x28, 0x24, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x17, 0x1A, 0x16, 0xFF, - 0x17, 0x1A, 0x16, 0xFF, 0x16, 0x18, 0x15, 0xFF, 0x15, 0x17, 0x14, 0xFF, - 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x17, 0x19, 0x1A, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x3B, 0x3D, 0x3D, 0xFF, - 0x87, 0x89, 0x86, 0xFF, 0xC9, 0xCA, 0xC5, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xD7, 0xD9, 0xCF, 0xFF, 0xE1, 0xE2, 0xD9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, - 0xB9, 0xBA, 0xB3, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, - 0x78, 0x79, 0x72, 0xFF, 0x69, 0x6A, 0x63, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, - 0x48, 0x49, 0x42, 0xFF, 0x61, 0x62, 0x5B, 0xFF, 0x86, 0x87, 0x80, 0xFF, - 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xAC, 0xAD, 0xA8, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA4, 0xFF, - 0xA8, 0xA9, 0xA2, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, - 0xA7, 0xA7, 0xA2, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, - 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x99, 0x99, 0x97, 0xFF, - 0x94, 0x94, 0x92, 0xFF, 0x95, 0x95, 0x93, 0xFF, 0x82, 0x83, 0x80, 0xFF, - 0x4E, 0x4E, 0x4C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, - 0x25, 0x28, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x17, 0x19, 0x18, 0xFF, - 0x17, 0x19, 0x18, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x16, 0x18, 0x17, 0xFF, - 0x18, 0x1A, 0x1A, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, - 0x21, 0x24, 0x23, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x4F, 0x51, 0x50, 0xFF, - 0xB3, 0xB6, 0xB2, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, - 0xE5, 0xE7, 0xDD, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, - 0xCF, 0xD0, 0xCB, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x8F, 0x92, 0x8C, 0xFF, 0x72, 0x75, 0x6F, 0xFF, - 0x61, 0x65, 0x5F, 0xFF, 0x49, 0x4C, 0x46, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, - 0x51, 0x54, 0x4F, 0xFF, 0x7C, 0x7F, 0x7A, 0xFF, 0x8C, 0x90, 0x8A, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, - 0xA5, 0xA7, 0x9F, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, - 0xA4, 0xA5, 0xA0, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, - 0x9A, 0x9A, 0x98, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0x97, 0x98, 0x95, 0xFF, - 0x9B, 0x9B, 0x99, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x77, 0x77, 0x75, 0xFF, - 0x41, 0x42, 0x3F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, - 0x23, 0x25, 0x22, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x15, 0x17, 0x16, 0xFF, - 0x15, 0x17, 0x16, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x16, 0x18, 0x17, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, - 0x23, 0x25, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, - 0xBD, 0xC0, 0xBD, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, - 0xC4, 0xC4, 0xC0, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, 0x60, 0x63, 0x5E, 0xFF, - 0x52, 0x55, 0x50, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, - 0x58, 0x5B, 0x56, 0xFF, 0x83, 0x86, 0x81, 0xFF, 0x8A, 0x8D, 0x88, 0xFF, - 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0xA9, 0xAA, 0xA5, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA7, 0x9F, 0xFF, - 0xA3, 0xA4, 0x9D, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x99, 0x99, 0x94, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x94, 0x94, 0x92, 0xFF, - 0x90, 0x91, 0x8E, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, 0x87, 0x87, 0x85, 0xFF, - 0x87, 0x87, 0x85, 0xFF, 0x7B, 0x7C, 0x79, 0xFF, 0x68, 0x68, 0x66, 0xFF, - 0x3F, 0x3F, 0x3D, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0F, 0x12, 0x0E, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, - 0x21, 0x24, 0x21, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x15, 0x17, 0x16, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, - 0x20, 0x23, 0x22, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, 0x44, 0x47, 0x44, 0xFF, - 0xAF, 0xB2, 0xAF, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, 0x53, 0x57, 0x51, 0xFF, - 0x48, 0x4B, 0x45, 0xFF, 0x35, 0x38, 0x33, 0xFF, 0x36, 0x39, 0x34, 0xFF, - 0x63, 0x66, 0x60, 0xFF, 0x8E, 0x91, 0x8B, 0xFF, 0x87, 0x8A, 0x84, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, - 0xA2, 0xA3, 0x9C, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, - 0xA1, 0xA1, 0x9D, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x92, 0x92, 0x90, 0xFF, - 0x87, 0x87, 0x85, 0xFF, 0x78, 0x78, 0x76, 0xFF, 0x6D, 0x6E, 0x6B, 0xFF, - 0x47, 0x47, 0x45, 0xFF, 0x45, 0x45, 0x43, 0xFF, 0x45, 0x45, 0x43, 0xFF, - 0x2D, 0x2E, 0x2B, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x07, 0x07, 0x05, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0C, 0x0F, 0x0C, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x17, 0x1A, 0x16, 0xFF, - 0x1D, 0x1F, 0x1C, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x16, 0x18, 0x17, 0xFF, - 0x16, 0x18, 0x17, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x37, 0x3A, 0x37, 0xFF, - 0x8E, 0x91, 0x8B, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xD2, 0xD3, 0xCC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x4B, 0x4E, 0x49, 0xFF, - 0x43, 0x46, 0x41, 0xFF, 0x30, 0x34, 0x2E, 0xFF, 0x34, 0x37, 0x32, 0xFF, - 0x6B, 0x6E, 0x68, 0xFF, 0x96, 0x99, 0x93, 0xFF, 0x84, 0x88, 0x82, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, - 0xA7, 0xA7, 0xA2, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0x9B, 0x9C, 0x95, 0xFF, - 0x8E, 0x8F, 0x88, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x61, 0x61, 0x5D, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x56, 0x57, 0x52, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x08, 0x08, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x26, 0x27, 0x24, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xCE, 0xCF, 0xC8, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xC8, 0xC9, 0xC2, 0xFF, - 0xCE, 0xCF, 0xC8, 0xFF, 0xC7, 0xC8, 0xC3, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0x99, 0x99, 0x94, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, - 0x63, 0x66, 0x60, 0xFF, 0x47, 0x4A, 0x44, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, - 0x31, 0x37, 0x30, 0xFF, 0x2B, 0x31, 0x2B, 0xFF, 0x2F, 0x34, 0x2E, 0xFF, - 0x60, 0x65, 0x5F, 0xFF, 0x7E, 0x84, 0x7D, 0xFF, 0x77, 0x7D, 0x76, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x66, 0x68, 0x60, 0xFF, - 0x50, 0x52, 0x4A, 0xFF, 0x46, 0x47, 0x40, 0xFF, 0x45, 0x45, 0x41, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x21, 0x21, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0xC5, 0xC6, 0xBF, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x6B, 0x6E, 0x68, 0xFF, - 0x56, 0x59, 0x53, 0xFF, 0x4E, 0x51, 0x4B, 0xFF, 0x3B, 0x3E, 0x39, 0xFF, - 0x2A, 0x30, 0x29, 0xFF, 0x1F, 0x24, 0x1E, 0xFF, 0x30, 0x36, 0x2F, 0xFF, - 0x5C, 0x62, 0x5B, 0xFF, 0x7B, 0x80, 0x7A, 0xFF, 0x78, 0x7E, 0x77, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, - 0xA1, 0xA1, 0x9D, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, - 0x48, 0x49, 0x44, 0xFF, 0x48, 0x49, 0x42, 0xFF, 0x44, 0x45, 0x3D, 0xFF, - 0x49, 0x4B, 0x43, 0xFF, 0x57, 0x58, 0x51, 0xFF, 0x69, 0x6A, 0x65, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x42, 0x43, 0x3E, 0xFF, - 0x25, 0x26, 0x21, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x05, 0x05, 0x05, 0xFF, - 0x08, 0x08, 0x08, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x52, 0x52, 0x4D, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, - 0xB9, 0xBA, 0xB3, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, - 0x82, 0x83, 0x7E, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x68, 0x6C, 0x66, 0xFF, - 0x53, 0x57, 0x51, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x32, 0x35, 0x2F, 0xFF, - 0x2B, 0x31, 0x2B, 0xFF, 0x28, 0x2D, 0x27, 0xFF, 0x29, 0x2F, 0x28, 0xFF, - 0x4C, 0x52, 0x4B, 0xFF, 0x6A, 0x70, 0x69, 0xFF, 0x71, 0x77, 0x70, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x9A, 0x9A, 0x96, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, - 0x53, 0x53, 0x4F, 0xFF, 0x40, 0x41, 0x3C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x54, 0x55, 0x50, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x68, 0x69, 0x62, 0xFF, - 0x7F, 0x80, 0x79, 0xFF, 0x94, 0x95, 0x8E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, - 0x6C, 0x6D, 0x68, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x24, 0x24, 0x22, 0xFF, 0x40, 0x40, 0x3E, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x73, 0x74, 0x6F, 0xFF, 0xB6, 0xB7, 0xB0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, 0xCD, 0xCE, 0xC7, 0xFF, - 0xB3, 0xB4, 0xAD, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, 0x53, 0x57, 0x51, 0xFF, - 0x42, 0x45, 0x3F, 0xFF, 0x43, 0x46, 0x41, 0xFF, 0x33, 0x36, 0x30, 0xFF, - 0x24, 0x2A, 0x24, 0xFF, 0x1C, 0x22, 0x1B, 0xFF, 0x1B, 0x21, 0x1A, 0xFF, - 0x39, 0x3F, 0x39, 0xFF, 0x58, 0x5D, 0x57, 0xFF, 0x63, 0x69, 0x62, 0xFF, - 0xA7, 0xA7, 0xA2, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x79, 0x7A, 0x75, 0xFF, - 0x62, 0x63, 0x5E, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x45, 0x45, 0x41, 0xFF, - 0x49, 0x4A, 0x45, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, - 0x78, 0x79, 0x74, 0xFF, 0x8E, 0x8F, 0x88, 0xFF, 0x97, 0x99, 0x91, 0xFF, - 0xA0, 0xA1, 0x99, 0xFF, 0x99, 0x9A, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x84, 0x84, 0x80, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x63, 0x64, 0x5F, 0xFF, - 0x5A, 0x5A, 0x56, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x25, 0x26, 0x21, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x25, 0x26, 0x23, 0xFF, - 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, - 0x14, 0x13, 0x16, 0xFF, 0x1E, 0x1E, 0x20, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, - 0x11, 0x11, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x3B, 0x3C, 0x39, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x36, 0x36, 0x32, 0xFF, - 0x78, 0x79, 0x74, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, - 0xCB, 0xCB, 0xC7, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0x62, 0x62, 0x60, 0xFF, 0x66, 0x67, 0x64, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, - 0x72, 0x74, 0x71, 0xFF, 0x78, 0x7D, 0x79, 0xFF, 0x64, 0x6A, 0x66, 0xFF, - 0x3D, 0x42, 0x3E, 0xFF, 0x19, 0x21, 0x1C, 0xFF, 0x17, 0x1F, 0x1A, 0xFF, - 0x26, 0x2E, 0x29, 0xFF, 0x48, 0x50, 0x4B, 0xFF, 0x6A, 0x71, 0x6D, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, - 0x9A, 0x9A, 0x96, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x69, 0x6A, 0x65, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x36, 0x36, 0x32, 0xFF, - 0x4D, 0x4E, 0x49, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0x79, 0x7A, 0x75, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0x95, 0x96, 0x8F, 0xFF, 0x9A, 0x9B, 0x94, 0xFF, - 0x92, 0x93, 0x8B, 0xFF, 0x7F, 0x80, 0x79, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x69, 0x6A, 0x65, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x39, 0x3A, 0x35, 0xFF, 0x21, 0x21, 0x1D, 0xFF, - 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x09, 0x0A, 0x07, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, - 0x08, 0x08, 0x0A, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0xFF, - 0x15, 0x15, 0x17, 0xFF, 0x32, 0x32, 0x32, 0xFF, 0x46, 0x46, 0x46, 0xFF, - 0x82, 0x83, 0x80, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xC8, 0xC9, 0xC4, 0xFF, - 0xBA, 0xBB, 0xB6, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x88, 0x89, 0x86, 0xFF, 0x90, 0x91, 0x8E, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, - 0xA3, 0xA5, 0xA2, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, - 0x5C, 0x63, 0x5F, 0xFF, 0x43, 0x4B, 0x46, 0xFF, 0x30, 0x37, 0x32, 0xFF, - 0x2C, 0x34, 0x2F, 0xFF, 0x3A, 0x42, 0x3D, 0xFF, 0x56, 0x5E, 0x59, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, - 0x73, 0x74, 0x6F, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x44, 0x44, 0x3F, 0xFF, - 0x45, 0x45, 0x41, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x85, 0x86, 0x7F, 0xFF, 0x89, 0x8B, 0x83, 0xFF, - 0x7F, 0x80, 0x79, 0xFF, 0x6F, 0x70, 0x69, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, - 0x69, 0x6A, 0x65, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x63, 0x64, 0x5F, 0xFF, - 0x45, 0x45, 0x41, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x08, 0x08, 0x08, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x3A, 0x3A, 0x3A, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0xAD, 0xAE, 0xAB, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA5, 0x9F, 0xFF, - 0xA7, 0xAA, 0xA5, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, - 0xAE, 0xB1, 0xAE, 0xFF, 0xAE, 0xB1, 0xAE, 0xFF, 0xAB, 0xAE, 0xAA, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, - 0x8D, 0x94, 0x90, 0xFF, 0x6C, 0x74, 0x6F, 0xFF, 0x65, 0x6D, 0x68, 0xFF, - 0x41, 0x49, 0x44, 0xFF, 0x31, 0x38, 0x34, 0xFF, 0x32, 0x3A, 0x35, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, - 0x47, 0x48, 0x43, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x85, 0x86, 0x81, 0xFF, 0x80, 0x81, 0x7A, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, - 0x73, 0x74, 0x6D, 0xFF, 0x6D, 0x6F, 0x67, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, - 0x64, 0x65, 0x60, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x53, 0x53, 0x4F, 0xFF, - 0x3F, 0x40, 0x3B, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x3A, 0x3B, 0x36, 0xFF, 0x38, 0x38, 0x36, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x1E, 0x1E, 0x1E, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x29, 0x29, 0x29, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, - 0xA0, 0xA0, 0x9D, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x56, 0x57, 0x52, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, - 0xB4, 0xB5, 0xB0, 0xFF, 0xBB, 0xBC, 0xB7, 0xFF, 0xB4, 0xB7, 0xB2, 0xFF, - 0xC1, 0xC4, 0xBE, 0xFF, 0xC4, 0xC8, 0xC2, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, - 0xB3, 0xB6, 0xB2, 0xFF, 0xB4, 0xB7, 0xB4, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, - 0xB4, 0xB9, 0xB5, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, - 0xA4, 0xAC, 0xA7, 0xFF, 0x8E, 0x96, 0x91, 0xFF, 0x79, 0x81, 0x7C, 0xFF, - 0x55, 0x5C, 0x58, 0xFF, 0x3B, 0x43, 0x3E, 0xFF, 0x35, 0x3D, 0x38, 0xFF, - 0x4D, 0x4E, 0x49, 0xFF, 0x58, 0x59, 0x54, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x76, 0x76, 0x72, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8D, 0x8E, 0x89, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x7D, 0x7E, 0x77, 0xFF, 0x77, 0x78, 0x71, 0xFF, - 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x65, 0xFF, - 0x62, 0x63, 0x5E, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, - 0x34, 0x35, 0x30, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x23, 0x24, 0x1F, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x76, 0x76, 0x72, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x32, 0x33, 0x2E, 0xFF, - 0x82, 0x83, 0x7E, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x05, 0x05, 0x01, 0xFF, - 0x08, 0x09, 0x04, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x25, 0x25, 0x25, 0xFF, - 0x09, 0x09, 0x09, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x7A, 0x7B, 0x78, 0xFF, - 0x88, 0x89, 0x86, 0xFF, 0x48, 0x49, 0x46, 0xFF, 0x66, 0x67, 0x62, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, - 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, - 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, - 0xB7, 0xBC, 0xB8, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0xB4, 0xB9, 0xB5, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xB9, 0xC1, 0xBC, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, - 0x8A, 0x92, 0x8D, 0xFF, 0x6B, 0x73, 0x6E, 0xFF, 0x51, 0x59, 0x54, 0xFF, - 0x74, 0x75, 0x70, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x90, 0x91, 0x8C, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x87, 0x88, 0x83, 0xFF, - 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x74, 0x76, 0x6E, 0xFF, - 0x6D, 0x6F, 0x67, 0xFF, 0x68, 0x69, 0x62, 0xFF, 0x65, 0x66, 0x61, 0xFF, - 0x5E, 0x5F, 0x5A, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, - 0x09, 0x0A, 0x05, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x06, 0x06, 0x06, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, - 0x30, 0x30, 0x30, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, - 0x42, 0x42, 0x42, 0xFF, 0x70, 0x70, 0x6E, 0xFF, 0xAF, 0xAF, 0xAD, 0xFF, - 0x71, 0x71, 0x6F, 0xFF, 0x50, 0x51, 0x4E, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, - 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xBB, 0xFF, - 0xBB, 0xBE, 0xBB, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, - 0xB6, 0xBB, 0xB7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, - 0xBC, 0xC1, 0xBD, 0xFF, 0xB4, 0xBC, 0xB7, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, - 0xBF, 0xC6, 0xC2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0x98, 0xA0, 0x9B, 0xFF, 0x87, 0x8F, 0x8A, 0xFF, 0x73, 0x7B, 0x76, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x79, 0x7A, 0x73, 0xFF, 0x73, 0x74, 0x6D, 0xFF, - 0x6C, 0x6D, 0x66, 0xFF, 0x66, 0x68, 0x60, 0xFF, 0x63, 0x64, 0x5F, 0xFF, - 0x5C, 0x5D, 0x58, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x48, 0x49, 0x44, 0xFF, - 0x2F, 0x2F, 0x2B, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, - 0x42, 0x43, 0x3E, 0xFF, 0x68, 0x68, 0x64, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0x3B, 0x3D, 0x35, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x09, 0x02, 0xFF, - 0x2F, 0x30, 0x29, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x78, 0x79, 0x74, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x14, 0x15, 0x10, 0xFF, - 0x0C, 0x0C, 0x08, 0xFF, 0x09, 0x0A, 0x05, 0xFF, 0x08, 0x09, 0x04, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x2D, 0x2E, 0x2B, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0xA9, 0xA9, 0xA7, 0xFF, - 0x94, 0x94, 0x92, 0xFF, 0x8B, 0x8B, 0x89, 0xFF, 0x77, 0x77, 0x75, 0xFF, - 0x50, 0x51, 0x4E, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, - 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, - 0xB9, 0xBF, 0xBB, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xBE, 0xC5, 0xC0, 0xFF, 0xC2, 0xCA, 0xC5, 0xFF, - 0xBE, 0xC5, 0xC0, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, - 0xC3, 0xCB, 0xC6, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, - 0xA2, 0xA9, 0xA4, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, - 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, 0x90, 0x91, 0x8C, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, - 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x71, 0xFF, 0x71, 0x72, 0x6B, 0xFF, - 0x6A, 0x6B, 0x64, 0xFF, 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, - 0x5A, 0x5A, 0x56, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x46, 0x47, 0x42, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x45, 0x45, 0x41, 0xFF, - 0x4B, 0x4B, 0x46, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, - 0x8E, 0x8F, 0x88, 0xFF, 0x55, 0x56, 0x4F, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, - 0x76, 0x76, 0x72, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x52, 0x52, 0x4D, 0xFF, - 0x03, 0x04, 0x00, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x08, 0x09, 0x04, 0xFF, 0x05, 0x05, 0x03, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x44, 0x44, 0x42, 0xFF, 0x53, 0x53, 0x51, 0xFF, - 0x4C, 0x4C, 0x4A, 0xFF, 0x52, 0x52, 0x4F, 0xFF, 0x46, 0x46, 0x44, 0xFF, - 0x38, 0x38, 0x36, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, - 0xC0, 0xC1, 0xBC, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, - 0xBA, 0xBD, 0xB7, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, - 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, - 0xB6, 0xBD, 0xB8, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, - 0xBD, 0xC4, 0xBF, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC5, 0xCC, 0xC7, 0xFF, - 0xC8, 0xD0, 0xCB, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, - 0xAA, 0xB1, 0xAD, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x84, 0x84, 0x80, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, - 0x77, 0x78, 0x73, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, - 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x28, 0x28, 0x24, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x48, 0x49, 0x44, 0xFF, 0x33, 0x34, 0x2F, 0xFF, 0x46, 0x47, 0x42, 0xFF, - 0x84, 0x84, 0x80, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x24, 0x24, 0x22, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x25, 0x26, 0x23, 0xFF, 0x39, 0x39, 0x37, 0xFF, 0x36, 0x36, 0x34, 0xFF, - 0x2F, 0x2F, 0x2D, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, 0x57, 0x58, 0x55, 0xFF, - 0x3D, 0x3D, 0x3B, 0xFF, 0x82, 0x83, 0x80, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, - 0xC6, 0xC6, 0xC4, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, - 0xC3, 0xC6, 0xC3, 0xFF, 0xBD, 0xC0, 0xBD, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xB9, 0xBF, 0xBB, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, - 0xCC, 0xD1, 0xCD, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, - 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, - 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, - 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x40, 0x41, 0x3C, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x33, 0x34, 0x2F, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x2A, 0x2A, 0x28, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x2C, 0x2D, 0x2A, 0xFF, 0x4D, 0x4D, 0x4B, 0xFF, - 0x47, 0x47, 0x45, 0xFF, 0x42, 0x43, 0x40, 0xFF, 0x33, 0x34, 0x31, 0xFF, - 0x64, 0x65, 0x62, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0xB8, 0xB8, 0xB6, 0xFF, - 0xC0, 0xC1, 0xBE, 0xFF, 0xBA, 0xBD, 0xB9, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, - 0xC1, 0xC4, 0xC0, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xC4, 0xC9, 0xC5, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, - 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, - 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x3E, 0x3E, 0x3A, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x32, 0x33, 0x2E, 0xFF, - 0x28, 0x28, 0x24, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1F, 0x20, 0x1D, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x2F, 0x2F, 0x2D, 0xFF, - 0x3F, 0x3F, 0x3D, 0xFF, 0x47, 0x47, 0x45, 0xFF, 0x55, 0x55, 0x53, 0xFF, - 0x92, 0x92, 0x90, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, - 0xB9, 0xBA, 0xB7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, - 0xBF, 0xC1, 0xBE, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, - 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, - 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x78, 0x79, 0x74, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x70, 0x71, 0x6C, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x69, 0x6A, 0x63, 0xFF, - 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x29, 0x29, 0x27, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x34, 0x35, 0x32, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, - 0x21, 0x21, 0x1F, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x36, 0x36, 0x34, 0xFF, - 0x36, 0x36, 0x34, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x5D, 0x5E, 0x5B, 0xFF, - 0xB2, 0xB3, 0xB0, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAB, 0xAC, 0xA9, 0xFF, - 0xB4, 0xB5, 0xB2, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, - 0xBD, 0xC0, 0xBD, 0xFF, 0xB3, 0xB6, 0xB2, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, - 0xCA, 0xCF, 0xCB, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, - 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x63, 0xFF, - 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1B, 0x1B, 0x1B, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x25, 0x26, 0x23, 0xFF, - 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, - 0x2A, 0x2A, 0x28, 0xFF, 0x26, 0x26, 0x26, 0xFF, 0x23, 0x23, 0x23, 0xFF, - 0x1E, 0x20, 0x1F, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x1C, 0x1C, 0x1C, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x34, 0x34, 0x34, 0xFF, - 0x3A, 0x3A, 0x3A, 0xFF, 0x57, 0x57, 0x57, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xC5, 0xC5, 0xC5, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, - 0xBA, 0xBA, 0xBA, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, - 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x88, 0x89, 0x84, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x68, 0x69, 0x62, 0xFF, - 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x22, 0x22, 0x22, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, - 0x3F, 0x3F, 0x3F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x68, 0x69, 0x62, 0xFF, - 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x21, 0x21, 0x21, 0xFF, - 0x20, 0x23, 0x22, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x44, 0x44, 0x44, 0xFF, - 0x3B, 0x3B, 0x3B, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, - 0xC8, 0xC8, 0xC8, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xCD, 0xD2, 0xD0, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x87, 0x88, 0x83, 0xFF, - 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x66, 0x68, 0x60, 0xFF, - 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, - 0x23, 0x25, 0x24, 0xFF, 0x25, 0x27, 0x26, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x44, 0x44, 0x44, 0xFF, - 0x4D, 0x4D, 0x4D, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, - 0xBD, 0xBD, 0xBD, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, - 0x1D, 0x1D, 0x1F, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x22, 0x21, 0x24, 0xFF, - 0x1E, 0x1E, 0x20, 0xFF, 0x13, 0x15, 0x17, 0xFF, 0x09, 0x0B, 0x0C, 0xFF, - 0x0B, 0x0D, 0x0F, 0xFF, 0x0F, 0x11, 0x12, 0xFF, 0x12, 0x14, 0x16, 0xFF, - 0x15, 0x17, 0x18, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, - 0x1D, 0x1D, 0x1D, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, - 0x50, 0x50, 0x50, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xCD, 0xCD, 0xCD, 0xFF, 0xCE, 0xCE, 0xCE, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, - 0xC2, 0xC2, 0xC2, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x34, 0x35, 0x30, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x16, 0x16, 0x18, 0xFF, - 0x1A, 0x19, 0x1C, 0xFF, 0x1D, 0x1D, 0x1F, 0xFF, 0x2D, 0x2D, 0x2F, 0xFF, - 0x31, 0x31, 0x33, 0xFF, 0x21, 0x23, 0x25, 0xFF, 0x11, 0x13, 0x15, 0xFF, - 0x09, 0x0B, 0x0C, 0xFF, 0x10, 0x12, 0x13, 0xFF, 0x16, 0x18, 0x19, 0xFF, - 0x19, 0x1B, 0x1D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, - 0x2B, 0x2B, 0x2B, 0xFF, 0x3B, 0x3B, 0x3B, 0xFF, 0x47, 0x47, 0x47, 0xFF, - 0x48, 0x48, 0x48, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, - 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xC5, 0xC5, 0xC5, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x37, 0x37, 0x33, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x32, 0x32, 0x32, 0xFF, - 0x36, 0x36, 0x36, 0xFF, 0x2C, 0x2E, 0x2D, 0xFF, 0x17, 0x19, 0x18, 0xFF, - 0x0B, 0x0E, 0x0D, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, - 0x24, 0x26, 0x25, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, - 0x3D, 0x3D, 0x3D, 0xFF, 0x49, 0x49, 0x49, 0xFF, 0x45, 0x45, 0x45, 0xFF, - 0x4E, 0x4E, 0x4E, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, - 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, - 0xC7, 0xC7, 0xC7, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x38, 0x39, 0x34, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, - 0x30, 0x30, 0x30, 0xFF, 0x26, 0x28, 0x28, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x28, 0x28, 0x28, 0xFF, - 0x30, 0x30, 0x30, 0xFF, 0x33, 0x33, 0x33, 0xFF, 0x26, 0x26, 0x26, 0xFF, - 0x48, 0x48, 0x48, 0xFF, 0x4C, 0x4C, 0x4C, 0xFF, 0x49, 0x49, 0x49, 0xFF, - 0x5D, 0x5D, 0x5D, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xCD, 0xCD, 0xCD, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x37, 0x37, 0x33, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x0C, 0x0C, 0x08, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, - 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x14, 0x12, 0x13, 0xFF, 0x1B, 0x19, 0x1A, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, - 0x2F, 0x2F, 0x2F, 0xFF, 0x2A, 0x2A, 0x2A, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x19, 0x16, 0x17, 0xFF, 0x22, 0x20, 0x21, 0xFF, - 0x2D, 0x2D, 0x2D, 0xFF, 0x34, 0x34, 0x34, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, - 0x53, 0x53, 0x53, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, - 0x69, 0x69, 0x69, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, - 0xCE, 0xCE, 0xCE, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x25, 0x22, 0x23, 0xFF, - 0x23, 0x23, 0x23, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x28, 0x28, 0x28, 0xFF, - 0x31, 0x31, 0x31, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x24, 0x24, 0x24, 0xFF, - 0x21, 0x1F, 0x1F, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x21, 0x1F, 0x1F, 0xFF, - 0x2A, 0x28, 0x29, 0xFF, 0x3E, 0x3E, 0x3E, 0xFF, 0x37, 0x37, 0x37, 0xFF, - 0x42, 0x42, 0x42, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x62, 0x62, 0x62, 0xFF, - 0x89, 0x89, 0x89, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, - 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x28, 0x26, 0x24, 0xFF, - 0x26, 0x27, 0x24, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x28, 0x28, 0x26, 0xFF, - 0x2B, 0x2B, 0x29, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, - 0x2E, 0x2C, 0x2A, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, - 0x25, 0x22, 0x21, 0xFF, 0x36, 0x36, 0x36, 0xFF, 0x39, 0x39, 0x39, 0xFF, - 0x3E, 0x3E, 0x3E, 0xFF, 0x50, 0x50, 0x50, 0xFF, 0x80, 0x80, 0x80, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, - 0xBB, 0xBB, 0xBB, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, - 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, - 0xD0, 0xD2, 0xD2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x13, 0x11, 0x0F, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x23, 0x21, 0x20, 0xFF, - 0x23, 0x21, 0x20, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x22, 0x20, 0x1F, 0xFF, - 0x22, 0x20, 0x1F, 0xFF, 0x27, 0x25, 0x23, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, - 0x37, 0x35, 0x34, 0xFF, 0x2A, 0x28, 0x27, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, - 0x21, 0x1F, 0x1D, 0xFF, 0x3C, 0x39, 0x3A, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, - 0x63, 0x63, 0x63, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0xB2, 0xB2, 0xB2, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xB7, 0xB7, 0xB7, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCA, 0xCD, 0xCC, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC0, 0xC1, 0xBE, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xA5, 0xA6, 0xA3, 0xFF, - 0x9C, 0x9C, 0x9A, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, 0x99, 0x99, 0x97, 0xFF, - 0x94, 0x94, 0x92, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x8E, 0x90, 0x8D, 0xFF, - 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x82, 0x85, 0x82, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, - 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1A, 0x18, 0x14, 0xFF, - 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, - 0x10, 0x0E, 0x0C, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, - 0x23, 0x21, 0x20, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, - 0x19, 0x17, 0x15, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x27, 0x23, 0x22, 0xFF, - 0x24, 0x1F, 0x1F, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x20, 0x1C, 0x1B, 0xFF, - 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x2B, 0x26, 0x26, 0xFF, - 0x3A, 0x35, 0x35, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x38, 0x33, 0x32, 0xFF, - 0x3D, 0x39, 0x38, 0xFF, 0x6A, 0x68, 0x69, 0xFF, 0x83, 0x80, 0x81, 0xFF, - 0x9B, 0x99, 0x9A, 0xFF, 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xC0, 0xC0, 0xC0, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xCE, 0xCE, 0xCE, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xD7, 0xD9, 0xD9, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xCE, 0xCE, 0xCC, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, - 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, - 0x97, 0x98, 0x95, 0xFF, 0x93, 0x93, 0x91, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, - 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, 0x84, 0x87, 0x84, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, - 0x1E, 0x1C, 0x18, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, - 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x19, 0x17, 0x13, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x13, 0x11, 0x0F, 0xFF, - 0x17, 0x15, 0x13, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x22, 0x20, 0x1F, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x22, 0x21, 0xFF, 0x2A, 0x25, 0x24, 0xFF, - 0x26, 0x22, 0x21, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, - 0x27, 0x23, 0x22, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x35, 0x31, 0x30, 0xFF, - 0x44, 0x40, 0x3F, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, 0x44, 0x40, 0x3F, 0xFF, - 0x51, 0x4D, 0x4C, 0xFF, 0x86, 0x84, 0x85, 0xFF, 0x95, 0x93, 0x94, 0xFF, - 0xAF, 0xAD, 0xAD, 0xFF, 0xAD, 0xAA, 0xAB, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, - 0xC1, 0xC1, 0xC1, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, - 0xC5, 0xC5, 0xC5, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, - 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, - 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xDB, 0xDB, 0xD9, 0xFF, 0xD5, 0xD5, 0xD3, 0xFF, 0xC7, 0xC7, 0xC5, 0xFF, - 0xB6, 0xB6, 0xB4, 0xFF, 0xA4, 0xA5, 0xA2, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, - 0x9B, 0x9B, 0x99, 0xFF, 0x96, 0x97, 0x94, 0xFF, 0x90, 0x93, 0x90, 0xFF, - 0x8E, 0x90, 0x8D, 0xFF, 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x22, 0x21, 0x1D, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, - 0x1C, 0x1B, 0x17, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x19, 0x17, 0x13, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, - 0x21, 0x1F, 0x1D, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, - 0x22, 0x20, 0x1F, 0xFF, 0x23, 0x21, 0x20, 0xFF, 0x25, 0x22, 0x21, 0xFF, - 0x26, 0x24, 0x22, 0xFF, 0x2A, 0x25, 0x24, 0xFF, 0x2D, 0x29, 0x28, 0xFF, - 0x2A, 0x25, 0x24, 0xFF, 0x25, 0x21, 0x20, 0xFF, 0x2B, 0x26, 0x26, 0xFF, - 0x31, 0x2C, 0x2B, 0xFF, 0x39, 0x34, 0x34, 0xFF, 0x44, 0x40, 0x3F, 0xFF, - 0x4D, 0x48, 0x47, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, - 0x50, 0x4C, 0x4B, 0xFF, 0x88, 0x85, 0x86, 0xFF, 0x97, 0x94, 0x95, 0xFF, - 0xAE, 0xAC, 0xAC, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, - 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, - 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, - 0xCB, 0xCE, 0xCD, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xDD, 0xDE, 0xDB, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, - 0xC8, 0xC9, 0xC6, 0xFF, 0xB1, 0xB1, 0xAF, 0xFF, 0xA0, 0xA0, 0x9D, 0xFF, - 0x9C, 0x9C, 0x9A, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x92, 0x95, 0x92, 0xFF, - 0x8F, 0x92, 0x8E, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x25, 0x23, 0x1F, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x20, 0x1E, 0x1A, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1A, 0x18, 0x14, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x28, 0x26, 0x24, 0xFF, - 0x28, 0x26, 0x24, 0xFF, 0x26, 0x24, 0x22, 0xFF, 0x25, 0x22, 0x21, 0xFF, - 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, - 0x2C, 0x29, 0x28, 0xFF, 0x2C, 0x28, 0x27, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, - 0x2C, 0x28, 0x27, 0xFF, 0x27, 0x23, 0x22, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, - 0x36, 0x32, 0x31, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x4F, 0x4A, 0x4A, 0xFF, - 0x4E, 0x49, 0x48, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, 0x2B, 0x26, 0x26, 0xFF, - 0x3A, 0x35, 0x35, 0xFF, 0x9A, 0x98, 0x99, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, - 0xBB, 0xB8, 0xB9, 0xFF, 0xB8, 0xB6, 0xB7, 0xFF, 0x97, 0x97, 0x97, 0xFF, - 0x9E, 0x9E, 0x9E, 0xFF, 0xA9, 0xA9, 0xA9, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, - 0xBE, 0xBE, 0xBE, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xC9, 0xC9, 0xC9, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, - 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xD7, 0xD7, 0xD7, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, - 0xDC, 0xDC, 0xDC, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, - 0x9F, 0xA2, 0xA1, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0x96, 0x98, 0x97, 0xFF, - 0x91, 0x94, 0x93, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x80, 0x82, 0x7F, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x73, 0x76, 0x72, 0xFF, 0x6F, 0x73, 0x6D, 0xFF, 0x71, 0x74, 0x6E, 0xFF, - 0x67, 0x6A, 0x65, 0xFF, 0x59, 0x5C, 0x57, 0xFF, 0x55, 0x56, 0x51, 0xFF, - 0x4B, 0x4B, 0x46, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x33, 0x34, 0x2F, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, - 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x27, 0x26, 0x1F, 0xFF, - 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, - 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, 0x23, 0x1F, 0x19, 0xFF, - 0x21, 0x1E, 0x18, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x13, 0x12, 0x0B, 0xFF, - 0x14, 0x13, 0x0D, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x33, 0x31, 0x2D, 0xFF, - 0x2E, 0x2C, 0x28, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x35, 0x33, 0x2F, 0xFF, 0x38, 0x37, 0x33, 0xFF, - 0x31, 0x30, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, - 0x2A, 0x26, 0x22, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x35, 0x31, 0x2E, 0xFF, - 0x41, 0x3D, 0x3A, 0xFF, 0x47, 0x43, 0x3F, 0xFF, 0x46, 0x42, 0x3E, 0xFF, - 0x33, 0x2E, 0x2E, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x2C, 0x28, 0x27, 0xFF, - 0x52, 0x4E, 0x4D, 0xFF, 0x93, 0x91, 0x90, 0xFF, 0xA0, 0x9E, 0x9C, 0xFF, - 0xA7, 0xA5, 0xA3, 0xFF, 0xA5, 0xA3, 0xA1, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xB6, 0xB6, 0xB6, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, - 0xC9, 0xC9, 0xC9, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xE1, 0xE1, 0xE1, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, - 0xD3, 0xD3, 0xD3, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, - 0xAB, 0xAD, 0xAC, 0xFF, 0xA0, 0xA3, 0xA2, 0xFF, 0x8E, 0x90, 0x8F, 0xFF, - 0x8A, 0x8D, 0x8C, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x82, 0x86, 0x85, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x6A, 0x6D, 0x67, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, - 0x66, 0x69, 0x64, 0xFF, 0x5A, 0x5E, 0x58, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, - 0x41, 0x42, 0x3D, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x23, 0x24, 0x1F, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, - 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x23, 0x22, 0x1C, 0xFF, - 0x28, 0x27, 0x20, 0xFF, 0x2A, 0x29, 0x23, 0xFF, 0x2A, 0x29, 0x23, 0xFF, - 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, 0x24, 0x20, 0x1B, 0xFF, - 0x21, 0x1E, 0x18, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x17, 0x15, 0x0F, 0xFF, - 0x1F, 0x1D, 0x17, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, - 0x2E, 0x2C, 0x28, 0xFF, 0x2C, 0x2A, 0x26, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x2A, 0x29, 0x25, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x34, 0x32, 0x2E, 0xFF, - 0x31, 0x30, 0x2C, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x2B, 0x27, 0x24, 0xFF, - 0x2C, 0x28, 0x25, 0xFF, 0x31, 0x2D, 0x29, 0xFF, 0x44, 0x40, 0x3D, 0xFF, - 0x4B, 0x47, 0x44, 0xFF, 0x4A, 0x46, 0x43, 0xFF, 0x40, 0x3C, 0x39, 0xFF, - 0x2B, 0x26, 0x26, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x36, 0x32, 0x31, 0xFF, - 0x5D, 0x58, 0x58, 0xFF, 0x89, 0x87, 0x85, 0xFF, 0x97, 0x95, 0x93, 0xFF, - 0xA1, 0x9F, 0x9D, 0xFF, 0xA1, 0x9F, 0x9D, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xB0, 0xB0, 0xB0, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xD4, 0xD4, 0xD4, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, - 0xE0, 0xE0, 0xE0, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, - 0xAF, 0xB2, 0xB1, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, - 0x92, 0x95, 0x94, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x7C, 0x7F, 0x7C, 0xFF, 0x79, 0x7B, 0x78, 0xFF, 0x74, 0x77, 0x74, 0xFF, - 0x6B, 0x6D, 0x6A, 0xFF, 0x56, 0x59, 0x53, 0xFF, 0x5C, 0x5F, 0x59, 0xFF, - 0x5A, 0x5E, 0x58, 0xFF, 0x51, 0x54, 0x4F, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, - 0x48, 0x49, 0x44, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x42, 0x43, 0x3E, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, - 0x1C, 0x1B, 0x15, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x20, 0x1F, 0x18, 0xFF, - 0x23, 0x22, 0x1C, 0xFF, 0x28, 0x27, 0x20, 0xFF, 0x28, 0x27, 0x20, 0xFF, - 0x2C, 0x28, 0x23, 0xFF, 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, - 0x23, 0x1F, 0x19, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x21, 0x20, 0x19, 0xFF, - 0x28, 0x27, 0x20, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x28, 0x26, 0x22, 0xFF, - 0x2F, 0x2D, 0x29, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x29, 0x28, 0x24, 0xFF, - 0x2D, 0x2B, 0x27, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, - 0x33, 0x31, 0x2D, 0xFF, 0x27, 0x23, 0x20, 0xFF, 0x28, 0x24, 0x21, 0xFF, - 0x34, 0x30, 0x2D, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x48, 0x44, 0x41, 0xFF, - 0x4A, 0x46, 0x43, 0xFF, 0x44, 0x40, 0x3D, 0xFF, 0x36, 0x32, 0x2F, 0xFF, - 0x1E, 0x1A, 0x19, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x43, 0x3F, 0x3E, 0xFF, - 0x6C, 0x68, 0x67, 0xFF, 0x83, 0x81, 0x7F, 0xFF, 0x94, 0x92, 0x91, 0xFF, - 0xA3, 0xA1, 0xA0, 0xFF, 0xA6, 0xA4, 0xA2, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, - 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, - 0xD6, 0xD6, 0xD6, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0x8F, 0x91, 0x90, 0xFF, - 0x8A, 0x8D, 0x8C, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x80, 0x85, 0x84, 0xFF, - 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x66, 0x69, 0x66, 0xFF, - 0x59, 0x5C, 0x59, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x66, 0x69, 0x64, 0xFF, - 0x67, 0x6A, 0x65, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, - 0x1B, 0x1A, 0x14, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, - 0x1F, 0x1D, 0x17, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x27, 0x24, 0x1E, 0xFF, - 0x2C, 0x28, 0x23, 0xFF, 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, - 0x24, 0x20, 0x1B, 0xFF, 0x2D, 0x29, 0x24, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, - 0x29, 0x28, 0x22, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x2F, 0x2D, 0x29, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, - 0x2F, 0x2D, 0x29, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x29, 0x28, 0x24, 0xFF, - 0x32, 0x2E, 0x2B, 0xFF, 0x2B, 0x27, 0x24, 0xFF, 0x2E, 0x2A, 0x27, 0xFF, - 0x3D, 0x39, 0x36, 0xFF, 0x52, 0x4E, 0x4B, 0xFF, 0x3D, 0x39, 0x36, 0xFF, - 0x41, 0x3D, 0x3A, 0xFF, 0x3D, 0x39, 0x36, 0xFF, 0x35, 0x31, 0x2E, 0xFF, - 0x1A, 0x16, 0x15, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, - 0x7B, 0x77, 0x76, 0xFF, 0x86, 0x84, 0x83, 0xFF, 0x9A, 0x98, 0x97, 0xFF, - 0xAD, 0xAB, 0xA9, 0xFF, 0xB1, 0xAF, 0xAE, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, - 0xB6, 0xB6, 0xB6, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xE1, 0xE0, 0xE3, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xE5, 0xE5, 0xE7, 0xFF, - 0xE3, 0xE3, 0xE5, 0xFF, 0xDE, 0xDE, 0xE0, 0xFF, 0xD5, 0xD5, 0xD7, 0xFF, - 0xB8, 0xBA, 0xBB, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x7E, 0x82, 0x83, 0xFF, - 0x78, 0x7D, 0x7D, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x73, 0x74, 0xFF, - 0x5D, 0x62, 0x61, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, - 0x5D, 0x62, 0x61, 0xFF, 0x6D, 0x70, 0x6D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, - 0x6D, 0x70, 0x6D, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x68, 0x68, 0x66, 0xFF, - 0x4B, 0x4B, 0x48, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, - 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x16, 0x10, 0xFF, - 0x19, 0x16, 0x10, 0xFF, 0x1C, 0x18, 0x12, 0xFF, 0x1D, 0x19, 0x14, 0xFF, - 0x2B, 0x25, 0x22, 0xFF, 0x2E, 0x27, 0x25, 0xFF, 0x29, 0x22, 0x20, 0xFF, - 0x23, 0x1D, 0x1A, 0xFF, 0x3B, 0x37, 0x34, 0xFF, 0x35, 0x31, 0x2E, 0xFF, - 0x27, 0x23, 0x20, 0xFF, 0x1C, 0x18, 0x14, 0xFF, 0x23, 0x1E, 0x1D, 0xFF, - 0x3B, 0x37, 0x36, 0xFF, 0x40, 0x3B, 0x3B, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, - 0x32, 0x2D, 0x2D, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, - 0x3D, 0x39, 0x38, 0xFF, 0x40, 0x39, 0x39, 0xFF, 0x40, 0x39, 0x39, 0xFF, - 0x3F, 0x38, 0x38, 0xFF, 0x3F, 0x38, 0x38, 0xFF, 0x31, 0x2A, 0x2A, 0xFF, - 0x3F, 0x38, 0x38, 0xFF, 0x3C, 0x38, 0x37, 0xFF, 0x2D, 0x29, 0x28, 0xFF, - 0x22, 0x1B, 0x1B, 0xFF, 0x3C, 0x35, 0x35, 0xFF, 0x72, 0x6D, 0x6D, 0xFF, - 0x96, 0x91, 0x91, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, 0xA4, 0x9F, 0xA1, 0xFF, - 0xA8, 0xA6, 0xA7, 0xFF, 0xA9, 0xA7, 0xA8, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, - 0x9B, 0x99, 0x9A, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, - 0xB4, 0xB4, 0xB4, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, - 0x9D, 0x9D, 0x9D, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, - 0xC7, 0xC7, 0xC7, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xDC, 0xDC, 0xDE, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, - 0xDB, 0xDA, 0xDD, 0xFF, 0xC9, 0xC9, 0xCB, 0xFF, 0xBD, 0xBC, 0xBF, 0xFF, - 0xA1, 0xA3, 0xA5, 0xFF, 0x8B, 0x8D, 0x8F, 0xFF, 0x84, 0x88, 0x89, 0xFF, - 0x7B, 0x7F, 0x80, 0xFF, 0x74, 0x7B, 0x7B, 0xFF, 0x6B, 0x72, 0x72, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x6F, 0x74, 0x72, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x5A, 0x5D, 0x5A, 0xFF, - 0x66, 0x69, 0x66, 0xFF, 0x76, 0x79, 0x76, 0xFF, 0x73, 0x74, 0x71, 0xFF, - 0x5A, 0x5A, 0x58, 0xFF, 0x41, 0x42, 0x3F, 0xFF, 0x36, 0x36, 0x34, 0xFF, - 0x33, 0x34, 0x2F, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, - 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x16, 0x12, 0x0D, 0xFF, - 0x17, 0x13, 0x0E, 0xFF, 0x18, 0x14, 0x0F, 0xFF, 0x19, 0x16, 0x10, 0xFF, - 0x1E, 0x18, 0x16, 0xFF, 0x24, 0x1E, 0x1B, 0xFF, 0x28, 0x21, 0x1F, 0xFF, - 0x27, 0x20, 0x1E, 0xFF, 0x33, 0x2F, 0x2C, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, - 0x27, 0x23, 0x20, 0xFF, 0x1F, 0x1B, 0x18, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, - 0x41, 0x3C, 0x3C, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x38, 0x33, 0x32, 0xFF, - 0x3D, 0x39, 0x38, 0xFF, 0x41, 0x3C, 0x3C, 0xFF, 0x49, 0x45, 0x44, 0xFF, - 0x52, 0x4E, 0x4D, 0xFF, 0x4D, 0x46, 0x46, 0xFF, 0x45, 0x3E, 0x3E, 0xFF, - 0x39, 0x32, 0x32, 0xFF, 0x30, 0x29, 0x29, 0xFF, 0x35, 0x2E, 0x2E, 0xFF, - 0x3A, 0x34, 0x34, 0xFF, 0x34, 0x30, 0x2F, 0xFF, 0x26, 0x22, 0x21, 0xFF, - 0x28, 0x21, 0x21, 0xFF, 0x4C, 0x45, 0x45, 0xFF, 0x7F, 0x7A, 0x79, 0xFF, - 0x98, 0x94, 0x93, 0xFF, 0xA5, 0xA0, 0xA2, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, - 0x97, 0x94, 0x95, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x98, 0x95, 0x96, 0xFF, - 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, - 0x9C, 0x9C, 0x9C, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xDF, 0xE1, 0xE3, 0xFF, 0xD2, 0xD4, 0xD6, 0xFF, 0xBD, 0xBF, 0xC1, 0xFF, - 0xAB, 0xAD, 0xAE, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x9D, 0x9F, 0xA0, 0xFF, - 0xA6, 0xA8, 0xAA, 0xFF, 0xAF, 0xB3, 0xB4, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7B, 0x83, 0x80, 0xFF, - 0x6B, 0x70, 0x6F, 0xFF, 0x74, 0x79, 0x75, 0xFF, 0x74, 0x79, 0x75, 0xFF, - 0x6B, 0x71, 0x6D, 0xFF, 0x5C, 0x61, 0x5D, 0xFF, 0x5F, 0x64, 0x60, 0xFF, - 0x63, 0x68, 0x64, 0xFF, 0x6A, 0x6C, 0x69, 0xFF, 0x65, 0x68, 0x64, 0xFF, - 0x63, 0x65, 0x62, 0xFF, 0x4F, 0x52, 0x4E, 0xFF, 0x37, 0x3A, 0x37, 0xFF, - 0x3B, 0x3C, 0x37, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, - 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x19, 0x16, 0x10, 0xFF, - 0x18, 0x14, 0x0F, 0xFF, 0x16, 0x12, 0x0D, 0xFF, 0x17, 0x13, 0x0E, 0xFF, - 0x19, 0x12, 0x10, 0xFF, 0x20, 0x19, 0x17, 0xFF, 0x26, 0x22, 0x1F, 0xFF, - 0x2C, 0x28, 0x25, 0xFF, 0x38, 0x34, 0x30, 0xFF, 0x34, 0x30, 0x2D, 0xFF, - 0x2A, 0x29, 0x25, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x2F, 0x2D, 0x2B, 0xFF, - 0x3E, 0x3C, 0x3B, 0xFF, 0x42, 0x40, 0x3E, 0xFF, 0x3E, 0x3C, 0x3B, 0xFF, - 0x3D, 0x3B, 0x39, 0xFF, 0x44, 0x42, 0x40, 0xFF, 0x49, 0x47, 0x45, 0xFF, - 0x4B, 0x47, 0x46, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x38, 0x33, 0x32, 0xFF, - 0x30, 0x29, 0x29, 0xFF, 0x2A, 0x23, 0x23, 0xFF, 0x37, 0x30, 0x30, 0xFF, - 0x39, 0x32, 0x32, 0xFF, 0x35, 0x31, 0x30, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, - 0x40, 0x39, 0x39, 0xFF, 0x69, 0x62, 0x62, 0xFF, 0x8F, 0x8A, 0x8A, 0xFF, - 0x9B, 0x96, 0x95, 0xFF, 0xA1, 0x9F, 0xA0, 0xFF, 0x8E, 0x8C, 0x8D, 0xFF, - 0x84, 0x82, 0x82, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x99, 0x97, 0x97, 0xFF, - 0xA6, 0xA3, 0xA4, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xB6, 0xB6, 0xB6, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, - 0x9D, 0x9D, 0x9D, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, - 0xB9, 0xB9, 0xB9, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xA4, 0xA6, 0xA7, 0xFF, 0xAC, 0xAE, 0xB0, 0xFF, 0xB6, 0xB8, 0xBA, 0xFF, - 0xBB, 0xBD, 0xBF, 0xFF, 0xB8, 0xBA, 0xBB, 0xFF, 0xAB, 0xAD, 0xAE, 0xFF, - 0xA4, 0xA9, 0xAA, 0xFF, 0xAA, 0xAF, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, - 0x67, 0x6C, 0x68, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x6F, 0x74, 0x70, 0xFF, - 0x67, 0x6C, 0x68, 0xFF, 0x4F, 0x55, 0x51, 0xFF, 0x56, 0x5C, 0x58, 0xFF, - 0x4F, 0x55, 0x51, 0xFF, 0x40, 0x46, 0x42, 0xFF, 0x5D, 0x60, 0x5C, 0xFF, - 0x7B, 0x7E, 0x7B, 0xFF, 0x7E, 0x81, 0x7E, 0xFF, 0x6B, 0x6D, 0x6A, 0xFF, - 0x41, 0x42, 0x3D, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x23, 0x24, 0x1F, 0xFF, 0x21, 0x20, 0x19, 0xFF, 0x21, 0x20, 0x19, 0xFF, - 0x21, 0x20, 0x19, 0xFF, 0x22, 0x21, 0x1B, 0xFF, 0x1D, 0x19, 0x14, 0xFF, - 0x1C, 0x18, 0x12, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x18, 0x14, 0x0F, 0xFF, - 0x1B, 0x14, 0x12, 0xFF, 0x1E, 0x18, 0x16, 0xFF, 0x26, 0x22, 0x1F, 0xFF, - 0x2F, 0x2B, 0x28, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x3D, 0x39, 0x36, 0xFF, - 0x2E, 0x2C, 0x28, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, - 0x33, 0x30, 0x2F, 0xFF, 0x3D, 0x3B, 0x39, 0xFF, 0x42, 0x40, 0x3E, 0xFF, - 0x33, 0x30, 0x2F, 0xFF, 0x38, 0x36, 0x35, 0xFF, 0x34, 0x32, 0x30, 0xFF, - 0x28, 0x26, 0x24, 0xFF, 0x1C, 0x17, 0x16, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, - 0x2A, 0x25, 0x24, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, 0x35, 0x31, 0x30, 0xFF, - 0x39, 0x34, 0x34, 0xFF, 0x3F, 0x3D, 0x3C, 0xFF, 0x47, 0x45, 0x44, 0xFF, - 0x68, 0x64, 0x63, 0xFF, 0x89, 0x85, 0x84, 0xFF, 0x9A, 0x98, 0x97, 0xFF, - 0x98, 0x96, 0x94, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x81, 0x7E, 0x7F, 0xFF, - 0x79, 0x79, 0x79, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, - 0xAF, 0xAD, 0xAD, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, - 0x9D, 0x9D, 0x9D, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x99, 0x99, 0x99, 0xFF, - 0xA1, 0xA1, 0xA1, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, - 0xAD, 0xAD, 0xAD, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, - 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC3, 0xC3, 0xFF, 0xB4, 0xB8, 0xB9, 0xFF, 0xB1, 0xB6, 0xB6, 0xFF, - 0xB7, 0xBC, 0xBC, 0xFF, 0xBB, 0xBF, 0xC0, 0xFF, 0xA8, 0xAC, 0xAD, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0x8F, 0x97, 0x92, 0xFF, - 0x69, 0x70, 0x6D, 0xFF, 0x5E, 0x65, 0x63, 0xFF, 0x5A, 0x61, 0x5E, 0xFF, - 0x5D, 0x64, 0x62, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, - 0x5B, 0x60, 0x5E, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, - 0x64, 0x66, 0x65, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x87, 0x89, 0x86, 0xFF, - 0x61, 0x64, 0x61, 0xFF, 0x40, 0x42, 0x3F, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x15, 0x14, 0x10, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1C, 0x18, 0x14, 0xFF, - 0x27, 0x23, 0x20, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x25, 0x21, 0x1E, 0xFF, - 0x21, 0x1D, 0x1A, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, - 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, - 0x1B, 0x19, 0x18, 0xFF, 0x1B, 0x19, 0x18, 0xFF, 0x17, 0x15, 0x13, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, - 0x26, 0x27, 0x24, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x33, 0x34, 0x31, 0xFF, - 0x32, 0x32, 0x30, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, 0x68, 0x6B, 0x68, 0xFF, - 0x78, 0x78, 0x76, 0xFF, 0x8E, 0x8E, 0x8C, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, - 0x97, 0x98, 0x95, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x80, 0x80, 0x80, 0xFF, - 0x85, 0x85, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x9B, 0x9B, 0x9B, 0xFF, - 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0x97, 0x97, 0x97, 0xFF, - 0x8E, 0x8E, 0x8E, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, - 0xA1, 0xA1, 0xA1, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, - 0xAD, 0xAD, 0xAD, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, - 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xB4, 0xB8, 0xB9, 0xFF, 0xB5, 0xB9, 0xBA, 0xFF, 0xBC, 0xC0, 0xC1, 0xFF, - 0xC2, 0xC6, 0xC7, 0xFF, 0xB9, 0xBE, 0xBF, 0xFF, 0xA9, 0xAE, 0xAE, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x94, 0x9B, 0x97, 0xFF, - 0x81, 0x88, 0x86, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, - 0x80, 0x87, 0x85, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, - 0x5D, 0x5F, 0x5E, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, - 0x7D, 0x80, 0x7D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, 0x43, 0x46, 0x41, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x17, 0x15, 0x11, 0xFF, 0x22, 0x21, 0x1D, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x28, 0x26, 0x22, 0xFF, - 0x27, 0x25, 0x21, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x26, 0x24, 0x20, 0xFF, - 0x33, 0x2F, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x26, 0x22, 0x1F, 0xFF, - 0x21, 0x1D, 0x1A, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x14, 0x13, 0x0F, 0xFF, - 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x12, 0x11, 0xFF, - 0x18, 0x16, 0x14, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x11, 0x0F, 0x0D, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x13, 0x11, 0x0F, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x23, 0x25, 0x22, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x2E, 0x31, 0x2E, 0xFF, - 0x44, 0x47, 0x44, 0xFF, 0x69, 0x6E, 0x6A, 0xFF, 0x7F, 0x84, 0x80, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x85, 0x88, 0x85, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, - 0x92, 0x95, 0x92, 0xFF, 0x7A, 0x7A, 0x7A, 0xFF, 0x76, 0x76, 0x76, 0xFF, - 0x7A, 0x7A, 0x7A, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, - 0x90, 0x90, 0x90, 0xFF, 0x93, 0x93, 0x93, 0xFF, 0x94, 0x94, 0x94, 0xFF, - 0x8F, 0x8F, 0x8F, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, - 0xB1, 0xB1, 0xB1, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, - 0xA3, 0xA3, 0xA3, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xCA, 0xCD, 0xCC, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xD1, 0xD4, 0xD3, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, - 0xB2, 0xB9, 0xB9, 0xFF, 0xBB, 0xC2, 0xC2, 0xFF, 0xC2, 0xC9, 0xC9, 0xFF, - 0xC0, 0xC7, 0xC7, 0xFF, 0xB4, 0xBB, 0xBB, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, - 0x8E, 0x96, 0x91, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x7B, 0x83, 0x7E, 0xFF, - 0x78, 0x7F, 0x7B, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, - 0x72, 0x79, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, - 0x62, 0x67, 0x65, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, 0x62, 0x67, 0x63, 0xFF, - 0x83, 0x86, 0x83, 0xFF, 0x8B, 0x8E, 0x8B, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, - 0x3D, 0x3D, 0x39, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x2A, 0x29, 0x25, 0xFF, - 0x2C, 0x2A, 0x26, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, - 0x39, 0x35, 0x32, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, - 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0C, 0x0A, 0x06, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1F, 0x22, 0x1F, 0xFF, 0x27, 0x2A, 0x27, 0xFF, 0x36, 0x39, 0x36, 0xFF, - 0x4C, 0x4F, 0x4C, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x85, 0x8A, 0x86, 0xFF, - 0x7C, 0x7F, 0x7C, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, - 0x7B, 0x7E, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x6F, 0x72, 0x71, 0xFF, - 0x74, 0x76, 0x76, 0xFF, 0x7E, 0x81, 0x80, 0xFF, 0x89, 0x89, 0x89, 0xFF, - 0x8E, 0x8E, 0x8E, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, - 0xAA, 0xAA, 0xAA, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xD5, 0xD7, 0xD6, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBD, 0xC3, 0xC3, 0xFF, 0xC6, 0xCD, 0xCD, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, - 0xB7, 0xBE, 0xBD, 0xFF, 0xB3, 0xBA, 0xBA, 0xFF, 0xAB, 0xB2, 0xB2, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x93, 0x9A, 0x97, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, - 0xA4, 0xAC, 0xA7, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA4, 0xAC, 0xA5, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0x97, 0x9F, 0x9A, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, - 0x8C, 0x93, 0x8E, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x82, 0x8A, 0x87, 0xFF, - 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, - 0x68, 0x6D, 0x6B, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, - 0x79, 0x7B, 0x78, 0xFF, 0x91, 0x94, 0x91, 0xFF, 0x88, 0x8B, 0x85, 0xFF, - 0x58, 0x5B, 0x56, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x25, 0x23, 0x1F, 0xFF, - 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, - 0x36, 0x32, 0x2F, 0xFF, 0x23, 0x1F, 0x1B, 0xFF, 0x12, 0x10, 0x0C, 0xFF, - 0x0D, 0x0C, 0x08, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0B, 0x09, 0x05, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x1D, 0x1F, 0x1C, 0xFF, 0x24, 0x26, 0x23, 0xFF, 0x2F, 0x32, 0x2F, 0xFF, - 0x34, 0x37, 0x34, 0xFF, 0x43, 0x48, 0x44, 0xFF, 0x58, 0x5D, 0x59, 0xFF, - 0x6C, 0x6F, 0x6B, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6F, 0x72, 0x6F, 0xFF, - 0x5E, 0x61, 0x5D, 0xFF, 0x7A, 0x7C, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, - 0x79, 0x7B, 0x7A, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, - 0x95, 0x95, 0x95, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, - 0xB0, 0xB0, 0xB0, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, - 0xB2, 0xB2, 0xB2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, - 0xA7, 0xA6, 0xA7, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xAF, 0xB5, 0xB5, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, - 0xAF, 0xB5, 0xB5, 0xFF, 0xB0, 0xB7, 0xB6, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0xB1, 0xB8, 0xB4, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0x8E, 0x96, 0x91, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, - 0x93, 0x9A, 0x95, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0x87, 0x8E, 0x8C, 0xFF, - 0x7F, 0x86, 0x84, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, - 0x72, 0x77, 0x78, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x52, 0x57, 0x55, 0xFF, - 0x6F, 0x72, 0x6F, 0xFF, 0x93, 0x96, 0x93, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, - 0x75, 0x78, 0x75, 0xFF, 0x24, 0x24, 0x22, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1D, 0x1D, 0x1B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x28, 0x26, 0x24, 0xFF, - 0x23, 0x21, 0x20, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x26, 0x24, 0x22, 0xFF, - 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x17, 0x19, 0x18, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x24, 0x26, 0x25, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x1D, 0x22, 0x21, 0xFF, - 0x3C, 0x3F, 0x3E, 0xFF, 0x51, 0x53, 0x53, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, - 0x64, 0x66, 0x65, 0xFF, 0x78, 0x7A, 0x79, 0xFF, 0x7E, 0x81, 0x80, 0xFF, - 0x84, 0x87, 0x86, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x87, 0x89, 0x88, 0xFF, - 0x96, 0x98, 0x97, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, - 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, - 0xAD, 0xAF, 0xAF, 0xFF, 0xD2, 0xD5, 0xD4, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xA8, 0xAB, 0xAA, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xD5, 0xDA, 0xD9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xA8, 0xAE, 0xAE, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, 0xB2, 0xB9, 0xB9, 0xFF, - 0xBB, 0xC2, 0xC2, 0xFF, 0xB6, 0xBC, 0xBC, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x93, 0x9A, 0x95, 0xFF, - 0x9D, 0xA5, 0xA0, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, - 0x95, 0x9D, 0x98, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x9C, 0xA4, 0x9F, 0xFF, - 0x98, 0xA0, 0x9B, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x94, 0x9B, 0x99, 0xFF, - 0x82, 0x8A, 0x87, 0xFF, 0x74, 0x7C, 0x79, 0xFF, 0x78, 0x7D, 0x7D, 0xFF, - 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x5D, 0x62, 0x61, 0xFF, - 0x7A, 0x7D, 0x79, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x98, 0x9B, 0x98, 0xFF, - 0x83, 0x86, 0x83, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x1C, 0x1A, 0x19, 0xFF, 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x24, 0x22, 0xFF, - 0x2A, 0x28, 0x27, 0xFF, 0x15, 0x13, 0x12, 0xFF, 0x09, 0x07, 0x05, 0xFF, - 0x10, 0x0E, 0x0C, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x16, 0x18, 0x17, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0D, 0x12, 0x10, 0xFF, - 0x1E, 0x20, 0x1F, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x51, 0x53, 0x53, 0xFF, - 0x6A, 0x6C, 0x6B, 0xFF, 0x76, 0x79, 0x78, 0xFF, 0x82, 0x84, 0x84, 0xFF, - 0x8C, 0x8F, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0x92, 0x95, 0x94, 0xFF, - 0x9C, 0x9E, 0x9D, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, - 0xAA, 0xAC, 0xAB, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xD9, 0xDC, 0xDB, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xD2, 0xD5, 0xD4, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, - 0xCD, 0xD4, 0xD2, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xAB, 0xB2, 0xB2, 0xFF, 0xA5, 0xAC, 0xAC, 0xFF, 0xAD, 0xB4, 0xB4, 0xFF, - 0xBF, 0xC6, 0xC6, 0xFF, 0xBE, 0xC5, 0xC4, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x9D, 0xA5, 0xA0, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, - 0xB4, 0xBC, 0xB7, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x87, 0x8E, 0x8C, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, - 0x75, 0x79, 0x7A, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, - 0x76, 0x79, 0x76, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x90, 0x93, 0x90, 0xFF, - 0x96, 0x99, 0x95, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x19, 0x17, 0x15, 0xFF, - 0x1A, 0x18, 0x16, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x2C, 0x29, 0x28, 0xFF, - 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x09, 0x0B, 0x0A, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x03, 0x07, 0x06, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x43, 0x46, 0x45, 0xFF, - 0x66, 0x68, 0x68, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x7C, 0x7F, 0x7E, 0xFF, - 0x8B, 0x8E, 0x8D, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, - 0xA8, 0xAB, 0xAA, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, - 0x93, 0x96, 0x95, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, - 0xA7, 0xAA, 0xA9, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, - 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xB8, 0xBF, 0xBF, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, - 0xB8, 0xBF, 0xBF, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xAA, 0xB1, 0xAD, 0xFF, - 0x9A, 0xA1, 0x9C, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0x96, 0x9E, 0x99, 0xFF, - 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0xA8, 0xAF, 0xAA, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0x8F, 0x96, 0x94, 0xFF, 0x82, 0x8A, 0x87, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, - 0x72, 0x77, 0x78, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6F, 0x74, 0x72, 0xFF, - 0x6E, 0x71, 0x6E, 0xFF, 0x66, 0x69, 0x66, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, - 0x97, 0x9A, 0x97, 0xFF, 0x32, 0x32, 0x30, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x19, 0x17, 0x15, 0xFF, - 0x1C, 0x1A, 0x19, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x35, 0x33, 0x31, 0xFF, - 0x3F, 0x3D, 0x3C, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0A, 0x08, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x08, 0x0A, 0x09, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x01, 0x06, 0x05, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x33, 0x35, 0x34, 0xFF, - 0x4E, 0x50, 0x4F, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, 0x72, 0x74, 0x73, 0xFF, - 0x84, 0x87, 0x86, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, - 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, - 0x95, 0x97, 0x96, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, 0xA4, 0xAC, 0xA7, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x70, 0x75, 0x73, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, - 0x70, 0x75, 0x73, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x75, 0x7A, 0x76, 0xFF, - 0x7A, 0x7D, 0x79, 0xFF, 0x37, 0x3A, 0x37, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x07, 0x07, 0x05, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x45, 0x45, 0x43, 0xFF, - 0x7C, 0x79, 0x7A, 0xFF, 0x4C, 0x4A, 0x4B, 0xFF, 0x47, 0x47, 0x47, 0xFF, - 0x29, 0x29, 0x29, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x01, 0x01, 0x01, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, - 0x2B, 0x2B, 0x2B, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, - 0x01, 0x03, 0x02, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0C, 0x11, 0x0F, 0xFF, - 0x00, 0x00, 0x00, 0xFF, 0x27, 0x2C, 0x2A, 0xFF, 0x46, 0x4B, 0x49, 0xFF, - 0x58, 0x5C, 0x5B, 0xFF, 0x49, 0x4D, 0x4C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, - 0x72, 0x77, 0x76, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x9A, 0x9D, 0x9C, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, - 0xAF, 0xB2, 0xB1, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, 0x95, 0x97, 0x96, 0xFF, - 0x8B, 0x8E, 0x8D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, - 0xAE, 0xB1, 0xB0, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xAC, 0xB4, 0xAF, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x7F, 0x84, 0x82, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, - 0x63, 0x68, 0x66, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x6D, 0x72, 0x6E, 0xFF, - 0x70, 0x75, 0x71, 0xFF, 0x35, 0x38, 0x35, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, 0x23, 0x23, 0x21, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, - 0x8A, 0x87, 0x88, 0xFF, 0x6E, 0x6B, 0x6C, 0xFF, 0x8B, 0x8B, 0x8B, 0xFF, - 0x9A, 0x9A, 0x9A, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x96, 0x96, 0x96, 0xFF, - 0x78, 0x78, 0x78, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x30, 0x30, 0x30, 0xFF, - 0x24, 0x24, 0x24, 0xFF, 0x25, 0x25, 0x25, 0xFF, 0x31, 0x31, 0x31, 0xFF, - 0x4F, 0x4F, 0x4F, 0xFF, 0x65, 0x65, 0x65, 0xFF, 0x77, 0x77, 0x77, 0xFF, - 0x79, 0x79, 0x79, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, - 0x53, 0x56, 0x55, 0xFF, 0x3A, 0x3C, 0x3B, 0xFF, 0x15, 0x17, 0x16, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x24, 0x29, 0x28, 0xFF, 0x03, 0x07, 0x06, 0xFF, - 0x2F, 0x34, 0x32, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x4A, 0x4E, 0x4D, 0xFF, - 0x69, 0x6E, 0x6C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, - 0x66, 0x6A, 0x69, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, 0x8F, 0x91, 0x90, 0xFF, - 0x93, 0x96, 0x95, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xA1, 0xA4, 0xA3, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, - 0xA3, 0xA5, 0xA4, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, - 0x63, 0x68, 0x66, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x66, 0x6B, 0x67, 0xFF, - 0x6B, 0x71, 0x6D, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x19, 0x1C, 0x19, 0xFF, - 0x19, 0x1C, 0x19, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x71, 0x71, 0x6F, 0xFF, - 0x97, 0x94, 0x95, 0xFF, 0x7F, 0x7D, 0x7E, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, - 0xAB, 0xAB, 0xAB, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0x9E, 0x9E, 0x9E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, - 0x8D, 0x8D, 0x8D, 0xFF, 0x88, 0x88, 0x88, 0xFF, 0x82, 0x82, 0x82, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x86, 0x86, 0x86, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x78, 0x78, 0x78, 0xFF, - 0x71, 0x73, 0x72, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x88, 0x8A, 0x89, 0xFF, - 0x66, 0x68, 0x68, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, 0x76, 0x7B, 0x79, 0xFF, - 0x5F, 0x63, 0x62, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x7E, 0x83, 0x81, 0xFF, - 0x76, 0x7B, 0x79, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, - 0x82, 0x86, 0x85, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, - 0x89, 0x8B, 0x8B, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, - 0xB2, 0xB4, 0xB3, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0x88, 0x8F, 0x8D, 0xFF, 0x89, 0x90, 0x8E, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x84, 0x89, 0x87, 0xFF, - 0x76, 0x7B, 0x79, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6E, 0x73, 0x6F, 0xFF, - 0x6F, 0x74, 0x70, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, - 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x29, 0x29, 0x27, 0xFF, - 0x1F, 0x20, 0x1D, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x77, 0x77, 0x75, 0xFF, - 0x8A, 0x87, 0x88, 0xFF, 0x8C, 0x8A, 0x8B, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0xAA, 0xAA, 0xAA, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, - 0xB7, 0xB7, 0xB7, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, - 0x70, 0x70, 0x70, 0xFF, 0x68, 0x68, 0x68, 0xFF, 0x77, 0x77, 0x77, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, - 0x88, 0x88, 0x88, 0xFF, 0x86, 0x86, 0x86, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, - 0x7A, 0x7C, 0x7B, 0xFF, 0x82, 0x84, 0x84, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0x6D, 0x6F, 0x6F, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x75, 0x7A, 0x78, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x7C, 0x81, 0x7F, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, - 0x97, 0x99, 0x99, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, - 0xAD, 0xAF, 0xAF, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x9B, 0xA0, 0x9E, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0x79, 0x7E, 0x7D, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x77, 0x7C, 0x7A, 0xFF, - 0x71, 0x76, 0x74, 0xFF, 0x27, 0x2A, 0x29, 0xFF, 0x16, 0x18, 0x17, 0xFF, - 0x0E, 0x10, 0x0F, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, 0x76, 0x76, 0x76, 0xFF, - 0x87, 0x87, 0x87, 0xFF, 0x9C, 0x9C, 0x9C, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, - 0x9E, 0x9E, 0x9E, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, - 0x96, 0x96, 0x96, 0xFF, 0x81, 0x81, 0x81, 0xFF, 0x72, 0x72, 0x72, 0xFF, - 0x76, 0x76, 0x76, 0xFF, 0x7B, 0x7B, 0x7B, 0xFF, 0x86, 0x86, 0x86, 0xFF, - 0x77, 0x77, 0x77, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, - 0x9A, 0x9A, 0x9A, 0xFF, 0x94, 0x94, 0x94, 0xFF, 0x92, 0x92, 0x92, 0xFF, - 0x8F, 0x91, 0x90, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, - 0xA5, 0xA7, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xDE, 0xE2, 0xE1, 0xFF, 0xDC, 0xE1, 0xE0, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0x9D, 0xA4, 0xA2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, - 0x62, 0x67, 0x65, 0xFF, 0x2B, 0x2D, 0x2C, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, - 0x17, 0x19, 0x18, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x73, 0x75, 0x74, 0xFF, - 0x8C, 0x8C, 0x8C, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, - 0x90, 0x90, 0x90, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0x99, 0x99, 0x99, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x6B, 0x6B, 0x6B, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, - 0x7E, 0x7E, 0x7E, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x79, 0x79, 0x79, 0xFF, - 0x8C, 0x8C, 0x8C, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, - 0x85, 0x85, 0x85, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, - 0xAB, 0xAD, 0xAC, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x71, 0x76, 0x74, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0x85, 0x8A, 0x88, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x55, 0x5A, 0x58, 0xFF, - 0x4E, 0x53, 0x52, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x1F, 0x21, 0x21, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x2B, 0x30, 0x2F, 0xFF, - 0x1B, 0x20, 0x1E, 0xFF, 0x29, 0x2E, 0x2C, 0xFF, 0x6F, 0x72, 0x71, 0xFF, - 0x9F, 0xA2, 0xA1, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xA7, 0xAA, 0xA9, 0xFF, 0x64, 0x64, 0x64, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, - 0x6F, 0x6F, 0x6F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x72, 0x72, 0x72, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0x8E, 0x90, 0x8F, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, - 0x96, 0x98, 0x97, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, - 0xB4, 0xB6, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x79, 0x7B, 0x7A, 0xFF, - 0xA7, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0x89, 0x8D, 0x8C, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x5F, 0x63, 0x62, 0xFF, 0x47, 0x4C, 0x4B, 0xFF, - 0x3F, 0x44, 0x42, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x20, 0x23, 0x22, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x26, 0x2A, 0x29, 0xFF, - 0x1F, 0x23, 0x22, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x9F, 0xA2, 0xA1, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x85, 0x88, 0x87, 0xFF, - 0x67, 0x6A, 0x69, 0xFF, 0x61, 0x61, 0x61, 0xFF, 0x62, 0x62, 0x62, 0xFF, - 0x69, 0x69, 0x69, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x72, 0x72, 0x72, 0xFF, - 0x7F, 0x7F, 0x7F, 0xFF, 0x92, 0x92, 0x92, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, - 0x9A, 0x9D, 0x9C, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, - 0xA0, 0xA3, 0xA2, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xAE, 0xB1, 0xB0, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x85, 0x88, 0x87, 0xFF, - 0x90, 0x92, 0x92, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0x85, 0x8A, 0x88, 0xFF, - 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0x9C, 0xA3, 0xA1, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x34, 0x38, 0x37, 0xFF, - 0x24, 0x29, 0x28, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, - 0x0E, 0x13, 0x11, 0xFF, 0x28, 0x2D, 0x2B, 0xFF, 0x26, 0x2A, 0x29, 0xFF, - 0x23, 0x28, 0x26, 0xFF, 0x6E, 0x73, 0x71, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x74, 0x76, 0x76, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, 0x49, 0x4B, 0x4B, 0xFF, - 0x56, 0x58, 0x57, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, - 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, - 0x83, 0x86, 0x85, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x85, 0x8A, 0x88, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xD0, 0xD8, 0xD5, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xDA, 0xE1, 0xDE, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x53, 0x58, 0x56, 0xFF, 0x2A, 0x2F, 0x2D, 0xFF, - 0x19, 0x1E, 0x1C, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x0F, 0x14, 0x13, 0xFF, - 0x14, 0x19, 0x17, 0xFF, 0x20, 0x25, 0x23, 0xFF, 0x21, 0x26, 0x24, 0xFF, - 0x28, 0x2D, 0x2B, 0xFF, 0x55, 0x5A, 0x58, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, - 0x4E, 0x50, 0x4F, 0xFF, 0x56, 0x58, 0x57, 0xFF, 0x53, 0x56, 0x55, 0xFF, - 0x50, 0x52, 0x52, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x65, 0x67, 0x66, 0xFF, - 0x72, 0x74, 0x73, 0xFF, 0x74, 0x76, 0x76, 0xFF, 0x6E, 0x71, 0x70, 0xFF, - 0x8C, 0x8F, 0x8E, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x95, 0x9A, 0x99, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x8D, 0x92, 0x90, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, - 0xD6, 0xDD, 0xDB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x5C, 0x61, 0x5F, 0xFF, 0x32, 0x37, 0x36, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, - 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x15, 0x1A, 0x18, 0xFF, - 0x1A, 0x1F, 0x1D, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x25, 0x2C, 0x2A, 0xFF, - 0x26, 0x2E, 0x2B, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x3F, 0x44, 0x42, 0xFF, - 0x40, 0x45, 0x44, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, - 0x53, 0x58, 0x56, 0xFF, 0x71, 0x73, 0x72, 0xFF, 0x74, 0x76, 0x76, 0xFF, - 0x75, 0x78, 0x77, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x74, 0x76, 0x76, 0xFF, - 0x9C, 0x9E, 0x9D, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD4, 0xDB, 0xD9, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCC, 0xD3, 0xD0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x30, 0x35, 0x33, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0F, 0x14, 0x13, 0xFF, - 0x0A, 0x0E, 0x0D, 0xFF, 0x0E, 0x13, 0x11, 0xFF, 0x1D, 0x22, 0x21, 0xFF, - 0x1D, 0x22, 0x21, 0xFF, 0x1A, 0x1F, 0x1D, 0xFF, 0x2B, 0x32, 0x30, 0xFF, - 0x23, 0x2A, 0x28, 0xFF, 0x3A, 0x41, 0x3F, 0xFF, 0x57, 0x5E, 0x5C, 0xFF, - 0x5A, 0x5F, 0x5D, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, 0x6D, 0x71, 0x70, 0xFF, - 0x82, 0x86, 0x85, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x80, 0x82, 0x81, 0xFF, - 0x78, 0x7A, 0x79, 0xFF, 0x89, 0x8B, 0x8B, 0xFF, 0x78, 0x7A, 0x79, 0xFF, - 0xA5, 0xA7, 0xA7, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, - 0x16, 0x1B, 0x1A, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, - 0x08, 0x0D, 0x0C, 0xFF, 0x07, 0x0C, 0x0A, 0xFF, 0x0D, 0x12, 0x10, 0xFF, - 0x08, 0x0D, 0x0C, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0E, 0x15, 0x13, 0xFF, - 0x25, 0x2C, 0x2A, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x5F, 0x67, 0x64, 0xFF, - 0x6A, 0x6F, 0x6D, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x82, 0x84, 0x84, 0xFF, - 0x92, 0x95, 0x94, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, - 0x93, 0x96, 0x95, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x59, 0x5E, 0x5C, 0xFF, - 0x1A, 0x1F, 0x1D, 0xFF, 0x0F, 0x14, 0x13, 0xFF, 0x13, 0x18, 0x16, 0xFF, - 0x0C, 0x11, 0x0F, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, - 0x07, 0x0C, 0x0A, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0F, 0x16, 0x14, 0xFF, - 0x46, 0x4D, 0x4B, 0xFF, 0x61, 0x68, 0x65, 0xFF, 0x6B, 0x72, 0x70, 0xFF, - 0x6F, 0x74, 0x72, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, - 0x9A, 0x9D, 0x9C, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0x9A, 0x9D, 0x9C, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xD1, 0xD9, 0xD6, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xC7, 0xCE, 0xCC, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xCC, 0xD3, 0xD0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, - 0x22, 0x27, 0x25, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, - 0x13, 0x18, 0x16, 0xFF, 0x04, 0x09, 0x07, 0xFF, 0x0E, 0x13, 0x11, 0xFF, - 0x0F, 0x14, 0x13, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x35, 0x32, 0xFF, - 0x6B, 0x72, 0x70, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, 0x7F, 0x86, 0x84, 0xFF, - 0x80, 0x85, 0x84, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, - 0xA3, 0xA5, 0xA4, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xD5, 0xDC, 0xDA, 0xFF, 0xD6, 0xDD, 0xDB, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCD, 0xD4, 0xD2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0x29, 0x2E, 0x2C, 0xFF, 0x1C, 0x21, 0x1F, 0xFF, 0x1D, 0x22, 0x21, 0xFF, - 0x14, 0x19, 0x17, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x14, 0x19, 0x17, 0xFF, - 0x19, 0x1E, 0x1C, 0xFF, 0x1F, 0x23, 0x22, 0xFF, 0x61, 0x68, 0x65, 0xFF, - 0x7E, 0x85, 0x82, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0x8E, 0x90, 0x8F, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, - 0xAA, 0xAC, 0xAB, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x9B, 0xA0, 0x9E, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0x93, 0x98, 0x96, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xDA, 0xE1, 0xDE, 0xFF, - 0xD0, 0xD8, 0xD5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xDC, 0xE1, 0xE0, 0xFF, 0xD9, 0xDE, 0xDC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC7, 0xCE, 0xCC, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xD8, 0xE0, 0xDD, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x79, 0x7E, 0x7D, 0xFF, 0x36, 0x3B, 0x39, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, - 0x1B, 0x20, 0x1E, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x31, 0x30, 0xFF, - 0x3B, 0x3F, 0x3E, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x7D, 0x82, 0x80, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xDE, 0xE2, 0xE1, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xD9, 0xDE, 0xDC, 0xFF, 0xD8, 0xDD, 0xDB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xCC, 0xD3, 0xD0, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xD1, 0xD9, 0xD6, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xD2, 0xD7, 0xD5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x89, 0x8D, 0x8C, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0x82, 0x86, 0x85, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, - 0x68, 0x6D, 0x6B, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x84, 0x89, 0x87, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x95, 0x9A, 0x99, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xD9, 0xDE, 0xDC, 0xFF, 0xDB, 0xE0, 0xDE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, - 0x7C, 0x81, 0x7F, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x7D, 0x82, 0x80, 0xFF, - 0x84, 0x89, 0x87, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xD8, 0xDD, 0xDB, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x91, 0x96, 0x94, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xDB, 0xE0, 0xDE, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xD3, 0xD8, 0xD6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x82, 0x86, 0x85, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x9B, 0xA0, 0x9E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x8B, 0x90, 0x8E, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0x7D, 0x82, 0x80, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0x8C, 0x91, 0x8F, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0x91, 0x96, 0x94, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, - 0xD1, 0xD6, 0xD4, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x8D, 0x92, 0x90, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x8E, 0x95, 0x93, 0xFF, 0x82, 0x8A, 0x87, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, - 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0x9A, 0xA1, 0x9E, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0x88, 0x8F, 0x8D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x83, 0x8B, 0x88, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xAE, 0xB1, 0xB0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0x89, 0x8D, 0x8C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0x97, 0x9E, 0x9C, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, - 0xD8, 0xE2, 0xDE, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0x80, 0x89, 0x86, 0xFF, - 0xAF, 0xB9, 0xB6, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, - 0xCB, 0xD5, 0xD2, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xD5, 0xDE, 0xDB, 0xFF, - 0xB3, 0xBC, 0xB9, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x90, 0x99, 0x96, 0xFF, - 0x8F, 0x98, 0x95, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, - 0x9D, 0xA6, 0xA3, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0x8E, 0x95, 0x93, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xAC, 0xAE, 0xAD, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x72, 0x77, 0x76, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0x71, 0x76, 0x74, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, - 0x86, 0x8D, 0x8B, 0xFF, 0x81, 0x88, 0x86, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0xD5, 0xDE, 0xDB, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x92, 0x9C, 0x99, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, - 0x8D, 0x97, 0x94, 0xFF, 0x8B, 0x95, 0x92, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xBA, 0xC3, 0xC0, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, - 0x9A, 0xA4, 0xA1, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, - 0x8A, 0x92, 0x8F, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, - 0xAC, 0xAE, 0xAD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x8B, 0x90, 0x8E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, - 0x77, 0x7C, 0x7A, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x80, 0x85, 0x84, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x87, 0x90, 0x8D, 0xFF, 0x85, 0x8F, 0x8C, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, - 0xC8, 0xD4, 0xD0, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, - 0xBE, 0xCA, 0xC6, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0x79, 0x85, 0x81, 0xFF, - 0x9C, 0xA8, 0xA4, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, - 0xD2, 0xDE, 0xDA, 0xFF, 0xD6, 0xE2, 0xDE, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, - 0x96, 0xA2, 0x9E, 0xFF, 0x76, 0x82, 0x7E, 0xFF, 0x9A, 0xA6, 0xA2, 0xFF, - 0xAB, 0xB7, 0xB3, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, - 0x9F, 0xAB, 0xA7, 0xFF, 0xA1, 0xAD, 0xA9, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, - 0x91, 0x99, 0x96, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, - 0xAC, 0xAE, 0xAD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x84, 0x89, 0x87, 0xFF, - 0x72, 0x77, 0x76, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x7F, 0x84, 0x82, 0xFF, - 0x7F, 0x84, 0x82, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0x99, 0xA3, 0xA0, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, - 0xC0, 0xCC, 0xC8, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, - 0xCC, 0xD8, 0xD4, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, - 0xA7, 0xB3, 0xAF, 0xFF, 0xC3, 0xCF, 0xCB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, - 0x9A, 0xA6, 0xA2, 0xFF, 0x73, 0x7F, 0x7B, 0xFF, 0x88, 0x94, 0x90, 0xFF, - 0x9A, 0xA6, 0xA2, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, 0xA7, 0xB3, 0xAF, 0xFF, - 0xAA, 0xB6, 0xB2, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, - 0xA8, 0xAF, 0xAA, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x95, 0x9D, 0x98, 0xFF, - 0x9B, 0xA2, 0x9D, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, - 0xC4, 0xC9, 0xC5, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, - 0xC6, 0xC8, 0xC5, 0xFF, 0xAF, 0xB2, 0xAF, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, - 0x9F, 0xA4, 0xA0, 0xFF, 0x82, 0x87, 0x83, 0xFF, 0x75, 0x7A, 0x76, 0xFF, - 0x8E, 0x94, 0x90, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x7E, 0x83, 0x81, 0xFF, - 0x76, 0x7B, 0x79, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x7E, 0x83, 0x81, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x89, 0x90, 0x8E, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, - 0x8D, 0x97, 0x94, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA4, 0xA0, 0xFF, - 0x8A, 0x96, 0x92, 0xFF, 0x8E, 0x9A, 0x96, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, - 0xD4, 0xE0, 0xDC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, - 0xC1, 0xCE, 0xC9, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, - 0xC5, 0xD1, 0xCD, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, - 0x9F, 0xAB, 0xA7, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x7B, 0x84, 0x81, 0xFF, - 0x90, 0x99, 0x96, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0x9B, 0xA5, 0xA2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, - 0xA2, 0xA9, 0xA4, 0xFF, 0xB1, 0xB6, 0xB2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC8, 0xCB, 0xC7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, - 0xC0, 0xC2, 0xBF, 0xFF, 0xA0, 0xA3, 0xA0, 0xFF, 0x87, 0x8D, 0x89, 0xFF, - 0x91, 0x96, 0x92, 0xFF, 0x80, 0x86, 0x82, 0xFF, 0x80, 0x86, 0x82, 0xFF, - 0x90, 0x95, 0x91, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x83, 0x88, 0x86, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0x8C, 0x93, 0x90, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x91, 0x9D, 0x99, 0xFF, - 0x79, 0x85, 0x81, 0xFF, 0x91, 0x9D, 0x99, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, - 0xCC, 0xD8, 0xD4, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, - 0xC8, 0xD4, 0xD0, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, - 0xC3, 0xCF, 0xCB, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, - 0xA0, 0xAC, 0xA8, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, 0x82, 0x8B, 0x88, 0xFF, - 0x84, 0x8E, 0x8B, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0xA0, 0xAA, 0xA7, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0xAB, 0xB3, 0xAE, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0xAB, 0xB3, 0xAE, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, - 0xA0, 0xA5, 0xA1, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, 0xA8, 0xAB, 0xA8, 0xFF, - 0x9F, 0xA2, 0x9F, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x75, 0x7A, 0x76, 0xFF, - 0x80, 0x86, 0x82, 0xFF, 0x77, 0x7C, 0x78, 0xFF, 0x89, 0x8E, 0x8A, 0xFF, - 0x8B, 0x90, 0x8C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, - 0xA8, 0xB2, 0xAF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, - 0xA2, 0xAE, 0xAA, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xD2, 0xDE, 0xDA, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, - 0xAC, 0xB9, 0xB4, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0x85, 0x8F, 0x8C, 0xFF, 0x91, 0x9B, 0x97, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, - 0x9B, 0xA5, 0xA2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xB2, 0xBA, 0xB5, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, 0x98, 0x9D, 0x99, 0xFF, - 0x97, 0x9C, 0x98, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, 0x99, 0x9C, 0x99, 0xFF, - 0x97, 0x9A, 0x97, 0xFF, 0x95, 0x97, 0x94, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, - 0x98, 0x9D, 0x99, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, - 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x80, 0x85, 0x84, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0xA0, 0xAA, 0xA7, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, - 0xB6, 0xC2, 0xBE, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, - 0xCB, 0xD7, 0xD3, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, - 0xB6, 0xC2, 0xBE, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0x98, 0xA2, 0x9E, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x8B, 0x95, 0x92, 0xFF, - 0x91, 0x9B, 0x97, 0xFF, 0xA2, 0xAC, 0xA9, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, - 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, - 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, - 0xAE, 0xB3, 0xAF, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, - 0xB6, 0xBB, 0xB7, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, - 0x97, 0x9C, 0x98, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, 0x90, 0x95, 0x91, 0xFF, - 0x84, 0x89, 0x83, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, - 0xA7, 0xAC, 0xA6, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, - 0x99, 0x9E, 0x9A, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8A, 0x8F, 0x8B, 0xFF, - 0x90, 0x95, 0x91, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x97, 0x9C, 0x98, 0xFF, - 0x9A, 0x9F, 0x9B, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x9D, 0xA4, 0xA2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, - 0xB3, 0xBC, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xD4, 0xE0, 0xDC, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, - 0xBC, 0xC6, 0xC2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, - 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, - 0x9A, 0xA1, 0x9C, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, - 0xA4, 0xAA, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xB6, 0xBC, 0xB5, 0xFF, - 0xAB, 0xB1, 0xAD, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, - 0x71, 0x77, 0x70, 0xFF, 0x7E, 0x83, 0x7F, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, - 0x98, 0x9D, 0x97, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, - 0x99, 0x9E, 0x98, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x82, 0x87, 0x81, 0xFF, - 0x86, 0x8B, 0x87, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, 0x91, 0x96, 0x92, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x94, 0x99, 0x95, 0xFF, - 0x9F, 0xA4, 0xA0, 0xFF, 0xA8, 0xAD, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, - 0xD2, 0xDE, 0xDA, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xAA, 0xB6, 0xB2, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, - 0xB7, 0xC1, 0xBE, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xB9, 0xC2, 0xBF, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0x97, 0x9E, 0x9C, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, - 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, - 0x9A, 0xA1, 0x9C, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xB6, 0xBB, 0xB7, 0xFF, - 0xA9, 0xAE, 0xAA, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xBB, 0xC0, 0xBA, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, - 0x8C, 0x92, 0x8B, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, - 0xB0, 0xB6, 0xAF, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, - 0x9C, 0xA2, 0x9B, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x93, 0x99, 0x92, 0xFF, - 0xA0, 0xA5, 0xA1, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, - 0x9E, 0xA3, 0x9F, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, 0x86, 0x8B, 0x87, 0xFF, - 0x8C, 0x91, 0x8D, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xD7, 0xDF, 0xDC, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, - 0xA3, 0xAF, 0xAB, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, - 0x9C, 0xA8, 0xA4, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, - 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, - 0xD5, 0xE1, 0xDD, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0x8D, 0x99, 0x95, 0xFF, - 0x94, 0x9E, 0x9B, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, - 0xAE, 0xB8, 0xB4, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, - 0xBD, 0xC7, 0xC4, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xA5, 0xAD, 0xA6, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, - 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, - 0x98, 0x9D, 0x99, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, - 0xB1, 0xB7, 0xB0, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, - 0xA3, 0xA9, 0xA2, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x8C, 0x92, 0x8B, 0xFF, - 0x94, 0x9A, 0x93, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, - 0x9E, 0xA3, 0x9F, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, 0x95, 0x9B, 0x97, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0x99, 0x9E, 0x9A, 0xFF, - 0x99, 0x9E, 0x9A, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, - 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, - 0x9C, 0xA8, 0xA4, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, - 0xB1, 0xBD, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, - 0xDD, 0xE9, 0xE5, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, - 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0x95, 0x9C, 0x9A, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xAA, 0xB2, 0xA9, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0x98, 0xA1, 0x97, 0xFF, - 0x91, 0x99, 0x92, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, - 0xAA, 0xB2, 0xAB, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB6, 0xB1, 0xFF, - 0x90, 0x98, 0x93, 0xFF, 0x85, 0x8D, 0x85, 0xFF, 0x90, 0x98, 0x91, 0xFF, - 0x90, 0x98, 0x93, 0xFF, 0x8A, 0x92, 0x8D, 0xFF, 0x93, 0x9B, 0x93, 0xFF, - 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, - 0x94, 0x9A, 0x93, 0xFF, 0x91, 0x97, 0x8E, 0xFF, 0x97, 0x9C, 0x96, 0xFF, - 0xA6, 0xAB, 0xA5, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, - 0x90, 0x95, 0x8F, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, - 0x93, 0x98, 0x94, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0x9D, 0xA4, 0xA2, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, - 0xA3, 0xAF, 0xAB, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, - 0xDE, 0xE7, 0xE4, 0xFF, 0xDA, 0xE4, 0xE1, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xCD, 0xD4, 0xD2, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xA4, 0xAC, 0xA3, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, 0xA9, 0xB1, 0xA7, 0xFF, - 0xAA, 0xB2, 0xA9, 0xFF, 0xA6, 0xAE, 0xA7, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, - 0x9B, 0xA3, 0x9B, 0xFF, 0x96, 0x9E, 0x97, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, - 0x87, 0x8F, 0x8A, 0xFF, 0x82, 0x8A, 0x83, 0xFF, 0x8C, 0x94, 0x8C, 0xFF, - 0x94, 0x9B, 0x97, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, - 0xAC, 0xB4, 0xAD, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, - 0x97, 0x9C, 0x94, 0xFF, 0x8C, 0x92, 0x89, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, - 0xA4, 0xAA, 0xA4, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, - 0x92, 0x97, 0x91, 0xFF, 0x92, 0x97, 0x91, 0xFF, 0x97, 0x9C, 0x98, 0xFF, - 0x9F, 0xA4, 0xA0, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0x97, 0x9C, 0x98, 0xFF, - 0xA2, 0xA7, 0xA3, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8D, 0x94, 0x92, 0xFF, - 0x9C, 0xA3, 0xA1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, - 0xC8, 0xD1, 0xCE, 0xFF, 0xCB, 0xD5, 0xD2, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0xB2, 0xBE, 0xBA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, - 0xA3, 0xAF, 0xAB, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, - 0xB1, 0xBD, 0xB9, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, - 0xD1, 0xDB, 0xD7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x85, 0x8A, 0x88, 0xFF, - 0x9E, 0xA7, 0x9D, 0xFF, 0xA4, 0xAC, 0xA3, 0xFF, 0xAB, 0xB3, 0xAA, 0xFF, - 0xB1, 0xB9, 0xB0, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0x9F, 0xA7, 0xA0, 0xFF, - 0x94, 0x9C, 0x94, 0xFF, 0x8A, 0x92, 0x8B, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, - 0xA8, 0xB0, 0xA8, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, - 0xBD, 0xC5, 0xBD, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, - 0xBB, 0xC3, 0xBC, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, - 0x87, 0x8D, 0x87, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, - 0x8D, 0x93, 0x8C, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x98, 0x9D, 0x97, 0xFF, - 0x98, 0x9D, 0x97, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, - 0xA9, 0xAF, 0xA8, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, - 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0x8D, 0x94, 0x92, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xD1, 0xD6, 0xD4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0x97, 0x9E, 0x9C, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xB4, 0xBE, 0xBA, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, - 0xBF, 0xCB, 0xC7, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, - 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, - 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, - 0xCC, 0xD6, 0xD3, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, - 0xA6, 0xB0, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0x9C, 0xA3, 0xA1, 0xFF, 0x8F, 0x96, 0x94, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, - 0x9D, 0xA5, 0x9C, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0x9F, 0xA8, 0x9E, 0xFF, - 0xA1, 0xA9, 0x9F, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x94, 0x9C, 0x94, 0xFF, - 0x97, 0x9F, 0x98, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x93, 0x9B, 0x93, 0xFF, - 0x9E, 0xA6, 0x9F, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, - 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x91, 0x99, 0x92, 0xFF, - 0x79, 0x81, 0x7A, 0xFF, 0x83, 0x88, 0x82, 0xFF, 0x95, 0x9B, 0x94, 0xFF, - 0x82, 0x87, 0x81, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, - 0x97, 0x9C, 0x96, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, - 0x9F, 0xA4, 0x9E, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, - 0xAA, 0xB0, 0xA9, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, - 0xAE, 0xB3, 0xAF, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, - 0x88, 0x8F, 0x8D, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, - 0x87, 0x8E, 0x8C, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0x96, 0x9F, 0x9C, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xDC, 0xE5, 0xE2, 0xFF, - 0xCE, 0xDA, 0xD6, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, - 0xC7, 0xD3, 0xCF, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, - 0xC7, 0xD3, 0xCF, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xD2, 0xDC, 0xD9, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x80, 0x87, 0x85, 0xFF, - 0xA4, 0xAC, 0xA3, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, - 0x83, 0x8C, 0x82, 0xFF, 0x80, 0x88, 0x7F, 0xFF, 0x78, 0x80, 0x77, 0xFF, - 0xB0, 0xB8, 0xAE, 0xFF, 0x90, 0x99, 0x8F, 0xFF, 0x78, 0x80, 0x79, 0xFF, - 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB7, 0xAF, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, - 0x80, 0x88, 0x81, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x75, 0x7D, 0x76, 0xFF, - 0x88, 0x90, 0x89, 0xFF, 0x79, 0x7F, 0x79, 0xFF, 0x94, 0x9A, 0x93, 0xFF, - 0x8E, 0x94, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0xAE, 0xB3, 0xAD, 0xFF, - 0xA0, 0xA5, 0x9F, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, - 0xA3, 0xA9, 0xA4, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0x9A, 0xA1, 0x9E, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0x8C, 0x93, 0x90, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xE1, 0xEB, 0xE8, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, - 0xBE, 0xCA, 0xC6, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, - 0xBD, 0xC7, 0xC4, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, - 0xC1, 0xCA, 0xC7, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, - 0xBE, 0xC8, 0xC5, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, - 0xAE, 0xB8, 0xB4, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, - 0x86, 0x8E, 0x85, 0xFF, 0x9A, 0xA2, 0x98, 0xFF, 0x9D, 0xA5, 0x9C, 0xFF, - 0xB1, 0xB9, 0xB0, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x90, 0x99, 0x8F, 0xFF, - 0xB7, 0xBF, 0xB5, 0xFF, 0x8C, 0x94, 0x8A, 0xFF, 0x7C, 0x84, 0x7D, 0xFF, - 0xAA, 0xB2, 0xAB, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0x96, 0x9E, 0x97, 0xFF, - 0x7F, 0x87, 0x80, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x7E, 0x86, 0x7E, 0xFF, - 0x8D, 0x95, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, - 0x9E, 0xA3, 0x9D, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xB1, 0xB7, 0xB0, 0xFF, - 0xA0, 0xA5, 0x9F, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, - 0xA4, 0xAA, 0xA6, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, - 0xAB, 0xB1, 0xAD, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, - 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xBE, 0xC8, 0xC5, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, - 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, - 0xB9, 0xC2, 0xBF, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, - 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, - 0xC7, 0xD0, 0xCD, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xBB, 0xC5, 0xC1, 0xFF, - 0x82, 0x8B, 0x81, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0x98, 0xA1, 0x97, 0xFF, - 0xC7, 0xCF, 0xC6, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, - 0xB6, 0xBE, 0xB4, 0xFF, 0x78, 0x80, 0x77, 0xFF, 0x72, 0x7A, 0x71, 0xFF, - 0x93, 0x9B, 0x91, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x79, 0x81, 0x78, 0xFF, - 0x8A, 0x92, 0x8B, 0xFF, 0x94, 0x9C, 0x94, 0xFF, 0x95, 0x9D, 0x96, 0xFF, - 0x9E, 0xA6, 0x9F, 0xFF, 0xA9, 0xAF, 0xA8, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, - 0xB2, 0xB8, 0xB2, 0xFF, 0xBE, 0xC4, 0xBD, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, - 0xAA, 0xB0, 0xA9, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, - 0xAB, 0xB1, 0xAD, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, - 0xB9, 0xC1, 0xBC, 0xFF, 0xBB, 0xC3, 0xBE, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, - 0xB4, 0xBE, 0xBA, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xAF, 0xB9, 0xB6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, - 0xCD, 0xD9, 0xD5, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, - 0xA8, 0xB2, 0xAF, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, - 0xA6, 0xB0, 0xAC, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, - 0xAC, 0xB9, 0xB4, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, - 0x9D, 0xA5, 0x9C, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0x97, 0xA0, 0x96, 0xFF, - 0xBA, 0xC3, 0xB9, 0xFF, 0x81, 0x8A, 0x80, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, - 0xAB, 0xB3, 0xAA, 0xFF, 0x61, 0x69, 0x5F, 0xFF, 0x5E, 0x67, 0x5D, 0xFF, - 0x7C, 0x85, 0x7B, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x71, 0x79, 0x70, 0xFF, - 0x9B, 0xA3, 0x9B, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, 0xB0, 0xB8, 0xB0, 0xFF, - 0xB4, 0xBC, 0xB5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, - 0xC2, 0xC7, 0xC1, 0xFF, 0xB5, 0xBA, 0xB4, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, - 0xBC, 0xC1, 0xBB, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, - 0xA2, 0xA7, 0xA3, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, - 0x93, 0x98, 0x94, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, - 0xBB, 0xC3, 0xBE, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, - 0xAE, 0xB8, 0xB4, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xB2, 0xBB, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, - 0xD3, 0xDD, 0xDA, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, - 0xBD, 0xC9, 0xC5, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, - 0x97, 0xA0, 0x9D, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, 0x88, 0x91, 0x8E, 0xFF, - 0x8D, 0x97, 0x94, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, - 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xA8, 0xB4, 0xB0, 0xFF, - 0x9C, 0xA4, 0x9B, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0xBB, 0xC4, 0xBA, 0xFF, - 0xAF, 0xB7, 0xAD, 0xFF, 0x86, 0x8E, 0x85, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, - 0x7C, 0x85, 0x7B, 0xFF, 0x51, 0x5A, 0x50, 0xFF, 0x53, 0x5B, 0x51, 0xFF, - 0x83, 0x8C, 0x82, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x9C, 0xA4, 0x9B, 0xFF, - 0xC1, 0xC9, 0xC2, 0xFF, 0xBE, 0xC6, 0xBE, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, - 0xB7, 0xBF, 0xB7, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, - 0xB7, 0xBD, 0xB6, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, 0x91, 0x96, 0x92, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x93, 0x98, 0x94, 0xFF, - 0x9A, 0x9F, 0x9B, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x98, 0x9D, 0x99, 0xFF, - 0x9B, 0xA0, 0x9C, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xCA, 0xD2, 0xCD, 0xFF, - 0xC3, 0xCB, 0xC6, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x8C, 0x96, 0x93, 0xFF, - 0xAB, 0xB4, 0xB1, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, - 0xC9, 0xD3, 0xCF, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xAE, 0xBA, 0xB6, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, - 0xD8, 0xE4, 0xE0, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, - 0xB5, 0xC1, 0xBD, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, - 0xB1, 0xBD, 0xB9, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, - 0x91, 0x9A, 0x90, 0xFF, 0x82, 0x8B, 0x81, 0xFF, 0xB9, 0xC1, 0xB8, 0xFF, - 0x95, 0x9D, 0x94, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x98, 0xA1, 0x97, 0xFF, - 0x82, 0x8B, 0x81, 0xFF, 0x73, 0x7C, 0x72, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, - 0xA5, 0xAE, 0xA4, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, 0xAF, 0xB7, 0xAD, 0xFF, - 0xB9, 0xC1, 0xBA, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, - 0xB7, 0xBF, 0xB7, 0xFF, 0x95, 0x9B, 0x94, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, - 0xBB, 0xC0, 0xBA, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x92, 0x97, 0x93, 0xFF, - 0x8D, 0x92, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9D, 0xFF, - 0xA4, 0xAA, 0xA6, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, - 0x9B, 0xA0, 0x9C, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC6, 0xCD, 0xC9, 0xFF, - 0xB2, 0xBA, 0xB5, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, - 0xB0, 0xBA, 0xB7, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, - 0xA1, 0xAB, 0xA8, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, - 0xBD, 0xC7, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, - 0xC3, 0xCD, 0xC9, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, - 0x9D, 0xA9, 0xA5, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, - 0xD1, 0xDD, 0xD9, 0xFF, 0xD6, 0xDF, 0xDC, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, - 0xC8, 0xD1, 0xCE, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, - 0x9A, 0xA1, 0x9E, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, - 0xC1, 0xCE, 0xC9, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, - 0xA9, 0xB5, 0xB1, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, - 0x7F, 0x87, 0x7E, 0xFF, 0x97, 0xA0, 0x96, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, - 0x7E, 0x86, 0x7C, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, 0x95, 0x9D, 0x94, 0xFF, - 0x90, 0x99, 0x8F, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, - 0xA2, 0xAA, 0xA0, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, - 0xAD, 0xB5, 0xAE, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, - 0xA8, 0xB0, 0xA8, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, - 0xB9, 0xBF, 0xB9, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0x91, 0x96, 0x92, 0xFF, - 0x83, 0x88, 0x84, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, - 0xA3, 0xA9, 0xA4, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, - 0x8E, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, - 0x9D, 0xA5, 0xA0, 0xFF, 0x89, 0x91, 0x8C, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, - 0xB9, 0xC2, 0xBF, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAD, 0xAA, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, - 0xAB, 0xB4, 0xB1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x91, 0x96, 0x94, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xBB, 0xC5, 0xC1, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, - 0x9A, 0xA6, 0xA2, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, - 0xD2, 0xDC, 0xD9, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, - 0xBD, 0xC9, 0xC5, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, - 0x72, 0x7A, 0x71, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, 0x8A, 0x93, 0x89, 0xFF, - 0x7E, 0x86, 0x7C, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, - 0x9C, 0xA4, 0x9B, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, - 0x8D, 0x95, 0x8B, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, - 0xB1, 0xB9, 0xB2, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, - 0x93, 0x9B, 0x93, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0xB8, 0xBE, 0xB7, 0xFF, - 0xB4, 0xB9, 0xB3, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8E, 0x94, 0x90, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, - 0xB5, 0xBA, 0xB6, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, - 0x97, 0x9C, 0x98, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, - 0xB1, 0xB8, 0xB4, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xB7, 0xC1, 0xBE, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, - 0x93, 0x9D, 0x9A, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, - 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0xA6, 0xB2, 0xAD, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, - 0xD2, 0xDC, 0xD9, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0x90, 0x99, 0x96, 0xFF, 0x83, 0x8D, 0x89, 0xFF, - 0xA4, 0xB0, 0xAC, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF + 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xD6, 0xD7, 0xD4, 0xFF, 0x56, 0x57, 0x54, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x39, 0x39, 0x3B, 0xFF, + 0xB7, 0xB7, 0xB7, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, + 0xDF, 0xDD, 0xD9, 0xFF, 0xF0, 0xEF, 0xEB, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xDE, 0xDA, 0xD7, 0xFF, 0xD5, 0xD1, 0xCE, 0xFF, + 0xE7, 0xE3, 0xE0, 0xFF, 0xE9, 0xE5, 0xE1, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, 0xEC, 0xE6, 0xE4, 0xFF, 0xEC, 0xE6, 0xE4, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, + 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE6, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xA3, 0xA3, 0xA1, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, 0x22, 0x21, 0x24, 0xFF, + 0x6A, 0x6A, 0x6A, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE5, 0xE7, 0xDF, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xEE, 0xEF, 0xE7, 0xFF, 0xF0, 0xF1, 0xEA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xDB, 0xDC, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, + 0xE6, 0xE4, 0xE0, 0xFF, 0xE6, 0xE4, 0xE0, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0xD2, 0xD0, 0xCC, 0xFF, 0x9F, 0x9B, 0x98, 0xFF, 0x9D, 0x99, 0x96, 0xFF, + 0xB7, 0xB2, 0xAF, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, 0xD9, 0xD2, 0xD0, 0xFF, 0xD9, 0xD2, 0xD0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, + 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, + 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0x77, 0x77, 0x75, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, 0x13, 0x12, 0x15, 0xFF, + 0x1E, 0x1E, 0x1E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, + 0xEE, 0xEF, 0xE7, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, 0xF1, 0xF2, 0xED, 0xFF, 0xF0, 0xF1, 0xEC, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE0, 0xDE, 0xDA, 0xFF, 0xBB, 0xB9, 0xB5, 0xFF, 0x7D, 0x7B, 0x77, 0xFF, 0x37, 0x36, 0x32, 0xFF, 0x24, 0x20, 0x1D, 0xFF, 0x73, 0x6F, 0x6C, 0xFF, + 0xC4, 0xC0, 0xBD, 0xFF, 0xEE, 0xEA, 0xE7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, + 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, + 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xDD, 0xDE, 0xDB, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, + 0x5C, 0x5C, 0x5A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x13, 0x12, 0x15, 0xFF, 0x13, 0x12, 0x15, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE4, 0xE5, 0xDE, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, + 0x70, 0x6F, 0x6B, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x10, 0x0E, 0x0A, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0xB2, 0xAE, 0xAB, 0xFF, + 0xF4, 0xF0, 0xED, 0xFF, 0xE6, 0xE2, 0xDF, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, 0xEA, 0xE4, 0xE1, 0xFF, 0xEA, 0xE4, 0xE1, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, + 0x30, 0x30, 0x2E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xD9, 0xD9, 0xD5, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE5, 0xE6, 0xE1, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x33, 0x34, 0x2F, 0xFF, + 0x21, 0x1F, 0x1B, 0xFF, 0x25, 0x23, 0x1F, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x46, 0x45, 0x41, 0xFF, 0xBB, 0xB7, 0xB4, 0xFF, 0xED, 0xE9, 0xE6, 0xFF, + 0xEA, 0xE6, 0xE3, 0xFF, 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xDC, 0xD6, 0xD3, 0xFF, 0xE3, 0xDD, 0xDA, 0xFF, 0xF1, 0xEB, 0xE8, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, + 0x24, 0x24, 0x22, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x15, 0x15, 0x17, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x53, 0x53, 0x51, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xF5, 0xF5, 0xF0, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, + 0xD4, 0xD5, 0xD0, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, + 0x0E, 0x0D, 0x09, 0xFF, 0x0E, 0x0D, 0x09, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x9B, 0x9A, 0x96, 0xFF, 0xDD, 0xD9, 0xD6, 0xFF, 0xE3, 0xDF, 0xDC, 0xFF, + 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xDC, 0xD9, 0xFF, 0xF6, 0xEF, 0xED, 0xFF, 0xF5, 0xEE, 0xEC, 0xFF, 0xE8, 0xE1, 0xDF, 0xFF, 0xD5, 0xCF, 0xCC, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xEA, 0xEA, 0xE8, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, + 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x13, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x26, 0x27, 0x24, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xEB, 0xEC, 0xE7, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x07, 0x08, 0x03, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x30, 0x31, 0x2C, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x63, 0x62, 0x5E, 0xFF, 0xC4, 0xC2, 0xBE, 0xFF, 0xE8, 0xE7, 0xE3, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, + 0xE6, 0xE4, 0xE0, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xD9, 0xD5, 0xD2, 0xFF, 0xD0, 0xCC, 0xC9, 0xFF, 0xB7, 0xB2, 0xAF, 0xFF, 0x9C, 0x98, 0x94, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0x63, 0x63, 0x61, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x17, 0x17, 0x19, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xD6, 0xD7, 0xD2, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x31, 0x32, 0x2D, 0xFF, + 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, + 0x1B, 0x1A, 0x16, 0xFF, 0x42, 0x40, 0x3C, 0xFF, 0xAE, 0xAC, 0xA8, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, + 0xD6, 0xD4, 0xD0, 0xFF, 0xC5, 0xC4, 0xC0, 0xFF, 0x97, 0x93, 0x90, 0xFF, 0x96, 0x92, 0x8F, 0xFF, 0xA3, 0x9F, 0x9B, 0xFF, 0xB4, 0xB0, 0xAD, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, + 0x1E, 0x1F, 0x1C, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x1C, 0x1C, 0x1E, 0xFF, 0x16, 0x16, 0x18, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x86, 0x87, 0x80, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, + 0xC9, 0xCB, 0xC3, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, + 0xE5, 0xE7, 0xDF, 0xFF, 0xEC, 0xEE, 0xE6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, + 0xF0, 0xF1, 0xEC, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, + 0xEA, 0xEB, 0xE6, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, + 0x5D, 0x5E, 0x59, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, + 0x4C, 0x4C, 0x48, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xB5, 0xB3, 0xAF, 0xFF, 0xAA, 0xA9, 0xA5, 0xFF, + 0x9E, 0x9C, 0x98, 0xFF, 0x93, 0x92, 0x8E, 0xFF, 0xA6, 0xA4, 0xA0, 0xFF, 0xBB, 0xB9, 0xB5, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x4E, 0x4E, 0x4C, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, + 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x08, 0x09, 0x06, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x55, 0x56, 0x4F, 0xFF, + 0x58, 0x5A, 0x52, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x55, 0x56, 0x51, 0xFF, 0x74, 0x75, 0x70, 0xFF, + 0xA2, 0xA3, 0x9C, 0xFF, 0xC2, 0xC4, 0xBC, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xDB, 0xDC, 0xD7, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, + 0x24, 0x25, 0x20, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xB3, 0xB4, 0xAF, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x9A, 0x98, 0x94, 0xFF, 0xA7, 0xA5, 0xA1, 0xFF, + 0xBA, 0xB8, 0xB4, 0xFF, 0xC6, 0xC5, 0xC1, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0xE2, 0xE1, 0xDD, 0xFF, 0xE3, 0xE2, 0xDE, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x53, 0x53, 0x51, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x1A, 0x1B, 0x14, 0xFF, 0x24, 0x25, 0x1E, 0xFF, + 0x2B, 0x2C, 0x25, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x35, 0x30, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, + 0x46, 0x47, 0x40, 0xFF, 0x4E, 0x4F, 0x48, 0xFF, 0x6F, 0x70, 0x69, 0xFF, 0x8F, 0x90, 0x89, 0xFF, 0xB0, 0xB1, 0xA8, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, + 0xA5, 0xA7, 0x9F, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x45, 0x46, 0x3F, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x31, 0x32, 0x2D, 0xFF, + 0x2D, 0x2E, 0x29, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x16, 0x17, 0x12, 0xFF, + 0x16, 0x17, 0x12, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x71, 0x72, 0x6D, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, + 0xDD, 0xDE, 0xD9, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x55, 0x55, 0x53, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x15, 0x16, 0x0F, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, + 0x28, 0x29, 0x22, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, + 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x2B, 0xFF, 0x31, 0x32, 0x2B, 0xFF, 0x41, 0x42, 0x3B, 0xFF, 0x44, 0x45, 0x3B, 0xFF, 0x37, 0x38, 0x2F, 0xFF, + 0x30, 0x31, 0x2A, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x21, 0x22, 0x1B, 0xFF, 0x26, 0x28, 0x20, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, + 0x22, 0x23, 0x1E, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, + 0xA3, 0xA4, 0x9F, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0x61, 0x61, 0x5F, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x14, 0x13, 0x16, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, + 0x32, 0x33, 0x2C, 0xFF, 0x38, 0x39, 0x32, 0xFF, 0x28, 0x29, 0x22, 0xFF, 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x29, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, + 0x2D, 0x2F, 0x27, 0xFF, 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, + 0xDE, 0xDF, 0xDA, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, + 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0x65, 0x66, 0x63, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x08, 0x08, 0x0A, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, + 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, + 0x29, 0x2A, 0x23, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x36, 0x37, 0x30, 0xFF, 0x38, 0x39, 0x32, 0xFF, 0x34, 0x36, 0x2C, 0xFF, 0x2A, 0x2B, 0x22, 0xFF, + 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, 0x16, 0x17, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, + 0xD9, 0xD9, 0xD5, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, 0xEB, 0xEC, 0xE7, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0x6B, 0x6C, 0x69, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, 0x17, 0x17, 0x19, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, + 0x13, 0x13, 0x0F, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x25, 0x26, 0x21, 0xFF, + 0x2A, 0x2B, 0x24, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x28, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, + 0x30, 0x31, 0x2A, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x24, 0x25, 0x1E, 0xFF, 0x1E, 0x1F, 0x18, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x08, 0x09, 0x06, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x07, 0x07, 0x05, 0xFF, + 0x29, 0x2A, 0x25, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE1, 0xE1, 0xDD, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, + 0xD7, 0xD8, 0xD3, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x70, 0x70, 0x6E, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, + 0x28, 0x28, 0x24, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x2A, 0xFF, 0x34, 0x36, 0x2E, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x2C, 0x2D, 0x26, 0xFF, + 0x2A, 0x2B, 0x24, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x1E, 0x1F, 0x18, 0xFF, 0x1A, 0x1B, 0x14, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x53, 0x53, 0x4F, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, + 0xE9, 0xEA, 0xE5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, + 0xE4, 0xE5, 0xE0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0x63, 0x63, 0x63, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, + 0x24, 0x25, 0x20, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x36, 0x2E, 0xFF, 0x2F, 0x30, 0x29, 0xFF, + 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1A, 0x1E, 0x18, 0xFF, + 0x13, 0x17, 0x11, 0xFF, 0x10, 0x13, 0x0D, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x15, 0x17, 0x16, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x02, 0x05, 0x01, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, + 0xC5, 0xC6, 0xC1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, + 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x64, 0x64, 0x64, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x22, 0x23, 0x1E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x32, 0x33, 0x2C, 0xFF, + 0x28, 0x2C, 0x26, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x1D, 0x20, 0x1A, 0xFF, + 0x16, 0x19, 0x13, 0xFF, 0x11, 0x14, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x09, 0x0B, 0x0A, 0xFF, 0x0A, 0x0C, 0x0C, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x25, 0x27, 0x26, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, + 0xD4, 0xD5, 0xCE, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x66, 0x66, 0x66, 0xFF, + 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x32, 0x33, 0x2C, 0xFF, 0x34, 0x36, 0x2E, 0xFF, + 0x28, 0x2C, 0x26, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2B, 0x2E, 0x28, 0xFF, 0x2C, 0x2F, 0x29, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x20, 0x23, 0x1E, 0xFF, + 0x19, 0x1C, 0x17, 0xFF, 0x15, 0x18, 0x12, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x0C, 0x0F, 0x0E, 0xFF, 0x2C, 0x2E, 0x2D, 0xFF, 0x80, 0x80, 0x7E, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, + 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, + 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0x69, 0x69, 0x69, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, + 0x27, 0x2A, 0x25, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2F, 0x33, 0x2D, 0xFF, 0x32, 0x35, 0x2F, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x23, 0x26, 0x20, 0xFF, + 0x1A, 0x1E, 0x18, 0xFF, 0x17, 0x1A, 0x14, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x08, 0x0A, 0x09, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x32, 0x34, 0x33, 0xFF, 0x81, 0x82, 0x7F, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, + 0xC8, 0xC9, 0xC2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, + 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, + 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, + 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x6A, 0x6A, 0x6A, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x25, 0x26, 0x23, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x32, 0x33, 0x2E, 0xFF, + 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x2D, 0x30, 0x2D, 0xFF, 0x25, 0x28, 0x24, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, + 0x0C, 0x0E, 0x10, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x4C, 0x4F, 0x4E, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, + 0xCD, 0xCE, 0xC7, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, + 0xD4, 0xD5, 0xCE, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xBA, 0xBB, 0xB4, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, + 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, + 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xC7, 0xC8, 0xC3, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, + 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x69, 0x69, 0x69, 0xFF, + 0x15, 0x15, 0x15, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x30, 0x31, 0x2C, 0xFF, + 0x2D, 0x30, 0x2B, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x24, 0x26, 0x23, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, + 0x0C, 0x0E, 0x10, 0xFF, 0x1C, 0x1E, 0x1F, 0xFF, 0x20, 0x23, 0x22, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0xB6, 0xB6, 0xB4, 0xFF, 0xCE, 0xCF, 0xCA, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, + 0xDE, 0xE0, 0xD8, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xD5, 0xD6, 0xCF, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, + 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, + 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, + 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0x65, 0x65, 0x65, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, + 0x32, 0x35, 0x2F, 0xFF, 0x2C, 0x2F, 0x29, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x1D, 0x20, 0x1A, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x21, 0x24, 0x21, 0xFF, + 0x1D, 0x1F, 0x1C, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x19, 0x1B, 0x1D, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, 0x91, 0x94, 0x93, 0xFF, 0xCC, 0xCC, 0xCA, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xDB, 0xDC, 0xD5, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, + 0xCC, 0xCD, 0xC6, 0xFF, 0xC6, 0xC7, 0xC0, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0x93, 0x94, 0x8D, 0xFF, 0x82, 0x84, 0x7C, 0xFF, + 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, + 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC2, 0xC3, 0xBE, 0xFF, + 0xCB, 0xCB, 0xC7, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, + 0xDE, 0xDF, 0xDC, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, 0x63, 0x63, 0x63, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0D, 0x0C, 0x0F, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, + 0x35, 0x38, 0x33, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x19, 0x1C, 0x17, 0xFF, 0x23, 0x25, 0x22, 0xFF, 0x20, 0x23, 0x20, 0xFF, + 0x1E, 0x21, 0x1D, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x12, 0x14, 0x16, 0xFF, 0x1D, 0x1F, 0x20, 0xFF, 0x4B, 0x4E, 0x4D, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xDC, 0xDD, 0xD6, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, + 0xBF, 0xC0, 0xB9, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0x90, 0x92, 0x8A, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x66, 0x68, 0x60, 0xFF, + 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, + 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, + 0xBB, 0xBC, 0xB7, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, + 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD6, 0xD7, 0xD4, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xC5, 0xC5, 0xC3, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, 0xDA, 0xDA, 0xD8, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x3B, 0x3C, 0x39, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x24, 0x25, 0x20, 0xFF, + 0x30, 0x34, 0x2E, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, + 0x1E, 0x21, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x12, 0x14, 0x16, 0xFF, 0x20, 0x22, 0x24, 0xFF, 0x91, 0x94, 0x93, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xDB, 0xDC, 0xD3, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC7, 0xC8, 0xC1, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, + 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x96, 0x97, 0x90, 0xFF, 0x7D, 0x7E, 0x77, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, + 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, 0xB0, 0xB1, 0xAA, 0xFF, 0xB1, 0xB2, 0xAB, 0xFF, 0xB0, 0xB1, 0xAA, 0xFF, + 0xB6, 0xB6, 0xB2, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, + 0xD6, 0xD7, 0xD2, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, + 0xC2, 0xC3, 0xC0, 0xFF, 0xB4, 0xB5, 0xB2, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, 0xB7, 0xB7, 0xB5, 0xFF, 0x7E, 0x7E, 0x7C, 0xFF, 0x29, 0x29, 0x27, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, + 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, + 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x16, 0x18, 0x19, 0xFF, 0x24, 0x26, 0x27, 0xFF, 0x6F, 0x72, 0x71, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0xCB, 0xCB, 0xC9, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, + 0xE1, 0xE2, 0xDB, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, + 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, 0x74, 0x76, 0x6E, 0xFF, 0x61, 0x62, 0x5B, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x50, 0x52, 0x4A, 0xFF, + 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, + 0xAC, 0xAD, 0xA8, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA5, 0xFF, 0xAB, 0xAC, 0xA5, 0xFF, 0xAC, 0xAD, 0xA6, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xBB, 0xBC, 0xB7, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, + 0xC4, 0xC4, 0xC0, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xCE, 0xCE, 0xCC, 0xFF, 0xBF, 0xBF, 0xBD, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, + 0xAF, 0xAF, 0xAD, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAA, 0xAA, 0xA8, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x1E, 0x21, 0x1B, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, + 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, + 0x0E, 0x10, 0x11, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x42, 0x44, 0x44, 0xFF, 0x71, 0x73, 0x72, 0xFF, 0xBD, 0xBD, 0xBB, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, + 0xCF, 0xD0, 0xC9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, + 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, + 0x8D, 0x8E, 0x87, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x56, 0x57, 0x50, 0xFF, 0x4B, 0x4C, 0x44, 0xFF, 0x53, 0x54, 0x4D, 0xFF, 0x69, 0x6A, 0x63, 0xFF, + 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, + 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, 0xB8, 0xB8, 0xB6, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x9E, 0x9F, 0x9C, 0xFF, + 0x96, 0x97, 0x94, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, 0x7A, 0x7B, 0x78, 0xFF, 0x3D, 0x3D, 0x3B, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, + 0x15, 0x18, 0x12, 0xFF, 0x1E, 0x21, 0x1B, 0xFF, 0x24, 0x27, 0x21, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x17, 0x1A, 0x16, 0xFF, + 0x17, 0x1A, 0x16, 0xFF, 0x16, 0x18, 0x15, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, + 0x17, 0x19, 0x1A, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x3B, 0x3D, 0x3D, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0xC9, 0xCA, 0xC5, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xD7, 0xD9, 0xCF, 0xFF, 0xE1, 0xE2, 0xD9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, + 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, + 0x78, 0x79, 0x72, 0xFF, 0x69, 0x6A, 0x63, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, 0x48, 0x49, 0x42, 0xFF, 0x61, 0x62, 0x5B, 0xFF, 0x86, 0x87, 0x80, 0xFF, + 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, + 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA4, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, + 0xA7, 0xA7, 0xA2, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x99, 0x99, 0x97, 0xFF, + 0x94, 0x94, 0x92, 0xFF, 0x95, 0x95, 0x93, 0xFF, 0x82, 0x83, 0x80, 0xFF, 0x4E, 0x4E, 0x4C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x17, 0x19, 0x18, 0xFF, + 0x17, 0x19, 0x18, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, + 0x21, 0x24, 0x23, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x4F, 0x51, 0x50, 0xFF, 0xB3, 0xB6, 0xB2, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, + 0xE5, 0xE7, 0xDD, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, + 0xCF, 0xD0, 0xCB, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x8F, 0x92, 0x8C, 0xFF, 0x72, 0x75, 0x6F, 0xFF, + 0x61, 0x65, 0x5F, 0xFF, 0x49, 0x4C, 0x46, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x51, 0x54, 0x4F, 0xFF, 0x7C, 0x7F, 0x7A, 0xFF, 0x8C, 0x90, 0x8A, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, + 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA5, 0xA7, 0x9F, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, + 0xA4, 0xA5, 0xA0, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0x97, 0x98, 0x95, 0xFF, + 0x9B, 0x9B, 0x99, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x77, 0x77, 0x75, 0xFF, 0x41, 0x42, 0x3F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x12, 0x15, 0x12, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x23, 0x25, 0x22, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x15, 0x17, 0x16, 0xFF, + 0x15, 0x17, 0x16, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, + 0x23, 0x25, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, 0xBD, 0xC0, 0xBD, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, + 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, + 0xC4, 0xC4, 0xC0, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, 0x60, 0x63, 0x5E, 0xFF, + 0x52, 0x55, 0x50, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, 0x58, 0x5B, 0x56, 0xFF, 0x83, 0x86, 0x81, 0xFF, 0x8A, 0x8D, 0x88, 0xFF, + 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, + 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA7, 0x9F, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, + 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x99, 0x99, 0x94, 0xFF, + 0x99, 0x99, 0x94, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x94, 0x94, 0x92, 0xFF, 0x90, 0x91, 0x8E, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, 0x87, 0x87, 0x85, 0xFF, + 0x87, 0x87, 0x85, 0xFF, 0x7B, 0x7C, 0x79, 0xFF, 0x68, 0x68, 0x66, 0xFF, 0x3F, 0x3F, 0x3D, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0F, 0x12, 0x0E, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, + 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, + 0x20, 0x23, 0x22, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, 0x44, 0x47, 0x44, 0xFF, 0xAF, 0xB2, 0xAF, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, + 0xB2, 0xB3, 0xAE, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, 0x53, 0x57, 0x51, 0xFF, + 0x48, 0x4B, 0x45, 0xFF, 0x35, 0x38, 0x33, 0xFF, 0x36, 0x39, 0x34, 0xFF, 0x63, 0x66, 0x60, 0xFF, 0x8E, 0x91, 0x8B, 0xFF, 0x87, 0x8A, 0x84, 0xFF, + 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, + 0xA1, 0xA1, 0x9D, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x87, 0x87, 0x85, 0xFF, 0x78, 0x78, 0x76, 0xFF, 0x6D, 0x6E, 0x6B, 0xFF, + 0x47, 0x47, 0x45, 0xFF, 0x45, 0x45, 0x43, 0xFF, 0x45, 0x45, 0x43, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x07, 0x07, 0x05, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0C, 0x0F, 0x0C, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x16, 0x18, 0x17, 0xFF, + 0x16, 0x18, 0x17, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x37, 0x3A, 0x37, 0xFF, 0x8E, 0x91, 0x8B, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x4B, 0x4E, 0x49, 0xFF, + 0x43, 0x46, 0x41, 0xFF, 0x30, 0x34, 0x2E, 0xFF, 0x34, 0x37, 0x32, 0xFF, 0x6B, 0x6E, 0x68, 0xFF, 0x96, 0x99, 0x93, 0xFF, 0x84, 0x88, 0x82, 0xFF, + 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, + 0x9B, 0x9C, 0x97, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0x9B, 0x9C, 0x95, 0xFF, + 0x8E, 0x8F, 0x88, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x61, 0x61, 0x5D, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x56, 0x57, 0x52, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x08, 0x08, 0x08, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x22, 0x22, 0x20, 0xFF, 0x26, 0x27, 0x24, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, + 0xCE, 0xCF, 0xC8, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xC8, 0xC9, 0xC2, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xC7, 0xC8, 0xC3, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, + 0x99, 0x99, 0x94, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, 0x63, 0x66, 0x60, 0xFF, 0x47, 0x4A, 0x44, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, + 0x31, 0x37, 0x30, 0xFF, 0x2B, 0x31, 0x2B, 0xFF, 0x2F, 0x34, 0x2E, 0xFF, 0x60, 0x65, 0x5F, 0xFF, 0x7E, 0x84, 0x7D, 0xFF, 0x77, 0x7D, 0x76, 0xFF, + 0xAA, 0xAB, 0xA6, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x96, 0x97, 0x92, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x66, 0x68, 0x60, 0xFF, + 0x50, 0x52, 0x4A, 0xFF, 0x46, 0x47, 0x40, 0xFF, 0x45, 0x45, 0x41, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x77, 0x78, 0x73, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x21, 0x21, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0xC5, 0xC6, 0xBF, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0x99, 0x99, 0x94, 0xFF, + 0x86, 0x87, 0x82, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x6B, 0x6E, 0x68, 0xFF, 0x56, 0x59, 0x53, 0xFF, 0x4E, 0x51, 0x4B, 0xFF, 0x3B, 0x3E, 0x39, 0xFF, + 0x2A, 0x30, 0x29, 0xFF, 0x1F, 0x24, 0x1E, 0xFF, 0x30, 0x36, 0x2F, 0xFF, 0x5C, 0x62, 0x5B, 0xFF, 0x7B, 0x80, 0x7A, 0xFF, 0x78, 0x7E, 0x77, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, + 0xA1, 0xA1, 0x9D, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x96, 0x97, 0x92, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x48, 0x49, 0x42, 0xFF, 0x44, 0x45, 0x3D, 0xFF, + 0x49, 0x4B, 0x43, 0xFF, 0x57, 0x58, 0x51, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, + 0x8B, 0x8B, 0x87, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x42, 0x43, 0x3E, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x05, 0x05, 0x05, 0xFF, 0x08, 0x08, 0x08, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x22, 0x22, 0x20, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x52, 0x52, 0x4D, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, + 0x82, 0x83, 0x7E, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x68, 0x6C, 0x66, 0xFF, 0x53, 0x57, 0x51, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x32, 0x35, 0x2F, 0xFF, + 0x2B, 0x31, 0x2B, 0xFF, 0x28, 0x2D, 0x27, 0xFF, 0x29, 0x2F, 0x28, 0xFF, 0x4C, 0x52, 0x4B, 0xFF, 0x6A, 0x70, 0x69, 0xFF, 0x71, 0x77, 0x70, 0xFF, + 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x96, 0x97, 0x92, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, + 0x53, 0x53, 0x4F, 0xFF, 0x40, 0x41, 0x3C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x68, 0x69, 0x62, 0xFF, + 0x7F, 0x80, 0x79, 0xFF, 0x94, 0x95, 0x8E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, + 0x6C, 0x6D, 0x68, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x24, 0x24, 0x22, 0xFF, 0x40, 0x40, 0x3E, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0xB6, 0xB7, 0xB0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, + 0xD4, 0xD5, 0xCE, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, 0xCD, 0xCE, 0xC7, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, + 0x71, 0x72, 0x6D, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, 0x53, 0x57, 0x51, 0xFF, 0x42, 0x45, 0x3F, 0xFF, 0x43, 0x46, 0x41, 0xFF, 0x33, 0x36, 0x30, 0xFF, + 0x24, 0x2A, 0x24, 0xFF, 0x1C, 0x22, 0x1B, 0xFF, 0x1B, 0x21, 0x1A, 0xFF, 0x39, 0x3F, 0x39, 0xFF, 0x58, 0x5D, 0x57, 0xFF, 0x63, 0x69, 0x62, 0xFF, + 0xA7, 0xA7, 0xA2, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, + 0x9B, 0x9C, 0x97, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x45, 0x45, 0x41, 0xFF, + 0x49, 0x4A, 0x45, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x8E, 0x8F, 0x88, 0xFF, 0x97, 0x99, 0x91, 0xFF, + 0xA0, 0xA1, 0x99, 0xFF, 0x99, 0x9A, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x63, 0x64, 0x5F, 0xFF, + 0x5A, 0x5A, 0x56, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x25, 0x26, 0x23, 0xFF, + 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, + 0x14, 0x13, 0x16, 0xFF, 0x1E, 0x1E, 0x20, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, 0x11, 0x11, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, + 0x3B, 0x3C, 0x39, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, + 0xCB, 0xCB, 0xC7, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x74, 0x75, 0x70, 0xFF, + 0x62, 0x62, 0x60, 0xFF, 0x66, 0x67, 0x64, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x72, 0x74, 0x71, 0xFF, 0x78, 0x7D, 0x79, 0xFF, 0x64, 0x6A, 0x66, 0xFF, + 0x3D, 0x42, 0x3E, 0xFF, 0x19, 0x21, 0x1C, 0xFF, 0x17, 0x1F, 0x1A, 0xFF, 0x26, 0x2E, 0x29, 0xFF, 0x48, 0x50, 0x4B, 0xFF, 0x6A, 0x71, 0x6D, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, + 0x69, 0x6A, 0x65, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x74, 0x75, 0x70, 0xFF, + 0x79, 0x7A, 0x75, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x95, 0x96, 0x8F, 0xFF, 0x9A, 0x9B, 0x94, 0xFF, + 0x92, 0x93, 0x8B, 0xFF, 0x7F, 0x80, 0x79, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, + 0x4E, 0x4F, 0x4A, 0xFF, 0x39, 0x3A, 0x35, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, + 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x09, 0x0A, 0x07, 0xFF, + 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, + 0x08, 0x08, 0x0A, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x15, 0x15, 0x17, 0xFF, 0x32, 0x32, 0x32, 0xFF, 0x46, 0x46, 0x46, 0xFF, + 0x82, 0x83, 0x80, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xC8, 0xC9, 0xC4, 0xFF, + 0xBA, 0xBB, 0xB6, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x80, 0x81, 0x7C, 0xFF, + 0x88, 0x89, 0x86, 0xFF, 0x90, 0x91, 0x8E, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, 0xA3, 0xA5, 0xA2, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, + 0x5C, 0x63, 0x5F, 0xFF, 0x43, 0x4B, 0x46, 0xFF, 0x30, 0x37, 0x32, 0xFF, 0x2C, 0x34, 0x2F, 0xFF, 0x3A, 0x42, 0x3D, 0xFF, 0x56, 0x5E, 0x59, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x44, 0x44, 0x3F, 0xFF, + 0x45, 0x45, 0x41, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x85, 0x86, 0x7F, 0xFF, 0x89, 0x8B, 0x83, 0xFF, + 0x7F, 0x80, 0x79, 0xFF, 0x6F, 0x70, 0x69, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x63, 0x64, 0x5F, 0xFF, + 0x45, 0x45, 0x41, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x08, 0x08, 0x08, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x95, 0x95, 0x95, 0xFF, + 0xAD, 0xAE, 0xAB, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, + 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA5, 0x9F, 0xFF, 0xA7, 0xAA, 0xA5, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, + 0xAE, 0xB1, 0xAE, 0xFF, 0xAE, 0xB1, 0xAE, 0xFF, 0xAB, 0xAE, 0xAA, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, + 0x8D, 0x94, 0x90, 0xFF, 0x6C, 0x74, 0x6F, 0xFF, 0x65, 0x6D, 0x68, 0xFF, 0x41, 0x49, 0x44, 0xFF, 0x31, 0x38, 0x34, 0xFF, 0x32, 0x3A, 0x35, 0xFF, + 0x72, 0x73, 0x6E, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x93, 0x93, 0x8F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x80, 0x81, 0x7A, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, + 0x73, 0x74, 0x6D, 0xFF, 0x6D, 0x6F, 0x67, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x53, 0x53, 0x4F, 0xFF, + 0x3F, 0x40, 0x3B, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x72, 0x73, 0x6E, 0xFF, + 0x1C, 0x1D, 0x18, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x3A, 0x3B, 0x36, 0xFF, 0x38, 0x38, 0x36, 0xFF, 0x22, 0x22, 0x20, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x1E, 0x1E, 0x1E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x29, 0x29, 0x29, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, + 0xA0, 0xA0, 0x9D, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, + 0xB4, 0xB5, 0xB0, 0xFF, 0xBB, 0xBC, 0xB7, 0xFF, 0xB4, 0xB7, 0xB2, 0xFF, 0xC1, 0xC4, 0xBE, 0xFF, 0xC4, 0xC8, 0xC2, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, + 0xB3, 0xB6, 0xB2, 0xFF, 0xB4, 0xB7, 0xB4, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, + 0xA4, 0xAC, 0xA7, 0xFF, 0x8E, 0x96, 0x91, 0xFF, 0x79, 0x81, 0x7C, 0xFF, 0x55, 0x5C, 0x58, 0xFF, 0x3B, 0x43, 0x3E, 0xFF, 0x35, 0x3D, 0x38, 0xFF, + 0x4D, 0x4E, 0x49, 0xFF, 0x58, 0x59, 0x54, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x96, 0x97, 0x92, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8D, 0x8E, 0x89, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x7D, 0x7E, 0x77, 0xFF, 0x77, 0x78, 0x71, 0xFF, + 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, + 0x34, 0x35, 0x30, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x76, 0x76, 0x72, 0xFF, + 0x13, 0x13, 0x0F, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x05, 0x05, 0x01, 0xFF, 0x08, 0x09, 0x04, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x16, 0x16, 0x16, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x25, 0x25, 0x25, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x7A, 0x7B, 0x78, 0xFF, + 0x88, 0x89, 0x86, 0xFF, 0x48, 0x49, 0x46, 0xFF, 0x66, 0x67, 0x62, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, + 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, + 0xB7, 0xBC, 0xB8, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, + 0xB9, 0xC1, 0xBC, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0x8A, 0x92, 0x8D, 0xFF, 0x6B, 0x73, 0x6E, 0xFF, 0x51, 0x59, 0x54, 0xFF, + 0x74, 0x75, 0x70, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA3, 0xA4, 0x9F, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x87, 0x88, 0x83, 0xFF, + 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x74, 0x76, 0x6E, 0xFF, + 0x6D, 0x6F, 0x67, 0xFF, 0x68, 0x69, 0x62, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x71, 0x72, 0x6D, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x09, 0x0A, 0x05, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x06, 0x06, 0x06, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, + 0x30, 0x30, 0x30, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0x42, 0x42, 0x42, 0xFF, 0x70, 0x70, 0x6E, 0xFF, 0xAF, 0xAF, 0xAD, 0xFF, + 0x71, 0x71, 0x6F, 0xFF, 0x50, 0x51, 0x4E, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, + 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xBB, 0xFF, 0xBB, 0xBE, 0xBB, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, + 0xB6, 0xBB, 0xB7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xB4, 0xBC, 0xB7, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, + 0xBF, 0xC6, 0xC2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x87, 0x8F, 0x8A, 0xFF, 0x73, 0x7B, 0x76, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x79, 0x7A, 0x73, 0xFF, 0x73, 0x74, 0x6D, 0xFF, + 0x6C, 0x6D, 0x66, 0xFF, 0x66, 0x68, 0x60, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x48, 0x49, 0x44, 0xFF, + 0x2F, 0x2F, 0x2B, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x42, 0x43, 0x3E, 0xFF, 0x68, 0x68, 0x64, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, + 0x3B, 0x3D, 0x35, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x09, 0x02, 0xFF, 0x2F, 0x30, 0x29, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x78, 0x79, 0x74, 0xFF, + 0x18, 0x19, 0x14, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x09, 0x0A, 0x05, 0xFF, 0x08, 0x09, 0x04, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x2D, 0x2E, 0x2B, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0xA9, 0xA9, 0xA7, 0xFF, 0x94, 0x94, 0x92, 0xFF, 0x8B, 0x8B, 0x89, 0xFF, 0x77, 0x77, 0x75, 0xFF, + 0x50, 0x51, 0x4E, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, + 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, + 0xB2, 0xB8, 0xB4, 0xFF, 0xBE, 0xC5, 0xC0, 0xFF, 0xC2, 0xCA, 0xC5, 0xFF, 0xBE, 0xC5, 0xC0, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, + 0xC3, 0xCB, 0xC6, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, + 0xB1, 0xB2, 0xAD, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x71, 0xFF, 0x71, 0x72, 0x6B, 0xFF, + 0x6A, 0x6B, 0x64, 0xFF, 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x46, 0x47, 0x42, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x45, 0x45, 0x41, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, + 0x8E, 0x8F, 0x88, 0xFF, 0x55, 0x56, 0x4F, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x52, 0x52, 0x4D, 0xFF, + 0x03, 0x04, 0x00, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x08, 0x09, 0x04, 0xFF, 0x05, 0x05, 0x03, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x08, 0x09, 0x06, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x44, 0x44, 0x42, 0xFF, 0x53, 0x53, 0x51, 0xFF, 0x4C, 0x4C, 0x4A, 0xFF, 0x52, 0x52, 0x4F, 0xFF, 0x46, 0x46, 0x44, 0xFF, + 0x38, 0x38, 0x36, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, + 0xBA, 0xBD, 0xB7, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, + 0xB6, 0xBD, 0xB8, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC5, 0xCC, 0xC7, 0xFF, + 0xC8, 0xD0, 0xCB, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0xAA, 0xB1, 0xAD, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, + 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x84, 0x84, 0x80, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, + 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x28, 0x28, 0x24, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x18, 0x19, 0x14, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x33, 0x34, 0x2F, 0xFF, 0x46, 0x47, 0x42, 0xFF, + 0x84, 0x84, 0x80, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x24, 0x24, 0x22, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x25, 0x26, 0x23, 0xFF, 0x39, 0x39, 0x37, 0xFF, 0x36, 0x36, 0x34, 0xFF, 0x2F, 0x2F, 0x2D, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, 0x57, 0x58, 0x55, 0xFF, + 0x3D, 0x3D, 0x3B, 0xFF, 0x82, 0x83, 0x80, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, 0xC6, 0xC6, 0xC4, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, + 0xC3, 0xC6, 0xC3, 0xFF, 0xBD, 0xC0, 0xBD, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xB9, 0xBF, 0xBB, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, + 0xCC, 0xD1, 0xCD, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, + 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, + 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, + 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x40, 0x41, 0x3C, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x33, 0x34, 0x2F, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x2A, 0x2A, 0x28, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, + 0x1E, 0x1F, 0x1C, 0xFF, 0x2C, 0x2D, 0x2A, 0xFF, 0x4D, 0x4D, 0x4B, 0xFF, 0x47, 0x47, 0x45, 0xFF, 0x42, 0x43, 0x40, 0xFF, 0x33, 0x34, 0x31, 0xFF, + 0x64, 0x65, 0x62, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0xB8, 0xB8, 0xB6, 0xFF, 0xC0, 0xC1, 0xBE, 0xFF, 0xBA, 0xBD, 0xB9, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, + 0xC1, 0xC4, 0xC0, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xBB, 0xC0, 0xBC, 0xFF, 0xC4, 0xC9, 0xC5, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, + 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, + 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x29, 0x2A, 0x25, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x3E, 0x3E, 0x3A, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x32, 0x33, 0x2E, 0xFF, + 0x28, 0x28, 0x24, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x1F, 0x20, 0x1D, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x2F, 0x2F, 0x2D, 0xFF, 0x3F, 0x3F, 0x3D, 0xFF, 0x47, 0x47, 0x45, 0xFF, 0x55, 0x55, 0x53, 0xFF, + 0x92, 0x92, 0x90, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, 0xB9, 0xBA, 0xB7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, + 0xBF, 0xC1, 0xBE, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, + 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x78, 0x79, 0x74, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x69, 0x6A, 0x63, 0xFF, + 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, + 0x2A, 0x2B, 0x26, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x34, 0x35, 0x32, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, + 0x21, 0x21, 0x1F, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x36, 0x36, 0x34, 0xFF, 0x36, 0x36, 0x34, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x5D, 0x5E, 0x5B, 0xFF, + 0xB2, 0xB3, 0xB0, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAB, 0xAC, 0xA9, 0xFF, 0xB4, 0xB5, 0xB2, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, + 0xBD, 0xC0, 0xBD, 0xFF, 0xB3, 0xB6, 0xB2, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, + 0xCA, 0xCF, 0xCB, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x63, 0xFF, + 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x25, 0x26, 0x23, 0xFF, + 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x26, 0x26, 0x26, 0xFF, 0x23, 0x23, 0x23, 0xFF, + 0x1E, 0x20, 0x1F, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x1C, 0x1C, 0x1C, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x34, 0x34, 0x34, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, 0x57, 0x57, 0x57, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0xC5, 0xC5, 0xC5, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, + 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x68, 0x69, 0x62, 0xFF, + 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0x2B, 0x2C, 0x27, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, + 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x22, 0x22, 0x22, 0xFF, + 0x1F, 0x21, 0x21, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, + 0xC6, 0xC6, 0xC6, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, + 0xC6, 0xC6, 0xC6, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x68, 0x69, 0x62, 0xFF, + 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0x2B, 0x2C, 0x27, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, + 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x21, 0x21, 0x21, 0xFF, + 0x20, 0x23, 0x22, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x44, 0x44, 0x44, 0xFF, 0x3B, 0x3B, 0x3B, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, + 0xC8, 0xC8, 0xC8, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, + 0xC6, 0xC6, 0xC6, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xCD, 0xD2, 0xD0, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x66, 0x68, 0x60, 0xFF, + 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, + 0x23, 0x25, 0x24, 0xFF, 0x25, 0x27, 0x26, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x44, 0x44, 0x44, 0xFF, 0x4D, 0x4D, 0x4D, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, + 0xBD, 0xBD, 0xBD, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xD0, 0xD4, 0xD3, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, + 0x1D, 0x1D, 0x1F, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x22, 0x21, 0x24, 0xFF, 0x1E, 0x1E, 0x20, 0xFF, 0x13, 0x15, 0x17, 0xFF, 0x09, 0x0B, 0x0C, 0xFF, + 0x0B, 0x0D, 0x0F, 0xFF, 0x0F, 0x11, 0x12, 0xFF, 0x12, 0x14, 0x16, 0xFF, 0x15, 0x17, 0x18, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, + 0x1D, 0x1D, 0x1D, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x50, 0x50, 0x50, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCE, 0xCE, 0xCE, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, + 0xC2, 0xC2, 0xC2, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, + 0xCD, 0xCF, 0xCE, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x34, 0x35, 0x30, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x16, 0x16, 0x18, 0xFF, + 0x1A, 0x19, 0x1C, 0xFF, 0x1D, 0x1D, 0x1F, 0xFF, 0x2D, 0x2D, 0x2F, 0xFF, 0x31, 0x31, 0x33, 0xFF, 0x21, 0x23, 0x25, 0xFF, 0x11, 0x13, 0x15, 0xFF, + 0x09, 0x0B, 0x0C, 0xFF, 0x10, 0x12, 0x13, 0xFF, 0x16, 0x18, 0x19, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, + 0x2B, 0x2B, 0x2B, 0xFF, 0x3B, 0x3B, 0x3B, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x48, 0x48, 0x48, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, + 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, + 0xC5, 0xC5, 0xC5, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x37, 0x37, 0x33, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x32, 0x32, 0x32, 0xFF, 0x36, 0x36, 0x36, 0xFF, 0x2C, 0x2E, 0x2D, 0xFF, 0x17, 0x19, 0x18, 0xFF, + 0x0B, 0x0E, 0x0D, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x24, 0x26, 0x25, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, + 0x3D, 0x3D, 0x3D, 0xFF, 0x49, 0x49, 0x49, 0xFF, 0x45, 0x45, 0x45, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, + 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, + 0xC7, 0xC7, 0xC7, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xC1, 0xC3, 0xC2, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x38, 0x39, 0x34, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x30, 0x30, 0x30, 0xFF, 0x26, 0x28, 0x28, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x28, 0x28, 0x28, 0xFF, 0x30, 0x30, 0x30, 0xFF, 0x33, 0x33, 0x33, 0xFF, 0x26, 0x26, 0x26, 0xFF, + 0x48, 0x48, 0x48, 0xFF, 0x4C, 0x4C, 0x4C, 0xFF, 0x49, 0x49, 0x49, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, + 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xC9, 0xCB, 0xCB, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, + 0xA2, 0xA3, 0x9E, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x37, 0x37, 0x33, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x0C, 0x0C, 0x08, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, + 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x08, 0x09, 0x06, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x14, 0x12, 0x13, 0xFF, 0x1B, 0x19, 0x1A, 0xFF, + 0x1A, 0x1A, 0x1A, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x2A, 0x2A, 0x2A, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x19, 0x16, 0x17, 0xFF, 0x22, 0x20, 0x21, 0xFF, 0x2D, 0x2D, 0x2D, 0xFF, 0x34, 0x34, 0x34, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, + 0x53, 0x53, 0x53, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, 0x69, 0x69, 0x69, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, + 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xCE, 0xCE, 0xCE, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, + 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x25, 0x22, 0x23, 0xFF, + 0x23, 0x23, 0x23, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x28, 0x28, 0x28, 0xFF, 0x31, 0x31, 0x31, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x24, 0x24, 0x24, 0xFF, + 0x21, 0x1F, 0x1F, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x21, 0x1F, 0x1F, 0xFF, 0x2A, 0x28, 0x29, 0xFF, 0x3E, 0x3E, 0x3E, 0xFF, 0x37, 0x37, 0x37, 0xFF, + 0x42, 0x42, 0x42, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x62, 0x62, 0x62, 0xFF, 0x89, 0x89, 0x89, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, + 0xA9, 0xA9, 0xA9, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, + 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0C, 0xFF, + 0x10, 0x11, 0x0C, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, + 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x28, 0x26, 0x24, 0xFF, + 0x26, 0x27, 0x24, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, + 0x2E, 0x2C, 0x2A, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x36, 0x36, 0x36, 0xFF, 0x39, 0x39, 0x39, 0xFF, + 0x3E, 0x3E, 0x3E, 0xFF, 0x50, 0x50, 0x50, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0xA9, 0xA9, 0xA9, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, + 0xA9, 0xA9, 0xA9, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, + 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, + 0xCF, 0xD1, 0xD0, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x13, 0x11, 0x0F, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x23, 0x21, 0x20, 0xFF, + 0x23, 0x21, 0x20, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x27, 0x25, 0x23, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, + 0x37, 0x35, 0x34, 0xFF, 0x2A, 0x28, 0x27, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x3C, 0x39, 0x3A, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, + 0x63, 0x63, 0x63, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xCA, 0xCD, 0xCC, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC0, 0xC1, 0xBE, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xA5, 0xA6, 0xA3, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, 0x99, 0x99, 0x97, 0xFF, + 0x94, 0x94, 0x92, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x8E, 0x90, 0x8D, 0xFF, 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x82, 0x85, 0x82, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, + 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x10, 0x0E, 0x0C, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, + 0x23, 0x21, 0x20, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x27, 0x23, 0x22, 0xFF, + 0x24, 0x1F, 0x1F, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x20, 0x1C, 0x1B, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x2B, 0x26, 0x26, 0xFF, + 0x3A, 0x35, 0x35, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x38, 0x33, 0x32, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x6A, 0x68, 0x69, 0xFF, 0x83, 0x80, 0x81, 0xFF, + 0x9B, 0x99, 0x9A, 0xFF, 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, + 0xCE, 0xCE, 0xCE, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xD7, 0xD9, 0xD9, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, + 0xBF, 0xC1, 0xC0, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xCE, 0xCE, 0xCC, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, + 0x97, 0x98, 0x95, 0xFF, 0x93, 0x93, 0x91, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, 0x84, 0x87, 0x84, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, + 0x1F, 0x1D, 0x19, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x19, 0x17, 0x13, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x13, 0x11, 0x0F, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, + 0x22, 0x20, 0x1F, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x22, 0x21, 0xFF, 0x2A, 0x25, 0x24, 0xFF, + 0x26, 0x22, 0x21, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x27, 0x23, 0x22, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x35, 0x31, 0x30, 0xFF, + 0x44, 0x40, 0x3F, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, 0x44, 0x40, 0x3F, 0xFF, 0x51, 0x4D, 0x4C, 0xFF, 0x86, 0x84, 0x85, 0xFF, 0x95, 0x93, 0x94, 0xFF, + 0xAF, 0xAD, 0xAD, 0xFF, 0xAD, 0xAA, 0xAB, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, + 0xC1, 0xC1, 0xC1, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, + 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, + 0xC1, 0xC3, 0xC2, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xDB, 0xDB, 0xD9, 0xFF, 0xD5, 0xD5, 0xD3, 0xFF, 0xC7, 0xC7, 0xC5, 0xFF, 0xB6, 0xB6, 0xB4, 0xFF, 0xA4, 0xA5, 0xA2, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, + 0x9B, 0x9B, 0x99, 0xFF, 0x96, 0x97, 0x94, 0xFF, 0x90, 0x93, 0x90, 0xFF, 0x8E, 0x90, 0x8D, 0xFF, 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, + 0x22, 0x21, 0x1D, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x19, 0x17, 0x13, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, + 0x22, 0x20, 0x1F, 0xFF, 0x23, 0x21, 0x20, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x26, 0x24, 0x22, 0xFF, 0x2A, 0x25, 0x24, 0xFF, 0x2D, 0x29, 0x28, 0xFF, + 0x2A, 0x25, 0x24, 0xFF, 0x25, 0x21, 0x20, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x31, 0x2C, 0x2B, 0xFF, 0x39, 0x34, 0x34, 0xFF, 0x44, 0x40, 0x3F, 0xFF, + 0x4D, 0x48, 0x47, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, 0x50, 0x4C, 0x4B, 0xFF, 0x88, 0x85, 0x86, 0xFF, 0x97, 0x94, 0x95, 0xFF, + 0xAE, 0xAC, 0xAC, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, + 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xDD, 0xDE, 0xDB, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, 0xC8, 0xC9, 0xC6, 0xFF, 0xB1, 0xB1, 0xAF, 0xFF, 0xA0, 0xA0, 0x9D, 0xFF, + 0x9C, 0x9C, 0x9A, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x92, 0x95, 0x92, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x30, 0x31, 0x2C, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, + 0x25, 0x23, 0x1F, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x20, 0x1E, 0x1A, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1A, 0x18, 0x14, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x26, 0x24, 0x22, 0xFF, 0x25, 0x22, 0x21, 0xFF, + 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x2C, 0x29, 0x28, 0xFF, 0x2C, 0x28, 0x27, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, + 0x2C, 0x28, 0x27, 0xFF, 0x27, 0x23, 0x22, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x4F, 0x4A, 0x4A, 0xFF, + 0x4E, 0x49, 0x48, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x3A, 0x35, 0x35, 0xFF, 0x9A, 0x98, 0x99, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, + 0xBB, 0xB8, 0xB9, 0xFF, 0xB8, 0xB6, 0xB7, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xA9, 0xA9, 0xA9, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, + 0xBE, 0xBE, 0xBE, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, + 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xD7, 0xD7, 0xD7, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, + 0x9F, 0xA2, 0xA1, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0x96, 0x98, 0x97, 0xFF, 0x91, 0x94, 0x93, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x80, 0x82, 0x7F, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x73, 0x76, 0x72, 0xFF, 0x6F, 0x73, 0x6D, 0xFF, 0x71, 0x74, 0x6E, 0xFF, + 0x67, 0x6A, 0x65, 0xFF, 0x59, 0x5C, 0x57, 0xFF, 0x55, 0x56, 0x51, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x33, 0x34, 0x2F, 0xFF, + 0x2B, 0x2C, 0x27, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, + 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x27, 0x26, 0x1F, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, + 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, 0x23, 0x1F, 0x19, 0xFF, 0x21, 0x1E, 0x18, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x13, 0x12, 0x0B, 0xFF, + 0x14, 0x13, 0x0D, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x35, 0x33, 0x2F, 0xFF, 0x38, 0x37, 0x33, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, + 0x2A, 0x26, 0x22, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x35, 0x31, 0x2E, 0xFF, 0x41, 0x3D, 0x3A, 0xFF, 0x47, 0x43, 0x3F, 0xFF, 0x46, 0x42, 0x3E, 0xFF, + 0x33, 0x2E, 0x2E, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x2C, 0x28, 0x27, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, 0x93, 0x91, 0x90, 0xFF, 0xA0, 0x9E, 0x9C, 0xFF, + 0xA7, 0xA5, 0xA3, 0xFF, 0xA5, 0xA3, 0xA1, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0xB6, 0xB6, 0xB6, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xE1, 0xE1, 0xE1, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, + 0xAB, 0xAD, 0xAC, 0xFF, 0xA0, 0xA3, 0xA2, 0xFF, 0x8E, 0x90, 0x8F, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x82, 0x86, 0x85, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6A, 0x6D, 0x67, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, + 0x66, 0x69, 0x64, 0xFF, 0x5A, 0x5E, 0x58, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x23, 0x24, 0x1F, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, + 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x28, 0x27, 0x20, 0xFF, 0x2A, 0x29, 0x23, 0xFF, 0x2A, 0x29, 0x23, 0xFF, + 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, 0x24, 0x20, 0x1B, 0xFF, 0x21, 0x1E, 0x18, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x17, 0x15, 0x0F, 0xFF, + 0x1F, 0x1D, 0x17, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x2C, 0x2A, 0x26, 0xFF, 0x27, 0x25, 0x21, 0xFF, + 0x2A, 0x29, 0x25, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x34, 0x32, 0x2E, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x2B, 0x27, 0x24, 0xFF, + 0x2C, 0x28, 0x25, 0xFF, 0x31, 0x2D, 0x29, 0xFF, 0x44, 0x40, 0x3D, 0xFF, 0x4B, 0x47, 0x44, 0xFF, 0x4A, 0x46, 0x43, 0xFF, 0x40, 0x3C, 0x39, 0xFF, + 0x2B, 0x26, 0x26, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x5D, 0x58, 0x58, 0xFF, 0x89, 0x87, 0x85, 0xFF, 0x97, 0x95, 0x93, 0xFF, + 0xA1, 0x9F, 0x9D, 0xFF, 0xA1, 0x9F, 0x9D, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, + 0xB0, 0xB0, 0xB0, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, + 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xD4, 0xD4, 0xD4, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, + 0xAF, 0xB2, 0xB1, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x7C, 0x7F, 0x7C, 0xFF, 0x79, 0x7B, 0x78, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6B, 0x6D, 0x6A, 0xFF, 0x56, 0x59, 0x53, 0xFF, 0x5C, 0x5F, 0x59, 0xFF, + 0x5A, 0x5E, 0x58, 0xFF, 0x51, 0x54, 0x4F, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x42, 0x43, 0x3E, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, + 0x1C, 0x1B, 0x15, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x20, 0x1F, 0x18, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x28, 0x27, 0x20, 0xFF, 0x28, 0x27, 0x20, 0xFF, + 0x2C, 0x28, 0x23, 0xFF, 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, 0x23, 0x1F, 0x19, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x21, 0x20, 0x19, 0xFF, + 0x28, 0x27, 0x20, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x29, 0x28, 0x24, 0xFF, + 0x2D, 0x2B, 0x27, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x27, 0x23, 0x20, 0xFF, 0x28, 0x24, 0x21, 0xFF, + 0x34, 0x30, 0x2D, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x48, 0x44, 0x41, 0xFF, 0x4A, 0x46, 0x43, 0xFF, 0x44, 0x40, 0x3D, 0xFF, 0x36, 0x32, 0x2F, 0xFF, + 0x1E, 0x1A, 0x19, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x43, 0x3F, 0x3E, 0xFF, 0x6C, 0x68, 0x67, 0xFF, 0x83, 0x81, 0x7F, 0xFF, 0x94, 0x92, 0x91, 0xFF, + 0xA3, 0xA1, 0xA0, 0xFF, 0xA6, 0xA4, 0xA2, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, + 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, + 0xBF, 0xC1, 0xC0, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, + 0xBF, 0xC1, 0xC0, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0x8F, 0x91, 0x90, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x80, 0x85, 0x84, 0xFF, + 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x66, 0x69, 0x66, 0xFF, 0x59, 0x5C, 0x59, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x66, 0x69, 0x64, 0xFF, + 0x67, 0x6A, 0x65, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, + 0x1B, 0x1A, 0x14, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x27, 0x24, 0x1E, 0xFF, + 0x2C, 0x28, 0x23, 0xFF, 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, 0x24, 0x20, 0x1B, 0xFF, 0x2D, 0x29, 0x24, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, + 0x29, 0x28, 0x22, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, + 0x2F, 0x2D, 0x29, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x29, 0x28, 0x24, 0xFF, 0x32, 0x2E, 0x2B, 0xFF, 0x2B, 0x27, 0x24, 0xFF, 0x2E, 0x2A, 0x27, 0xFF, + 0x3D, 0x39, 0x36, 0xFF, 0x52, 0x4E, 0x4B, 0xFF, 0x3D, 0x39, 0x36, 0xFF, 0x41, 0x3D, 0x3A, 0xFF, 0x3D, 0x39, 0x36, 0xFF, 0x35, 0x31, 0x2E, 0xFF, + 0x1A, 0x16, 0x15, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, 0x7B, 0x77, 0x76, 0xFF, 0x86, 0x84, 0x83, 0xFF, 0x9A, 0x98, 0x97, 0xFF, + 0xAD, 0xAB, 0xA9, 0xFF, 0xB1, 0xAF, 0xAE, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, + 0xE1, 0xE0, 0xE3, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xE5, 0xE5, 0xE7, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xDE, 0xDE, 0xE0, 0xFF, 0xD5, 0xD5, 0xD7, 0xFF, + 0xB8, 0xBA, 0xBB, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x7E, 0x82, 0x83, 0xFF, 0x78, 0x7D, 0x7D, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x73, 0x74, 0xFF, + 0x5D, 0x62, 0x61, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x5D, 0x62, 0x61, 0xFF, 0x6D, 0x70, 0x6D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, + 0x6D, 0x70, 0x6D, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x68, 0x68, 0x66, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, + 0x2D, 0x2E, 0x29, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, + 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x1C, 0x18, 0x12, 0xFF, 0x1D, 0x19, 0x14, 0xFF, + 0x2B, 0x25, 0x22, 0xFF, 0x2E, 0x27, 0x25, 0xFF, 0x29, 0x22, 0x20, 0xFF, 0x23, 0x1D, 0x1A, 0xFF, 0x3B, 0x37, 0x34, 0xFF, 0x35, 0x31, 0x2E, 0xFF, + 0x27, 0x23, 0x20, 0xFF, 0x1C, 0x18, 0x14, 0xFF, 0x23, 0x1E, 0x1D, 0xFF, 0x3B, 0x37, 0x36, 0xFF, 0x40, 0x3B, 0x3B, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, + 0x32, 0x2D, 0x2D, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x40, 0x39, 0x39, 0xFF, 0x40, 0x39, 0x39, 0xFF, + 0x3F, 0x38, 0x38, 0xFF, 0x3F, 0x38, 0x38, 0xFF, 0x31, 0x2A, 0x2A, 0xFF, 0x3F, 0x38, 0x38, 0xFF, 0x3C, 0x38, 0x37, 0xFF, 0x2D, 0x29, 0x28, 0xFF, + 0x22, 0x1B, 0x1B, 0xFF, 0x3C, 0x35, 0x35, 0xFF, 0x72, 0x6D, 0x6D, 0xFF, 0x96, 0x91, 0x91, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, 0xA4, 0x9F, 0xA1, 0xFF, + 0xA8, 0xA6, 0xA7, 0xFF, 0xA9, 0xA7, 0xA8, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, 0x9B, 0x99, 0x9A, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, + 0xB4, 0xB4, 0xB4, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, + 0xC7, 0xC7, 0xC7, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xDC, 0xDC, 0xDE, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, 0xDB, 0xDA, 0xDD, 0xFF, 0xC9, 0xC9, 0xCB, 0xFF, 0xBD, 0xBC, 0xBF, 0xFF, + 0xA1, 0xA3, 0xA5, 0xFF, 0x8B, 0x8D, 0x8F, 0xFF, 0x84, 0x88, 0x89, 0xFF, 0x7B, 0x7F, 0x80, 0xFF, 0x74, 0x7B, 0x7B, 0xFF, 0x6B, 0x72, 0x72, 0xFF, + 0x67, 0x6C, 0x6A, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x5A, 0x5D, 0x5A, 0xFF, + 0x66, 0x69, 0x66, 0xFF, 0x76, 0x79, 0x76, 0xFF, 0x73, 0x74, 0x71, 0xFF, 0x5A, 0x5A, 0x58, 0xFF, 0x41, 0x42, 0x3F, 0xFF, 0x36, 0x36, 0x34, 0xFF, + 0x33, 0x34, 0x2F, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, + 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x16, 0x12, 0x0D, 0xFF, 0x17, 0x13, 0x0E, 0xFF, 0x18, 0x14, 0x0F, 0xFF, 0x19, 0x16, 0x10, 0xFF, + 0x1E, 0x18, 0x16, 0xFF, 0x24, 0x1E, 0x1B, 0xFF, 0x28, 0x21, 0x1F, 0xFF, 0x27, 0x20, 0x1E, 0xFF, 0x33, 0x2F, 0x2C, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, + 0x27, 0x23, 0x20, 0xFF, 0x1F, 0x1B, 0x18, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, 0x41, 0x3C, 0x3C, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x38, 0x33, 0x32, 0xFF, + 0x3D, 0x39, 0x38, 0xFF, 0x41, 0x3C, 0x3C, 0xFF, 0x49, 0x45, 0x44, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, 0x4D, 0x46, 0x46, 0xFF, 0x45, 0x3E, 0x3E, 0xFF, + 0x39, 0x32, 0x32, 0xFF, 0x30, 0x29, 0x29, 0xFF, 0x35, 0x2E, 0x2E, 0xFF, 0x3A, 0x34, 0x34, 0xFF, 0x34, 0x30, 0x2F, 0xFF, 0x26, 0x22, 0x21, 0xFF, + 0x28, 0x21, 0x21, 0xFF, 0x4C, 0x45, 0x45, 0xFF, 0x7F, 0x7A, 0x79, 0xFF, 0x98, 0x94, 0x93, 0xFF, 0xA5, 0xA0, 0xA2, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, + 0x97, 0x94, 0x95, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x98, 0x95, 0x96, 0xFF, 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0x9C, 0x9C, 0x9C, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, + 0xC9, 0xCB, 0xCB, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xDF, 0xE1, 0xE3, 0xFF, 0xD2, 0xD4, 0xD6, 0xFF, 0xBD, 0xBF, 0xC1, 0xFF, 0xAB, 0xAD, 0xAE, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x9D, 0x9F, 0xA0, 0xFF, + 0xA6, 0xA8, 0xAA, 0xFF, 0xAF, 0xB3, 0xB4, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7B, 0x83, 0x80, 0xFF, + 0x6B, 0x70, 0x6F, 0xFF, 0x74, 0x79, 0x75, 0xFF, 0x74, 0x79, 0x75, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x5C, 0x61, 0x5D, 0xFF, 0x5F, 0x64, 0x60, 0xFF, + 0x63, 0x68, 0x64, 0xFF, 0x6A, 0x6C, 0x69, 0xFF, 0x65, 0x68, 0x64, 0xFF, 0x63, 0x65, 0x62, 0xFF, 0x4F, 0x52, 0x4E, 0xFF, 0x37, 0x3A, 0x37, 0xFF, + 0x3B, 0x3C, 0x37, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, + 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x18, 0x14, 0x0F, 0xFF, 0x16, 0x12, 0x0D, 0xFF, 0x17, 0x13, 0x0E, 0xFF, + 0x19, 0x12, 0x10, 0xFF, 0x20, 0x19, 0x17, 0xFF, 0x26, 0x22, 0x1F, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x38, 0x34, 0x30, 0xFF, 0x34, 0x30, 0x2D, 0xFF, + 0x2A, 0x29, 0x25, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x2F, 0x2D, 0x2B, 0xFF, 0x3E, 0x3C, 0x3B, 0xFF, 0x42, 0x40, 0x3E, 0xFF, 0x3E, 0x3C, 0x3B, 0xFF, + 0x3D, 0x3B, 0x39, 0xFF, 0x44, 0x42, 0x40, 0xFF, 0x49, 0x47, 0x45, 0xFF, 0x4B, 0x47, 0x46, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x38, 0x33, 0x32, 0xFF, + 0x30, 0x29, 0x29, 0xFF, 0x2A, 0x23, 0x23, 0xFF, 0x37, 0x30, 0x30, 0xFF, 0x39, 0x32, 0x32, 0xFF, 0x35, 0x31, 0x30, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, + 0x40, 0x39, 0x39, 0xFF, 0x69, 0x62, 0x62, 0xFF, 0x8F, 0x8A, 0x8A, 0xFF, 0x9B, 0x96, 0x95, 0xFF, 0xA1, 0x9F, 0xA0, 0xFF, 0x8E, 0x8C, 0x8D, 0xFF, + 0x84, 0x82, 0x82, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x99, 0x97, 0x97, 0xFF, 0xA6, 0xA3, 0xA4, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, + 0xB6, 0xB6, 0xB6, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, + 0xB9, 0xB9, 0xB9, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xCD, 0xCF, 0xCE, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xA4, 0xA6, 0xA7, 0xFF, 0xAC, 0xAE, 0xB0, 0xFF, 0xB6, 0xB8, 0xBA, 0xFF, 0xBB, 0xBD, 0xBF, 0xFF, 0xB8, 0xBA, 0xBB, 0xFF, 0xAB, 0xAD, 0xAE, 0xFF, + 0xA4, 0xA9, 0xAA, 0xFF, 0xAA, 0xAF, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, + 0x67, 0x6C, 0x68, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x67, 0x6C, 0x68, 0xFF, 0x4F, 0x55, 0x51, 0xFF, 0x56, 0x5C, 0x58, 0xFF, + 0x4F, 0x55, 0x51, 0xFF, 0x40, 0x46, 0x42, 0xFF, 0x5D, 0x60, 0x5C, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x7E, 0x81, 0x7E, 0xFF, 0x6B, 0x6D, 0x6A, 0xFF, + 0x41, 0x42, 0x3D, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x21, 0x20, 0x19, 0xFF, 0x21, 0x20, 0x19, 0xFF, + 0x21, 0x20, 0x19, 0xFF, 0x22, 0x21, 0x1B, 0xFF, 0x1D, 0x19, 0x14, 0xFF, 0x1C, 0x18, 0x12, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x18, 0x14, 0x0F, 0xFF, + 0x1B, 0x14, 0x12, 0xFF, 0x1E, 0x18, 0x16, 0xFF, 0x26, 0x22, 0x1F, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x3D, 0x39, 0x36, 0xFF, + 0x2E, 0x2C, 0x28, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x33, 0x30, 0x2F, 0xFF, 0x3D, 0x3B, 0x39, 0xFF, 0x42, 0x40, 0x3E, 0xFF, + 0x33, 0x30, 0x2F, 0xFF, 0x38, 0x36, 0x35, 0xFF, 0x34, 0x32, 0x30, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x1C, 0x17, 0x16, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, + 0x2A, 0x25, 0x24, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, 0x35, 0x31, 0x30, 0xFF, 0x39, 0x34, 0x34, 0xFF, 0x3F, 0x3D, 0x3C, 0xFF, 0x47, 0x45, 0x44, 0xFF, + 0x68, 0x64, 0x63, 0xFF, 0x89, 0x85, 0x84, 0xFF, 0x9A, 0x98, 0x97, 0xFF, 0x98, 0x96, 0x94, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x81, 0x7E, 0x7F, 0xFF, + 0x79, 0x79, 0x79, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, 0xAF, 0xAD, 0xAD, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, + 0x9D, 0x9D, 0x9D, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, + 0xAD, 0xAD, 0xAD, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, + 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBE, 0xC3, 0xC3, 0xFF, 0xB4, 0xB8, 0xB9, 0xFF, 0xB1, 0xB6, 0xB6, 0xFF, 0xB7, 0xBC, 0xBC, 0xFF, 0xBB, 0xBF, 0xC0, 0xFF, 0xA8, 0xAC, 0xAD, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0x8F, 0x97, 0x92, 0xFF, + 0x69, 0x70, 0x6D, 0xFF, 0x5E, 0x65, 0x63, 0xFF, 0x5A, 0x61, 0x5E, 0xFF, 0x5D, 0x64, 0x62, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, + 0x5B, 0x60, 0x5E, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x87, 0x89, 0x86, 0xFF, + 0x61, 0x64, 0x61, 0xFF, 0x40, 0x42, 0x3F, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x15, 0x14, 0x10, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1C, 0x18, 0x14, 0xFF, + 0x27, 0x23, 0x20, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x25, 0x21, 0x1E, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x23, 0x22, 0x1E, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, + 0x1B, 0x19, 0x18, 0xFF, 0x1B, 0x19, 0x18, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, + 0x26, 0x27, 0x24, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x33, 0x34, 0x31, 0xFF, 0x32, 0x32, 0x30, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, 0x68, 0x6B, 0x68, 0xFF, + 0x78, 0x78, 0x76, 0xFF, 0x8E, 0x8E, 0x8C, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, 0x97, 0x98, 0x95, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x80, 0x80, 0x80, 0xFF, + 0x85, 0x85, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x9B, 0x9B, 0x9B, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0x97, 0x97, 0x97, 0xFF, + 0x8E, 0x8E, 0x8E, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, + 0xAD, 0xAD, 0xAD, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, + 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, + 0xB4, 0xB8, 0xB9, 0xFF, 0xB5, 0xB9, 0xBA, 0xFF, 0xBC, 0xC0, 0xC1, 0xFF, 0xC2, 0xC6, 0xC7, 0xFF, 0xB9, 0xBE, 0xBF, 0xFF, 0xA9, 0xAE, 0xAE, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x94, 0x9B, 0x97, 0xFF, + 0x81, 0x88, 0x86, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, + 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, + 0x7D, 0x80, 0x7D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, 0x43, 0x46, 0x41, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x17, 0x15, 0x11, 0xFF, 0x22, 0x21, 0x1D, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x26, 0x24, 0x20, 0xFF, + 0x33, 0x2F, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x26, 0x22, 0x1F, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x14, 0x13, 0x0F, 0xFF, + 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x18, 0x16, 0x14, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, + 0x11, 0x0F, 0x0D, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x13, 0x11, 0x0F, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, + 0x23, 0x25, 0x22, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x2E, 0x31, 0x2E, 0xFF, 0x44, 0x47, 0x44, 0xFF, 0x69, 0x6E, 0x6A, 0xFF, 0x7F, 0x84, 0x80, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x85, 0x88, 0x85, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x92, 0x95, 0x92, 0xFF, 0x7A, 0x7A, 0x7A, 0xFF, 0x76, 0x76, 0x76, 0xFF, + 0x7A, 0x7A, 0x7A, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, 0x90, 0x90, 0x90, 0xFF, 0x93, 0x93, 0x93, 0xFF, 0x94, 0x94, 0x94, 0xFF, + 0x8F, 0x8F, 0x8F, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, + 0xA3, 0xA3, 0xA3, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xD1, 0xD4, 0xD3, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, + 0xB2, 0xB9, 0xB9, 0xFF, 0xBB, 0xC2, 0xC2, 0xFF, 0xC2, 0xC9, 0xC9, 0xFF, 0xC0, 0xC7, 0xC7, 0xFF, 0xB4, 0xBB, 0xBB, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, + 0x9F, 0xA7, 0xA4, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x8E, 0x96, 0x91, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, + 0x9E, 0xA6, 0xA1, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x7B, 0x83, 0x7E, 0xFF, 0x78, 0x7F, 0x7B, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, + 0x72, 0x79, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, 0x62, 0x67, 0x63, 0xFF, + 0x83, 0x86, 0x83, 0xFF, 0x8B, 0x8E, 0x8B, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x23, 0x22, 0x1E, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x2C, 0x2A, 0x26, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, + 0x39, 0x35, 0x32, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0C, 0x0A, 0x06, 0xFF, + 0x10, 0x11, 0x0C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x1F, 0x22, 0x1F, 0xFF, 0x27, 0x2A, 0x27, 0xFF, 0x36, 0x39, 0x36, 0xFF, 0x4C, 0x4F, 0x4C, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x85, 0x8A, 0x86, 0xFF, + 0x7C, 0x7F, 0x7C, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x6F, 0x72, 0x71, 0xFF, + 0x74, 0x76, 0x76, 0xFF, 0x7E, 0x81, 0x80, 0xFF, 0x89, 0x89, 0x89, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, + 0xA9, 0xA9, 0xA9, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, + 0xAA, 0xAA, 0xAA, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, + 0xD5, 0xD7, 0xD6, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, + 0xBD, 0xC3, 0xC3, 0xFF, 0xC6, 0xCD, 0xCD, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, 0xB3, 0xBA, 0xBA, 0xFF, 0xAB, 0xB2, 0xB2, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0x93, 0x9A, 0x97, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xA4, 0xAC, 0xA7, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA4, 0xAC, 0xA5, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0x97, 0x9F, 0x9A, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x82, 0x8A, 0x87, 0xFF, + 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, + 0x79, 0x7B, 0x78, 0xFF, 0x91, 0x94, 0x91, 0xFF, 0x88, 0x8B, 0x85, 0xFF, 0x58, 0x5B, 0x56, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x25, 0x23, 0x1F, 0xFF, + 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x29, 0x28, 0x24, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, + 0x36, 0x32, 0x2F, 0xFF, 0x23, 0x1F, 0x1B, 0xFF, 0x12, 0x10, 0x0C, 0xFF, 0x0D, 0x0C, 0x08, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0B, 0x09, 0x05, 0xFF, + 0x0F, 0x10, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x1D, 0x1F, 0x1C, 0xFF, 0x24, 0x26, 0x23, 0xFF, 0x2F, 0x32, 0x2F, 0xFF, 0x34, 0x37, 0x34, 0xFF, 0x43, 0x48, 0x44, 0xFF, 0x58, 0x5D, 0x59, 0xFF, + 0x6C, 0x6F, 0x6B, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6F, 0x72, 0x6F, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x7A, 0x7C, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, + 0x79, 0x7B, 0x7A, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, + 0xB0, 0xB0, 0xB0, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, + 0xA7, 0xA6, 0xA7, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0xAF, 0xB5, 0xB5, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, 0xAF, 0xB5, 0xB5, 0xFF, 0xB0, 0xB7, 0xB6, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, + 0x8E, 0x96, 0x91, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0x87, 0x8E, 0x8C, 0xFF, + 0x7F, 0x86, 0x84, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, 0x72, 0x77, 0x78, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x52, 0x57, 0x55, 0xFF, + 0x6F, 0x72, 0x6F, 0xFF, 0x93, 0x96, 0x93, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, 0x75, 0x78, 0x75, 0xFF, 0x24, 0x24, 0x22, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, + 0x1D, 0x1D, 0x1B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x23, 0x21, 0x20, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x26, 0x24, 0x22, 0xFF, + 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, + 0x17, 0x19, 0x18, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x24, 0x26, 0x25, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x1D, 0x22, 0x21, 0xFF, + 0x3C, 0x3F, 0x3E, 0xFF, 0x51, 0x53, 0x53, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x78, 0x7A, 0x79, 0xFF, 0x7E, 0x81, 0x80, 0xFF, + 0x84, 0x87, 0x86, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x87, 0x89, 0x88, 0xFF, 0x96, 0x98, 0x97, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, + 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xD2, 0xD5, 0xD4, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, + 0xA8, 0xAB, 0xAA, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xA8, 0xAE, 0xAE, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, 0xB2, 0xB9, 0xB9, 0xFF, 0xBB, 0xC2, 0xC2, 0xFF, 0xB6, 0xBC, 0xBC, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x9D, 0xA5, 0xA0, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, + 0x95, 0x9D, 0x98, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x9C, 0xA4, 0x9F, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x94, 0x9B, 0x99, 0xFF, + 0x82, 0x8A, 0x87, 0xFF, 0x74, 0x7C, 0x79, 0xFF, 0x78, 0x7D, 0x7D, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x5D, 0x62, 0x61, 0xFF, + 0x7A, 0x7D, 0x79, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x98, 0x9B, 0x98, 0xFF, 0x83, 0x86, 0x83, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x24, 0x22, 0xFF, + 0x2A, 0x28, 0x27, 0xFF, 0x15, 0x13, 0x12, 0xFF, 0x09, 0x07, 0x05, 0xFF, 0x10, 0x0E, 0x0C, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, + 0x16, 0x18, 0x17, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0D, 0x12, 0x10, 0xFF, + 0x1E, 0x20, 0x1F, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x51, 0x53, 0x53, 0xFF, 0x6A, 0x6C, 0x6B, 0xFF, 0x76, 0x79, 0x78, 0xFF, 0x82, 0x84, 0x84, 0xFF, + 0x8C, 0x8F, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, + 0xAA, 0xAC, 0xAB, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xCF, 0xD1, 0xD0, 0xFF, 0xD9, 0xDC, 0xDB, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, + 0xD2, 0xD5, 0xD4, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xAB, 0xB2, 0xB2, 0xFF, 0xA5, 0xAC, 0xAC, 0xFF, 0xAD, 0xB4, 0xB4, 0xFF, 0xBF, 0xC6, 0xC6, 0xFF, 0xBE, 0xC5, 0xC4, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x9D, 0xA5, 0xA0, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, + 0xB4, 0xBC, 0xB7, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, + 0x87, 0x8E, 0x8C, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x75, 0x79, 0x7A, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, + 0x76, 0x79, 0x76, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x90, 0x93, 0x90, 0xFF, 0x96, 0x99, 0x95, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x1A, 0x18, 0x16, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x2C, 0x29, 0x28, 0xFF, + 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x09, 0x0B, 0x0A, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x03, 0x07, 0x06, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x43, 0x46, 0x45, 0xFF, 0x66, 0x68, 0x68, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x7C, 0x7F, 0x7E, 0xFF, + 0x8B, 0x8E, 0x8D, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, + 0x93, 0x96, 0x95, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, + 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xB8, 0xBF, 0xBF, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, 0xB8, 0xBF, 0xBF, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xAA, 0xB1, 0xAD, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0x96, 0x9E, 0x99, 0xFF, + 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, + 0x8F, 0x96, 0x94, 0xFF, 0x82, 0x8A, 0x87, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, 0x72, 0x77, 0x78, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6F, 0x74, 0x72, 0xFF, + 0x6E, 0x71, 0x6E, 0xFF, 0x66, 0x69, 0x66, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, 0x97, 0x9A, 0x97, 0xFF, 0x32, 0x32, 0x30, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x35, 0x33, 0x31, 0xFF, + 0x3F, 0x3D, 0x3C, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x18, 0x18, 0x18, 0xFF, + 0x12, 0x15, 0x14, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x08, 0x0A, 0x09, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x01, 0x06, 0x05, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x33, 0x35, 0x34, 0xFF, 0x4E, 0x50, 0x4F, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, 0x72, 0x74, 0x73, 0xFF, + 0x84, 0x87, 0x86, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, + 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, 0xA4, 0xAC, 0xA7, 0xFF, + 0xA5, 0xAC, 0xAA, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x70, 0x75, 0x73, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, + 0x70, 0x75, 0x73, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x75, 0x7A, 0x76, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x37, 0x3A, 0x37, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x07, 0x07, 0x05, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x45, 0x45, 0x43, 0xFF, + 0x7C, 0x79, 0x7A, 0xFF, 0x4C, 0x4A, 0x4B, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x29, 0x29, 0x29, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x01, 0x01, 0x01, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, + 0x12, 0x15, 0x14, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x01, 0x03, 0x02, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0C, 0x11, 0x0F, 0xFF, + 0x00, 0x00, 0x00, 0xFF, 0x27, 0x2C, 0x2A, 0xFF, 0x46, 0x4B, 0x49, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, 0x49, 0x4D, 0x4C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, + 0x72, 0x77, 0x76, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x9A, 0x9D, 0x9C, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, + 0xAF, 0xB2, 0xB1, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x8B, 0x8E, 0x8D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, + 0xAE, 0xB1, 0xB0, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAC, 0xB4, 0xAF, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x7F, 0x84, 0x82, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, + 0x63, 0x68, 0x66, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x6D, 0x72, 0x6E, 0xFF, 0x70, 0x75, 0x71, 0xFF, 0x35, 0x38, 0x35, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, + 0x8A, 0x87, 0x88, 0xFF, 0x6E, 0x6B, 0x6C, 0xFF, 0x8B, 0x8B, 0x8B, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x96, 0x96, 0x96, 0xFF, + 0x78, 0x78, 0x78, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x30, 0x30, 0x30, 0xFF, 0x24, 0x24, 0x24, 0xFF, 0x25, 0x25, 0x25, 0xFF, 0x31, 0x31, 0x31, 0xFF, + 0x4F, 0x4F, 0x4F, 0xFF, 0x65, 0x65, 0x65, 0xFF, 0x77, 0x77, 0x77, 0xFF, 0x79, 0x79, 0x79, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, + 0x53, 0x56, 0x55, 0xFF, 0x3A, 0x3C, 0x3B, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x24, 0x29, 0x28, 0xFF, 0x03, 0x07, 0x06, 0xFF, + 0x2F, 0x34, 0x32, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x4A, 0x4E, 0x4D, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, + 0x66, 0x6A, 0x69, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, 0x8F, 0x91, 0x90, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, + 0xA3, 0xA5, 0xA4, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, + 0x63, 0x68, 0x66, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x66, 0x6B, 0x67, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x19, 0x1C, 0x19, 0xFF, + 0x19, 0x1C, 0x19, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x71, 0x71, 0x6F, 0xFF, + 0x97, 0x94, 0x95, 0xFF, 0x7F, 0x7D, 0x7E, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0x9E, 0x9E, 0x9E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0x88, 0x88, 0x88, 0xFF, 0x82, 0x82, 0x82, 0xFF, + 0x7D, 0x7D, 0x7D, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x86, 0x86, 0x86, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x78, 0x78, 0x78, 0xFF, + 0x71, 0x73, 0x72, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x88, 0x8A, 0x89, 0xFF, 0x66, 0x68, 0x68, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, 0x76, 0x7B, 0x79, 0xFF, + 0x5F, 0x63, 0x62, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x76, 0x7B, 0x79, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, + 0x82, 0x86, 0x85, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0x89, 0x8B, 0x8B, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, + 0xB1, 0xB3, 0xB2, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0x88, 0x8F, 0x8D, 0xFF, 0x89, 0x90, 0x8E, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, + 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x84, 0x89, 0x87, 0xFF, + 0x76, 0x7B, 0x79, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6E, 0x73, 0x6F, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, + 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x77, 0x77, 0x75, 0xFF, + 0x8A, 0x87, 0x88, 0xFF, 0x8C, 0x8A, 0x8B, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, + 0xB7, 0xB7, 0xB7, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x68, 0x68, 0x68, 0xFF, 0x77, 0x77, 0x77, 0xFF, + 0x7D, 0x7D, 0x7D, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x88, 0x88, 0x88, 0xFF, 0x86, 0x86, 0x86, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, + 0x7A, 0x7C, 0x7B, 0xFF, 0x82, 0x84, 0x84, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0x6D, 0x6F, 0x6F, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0x75, 0x7A, 0x78, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x91, 0x96, 0x94, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, + 0xAD, 0xAF, 0xAF, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, + 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0x9B, 0xA0, 0x9E, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0x79, 0x7E, 0x7D, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x77, 0x7C, 0x7A, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x27, 0x2A, 0x29, 0xFF, 0x16, 0x18, 0x17, 0xFF, + 0x0E, 0x10, 0x0F, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, 0x76, 0x76, 0x76, 0xFF, + 0x87, 0x87, 0x87, 0xFF, 0x9C, 0x9C, 0x9C, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, + 0x96, 0x96, 0x96, 0xFF, 0x81, 0x81, 0x81, 0xFF, 0x72, 0x72, 0x72, 0xFF, 0x76, 0x76, 0x76, 0xFF, 0x7B, 0x7B, 0x7B, 0xFF, 0x86, 0x86, 0x86, 0xFF, + 0x77, 0x77, 0x77, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x94, 0x94, 0x94, 0xFF, 0x92, 0x92, 0x92, 0xFF, + 0x8F, 0x91, 0x90, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xDE, 0xE2, 0xE1, 0xFF, 0xDC, 0xE1, 0xE0, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0x9D, 0xA4, 0xA2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0x7E, 0x83, 0x81, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x2B, 0x2D, 0x2C, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x73, 0x75, 0x74, 0xFF, + 0x8C, 0x8C, 0x8C, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0x90, 0x90, 0x90, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0x99, 0x99, 0x99, 0xFF, + 0x7D, 0x7D, 0x7D, 0xFF, 0x6B, 0x6B, 0x6B, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x7E, 0x7E, 0x7E, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x79, 0x79, 0x79, 0xFF, + 0x8C, 0x8C, 0x8C, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, + 0xAB, 0xAD, 0xAC, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x71, 0x76, 0x74, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x87, 0x8C, 0x8B, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0x85, 0x8A, 0x88, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x55, 0x5A, 0x58, 0xFF, 0x4E, 0x53, 0x52, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x1F, 0x21, 0x21, 0xFF, + 0x11, 0x13, 0x13, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x2B, 0x30, 0x2F, 0xFF, 0x1B, 0x20, 0x1E, 0xFF, 0x29, 0x2E, 0x2C, 0xFF, 0x6F, 0x72, 0x71, 0xFF, + 0x9F, 0xA2, 0xA1, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0x64, 0x64, 0x64, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, + 0x6F, 0x6F, 0x6F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x72, 0x72, 0x72, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0x95, 0x95, 0x95, 0xFF, + 0x8E, 0x90, 0x8F, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0x96, 0x98, 0x97, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, + 0xB4, 0xB6, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x79, 0x7B, 0x7A, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x83, 0x88, 0x86, 0xFF, + 0x89, 0x8D, 0x8C, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0x8E, 0x93, 0x92, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xC9, 0xCD, 0xCC, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xA5, 0xAC, 0xAA, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, + 0xA3, 0xAA, 0xA8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xAA, 0xB1, 0xAF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0x8A, 0x8F, 0x8D, 0xFF, 0x5F, 0x63, 0x62, 0xFF, 0x47, 0x4C, 0x4B, 0xFF, 0x3F, 0x44, 0x42, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x20, 0x23, 0x22, 0xFF, + 0x11, 0x13, 0x13, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x26, 0x2A, 0x29, 0xFF, 0x1F, 0x23, 0x22, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, + 0x9F, 0xA2, 0xA1, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x67, 0x6A, 0x69, 0xFF, 0x61, 0x61, 0x61, 0xFF, 0x62, 0x62, 0x62, 0xFF, + 0x69, 0x69, 0x69, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x72, 0x72, 0x72, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x92, 0x92, 0x92, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, + 0x9A, 0x9D, 0x9C, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0xA0, 0xA3, 0xA2, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xAE, 0xB1, 0xB0, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0x85, 0x8A, 0x88, 0xFF, + 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0x92, 0x97, 0x95, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, + 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0x9F, 0xA7, 0xA4, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x34, 0x38, 0x37, 0xFF, 0x24, 0x29, 0x28, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, + 0x0E, 0x13, 0x11, 0xFF, 0x28, 0x2D, 0x2B, 0xFF, 0x26, 0x2A, 0x29, 0xFF, 0x23, 0x28, 0x26, 0xFF, 0x6E, 0x73, 0x71, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x74, 0x76, 0x76, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, 0x49, 0x4B, 0x4B, 0xFF, 0x56, 0x58, 0x57, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, + 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, + 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0x9E, 0xA2, 0xA1, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xD0, 0xD8, 0xD5, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xDA, 0xE1, 0xDE, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xA6, 0xAE, 0xAB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0x8E, 0x93, 0x92, 0xFF, 0x53, 0x58, 0x56, 0xFF, 0x2A, 0x2F, 0x2D, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x0F, 0x14, 0x13, 0xFF, + 0x14, 0x19, 0x17, 0xFF, 0x20, 0x25, 0x23, 0xFF, 0x21, 0x26, 0x24, 0xFF, 0x28, 0x2D, 0x2B, 0xFF, 0x55, 0x5A, 0x58, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, + 0x4E, 0x50, 0x4F, 0xFF, 0x56, 0x58, 0x57, 0xFF, 0x53, 0x56, 0x55, 0xFF, 0x50, 0x52, 0x52, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x65, 0x67, 0x66, 0xFF, + 0x72, 0x74, 0x73, 0xFF, 0x74, 0x76, 0x76, 0xFF, 0x6E, 0x71, 0x70, 0xFF, 0x8C, 0x8F, 0x8E, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, + 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xD6, 0xDD, 0xDB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x5C, 0x61, 0x5F, 0xFF, 0x32, 0x37, 0x36, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x15, 0x1A, 0x18, 0xFF, + 0x1A, 0x1F, 0x1D, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x25, 0x2C, 0x2A, 0xFF, 0x26, 0x2E, 0x2B, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x3F, 0x44, 0x42, 0xFF, + 0x40, 0x45, 0x44, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x53, 0x58, 0x56, 0xFF, 0x71, 0x73, 0x72, 0xFF, 0x74, 0x76, 0x76, 0xFF, + 0x75, 0x78, 0x77, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x74, 0x76, 0x76, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x87, 0x8C, 0x8B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0xC6, 0xCD, 0xCB, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD4, 0xDB, 0xD9, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, + 0x30, 0x35, 0x33, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0F, 0x14, 0x13, 0xFF, 0x0A, 0x0E, 0x0D, 0xFF, 0x0E, 0x13, 0x11, 0xFF, 0x1D, 0x22, 0x21, 0xFF, + 0x1D, 0x22, 0x21, 0xFF, 0x1A, 0x1F, 0x1D, 0xFF, 0x2B, 0x32, 0x30, 0xFF, 0x23, 0x2A, 0x28, 0xFF, 0x3A, 0x41, 0x3F, 0xFF, 0x57, 0x5E, 0x5C, 0xFF, + 0x5A, 0x5F, 0x5D, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x80, 0x82, 0x81, 0xFF, + 0x78, 0x7A, 0x79, 0xFF, 0x89, 0x8B, 0x8B, 0xFF, 0x78, 0x7A, 0x79, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, + 0x16, 0x1B, 0x1A, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x07, 0x0C, 0x0A, 0xFF, 0x0D, 0x12, 0x10, 0xFF, + 0x08, 0x0D, 0x0C, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0E, 0x15, 0x13, 0xFF, 0x25, 0x2C, 0x2A, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x5F, 0x67, 0x64, 0xFF, + 0x6A, 0x6F, 0x6D, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x82, 0x84, 0x84, 0xFF, + 0x92, 0x95, 0x94, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, + 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xBA, 0xC1, 0xBF, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x59, 0x5E, 0x5C, 0xFF, + 0x1A, 0x1F, 0x1D, 0xFF, 0x0F, 0x14, 0x13, 0xFF, 0x13, 0x18, 0x16, 0xFF, 0x0C, 0x11, 0x0F, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, + 0x07, 0x0C, 0x0A, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0F, 0x16, 0x14, 0xFF, 0x46, 0x4D, 0x4B, 0xFF, 0x61, 0x68, 0x65, 0xFF, 0x6B, 0x72, 0x70, 0xFF, + 0x6F, 0x74, 0x72, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, + 0x9A, 0x9D, 0x9C, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0x9A, 0x9D, 0x9C, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xCC, 0xD3, 0xD0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, + 0x22, 0x27, 0x25, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, 0x13, 0x18, 0x16, 0xFF, 0x04, 0x09, 0x07, 0xFF, 0x0E, 0x13, 0x11, 0xFF, + 0x0F, 0x14, 0x13, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x35, 0x32, 0xFF, 0x6B, 0x72, 0x70, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, 0x7F, 0x86, 0x84, 0xFF, + 0x80, 0x85, 0x84, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, + 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD5, 0xDC, 0xDA, 0xFF, 0xD6, 0xDD, 0xDB, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, + 0xC6, 0xCD, 0xCB, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xCD, 0xD4, 0xD2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x83, 0x88, 0x86, 0xFF, + 0x29, 0x2E, 0x2C, 0xFF, 0x1C, 0x21, 0x1F, 0xFF, 0x1D, 0x22, 0x21, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x14, 0x19, 0x17, 0xFF, + 0x19, 0x1E, 0x1C, 0xFF, 0x1F, 0x23, 0x22, 0xFF, 0x61, 0x68, 0x65, 0xFF, 0x7E, 0x85, 0x82, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, 0x93, 0x9A, 0x97, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, + 0x8E, 0x90, 0x8F, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0x9B, 0xA0, 0x9E, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0x93, 0x98, 0x96, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xDA, 0xE1, 0xDE, 0xFF, + 0xD0, 0xD8, 0xD5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xCE, 0xD5, 0xD3, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xDC, 0xE1, 0xE0, 0xFF, 0xD9, 0xDE, 0xDC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xC7, 0xCE, 0xCC, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD8, 0xE0, 0xDD, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x79, 0x7E, 0x7D, 0xFF, 0x36, 0x3B, 0x39, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x1B, 0x20, 0x1E, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x31, 0x30, 0xFF, + 0x3B, 0x3F, 0x3E, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x7D, 0x82, 0x80, 0xFF, 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x92, 0x97, 0x95, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xC9, 0xCD, 0xCC, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xDE, 0xE2, 0xE1, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xD9, 0xDE, 0xDC, 0xFF, 0xD8, 0xDD, 0xDB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xCC, 0xD3, 0xD0, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xD2, 0xD7, 0xD5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0x82, 0x86, 0x85, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, + 0x68, 0x6D, 0x6B, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x95, 0x9A, 0x99, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, + 0xD9, 0xDE, 0xDC, 0xFF, 0xDB, 0xE0, 0xDE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0x86, 0x8B, 0x89, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, + 0x7C, 0x81, 0x7F, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x7D, 0x82, 0x80, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x92, 0x97, 0x95, 0xFF, + 0x97, 0x9B, 0x9A, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x86, 0x8B, 0x89, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, + 0xD8, 0xDD, 0xDB, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC0, 0xC5, 0xC4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, + 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, + 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x92, 0x97, 0x95, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0x86, 0x8B, 0x89, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, + 0xDB, 0xE0, 0xDE, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, + 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xD0, 0xD4, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x82, 0x86, 0x85, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x9B, 0xA0, 0x9E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0x7D, 0x82, 0x80, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xCE, 0xD3, 0xD2, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0x91, 0x96, 0x94, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0x95, 0x9A, 0x99, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xA9, 0xAE, 0xAC, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, + 0x94, 0x9B, 0x99, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x8E, 0x95, 0x93, 0xFF, 0x82, 0x8A, 0x87, 0xFF, + 0x98, 0xA0, 0x9D, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, + 0x9A, 0xA1, 0x9E, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, + 0xAC, 0xB3, 0xB1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x83, 0x88, 0x86, 0xFF, + 0x88, 0x8F, 0x8D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x83, 0x8B, 0x88, 0xFF, + 0x98, 0xA0, 0x9D, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0x94, 0x9B, 0x99, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xAE, 0xB1, 0xB0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x91, 0x96, 0x94, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0x93, 0x9A, 0x97, 0xFF, + 0x97, 0x9E, 0x9C, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xD8, 0xE2, 0xDE, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0x80, 0x89, 0x86, 0xFF, + 0xAF, 0xB9, 0xB6, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCB, 0xD5, 0xD2, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xD5, 0xDE, 0xDB, 0xFF, + 0xB3, 0xBC, 0xB9, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x90, 0x99, 0x96, 0xFF, 0x8F, 0x98, 0x95, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, + 0xC0, 0xC9, 0xC6, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0x8E, 0x95, 0x93, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, + 0x86, 0x8D, 0x8B, 0xFF, 0x81, 0x88, 0x86, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, 0xD5, 0xDE, 0xDB, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x92, 0x9C, 0x99, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, + 0xC0, 0xC9, 0xC6, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, 0x8D, 0x97, 0x94, 0xFF, 0x8B, 0x95, 0x92, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, + 0xBA, 0xC3, 0xC0, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0x9A, 0xA4, 0xA1, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, + 0x8A, 0x92, 0x8F, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x8B, 0x90, 0x8E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, + 0x77, 0x7C, 0x7A, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, + 0x87, 0x90, 0x8D, 0xFF, 0x85, 0x8F, 0x8C, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, + 0xBE, 0xCA, 0xC6, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0x79, 0x85, 0x81, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, + 0xD2, 0xDE, 0xDA, 0xFF, 0xD6, 0xE2, 0xDE, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0x76, 0x82, 0x7E, 0xFF, 0x9A, 0xA6, 0xA2, 0xFF, + 0xAB, 0xB7, 0xB3, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, 0x9F, 0xAB, 0xA7, 0xFF, 0xA1, 0xAD, 0xA9, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, + 0x91, 0x99, 0x96, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0x7E, 0x83, 0x81, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x7F, 0x84, 0x82, 0xFF, + 0x7F, 0x84, 0x82, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xC0, 0xC5, 0xC4, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, + 0x99, 0xA3, 0xA0, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, + 0xCC, 0xD8, 0xD4, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0xA7, 0xB3, 0xAF, 0xFF, 0xC3, 0xCF, 0xCB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0x9A, 0xA6, 0xA2, 0xFF, 0x73, 0x7F, 0x7B, 0xFF, 0x88, 0x94, 0x90, 0xFF, + 0x9A, 0xA6, 0xA2, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, 0xA7, 0xB3, 0xAF, 0xFF, 0xAA, 0xB6, 0xB2, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, + 0xA8, 0xAF, 0xAA, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x95, 0x9D, 0x98, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, + 0xC4, 0xC9, 0xC5, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, + 0xC6, 0xC8, 0xC5, 0xFF, 0xAF, 0xB2, 0xAF, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x82, 0x87, 0x83, 0xFF, 0x75, 0x7A, 0x76, 0xFF, + 0x8E, 0x94, 0x90, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x91, 0x96, 0x94, 0xFF, + 0x99, 0x9E, 0x9C, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x76, 0x7B, 0x79, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x7E, 0x83, 0x81, 0xFF, + 0x86, 0x8B, 0x89, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0x95, 0x9A, 0x99, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x89, 0x90, 0x8E, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, + 0x8D, 0x97, 0x94, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA4, 0xA0, 0xFF, 0x8A, 0x96, 0x92, 0xFF, 0x8E, 0x9A, 0x96, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, + 0xD4, 0xE0, 0xDC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, + 0xC5, 0xD1, 0xCD, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0x9F, 0xAB, 0xA7, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x7B, 0x84, 0x81, 0xFF, + 0x90, 0x99, 0x96, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xB1, 0xB6, 0xB2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, + 0xB2, 0xB8, 0xB4, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC8, 0xCB, 0xC7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, + 0xC0, 0xC2, 0xBF, 0xFF, 0xA0, 0xA3, 0xA0, 0xFF, 0x87, 0x8D, 0x89, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0x80, 0x86, 0x82, 0xFF, 0x80, 0x86, 0x82, 0xFF, + 0x90, 0x95, 0x91, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x83, 0x88, 0x86, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x86, 0x8B, 0x89, 0xFF, + 0x94, 0x99, 0x97, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x93, 0x9A, 0x97, 0xFF, + 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x91, 0x9D, 0x99, 0xFF, 0x79, 0x85, 0x81, 0xFF, 0x91, 0x9D, 0x99, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, + 0xCC, 0xD8, 0xD4, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, + 0xC3, 0xCF, 0xCB, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, 0x82, 0x8B, 0x88, 0xFF, + 0x84, 0x8E, 0x8B, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0xA0, 0xAA, 0xA7, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0xAB, 0xB3, 0xAE, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xAB, 0xB3, 0xAE, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, + 0xA0, 0xA5, 0xA1, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, 0xA8, 0xAB, 0xA8, 0xFF, + 0x9F, 0xA2, 0x9F, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x75, 0x7A, 0x76, 0xFF, 0x80, 0x86, 0x82, 0xFF, 0x77, 0x7C, 0x78, 0xFF, 0x89, 0x8E, 0x8A, 0xFF, + 0x8B, 0x90, 0x8C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x7E, 0x83, 0x81, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, + 0xA8, 0xB2, 0xAF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xD2, 0xDE, 0xDA, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, + 0xB9, 0xC5, 0xC1, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0x85, 0x8F, 0x8C, 0xFF, 0x91, 0x9B, 0x97, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, 0x98, 0x9D, 0x99, 0xFF, + 0x97, 0x9C, 0x98, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, 0x99, 0x9C, 0x99, 0xFF, + 0x97, 0x9A, 0x97, 0xFF, 0x95, 0x97, 0x94, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, + 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x80, 0x85, 0x84, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, + 0xCE, 0xD3, 0xD2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, + 0xA0, 0xAA, 0xA7, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, + 0xCB, 0xD7, 0xD3, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, + 0xB6, 0xC2, 0xBE, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, + 0x98, 0xA2, 0x9E, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x8B, 0x95, 0x92, 0xFF, 0x91, 0x9B, 0x97, 0xFF, 0xA2, 0xAC, 0xA9, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, + 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, + 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, + 0xB6, 0xBB, 0xB7, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, 0x90, 0x95, 0x91, 0xFF, + 0x84, 0x89, 0x83, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, + 0x99, 0x9E, 0x9A, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8A, 0x8F, 0x8B, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x97, 0x9C, 0x98, 0xFF, + 0x9A, 0x9F, 0x9B, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, + 0x9D, 0xA4, 0xA2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xBA, 0xC1, 0xBF, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xCF, 0xD6, 0xD4, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, + 0xB3, 0xBC, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xD4, 0xE0, 0xDC, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, + 0xBC, 0xC6, 0xC2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, + 0xAC, 0xB5, 0xB2, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, + 0x9A, 0xA1, 0x9C, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xB6, 0xBC, 0xB5, 0xFF, + 0xAB, 0xB1, 0xAD, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, 0x71, 0x77, 0x70, 0xFF, 0x7E, 0x83, 0x7F, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, + 0x98, 0x9D, 0x97, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, 0x99, 0x9E, 0x98, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x82, 0x87, 0x81, 0xFF, + 0x86, 0x8B, 0x87, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x94, 0x99, 0x95, 0xFF, + 0x9F, 0xA4, 0xA0, 0xFF, 0xA8, 0xAD, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xAC, 0xB3, 0xB1, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xCE, 0xD5, 0xD3, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, + 0xAF, 0xBB, 0xB7, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, + 0xD2, 0xDE, 0xDA, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xAA, 0xB6, 0xB2, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, + 0xB7, 0xC1, 0xBE, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, + 0xB9, 0xC2, 0xBF, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, + 0x9A, 0xA1, 0x9C, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xB6, 0xBB, 0xB7, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xBB, 0xC0, 0xBA, 0xFF, + 0xA7, 0xAC, 0xA8, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, 0x8C, 0x92, 0x8B, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, + 0xB0, 0xB6, 0xAF, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x93, 0x99, 0x92, 0xFF, + 0xA0, 0xA5, 0xA1, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x9E, 0xA3, 0x9F, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, 0x86, 0x8B, 0x87, 0xFF, + 0x8C, 0x91, 0x8D, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, + 0xA3, 0xAA, 0xA8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xD7, 0xDF, 0xDC, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, + 0xA3, 0xAF, 0xAB, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, + 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0x8D, 0x99, 0x95, 0xFF, + 0x94, 0x9E, 0x9B, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, + 0xBD, 0xC7, 0xC4, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0xA5, 0xAD, 0xA6, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, + 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, + 0x92, 0x97, 0x93, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0xB1, 0xB7, 0xB0, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, + 0xA3, 0xA9, 0xA2, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x8C, 0x92, 0x8B, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, + 0x9E, 0xA3, 0x9F, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, 0x95, 0x9B, 0x97, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0x99, 0x9E, 0x9A, 0xFF, + 0x99, 0x9E, 0x9A, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, + 0xA8, 0xAF, 0xAC, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, + 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, + 0xB1, 0xBD, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xDD, 0xE9, 0xE5, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, + 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xAA, 0xB2, 0xA9, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0x98, 0xA1, 0x97, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, + 0xAA, 0xB2, 0xAB, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB6, 0xB1, 0xFF, 0x90, 0x98, 0x93, 0xFF, 0x85, 0x8D, 0x85, 0xFF, 0x90, 0x98, 0x91, 0xFF, + 0x90, 0x98, 0x93, 0xFF, 0x8A, 0x92, 0x8D, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, + 0x94, 0x9A, 0x93, 0xFF, 0x91, 0x97, 0x8E, 0xFF, 0x97, 0x9C, 0x96, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, + 0x90, 0x95, 0x8F, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x93, 0x98, 0x94, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, + 0xA7, 0xAC, 0xA8, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x93, 0x9A, 0x97, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0x9D, 0xA4, 0xA2, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, + 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, + 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xDE, 0xE7, 0xE4, 0xFF, 0xDA, 0xE4, 0xE1, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, + 0xAB, 0xB2, 0xB0, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xCD, 0xD4, 0xD2, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xA4, 0xAC, 0xA3, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, 0xA9, 0xB1, 0xA7, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xA6, 0xAE, 0xA7, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, + 0x9B, 0xA3, 0x9B, 0xFF, 0x96, 0x9E, 0x97, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x87, 0x8F, 0x8A, 0xFF, 0x82, 0x8A, 0x83, 0xFF, 0x8C, 0x94, 0x8C, 0xFF, + 0x94, 0x9B, 0x97, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, 0xAC, 0xB4, 0xAD, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, + 0x97, 0x9C, 0x94, 0xFF, 0x8C, 0x92, 0x89, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, + 0x92, 0x97, 0x91, 0xFF, 0x92, 0x97, 0x91, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0x97, 0x9C, 0x98, 0xFF, + 0xA2, 0xA7, 0xA3, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xCC, 0xD1, 0xCF, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8D, 0x94, 0x92, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCB, 0xD5, 0xD2, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, + 0xB2, 0xBE, 0xBA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, + 0xB1, 0xBD, 0xB9, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x85, 0x8A, 0x88, 0xFF, + 0x9E, 0xA7, 0x9D, 0xFF, 0xA4, 0xAC, 0xA3, 0xFF, 0xAB, 0xB3, 0xAA, 0xFF, 0xB1, 0xB9, 0xB0, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0x9F, 0xA7, 0xA0, 0xFF, + 0x94, 0x9C, 0x94, 0xFF, 0x8A, 0x92, 0x8B, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0xA8, 0xB0, 0xA8, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, + 0xBD, 0xC5, 0xBD, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, 0xBB, 0xC3, 0xBC, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, + 0x87, 0x8D, 0x87, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x98, 0x9D, 0x97, 0xFF, + 0x98, 0x9D, 0x97, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xA9, 0xAF, 0xA8, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, + 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x8D, 0x94, 0x92, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xD1, 0xD6, 0xD4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, + 0x97, 0x9E, 0x9C, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, + 0xBF, 0xCB, 0xC7, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, + 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xC0, 0xC9, 0xC6, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x8F, 0x96, 0x94, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, + 0x9D, 0xA5, 0x9C, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0x9F, 0xA8, 0x9E, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x94, 0x9C, 0x94, 0xFF, + 0x97, 0x9F, 0x98, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, + 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x79, 0x81, 0x7A, 0xFF, 0x83, 0x88, 0x82, 0xFF, 0x95, 0x9B, 0x94, 0xFF, + 0x82, 0x87, 0x81, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0x97, 0x9C, 0x96, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, + 0x9F, 0xA4, 0x9E, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, + 0xAE, 0xB3, 0xAF, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xB0, 0xB7, 0xB4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, + 0x87, 0x8E, 0x8C, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xDC, 0xE5, 0xE2, 0xFF, + 0xCE, 0xDA, 0xD6, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, + 0xC7, 0xD3, 0xCF, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x80, 0x87, 0x85, 0xFF, + 0xA4, 0xAC, 0xA3, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, 0x83, 0x8C, 0x82, 0xFF, 0x80, 0x88, 0x7F, 0xFF, 0x78, 0x80, 0x77, 0xFF, + 0xB0, 0xB8, 0xAE, 0xFF, 0x90, 0x99, 0x8F, 0xFF, 0x78, 0x80, 0x79, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB7, 0xAF, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, + 0x80, 0x88, 0x81, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x75, 0x7D, 0x76, 0xFF, 0x88, 0x90, 0x89, 0xFF, 0x79, 0x7F, 0x79, 0xFF, 0x94, 0x9A, 0x93, 0xFF, + 0x8E, 0x94, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0xAE, 0xB3, 0xAD, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, + 0xA3, 0xA9, 0xA4, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, + 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, + 0x98, 0xA0, 0x9D, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xE1, 0xEB, 0xE8, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, + 0xBD, 0xC7, 0xC4, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, + 0xBE, 0xC8, 0xC5, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, + 0x86, 0x8E, 0x85, 0xFF, 0x9A, 0xA2, 0x98, 0xFF, 0x9D, 0xA5, 0x9C, 0xFF, 0xB1, 0xB9, 0xB0, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x90, 0x99, 0x8F, 0xFF, + 0xB7, 0xBF, 0xB5, 0xFF, 0x8C, 0x94, 0x8A, 0xFF, 0x7C, 0x84, 0x7D, 0xFF, 0xAA, 0xB2, 0xAB, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0x96, 0x9E, 0x97, 0xFF, + 0x7F, 0x87, 0x80, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x7E, 0x86, 0x7E, 0xFF, 0x8D, 0x95, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, + 0x9E, 0xA3, 0x9D, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xB1, 0xB7, 0xB0, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, + 0xA4, 0xAA, 0xA6, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, + 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, + 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, + 0xB9, 0xC2, 0xBF, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, + 0xC7, 0xD0, 0xCD, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xBB, 0xC5, 0xC1, 0xFF, + 0x82, 0x8B, 0x81, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0x98, 0xA1, 0x97, 0xFF, 0xC7, 0xCF, 0xC6, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, + 0xB6, 0xBE, 0xB4, 0xFF, 0x78, 0x80, 0x77, 0xFF, 0x72, 0x7A, 0x71, 0xFF, 0x93, 0x9B, 0x91, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x79, 0x81, 0x78, 0xFF, + 0x8A, 0x92, 0x8B, 0xFF, 0x94, 0x9C, 0x94, 0xFF, 0x95, 0x9D, 0x96, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0xA9, 0xAF, 0xA8, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, + 0xB2, 0xB8, 0xB2, 0xFF, 0xBE, 0xC4, 0xBD, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, + 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, + 0xB9, 0xC1, 0xBC, 0xFF, 0xBB, 0xC3, 0xBE, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, + 0xB4, 0xBE, 0xBA, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, + 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, + 0xA8, 0xB2, 0xAF, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, + 0xC4, 0xD0, 0xCC, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, + 0x9D, 0xA5, 0x9C, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0x97, 0xA0, 0x96, 0xFF, 0xBA, 0xC3, 0xB9, 0xFF, 0x81, 0x8A, 0x80, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, + 0xAB, 0xB3, 0xAA, 0xFF, 0x61, 0x69, 0x5F, 0xFF, 0x5E, 0x67, 0x5D, 0xFF, 0x7C, 0x85, 0x7B, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x71, 0x79, 0x70, 0xFF, + 0x9B, 0xA3, 0x9B, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, 0xB0, 0xB8, 0xB0, 0xFF, 0xB4, 0xBC, 0xB5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, + 0xC2, 0xC7, 0xC1, 0xFF, 0xB5, 0xBA, 0xB4, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, 0xBC, 0xC1, 0xBB, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, + 0xA2, 0xA7, 0xA3, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0x93, 0x98, 0x94, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, + 0xBB, 0xC3, 0xBE, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, + 0xBD, 0xC9, 0xC5, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, + 0x97, 0xA0, 0x9D, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, 0x88, 0x91, 0x8E, 0xFF, 0x8D, 0x97, 0x94, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, + 0xB9, 0xC5, 0xC1, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xA8, 0xB4, 0xB0, 0xFF, + 0x9C, 0xA4, 0x9B, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0xBB, 0xC4, 0xBA, 0xFF, 0xAF, 0xB7, 0xAD, 0xFF, 0x86, 0x8E, 0x85, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, + 0x7C, 0x85, 0x7B, 0xFF, 0x51, 0x5A, 0x50, 0xFF, 0x53, 0x5B, 0x51, 0xFF, 0x83, 0x8C, 0x82, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x9C, 0xA4, 0x9B, 0xFF, + 0xC1, 0xC9, 0xC2, 0xFF, 0xBE, 0xC6, 0xBE, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, + 0xB7, 0xBD, 0xB6, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x93, 0x98, 0x94, 0xFF, + 0x9A, 0x9F, 0x9B, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xCA, 0xD2, 0xCD, 0xFF, + 0xC3, 0xCB, 0xC6, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0x9E, 0xA2, 0xA1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, + 0xAE, 0xBA, 0xB6, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD8, 0xE4, 0xE0, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, + 0xAC, 0xB5, 0xB2, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, + 0xB5, 0xC1, 0xBD, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, + 0x91, 0x9A, 0x90, 0xFF, 0x82, 0x8B, 0x81, 0xFF, 0xB9, 0xC1, 0xB8, 0xFF, 0x95, 0x9D, 0x94, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x98, 0xA1, 0x97, 0xFF, + 0x82, 0x8B, 0x81, 0xFF, 0x73, 0x7C, 0x72, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, 0xAF, 0xB7, 0xAD, 0xFF, + 0xB9, 0xC1, 0xBA, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0x95, 0x9B, 0x94, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, + 0xBB, 0xC0, 0xBA, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9D, 0xFF, + 0xA4, 0xAA, 0xA6, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC6, 0xCD, 0xC9, 0xFF, + 0xB2, 0xBA, 0xB5, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, + 0xA1, 0xAB, 0xA8, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0x94, 0x99, 0x97, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, + 0x9D, 0xA9, 0xA5, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xD6, 0xDF, 0xDC, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, + 0xC8, 0xD1, 0xCE, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, + 0xC1, 0xCE, 0xC9, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, + 0x7F, 0x87, 0x7E, 0xFF, 0x97, 0xA0, 0x96, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, 0x95, 0x9D, 0x94, 0xFF, + 0x90, 0x99, 0x8F, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, + 0xAD, 0xB5, 0xAE, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, 0xA8, 0xB0, 0xA8, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, + 0xB9, 0xBF, 0xB9, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0x83, 0x88, 0x84, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, + 0xA3, 0xA9, 0xA4, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, + 0x9D, 0xA5, 0xA0, 0xFF, 0x89, 0x91, 0x8C, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, + 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAD, 0xAA, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x91, 0x96, 0x94, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xBB, 0xC5, 0xC1, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, + 0x9A, 0xA6, 0xA2, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, + 0xD2, 0xDC, 0xD9, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, + 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, + 0xBD, 0xC9, 0xC5, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, + 0x72, 0x7A, 0x71, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, + 0x9C, 0xA4, 0x9B, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, 0x8D, 0x95, 0x8B, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, + 0xB1, 0xB9, 0xB2, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0xB8, 0xBE, 0xB7, 0xFF, + 0xB4, 0xB9, 0xB3, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, + 0xB5, 0xBA, 0xB6, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, + 0xB1, 0xB8, 0xB4, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, + 0x93, 0x9D, 0x9A, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0x95, 0x9A, 0x99, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0xA6, 0xB2, 0xAD, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, + 0xD2, 0xDC, 0xD9, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, + 0xD0, 0xD4, 0xD3, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x90, 0x99, 0x96, 0xFF, 0x83, 0x8D, 0x89, 0xFF, + 0xA4, 0xB0, 0xAC, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index dac0f7a8..8892d3ca 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -90,6 +90,13 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, isHoag ? "Default: 1664 mA" : "2048 mA" }; + + case HocClkConfigValue_InputCurrentLimit: + return { + "Overrides the maximum input current from the charger.", + isHoag ? "Default: 900 mA" : "1200 mA" + }; + case HocClkConfigValue_AulaDisplayColorPreset: return { "Current display color preset. Default is Basic", @@ -472,7 +479,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, " - HiOPT: L4T Custom HiOPT table, HOC Default", " - HiOPT - 15mV: L4T Custom HiOPT table with a 15mV offset", " - High UV: The highest undervolt table", - "Default: No Undervolt" + "Default: HiOPT" }; case KipConfigValue_marikoGpuVmin: @@ -544,4 +551,4 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, default: return {}; } -} +} \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h index 595abbee..bffde185 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h @@ -16,8 +16,9 @@ * */ #pragma once -#include "misc_gui.h" -#include #include +#include + +#include "misc_gui.h" std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, bool isHoag); diff --git a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp index fa2c6c89..995dec81 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,45 +24,37 @@ * -------------------------------------------------------------------------- */ - #include "fatal_gui.h" -FatalGui::FatalGui(const std::string message, const std::string info) -{ +FatalGui::FatalGui(const std::string message, const std::string info) { this->message = message; this->info = info; } -void FatalGui::openWithResultCode(std::string tag, Result rc) -{ +void FatalGui::openWithResultCode(std::string tag, Result rc) { char rcStr[32]; std::string info = tag; info.append(rcStr, snprintf(rcStr, sizeof(rcStr), "\n\n[0x%x] %04d-%04d", rc, R_MODULE(rc), R_DESCRIPTION(rc))); - tsl::changeTo( - "Could not connect to hoc-clk sysmodule.\n\n" - "\n" - "Please make sure everything is\n\n" - "correctly installed and enabled.", - info - ); + tsl::changeTo("Could not connect to hoc-clk sysmodule.\n\n" + "\n" + "Please make sure everything is\n\n" + "correctly installed and enabled.", + info); } -tsl::elm::Element* FatalGui::baseUI() -{ - tsl::elm::CustomDrawer* drawer = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer* renderer, u16 x, u16 y, u16 w, u16 h) { +tsl::elm::Element *FatalGui::baseUI() { + tsl::elm::CustomDrawer *drawer = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { renderer->drawString("\uE150", false, 40, 210, 40, TEXT_COLOR); renderer->drawString("Fatal error", false, 100, 210, 30, TEXT_COLOR); std::uint32_t txtY = 255; - if(!this->message.empty()) - { + if (!this->message.empty()) { txtY += renderer->drawString(this->message.c_str(), false, 40, txtY, 23, TEXT_COLOR).second; txtY += 55; } - if(!this->info.empty()) - { + if (!this->info.empty()) { renderer->drawString(this->info.c_str(), false, 40, txtY, 18, DESC_COLOR); } }); @@ -70,11 +62,10 @@ tsl::elm::Element* FatalGui::baseUI() return drawer; } -bool FatalGui::handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) -{ - if((keysDown & HidNpadButton_A) == HidNpadButton_A || (keysDown & HidNpadButton_B) == HidNpadButton_B) - { - while(tsl::Overlay::get()->getCurrentGui() != nullptr) { +bool FatalGui::handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, + HidAnalogStickState joyStickPosRight) { + if ((keysDown & HidNpadButton_A) == HidNpadButton_A || (keysDown & HidNpadButton_B) == HidNpadButton_B) { + while (tsl::Overlay::get()->getCurrentGui() != nullptr) { tsl::goBack(); } return true; diff --git a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h index 61616e58..eb76bd14 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,23 +24,23 @@ * -------------------------------------------------------------------------- */ - #pragma once #include #include "base_gui.h" -class FatalGui : public BaseGui -{ +class FatalGui : public BaseGui { protected: - std::string message; - std::string info; + std::string message; + std::string info; public: - FatalGui(const std::string message, const std::string info); - ~FatalGui() {} - tsl::elm::Element* baseUI() override; - bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight); - static void openWithResultCode(std::string tag, Result rc); + FatalGui(const std::string message, const std::string info); + ~FatalGui() { + } + tsl::elm::Element *baseUI() override; + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, + HidAnalogStickState joyStickPosRight); + static void openWithResultCode(std::string tag, Result rc); }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp index 4628d075..fce953be 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,21 +24,13 @@ * -------------------------------------------------------------------------- */ - -#include "ult_ext.h" -#include "freq_choice_gui.h" - #include "../format.h" #include "fatal_gui.h" +#include "freq_choice_gui.h" +#include "ult_ext.h" -FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz, - std::uint32_t* hzList, - std::uint32_t hzCount, - HocClkModule module, - FreqChoiceListener listener, - bool checkMax, - std::map labels) -{ +FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz, std::uint32_t *hzList, std::uint32_t hzCount, HocClkModule module, FreqChoiceListener listener, + bool checkMax, std::map labels) { this->selectedHz = selectedHz; this->hzList = hzList; this->hzCount = hzCount; @@ -46,18 +38,16 @@ FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz, this->listener = listener; this->checkMax = checkMax; this->labels = labels; - this->configList = new HocClkConfigValueList {}; + this->configList = new HocClkConfigValueList{}; } -FreqChoiceGui::~FreqChoiceGui() -{ +FreqChoiceGui::~FreqChoiceGui() { delete this->configList; } -tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool selected, int safety) -{ +tsl::elm::ListItem *FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool selected, int safety) { std::string text; - if(module == HocClkModule_MEM) + if (module == HocClkModule_MEM) text = formatListFreqHzMem(hz, (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]); else text = formatListFreqHz(hz); @@ -68,35 +58,32 @@ tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool sel rightText = it->second; if (selected) - const_cast(rightText) = "\uE14B"; + const_cast(rightText) = "\uE14B"; - tsl::elm::ListItem* listItem = - new tsl::elm::ListItem(text, rightText, false); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, rightText, false); - switch (safety) - { - case 0: - listItem->setTextColor(tsl::Color(255, 255, 255, 255)); - listItem->setValueColor(tsl::Color(255, 255, 255, 255)); - break; - case 1: - listItem->setTextColor(tsl::Color(255, 165, 0, 255)); - listItem->setValueColor(tsl::Color(255, 165, 0, 255)); - break; - case 2: - listItem->setTextColor(tsl::Color(255, 0, 0, 255)); - listItem->setValueColor(tsl::Color(255, 0, 0, 255)); - break; + switch (safety) { + case 0: + listItem->setTextColor(tsl::Color(255, 255, 255, 255)); + listItem->setValueColor(tsl::Color(255, 255, 255, 255)); + break; + case 1: + listItem->setTextColor(tsl::Color(255, 165, 0, 255)); + listItem->setValueColor(tsl::Color(255, 165, 0, 255)); + break; + case 2: + listItem->setTextColor(tsl::Color(255, 0, 0, 255)); + listItem->setValueColor(tsl::Color(255, 0, 0, 255)); + break; } // Make annotation grey if (!rightText.empty() && !selected) listItem->setValueColor(tsl::Color(180, 180, 180, 255)); - else if(selected) + else if (selected) listItem->setValueColor(tsl::infoTextColor); - listItem->setClickListener([this, hz](u64 keys) - { + listItem->setClickListener([this, hz](u64 keys) { if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) { if (this->listener(hz)) { tsl::goBack(); @@ -109,8 +96,7 @@ tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool sel return listItem; } -void FreqChoiceGui::listUI() -{ +void FreqChoiceGui::listUI() { hocclkIpcGetConfigValues(this->configList); // Header based on CPU/GPU/MEM module @@ -118,11 +104,9 @@ void FreqChoiceGui::listUI() this->listElement->addItem(new tsl::elm::CategoryHeader(moduleName)); // Default option - this->listElement->addItem( - this->createFreqListItem(0, this->selectedHz == 0, 0)); + this->listElement->addItem(this->createFreqListItem(0, this->selectedHz == 0, 0)); - for (std::uint32_t i = 0; i < this->hzCount; i++) - { + for (std::uint32_t i = 0; i < this->hzCount; i++) { std::uint32_t hz = this->hzList[i]; uint32_t mhz = hz / 1000000; @@ -160,17 +144,14 @@ void FreqChoiceGui::listUI() uint32_t danger_cpu; uint32_t danger_gpu; - if (IsMariko()) - { + if (IsMariko()) { unsafe_cpu = this->configList->values[KipConfigValue_marikoCpuUVHigh] ? 2398 : 1964; unsafe_gpu = 1229; danger_cpu = this->configList->values[KipConfigValue_marikoCpuUVHigh] ? 2500 : 2398; danger_gpu = 1306; - } - else - { + } else { unsafe_cpu = this->configList->values[KipConfigValue_eristaCpuUV] ? 2092 : 1786; - if(this->configList->values[KipConfigValue_eristaGpuUV] == GPUUVLevel_NoUV) { + if (this->configList->values[KipConfigValue_eristaGpuUV] == GPUUVLevel_NoUV) { unsafe_gpu = 922; } else { unsafe_gpu = 961; @@ -202,16 +183,9 @@ void FreqChoiceGui::listUI() } else if (moduleName == "mem") { safety = 0; - } - this->listElement->addItem( - this->createFreqListItem( - hz, - (mhz == this->selectedHz / 1000000), - safety - ) - ); + this->listElement->addItem(this->createFreqListItem(hz, (mhz == this->selectedHz / 1000000), safety)); } this->listElement->jumpToItem("", ""); diff --git a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h index 56b04ce2..98440941 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,22 +24,21 @@ * -------------------------------------------------------------------------- */ - #pragma once -#include #include +#include #include + #include "base_menu_gui.h" using FreqChoiceListener = std::function; -class FreqChoiceGui : public BaseMenuGui -{ -protected: - HocClkConfigValueList* configList; +class FreqChoiceGui : public BaseMenuGui { + protected: + HocClkConfigValueList *configList; std::uint32_t selectedHz; - std::uint32_t* hzList; + std::uint32_t *hzList; std::uint32_t hzCount; HocClkModule module; FreqChoiceListener listener; @@ -47,16 +46,11 @@ protected: std::map labels; - tsl::elm::ListItem* createFreqListItem(std::uint32_t hz, bool selected, int safety); + tsl::elm::ListItem *createFreqListItem(std::uint32_t hz, bool selected, int safety); -public: - FreqChoiceGui(std::uint32_t selectedHz, - std::uint32_t* hzList, - std::uint32_t hzCount, - HocClkModule module, - FreqChoiceListener listener, - bool checkMax = true, - std::map labels = {}); + public: + FreqChoiceGui(std::uint32_t selectedHz, std::uint32_t *hzList, std::uint32_t hzCount, HocClkModule module, FreqChoiceListener listener, + bool checkMax = true, std::map labels = {}); ~FreqChoiceGui(); diff --git a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h index 1f57be35..51cfd075 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h @@ -13,9 +13,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -25,50 +25,33 @@ * -------------------------------------------------------------------------- */ #pragma once +#include + #include "../../ipc.h" #include "base_menu_gui.h" #include "freq_choice_gui.h" -#include #include "value_choice_gui.h" -class GlobalOverrideGui : public BaseMenuGui -{ +class GlobalOverrideGui : public BaseMenuGui { protected: - std::map> customFormatModules; - tsl::elm::ListItem* listItems[HocClkModule_EnumMax]; - std::uint32_t listHz[HocClkModule_EnumMax]; - void openFreqChoiceGui(HocClkModule module); - void addGovernorSection(); - void addModuleListItem(HocClkModule module); - void addModuleToggleItem(HocClkModule module); - void openValueChoiceGui( - tsl::elm::ListItem* listItem, - std::uint32_t currentValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds, - bool enableThresholds, - const std::map& labels, - const std::vector& namedValues, - bool showDefaultValue - ); - void addModuleListItemValue( - HocClkModule module, - const std::string& categoryName, - std::uint32_t min, - std::uint32_t max, - std::uint32_t step, - const std::string& suffix, - std::uint32_t divisor, - int decimalPlaces, - ValueThresholds thresholds = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true - ); + std::map> customFormatModules; + tsl::elm::ListItem *listItems[HocClkModule_EnumMax]; + std::uint32_t listHz[HocClkModule_EnumMax]; + void openFreqChoiceGui(HocClkModule module); + void addGovernorSection(); + void addModuleListItem(HocClkModule module); + void addModuleToggleItem(HocClkModule module); + void openValueChoiceGui(tsl::elm::ListItem *listItem, std::uint32_t currentValue, const ValueRange &range, const std::string &categoryName, + ValueChoiceListener listener, const ValueThresholds &thresholds, bool enableThresholds, + const std::map &labels, const std::vector &namedValues, bool showDefaultValue); + void addModuleListItemValue(HocClkModule module, const std::string &categoryName, std::uint32_t min, std::uint32_t max, std::uint32_t step, + const std::string &suffix, std::uint32_t divisor, int decimalPlaces, ValueThresholds thresholds = {}, + const std::vector &namedValues = {}, bool showDefaultValue = true); + public: - GlobalOverrideGui(); - ~GlobalOverrideGui() {} - void listUI() override; - void refresh() override; - void setModuleCustomFormat(HocClkModule module, const std::string& suffix, std::uint32_t divisor, int decimalPlaces); + GlobalOverrideGui(); + ~GlobalOverrideGui() { + } + void listUI() override; + void refresh() override; + void setModuleCustomFormat(HocClkModule module, const std::string &suffix, std::uint32_t divisor, int decimalPlaces); }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp index aa4e4869..3a339d5b 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp @@ -16,72 +16,70 @@ * */ -#include "info_gui.h" -#include "ult_ext.h" #include -InfoGui::InfoGui(std::string title, std::vector strings) - : m_title(std::move(title)), m_strings(std::move(strings)) {} +#include "info_gui.h" +#include "ult_ext.h" -static constexpr s32 TEXT_SIZE = 16; -static constexpr s32 LINE_H = 22; -static constexpr s32 PARA_GAP = 10; -static constexpr s32 MARGIN_L = 20; -static constexpr s32 MARGIN_R = 35; +InfoGui::InfoGui(std::string title, std::vector strings) : m_title(std::move(title)), m_strings(std::move(strings)) { +} -static std::vector wrapText(const std::string& text, s32 maxWidth) -{ +static constexpr s32 TEXT_SIZE = 16; +static constexpr s32 LINE_H = 22; +static constexpr s32 PARA_GAP = 10; +static constexpr s32 MARGIN_L = 20; +static constexpr s32 MARGIN_R = 35; + +static std::vector wrapText(const std::string &text, s32 maxWidth) { constexpr float CHAR_W = 10.0f; // Preserve leading whitespace as an indent prefix for wrapped continuation lines. std::string indent; for (char c : text) { - if (c == ' ') indent += ' '; - else break; + if (c == ' ') + indent += ' '; + else + break; } std::vector lines; std::istringstream ss(text); - std::string word, line = indent; // seed with indent so first word inherits it + std::string word, line = indent; // seed with indent so first word inherits it bool first = true; while (ss >> word) { - std::string candidate = (first && !indent.empty()) ? indent + word - : line.empty() ? word - : line + " " + word; + std::string candidate = (first && !indent.empty()) ? indent + word : line.empty() ? word : line + " " + word; first = false; if (static_cast(candidate.size() * CHAR_W) <= maxWidth) line = std::move(candidate); else { - if (!line.empty() && line != indent) lines.push_back(line); + if (!line.empty() && line != indent) + lines.push_back(line); line = indent + word; } } - if (!line.empty() && line != indent) lines.push_back(line); - if (lines.empty()) lines.emplace_back(""); + if (!line.empty() && line != indent) + lines.push_back(line); + if (lines.empty()) + lines.emplace_back(""); return lines; } -void InfoGui::listUI() -{ +void InfoGui::listUI() { this->listElement->addItem(new tsl::elm::CategoryHeader(m_title)); const s32 maxWidth = tsl::cfg::FramebufferWidth - MARGIN_L - MARGIN_R; - for (const auto& para : m_strings) { - for (const auto& lineText : wrapText(para, maxWidth)) { - auto* d = new FocusableDrawer( - [lineText](tsl::gfx::Renderer* r, s32 x, s32 y, s32 w, s32 h) { - r->drawString((lineText + "\n").c_str(), false, - x + MARGIN_L, y + LINE_H - 5, - TEXT_SIZE, tsl::style::color::ColorText); - }); + for (const auto ¶ : m_strings) { + for (const auto &lineText : wrapText(para, maxWidth)) { + auto *d = new FocusableDrawer([lineText](tsl::gfx::Renderer *r, s32 x, s32 y, s32 w, s32 h) { + r->drawString((lineText + "\n").c_str(), false, x + MARGIN_L, y + LINE_H - 5, TEXT_SIZE, tsl::style::color::ColorText); + }); d->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, LINE_H); this->listElement->addItem(d, LINE_H); } // paragraph gap - auto* gap = new tsl::elm::CustomDrawer( - [](tsl::gfx::Renderer*, s32, s32, s32, s32) {}); + auto *gap = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {}); gap->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, PARA_GAP); this->listElement->addItem(gap, PARA_GAP); } diff --git a/Source/hoc-clk/overlay/src/ui/gui/info_gui.h b/Source/hoc-clk/overlay/src/ui/gui/info_gui.h index 8e5bf437..a1ae8e9d 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/info_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/info_gui.h @@ -16,18 +16,18 @@ * */ #pragma once -#include "base_menu_gui.h" #include #include -class InfoGui : public BaseMenuGui -{ -public: +#include "base_menu_gui.h" + +class InfoGui : public BaseMenuGui { + public: InfoGui(std::string title, std::vector strings); ~InfoGui() = default; void listUI() override; -private: + private: std::string m_title; std::vector m_strings; }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp index 166c313e..55f59189 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp @@ -12,140 +12,73 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include #include +#include #include std::map cpu_freq_label_m = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Boost Mode"}, - {1963000000, "Safe Max"}, - {2397000000, "Unsafe Max"}, - {2703000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, + { 1963000000, "Safe Max" }, { 2397000000, "Unsafe Max" }, { 2703000000, "Absolute Max" }, }; std::map cpu_freq_label_m_uv = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Boost Mode"}, - {2397000000, "Safe Max"}, - {2499000000, "Unsafe Max"}, - {2703000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, + { 2397000000, "Safe Max" }, { 2499000000, "Unsafe Max" }, { 2703000000, "Absolute Max" }, }; std::map cpu_freq_label_e = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Safe Max"}, - {2091000000, "Unsafe Max"}, - {2397000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, + { 1785000000, "Safe Max" }, { 2091000000, "Unsafe Max" }, { 2397000000, "Absolute Max" }, }; std::map cpu_freq_label_e_uv = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Boost Mode"}, - {2091000000, "Safe Max"}, - {2193000000, "Unsafe Max"}, - {2397000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, + { 2091000000, "Safe Max" }, { 2193000000, "Unsafe Max" }, { 2397000000, "Absolute Max" }, }; - std::map gpu_freq_label_e = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {921600000, "Safe Max"}, - {960000000, "Unsafe Max"}, - {1075200000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, + { 422400000, "Handheld" }, { 460800000, "Handheld Safe Max" }, { 768000000, "Docked" }, { 921600000, "Safe Max" }, + { 960000000, "Unsafe Max" }, { 1075200000, "Absolute Max" }, }; std::map gpu_freq_label_e_uv = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {960000000, "Safe Max"}, - {1075200000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, + { 384000000, "Handheld" }, { 422400000, "Handheld" }, { 460800000, "Handheld Safe Max" }, + { 768000000, "Docked" }, { 960000000, "Safe Max" }, { 1075200000, "Absolute Max" }, }; std::map gpu_freq_label_m = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld"}, - {614400000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {998400000, "Safe Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, { 422400000, "Handheld" }, + { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, { 998400000, "Safe Max" }, }; std::map gpu_freq_label_m_slt = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld"}, - {614400000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {1075200000, "Safe Max"}, - {1305600000, "Unsafe Max"}, - {1536000000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, + { 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, + { 1075200000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, }; std::map gpu_freq_label_m_hiopt = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld"}, - {614400000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {1152000000, "Safe Max"}, - {1305600000, "Unsafe Max"}, - {1536000000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, + { 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, + { 1152000000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, }; std::map gpu_freq_label_m_highuv = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {384000000, "Handheld"}, - {460800000, "Handheld"}, - {614400000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {1228800000, "Safe Max"}, - {1305600000, "Unsafe Max"}, - {1536000000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 384000000, "Handheld" }, + { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, + { 1228800000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, }; -std::map* marikoUV[5] { - &gpu_freq_label_m, - &gpu_freq_label_m_slt, - &gpu_freq_label_m_hiopt, - &gpu_freq_label_m_hiopt, - &gpu_freq_label_m_highuv, +std::map *marikoUV[5]{ + &gpu_freq_label_m, &gpu_freq_label_m_slt, &gpu_freq_label_m_hiopt, &gpu_freq_label_m_hiopt, &gpu_freq_label_m_highuv, }; - -std::map* eristaUV[3] { +std::map *eristaUV[3]{ &gpu_freq_label_e, &gpu_freq_label_e_uv, &gpu_freq_label_e_uv, diff --git a/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp index 608a874b..4b2021e8 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,25 +24,23 @@ * -------------------------------------------------------------------------- */ - -#include "main_gui.h" - -#include "fatal_gui.h" -#include "app_profile_gui.h" -#include "global_override_gui.h" -#include "misc_gui.h" #include "about_gui.h" +#include "app_profile_gui.h" +#include "fatal_gui.h" +#include "global_override_gui.h" +#include "main_gui.h" +#include "misc_gui.h" #include "ult_ext.h" -tsl::elm::Element* MainGui::baseUI() { - auto* list = new BoxClippedList(); + +tsl::elm::Element *MainGui::baseUI() { + auto *list = new BoxClippedList(); this->listElement = list; this->listUI(); return list; } -void MainGui::listUI() -{ +void MainGui::listUI() { // this->enabledToggle = new tsl::elm::ToggleListItem("Enable", false); // enabledToggle->setStateChangedListener([this](bool state) { // Result rc = hocclkIpcSetEnabled(state); @@ -56,10 +54,9 @@ void MainGui::listUI() // }); // this->listElement->addItem(this->enabledToggle); - tsl::elm::ListItem* appProfileItem = new tsl::elm::ListItem("Edit App Profile"); + tsl::elm::ListItem *appProfileItem = new tsl::elm::ListItem("Edit App Profile"); appProfileItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { AppProfileGui::changeTo(this->context->applicationId); return true; } @@ -68,11 +65,9 @@ void MainGui::listUI() }); this->listElement->addItem(appProfileItem); - - tsl::elm::ListItem* globalProfileItem = new tsl::elm::ListItem("Edit Global Profile"); + tsl::elm::ListItem *globalProfileItem = new tsl::elm::ListItem("Edit Global Profile"); globalProfileItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { AppProfileGui::changeTo(HOCCLK_GLOBAL_PROFILE_TID); return true; } @@ -81,10 +76,9 @@ void MainGui::listUI() }); this->listElement->addItem(globalProfileItem); - tsl::elm::ListItem* globalOverrideItem = new tsl::elm::ListItem("Temporary Overrides"); + tsl::elm::ListItem *globalOverrideItem = new tsl::elm::ListItem("Temporary Overrides"); globalOverrideItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { tsl::changeTo(); return true; } @@ -93,12 +87,11 @@ void MainGui::listUI() }); this->listElement->addItem(globalOverrideItem); - //this->listElement->addItem(new tsl::elm::CategoryHeader("Misc")); + // this->listElement->addItem(new tsl::elm::CategoryHeader("Misc")); - tsl::elm::ListItem* miscItem = new tsl::elm::ListItem("Settings"); + tsl::elm::ListItem *miscItem = new tsl::elm::ListItem("Settings"); miscItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { tsl::changeTo(); return true; } @@ -107,10 +100,9 @@ void MainGui::listUI() }); this->listElement->addItem(miscItem); - tsl::elm::ListItem* aboutItem = new tsl::elm::ListItem("About"); + tsl::elm::ListItem *aboutItem = new tsl::elm::ListItem("About"); aboutItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { tsl::changeTo(); return true; } @@ -118,14 +110,12 @@ void MainGui::listUI() return false; }); this->listElement->addItem(aboutItem); - } -void MainGui::refresh() -{ +void MainGui::refresh() { BaseMenuGui::refresh(); - //if(this->context) + // if(this->context) //{ - // this->enabledToggle->setState(this->context->enabled); - //} + // this->enabledToggle->setState(this->context->enabled); + // } } diff --git a/Source/hoc-clk/overlay/src/ui/gui/main_gui.h b/Source/hoc-clk/overlay/src/ui/gui/main_gui.h index fce605c9..363811b7 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/main_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/main_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,18 +24,20 @@ * -------------------------------------------------------------------------- */ - #pragma once #include "base_menu_gui.h" -class MainGui : public BaseMenuGui -{ +class MainGui : public BaseMenuGui { public: - MainGui() {} - ~MainGui() {} - tsl::elm::Element* baseUI() override; - void listUI() override; - void refresh() override; - u16 headerHeight() const override { return HOC_HEADER_HEIGHT - 25; } + MainGui() { + } + ~MainGui() { + } + tsl::elm::Element *baseUI() override; + void listUI() override; + void refresh() override; + u16 headerHeight() const override { + return HOC_HEADER_HEIGHT - 25; + } }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index e63f20e5..704401aa 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -16,18 +16,20 @@ * */ -#include "misc_gui.h" -#include "ult_ext.h" -#include "fatal_gui.h" -#include "config_info_strings.h" -#include "../format.h" #include #include #include + +#include "../format.h" +#include "config_info_strings.h" +#include "fatal_gui.h" #include "labels.h" +#include "misc_gui.h" +#include "ult_ext.h" + // This workaround *may* not be nessasary, but it seems to help with reducing stutter -static void kipDataThreadFunc(void*) { +static void kipDataThreadFunc(void *) { hocClkIpcSetKipData(); } @@ -46,7 +48,7 @@ static void sendKipData() { } } #if IS_MINIMAL == 1 -#pragma message("Compiling with minimal features") + #pragma message("Compiling with minimal features") #endif #define A_BTN "\ue0e0" @@ -59,18 +61,17 @@ class SafetySubMenuGui; class RamSubmenuGui; class RamTimingsSubmenuGui; class RamLatenciesSubmenuGui; +class SocCustomTableSubmenuGui; class CpuSubmenuGui; class GpuSubmenuGui; class GpuCustomTableSubmenuGui; class ExperimentalSettingsSubMenuGui; -MiscGui::MiscGui() -{ - this->configList = new HocClkConfigValueList {}; +MiscGui::MiscGui() { + this->configList = new HocClkConfigValueList{}; } -MiscGui::~MiscGui() -{ +MiscGui::~MiscGui() { if (shouldSaveKip) { sendKipData(); shouldSaveKip = false; @@ -87,15 +88,16 @@ MiscGui::~MiscGui() this->configRanges.clear(); } -void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char* altName, bool kip) { - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char *altName, bool kip) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); struct YAwareToggle : tsl::elm::ToggleListItem { std::vector m_info; std::string m_title; - YAwareToggle(const char* text, bool state, std::string title, std::vector info) - : tsl::elm::ToggleListItem(text, state), m_info(std::move(info)), m_title(std::move(title)) {} + YAwareToggle(const char *text, bool state, std::string title, std::vector info) + : tsl::elm::ToggleListItem(text, state), m_info(std::move(info)), m_title(std::move(title)) { + } bool onClick(u64 keys) override { if (!m_info.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { tsl::changeTo(m_title, m_info); @@ -105,8 +107,7 @@ void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char* altName, } }; - auto* toggle = new YAwareToggle(configName, this->configList->values[configVal], - configName, std::move(infoStrings)); + auto *toggle = new YAwareToggle(configName, this->configList->values[configVal], configName, std::move(infoStrings)); if (!kip) toggle->setTextColor(tsl::Color(120, 235, 255, 255)); toggle->setStateChangedListener([this, configVal, kip](bool state) { @@ -123,27 +124,27 @@ void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char* altName, this->configToggles[configVal] = toggle; } -void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char* altName, const ValueRange& range, bool kip) { +void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char *altName, const ValueRange &range, bool kip) { auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); struct IndexedBar : tsl::elm::NamedStepTrackBar { std::vector m_info; std::string m_title; - IndexedBar(const char* label, const ValueRange& r, std::string title, std::vector info) - : tsl::elm::NamedStepTrackBar("", {""}, true, label), - m_info(std::move(info)), m_title(std::move(title)) { + IndexedBar(const char *label, const ValueRange &r, std::string title, std::vector info) + : tsl::elm::NamedStepTrackBar("", { "" }, true, label), m_info(std::move(info)), m_title(std::move(title)) { m_stepDescriptions.clear(); u32 numSteps = (r.max - r.min) / r.step + 1; for (u32 i = 0; i < numSteps; i++) { u32 disp = (r.min + i * r.step) / r.divisor; std::string s = std::to_string(disp); - if (!r.suffix.empty()) s += " " + r.suffix; + if (!r.suffix.empty()) + s += " " + r.suffix; m_stepDescriptions.push_back(s); } m_numSteps = (u8)m_stepDescriptions.size(); m_selection = m_stepDescriptions[0]; } - bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState& touchPos, - HidAnalogStickState leftJoyStick, HidAnalogStickState rightJoyStick) override { + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoyStick, + HidAnalogStickState rightJoyStick) override { if (!m_info.empty() && (keysDown & HidNpadButton_Y) && !(keysDown & ~HidNpadButton_Y)) { tsl::changeTo(m_title, m_info); return true; @@ -151,8 +152,8 @@ void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char* altName return tsl::elm::NamedStepTrackBar::handleInput(keysDown, keysHeld, touchPos, leftJoyStick, rightJoyStick); } }; - const char* name = altName ? altName : hocclkFormatConfigValue(configVal, true); - auto* bar = new IndexedBar(name, range, name, std::move(infoStrings)); + const char *name = altName ? altName : hocclkFormatConfigValue(configVal, true); + auto *bar = new IndexedBar(name, range, name, std::move(infoStrings)); u32 cur = (u32)this->configList->values[configVal]; u16 curStep = 0; if (cur >= range.min && cur <= range.max && range.step > 0 && (cur - range.min) % range.step == 0) @@ -161,26 +162,27 @@ void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char* altName bar->setValueChangedListener([this, configVal, kip, range](u16 v) { this->configList->values[configVal] = range.min + (u32)v * range.step; Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - if (kip) shouldSaveKip = true; + if (R_FAILED(rc)) + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + if (kip) + shouldSaveKip = true; }); this->listElement->addItem(bar); } -void MiscGui::addMappedConfigTrackbar(HocClkConfigValue configVal, const char* altName, - std::vector vals, - std::initializer_list names, bool kip) { - const char* name = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addMappedConfigTrackbar(HocClkConfigValue configVal, const char *altName, std::vector vals, + std::initializer_list names, bool kip) { + const char *name = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); struct YAwareTrackBar : tsl::elm::NamedStepTrackBar { std::vector m_info; std::string m_title; - YAwareTrackBar(const char* label, std::initializer_list steps, std::string title, std::vector info) - : tsl::elm::NamedStepTrackBar("", steps, true, label), - m_info(std::move(info)), m_title(std::move(title)) {} - bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState& touchPos, - HidAnalogStickState leftJoyStick, HidAnalogStickState rightJoyStick) override { + YAwareTrackBar(const char *label, std::initializer_list steps, std::string title, std::vector info) + : tsl::elm::NamedStepTrackBar("", steps, true, label), m_info(std::move(info)), m_title(std::move(title)) { + } + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoyStick, + HidAnalogStickState rightJoyStick) override { if (!m_info.empty() && (keysDown & HidNpadButton_Y) && !(keysDown & ~HidNpadButton_Y)) { tsl::changeTo(m_title, m_info); return true; @@ -189,38 +191,35 @@ void MiscGui::addMappedConfigTrackbar(HocClkConfigValue configVal, const char* a } }; - auto* bar = new YAwareTrackBar(name, names, name, std::move(infoStrings)); + auto *bar = new YAwareTrackBar(name, names, name, std::move(infoStrings)); u32 cur = (u32)this->configList->values[configVal]; u16 curIdx = 0; for (u16 i = 0; i < (u16)vals.size(); i++) { - if (vals[i] == cur) { curIdx = i; break; } + if (vals[i] == cur) { + curIdx = i; + break; + } } bar->setProgress(curIdx); bar->setValueChangedListener([this, configVal, kip, vals](u16 idx) { if (idx < (u16)vals.size()) this->configList->values[configVal] = vals[idx]; Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - if (kip) shouldSaveKip = true; + if (R_FAILED(rc)) + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + if (kip) + shouldSaveKip = true; }); this->listElement->addItem(bar); } - -void MiscGui::addConfigButton(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels, - const std::vector& namedValues, - bool showDefaultValue, - bool kip) -{ - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addConfigButton(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels, + const std::vector &namedValues, bool showDefaultValue, bool kip) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(configName); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(configName); if (!kip) listItem->setTextColor(tsl::Color(120, 235, 255, 255)); @@ -230,7 +229,7 @@ void MiscGui::addConfigButton(HocClkConfigValue configVal, snprintf(valueText, sizeof(valueText), "%s", VALUE_DEFAULT_TEXT); } else { bool foundNamedValue = false; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { snprintf(valueText, sizeof(valueText), "%s", namedValue.name.c_str()); foundNamedValue = true; @@ -251,79 +250,62 @@ void MiscGui::addConfigButton(HocClkConfigValue configVal, ValueThresholds thresholdsCopy = (thresholds ? *thresholds : ValueThresholds{}); - listItem->setClickListener( - [this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, - infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) - { - if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { - tsl::changeTo(configName, infoStrings); - return true; - } - - if ((keys & HidNpadButton_A) == 0) - return false; - - std::uint32_t currentValue = this->configList->values[configVal]; - - // Look up live namedValues so relabeling in refresh() is reflected - auto nvIt = this->configNamedValues.find(configVal); - const std::vector& liveNamedValues = (nvIt != this->configNamedValues.end()) - ? nvIt->second : std::vector(); - - if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - thresholdsCopy, - true, - labels, - liveNamedValues, - showDefaultValue - ); - } else { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - ValueThresholds(), - false, - labels, - liveNamedValues, - showDefaultValue - ); - } - + listItem->setClickListener([this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, + infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) { + if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { + tsl::changeTo(configName, infoStrings); return true; - }); + } + + if ((keys & HidNpadButton_A) == 0) + return false; + + std::uint32_t currentValue = this->configList->values[configVal]; + + // Look up live namedValues so relabeling in refresh() is reflected + auto nvIt = this->configNamedValues.find(configVal); + const std::vector &liveNamedValues = (nvIt != this->configNamedValues.end()) ? nvIt->second : std::vector(); + + if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + thresholdsCopy, true, labels, liveNamedValues, showDefaultValue); + } else { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + ValueThresholds(), false, labels, liveNamedValues, showDefaultValue); + } + + return true; + }); this->listElement->addItem(listItem); this->configButtons[configVal] = listItem; @@ -331,20 +313,12 @@ void MiscGui::addConfigButton(HocClkConfigValue configVal, this->configNamedValues[configVal] = namedValues; } -void MiscGui::addConfigButtonS(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels, - const std::vector& namedValues, - bool showDefaultValue, - const char* subText, - bool kip) -{ - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addConfigButtonS(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels, + const std::vector &namedValues, bool showDefaultValue, const char *subText, bool kip) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(""); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(""); if (!kip) listItem->setTextColor(tsl::Color(120, 235, 255, 255)); @@ -354,7 +328,7 @@ void MiscGui::addConfigButtonS(HocClkConfigValue configVal, snprintf(valueText, sizeof(valueText), "%s", VALUE_DEFAULT_TEXT); } else { bool foundNamedValue = false; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { snprintf(valueText, sizeof(valueText), "%s", namedValue.name.c_str()); foundNamedValue = true; @@ -377,79 +351,62 @@ void MiscGui::addConfigButtonS(HocClkConfigValue configVal, ValueThresholds thresholdsCopy = (thresholds ? *thresholds : ValueThresholds{}); - listItem->setClickListener( - [this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, - infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) - { - if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { - tsl::changeTo(configName, infoStrings); - return true; - } - - if ((keys & HidNpadButton_A) == 0) - return false; - - std::uint32_t currentValue = this->configList->values[configVal]; - - // Look up live namedValues so relabeling in refresh() is reflected - auto nvIt = this->configNamedValues.find(configVal); - const std::vector& liveNamedValues = (nvIt != this->configNamedValues.end()) - ? nvIt->second : std::vector(); - - if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - thresholdsCopy, - true, - labels, - liveNamedValues, - showDefaultValue - ); - } else { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - ValueThresholds(), - false, - labels, - liveNamedValues, - showDefaultValue - ); - } - + listItem->setClickListener([this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, + infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) { + if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { + tsl::changeTo(configName, infoStrings); return true; - }); + } + + if ((keys & HidNpadButton_A) == 0) + return false; + + std::uint32_t currentValue = this->configList->values[configVal]; + + // Look up live namedValues so relabeling in refresh() is reflected + auto nvIt = this->configNamedValues.find(configVal); + const std::vector &liveNamedValues = (nvIt != this->configNamedValues.end()) ? nvIt->second : std::vector(); + + if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + thresholdsCopy, true, labels, liveNamedValues, showDefaultValue); + } else { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + ValueThresholds(), false, labels, liveNamedValues, showDefaultValue); + } + + return true; + }); this->listElement->addItem(listItem); this->configButtons[configVal] = listItem; @@ -461,21 +418,17 @@ void MiscGui::addConfigButtonS(HocClkConfigValue configVal, } void MiscGui::updateConfigToggles() { - for (const auto& [value, toggle] : this->configToggles) { + for (const auto &[value, toggle] : this->configToggles) { if (toggle != nullptr) toggle->setState(this->configList->values[value]); } } -void MiscGui::addFreqButton(HocClkConfigValue configVal, - const char* altName, - HocClkModule module, - const std::map& labels) -{ - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addFreqButton(HocClkConfigValue configVal, const char *altName, HocClkModule module, const std::map &labels) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(configName); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(configName); uint64_t currentMHz = this->configList->values[configVal]; char valueText[32]; @@ -483,9 +436,7 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, listItem->setValue(valueText); listItem->setClickListener( - [this, configVal, module, labels, - infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) - { + [this, configVal, module, labels, infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) { if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { tsl::changeTo(configName, infoStrings); return true; @@ -506,12 +457,8 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, std::uint32_t currentHz = this->configList->values[configVal] * 1'000'000; tsl::changeTo( - currentHz, - hzList, - hzCount, - module, - [this, configVal](std::uint32_t hz) - { + currentHz, hzList, hzCount, module, + [this, configVal](std::uint32_t hz) { uint64_t mhz = hz / 1'000'000; this->configList->values[configVal] = mhz; @@ -524,9 +471,7 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, this->lastContextUpdate = armGetSystemTick(); return true; }, - false, - labels - ); + false, labels); return true; }); @@ -537,8 +482,7 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, this->configRanges[configVal] = ValueRange(0, 0, 0, "MHz", 1); } -void MiscGui::listUI() -{ +void MiscGui::listUI() { Result rc = hocclkIpcGetConfigValues(configList); if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); @@ -550,17 +494,16 @@ void MiscGui::listUI() this->listElement->addItem(new CompactCategoryHeader("Settings")); - tsl::elm::CustomDrawer* rebootSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *rebootSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Settings marked in blue", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("don't require a reboot to apply!", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("You can also press \ue0e3 to show", false, x + 20, y + 70, 18, tsl::style::color::ColorText); renderer->drawString("information about each setting.", false, x + 20, y + 90, 18, tsl::style::color::ColorText); - }); rebootSetWarning->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); this->listElement->addItem(rebootSetWarning); - tsl::elm::ListItem* sysmoduleSettingsSubMenu = new tsl::elm::ListItem("General Settings"); + tsl::elm::ListItem *sysmoduleSettingsSubMenu = new tsl::elm::ListItem("General Settings"); sysmoduleSettingsSubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -571,7 +514,7 @@ void MiscGui::listUI() sysmoduleSettingsSubMenu->setValue(R_ARROW); this->listElement->addItem(sysmoduleSettingsSubMenu); - tsl::elm::ListItem* governorSettingsSubMenu = new tsl::elm::ListItem("Governor Settings"); + tsl::elm::ListItem *governorSettingsSubMenu = new tsl::elm::ListItem("Governor Settings"); governorSettingsSubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -582,7 +525,7 @@ void MiscGui::listUI() governorSettingsSubMenu->setValue(R_ARROW); this->listElement->addItem(governorSettingsSubMenu); - tsl::elm::ListItem* safetySubmenu = new tsl::elm::ListItem("Safety Settings"); + tsl::elm::ListItem *safetySubmenu = new tsl::elm::ListItem("Safety Settings"); safetySubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -593,7 +536,7 @@ void MiscGui::listUI() safetySubmenu->setValue(R_ARROW); this->listElement->addItem(safetySubmenu); - tsl::elm::ListItem* ramSubmenu = new tsl::elm::ListItem("RAM Settings"); + tsl::elm::ListItem *ramSubmenu = new tsl::elm::ListItem("RAM Settings"); ramSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -604,7 +547,7 @@ void MiscGui::listUI() ramSubmenu->setValue(R_ARROW); this->listElement->addItem(ramSubmenu); - tsl::elm::ListItem* cpuSubmenu = new tsl::elm::ListItem("CPU Settings"); + tsl::elm::ListItem *cpuSubmenu = new tsl::elm::ListItem("CPU Settings"); cpuSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -615,7 +558,7 @@ void MiscGui::listUI() cpuSubmenu->setValue(R_ARROW); this->listElement->addItem(cpuSubmenu); - tsl::elm::ListItem* gpuSubmenu = new tsl::elm::ListItem("GPU Settings"); + tsl::elm::ListItem *gpuSubmenu = new tsl::elm::ListItem("GPU Settings"); gpuSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -626,7 +569,7 @@ void MiscGui::listUI() gpuSubmenu->setValue(R_ARROW); this->listElement->addItem(gpuSubmenu); - tsl::elm::ListItem* displaySubMenu = new tsl::elm::ListItem("Display Settings"); + tsl::elm::ListItem *displaySubMenu = new tsl::elm::ListItem("Display Settings"); displaySubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -637,8 +580,8 @@ void MiscGui::listUI() displaySubMenu->setValue(R_ARROW); this->listElement->addItem(displaySubMenu); - if(this->configList->values[HocClkConfigValue_EnableExperimentalSettings]) { - tsl::elm::ListItem* experimentalSubMenu = new tsl::elm::ListItem("Experimental Settings"); + if (this->configList->values[HocClkConfigValue_EnableExperimentalSettings]) { + tsl::elm::ListItem *experimentalSubMenu = new tsl::elm::ListItem("Experimental Settings"); experimentalSubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -649,17 +592,20 @@ void MiscGui::listUI() experimentalSubMenu->setValue(R_ARROW); this->listElement->addItem(experimentalSubMenu); } - } class GeneralSettingsSubMenuGui : public MiscGui { -public: - GeneralSettingsSubMenuGui() { } + public: + GeneralSettingsSubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } this->listElement->addItem(new CompactCategoryHeader("General Settings")); ValueThresholds thresholdsDisabled(0, 0); @@ -668,8 +614,9 @@ protected: NamedValue("VDDQ", RamDisplayMode_VDDQ), }; - if(IsMariko()) { - addConfigButton(HocClkConfigValue_RAMVoltDisplayMode, "RAM Voltage Display Mode", ValueRange(0, 12, 1, "", 0), "RAM Voltage Display Mode", &thresholdsDisabled, {}, ramVoltDispModes, false); + if (IsMariko()) { + addConfigButton(HocClkConfigValue_RAMVoltDisplayMode, "RAM Voltage Display Mode", ValueRange(0, 12, 1, "", 0), "RAM Voltage Display Mode", + &thresholdsDisabled, {}, ramVoltDispModes, false); } std::vector RamDisplayUnitValues = { @@ -677,30 +624,15 @@ protected: NamedValue("MT/s", RamDisplayUnit_MTs), NamedValue("MHz and MT/s", RamDisplayUnit_MHzMTs), }; - addConfigButton( - HocClkConfigValue_RamDisplayUnit, - "RAM Display Unit", - ValueRange(0, 0, 2, "", 0), - "RAM Display Unit", - &thresholdsDisabled, - {}, - RamDisplayUnitValues, - false + addConfigButton(HocClkConfigValue_RamDisplayUnit, "RAM Display Unit", ValueRange(0, 0, 2, "", 0), "RAM Display Unit", &thresholdsDisabled, {}, + RamDisplayUnitValues, false ); - addConfigButton( - HocClkConfigValue_PollingIntervalMs, - "Polling Interval", - ValueRange(50, 1000, 50, "ms", 1), - "Polling Interval", - &thresholdsDisabled, - {}, - {}, - false - ); + addConfigButton(HocClkConfigValue_PollingIntervalMs, "Polling Interval", ValueRange(50, 1000, 50, "ms", 1), "Polling Interval", + &thresholdsDisabled, {}, {}, false); - tsl::elm::CustomDrawer* exSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *exSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Experimental Settings are incomplete ", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("and may not work correctly or at all!", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("Here be dragons!", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -713,16 +645,20 @@ protected: }; class ExperimentalSettingsSubMenuGui : public MiscGui { -public: - ExperimentalSettingsSubMenuGui() { } + public: + ExperimentalSettingsSubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } this->listElement->addItem(new CompactCategoryHeader("Experimental Settings")); ValueThresholds thresholdsDisabled(0, 0); - if(IsMariko()) { + if (IsMariko()) { addConfigToggle(HocClkConfigValue_MarikoMiddleFreqs, nullptr, true); addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); } @@ -730,35 +666,20 @@ protected: NamedValue("INI", GpuSchedulingOverrideMethod_Ini), NamedValue("NV Service", GpuSchedulingOverrideMethod_NvService), }; - addConfigButton( - HocClkConfigValue_GPUSchedulingMethod, - "GPU Scheduling Override Method", - ValueRange(0, 0, 1, "", 0), - "GPU Scheduling Override Method", - &thresholdsDisabled, - {}, - gpuSchedMethodValues, - false - ); + addConfigButton(HocClkConfigValue_GPUSchedulingMethod, "GPU Scheduling Override Method", ValueRange(0, 0, 1, "", 0), + "GPU Scheduling Override Method", &thresholdsDisabled, {}, gpuSchedMethodValues, false); - addConfigButton(KipConfigValue_marikoGpuBootVolt, "GPU Boot Volt", ValueRange(700, 800, 5, "mV", 1), "GPU Boot Voltage", &thresholdsDisabled, {}, {}, false, true); + addConfigButton(KipConfigValue_marikoGpuBootVolt, "GPU Boot Volt", ValueRange(700, 800, 5, "mV", 1), "GPU Boot Voltage", &thresholdsDisabled, + {}, {}, false, true); std::vector ramRFMeasurementMethods = { NamedValue("PLL", MemoryFrequencyMeasurementMode_PLL), NamedValue("Actmon", MemoryFrequencyMeasurementMode_Actmon), }; - addConfigButton( - HocClkConfigValue_MemoryFrequencyMeasurementMode, - "Memory Frequency Measurement Mode", - ValueRange(0, 0, 1, "", 0), - "Memory Frequency Measurement Mode", - &thresholdsDisabled, - {}, - ramRFMeasurementMethods, - false - ); + addConfigButton(HocClkConfigValue_MemoryFrequencyMeasurementMode, "Memory Frequency Measurement Mode", ValueRange(0, 0, 1, "", 0), + "Memory Frequency Measurement Mode", &thresholdsDisabled, {}, ramRFMeasurementMethods, false); - tsl::elm::CustomDrawer* chargeWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *chargeWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Overriding the charge current", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("can be dangerous and may cause", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("damage to your battery or charger!", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -766,60 +687,58 @@ protected: chargeWarningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 90); this->listElement->addItem(chargeWarningText); - if(!IsHoag()) { - std::vector chargerCurrents = { - NamedValue("Disabled", 0), - NamedValue("1024mA", 1024), - NamedValue("1280mA", 1280), - NamedValue("1536mA", 1536), - NamedValue("1792mA", 1792), - NamedValue("2048mA", 2048), - NamedValue("2304mA", 2304), - NamedValue("2560mA", 2560), - NamedValue("2816mA", 2816), - NamedValue("3072mA", 3072), - }; + if (!IsHoag()) { + std::vector chargerCurrents = { + NamedValue("Disabled", 0), NamedValue("1024mA", 1024), NamedValue("1280mA", 1280), NamedValue("1536mA", 1536), + NamedValue("1792mA", 1792), NamedValue("2048mA", 2048), NamedValue("2304mA", 2304), NamedValue("2560mA", 2560), + NamedValue("2816mA", 2816), NamedValue("3072mA", 3072), + }; - ValueThresholds chargerThresholds(2048, 2049); + ValueThresholds chargerThresholds(2048, 2049); - addConfigButton( - HocClkConfigValue_BatteryChargeCurrent, - "Charge Current Override", - ValueRange(0, 0, 1, "", 0), - "Charge Current Override", - &chargerThresholds, - {}, - chargerCurrents, - false - ); + addConfigButton(HocClkConfigValue_BatteryChargeCurrent, "Charge Current Override", ValueRange(0, 0, 1, "", 0), "Charge Current Override", + &chargerThresholds, {}, chargerCurrents, false); } else { std::vector chargerCurrents = { - NamedValue("Disabled", 0), - NamedValue("1024mA", 1024), - NamedValue("1280mA", 1280), - NamedValue("1536mA", 1536), - NamedValue("1664mA", 1664), // Why Nintendo? - NamedValue("1792mA", 1792), - NamedValue("2048mA", 2048), - NamedValue("2304mA", 2304), - NamedValue("2560mA", 2560), + NamedValue("Disabled", 0), NamedValue("1024mA", 1024), NamedValue("1280mA", 1280), NamedValue("1536mA", 1536), + NamedValue("1664mA", 1664), // Why Nintendo? + NamedValue("1792mA", 1792), NamedValue("2048mA", 2048), NamedValue("2304mA", 2304), NamedValue("2560mA", 2560), }; ValueThresholds chargerThresholds(1664, 1793); - addConfigButton( - HocClkConfigValue_BatteryChargeCurrent, - "Charge Current Override", - ValueRange(0, 0, 1, "", 0), - "Charge Current Override", - &chargerThresholds, - {}, - chargerCurrents, - false - ); - + addConfigButton(HocClkConfigValue_BatteryChargeCurrent, "Charge Current Override", ValueRange(0, 0, 1, "", 0), "Charge Current Override", + &chargerThresholds, {}, chargerCurrents, false); } - if(IsAula()) { + + tsl::elm::CustomDrawer *inputLimitWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + renderer->drawString("\uE150 Overriding the input current", false, x + 20, y + 30, 18, tsl::style::color::ColorText); + renderer->drawString("limit increases power draw from", false, x + 20, y + 50, 18, tsl::style::color::ColorText); + renderer->drawString("your charger. And board stress ", false, x + 20, y + 70, 18, tsl::style::color::ColorText); + renderer->drawString("use 1500mA max.", false, x + 20, y + 90, 18, tsl::style::color::ColorText); + }); + inputLimitWarningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); + this->listElement->addItem(inputLimitWarningText); + + // having an option for hoag would be cool and disabling 100-500 and 2000+ + std::vector inputCurrentLimits = { + NamedValue("Disabled", 0), + NamedValue("100mA", 100), + NamedValue("150mA", 150), + NamedValue("500mA", 500), + NamedValue("900mA", 900, "Hoag Default"), + NamedValue("1200mA", 1200, "Default"), + NamedValue("1500mA", 1500), + NamedValue("2000mA", 2000), + NamedValue("3000mA", 3000), + }; + + ValueThresholds inputLimitThresholds(1500, 1501); + + addConfigButton(HocClkConfigValue_InputCurrentLimit, "Input Current Limit Override", ValueRange(0, 0, 1, "", 0), + "Input Current Limit Override", &inputLimitThresholds, {}, inputCurrentLimits, false); + + if (IsAula()) { std::vector displayClrPreset = { NamedValue("Do Not Override", AulaDisplayColorMode_DoNotOverride), NamedValue("Basic", AulaDisplayColorMode_Basic), @@ -833,75 +752,59 @@ protected: NamedValue("Vivid", AulaDisplayColorMode_Night3, "Night"), }; - addConfigButton( - HocClkConfigValue_AulaDisplayColorPreset, - "Display Color Preset", - ValueRange(0, 1, 1, "", 0), - "Display Color Preset", - &thresholdsDisabled, - {}, - displayClrPreset, - false, - false - ); + addConfigButton(HocClkConfigValue_AulaDisplayColorPreset, "Display Color Preset", ValueRange(0, 1, 1, "", 0), "Display Color Preset", + &thresholdsDisabled, {}, displayClrPreset, false, false); } } }; - class GovernorSettingsSubMenuGui : public MiscGui { -public: - GovernorSettingsSubMenuGui() { } + public: + GovernorSettingsSubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } this->listElement->addItem(new CompactCategoryHeader("Governor Settings")); ValueThresholds thresholdsDisabled(0, 0); std::vector GovernorMinHz = { - NamedValue("510 MHz", 510000000), - NamedValue("612 MHz", 612000000), - NamedValue("714 MHz", 714000000), - NamedValue("816 MHz", 816000000), - NamedValue("918 MHz", 918000000), - NamedValue("1020 MHz", 1020000000), + NamedValue("510 MHz", 510000000), NamedValue("612 MHz", 612000000), NamedValue("714 MHz", 714000000), + NamedValue("816 MHz", 816000000), NamedValue("918 MHz", 918000000), NamedValue("1020 MHz", 1020000000), }; - addConfigButton( - HocClkConfigValue_CpuGovernorMinimumFreq, - "CPU Governor Minimum Frequency", - ValueRange(0, 0, 1, "", 0), - "CPU Governor Minimum Frequency", - &thresholdsDisabled, - {}, - GovernorMinHz, - false - ); - + addConfigButton(HocClkConfigValue_CpuGovernorMinimumFreq, "CPU Governor Minimum Frequency", ValueRange(0, 0, 1, "", 0), + "CPU Governor Minimum Frequency", &thresholdsDisabled, {}, GovernorMinHz, false); } }; - class DisplaySubMenuGui : public MiscGui { -public: - DisplaySubMenuGui() { } + public: + DisplaySubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } ValueThresholds thresholdsDisabled(0, 0); - BaseMenuGui::refresh(); // get latest context - if(!this->context) + BaseMenuGui::refresh(); // get latest context + if (!this->context) return; this->listElement->addItem(new CompactCategoryHeader("Display Settings")); addConfigToggle(HocClkConfigValue_OverwriteRefreshRate, nullptr); - if(!this->context->isUsingRetroSuper) { - tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + if (!this->context->isUsingRetroSuper) { + tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Usage of unsafe display", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("refresh rates may cause stress", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("or damage to your display! ", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -911,19 +814,11 @@ protected: warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); this->listElement->addItem(warningText); ValueThresholds displayThresholds(60, 65); - addConfigButton( - HocClkConfigValue_MaxDisplayClockH, - "Max Handheld Display Hz", - ValueRange(60, IsAula() ? 65 : 75, 1, " Hz", 1), - "Display Clock", - &displayThresholds, - {}, - {}, - false - ); + addConfigButton(HocClkConfigValue_MaxDisplayClockH, "Max Handheld Display Hz", ValueRange(60, IsAula() ? 65 : 75, 1, " Hz", 1), + "Display Clock", &displayThresholds, {}, {}, false); } - if(!IsAula()) { - tsl::elm::CustomDrawer* warningTextDV = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + if (!IsAula()) { + tsl::elm::CustomDrawer *warningTextDV = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Adjust the display voltage", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("with caution to avoid damage", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("to your display panel! ", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -931,76 +826,69 @@ protected: }); warningTextDV->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); this->listElement->addItem(warningTextDV); - addConfigButton( - HocClkConfigValue_DisplayVoltage, - "Display Voltage", - ValueRange(800, 1200, 25, " mV", 1), - "Display Voltage", - &thresholdsDisabled, - {}, - {}, - false - ); + addConfigButton(HocClkConfigValue_DisplayVoltage, "Display Voltage", ValueRange(800, 1200, 25, " mV", 1), "Display Voltage", + &thresholdsDisabled, {}, {}, false); } } }; class SafetySubMenuGui : public MiscGui { -public: - SafetySubMenuGui() { } + public: + SafetySubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } this->listElement->addItem(new CompactCategoryHeader("Safety Settings")); addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr); addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr); - #if IS_MINIMAL == 0 - ValueThresholds throttleThresholds(70, 80); - addConfigButton( - HocClkConfigValue_ThermalThrottleThreshold, - "Thermal Throttle Limit", - ValueRange(50, 85, 1, "°C", 1), - "Temp", - &throttleThresholds - ); - #endif +#if IS_MINIMAL == 0 + ValueThresholds throttleThresholds(70, 80); + addConfigButton(HocClkConfigValue_ThermalThrottleThreshold, "Thermal Throttle Limit", ValueRange(50, 85, 1, "°C", 1), "Temp", + &throttleThresholds); +#endif } }; class RamSubmenuGui : public MiscGui { -public: - RamSubmenuGui() { } + public: + RamSubmenuGui() { + } -protected: + protected: void listUI() override { BaseMenuGui::refresh(); - if(!this->context) + if (!this->context) return; Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } ValueThresholds thresholdsDisabled(0, 0); std::vector noNamedValues = {}; - - this->listElement->addItem(new CompactCategoryHeader("RAM Settings")); addMappedConfigTrackbar(KipConfigValue_emcDvbShift, "DVB Shift", - {0xFFFFFFFCu, 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u}, - {"-4", "-3", "-2", "-1", " 0", "1", "2", "3", "4", "5", "6", "7", "8"}); + { 0xFFFFFFFCu, 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u }, + { "-4", "-3", "-2", "-1", " 0", "1", "2", "3", "4", "5", "6", "7", "8" }); - if(IsMariko()) { + if (IsMariko()) { u32 socSpeedo = this->context->speedos[HocClkSpeedo_SOC]; std::string autoText = "1000 mV"; if (socSpeedo <= 1597) { autoText = "1050 mV"; } else if (socSpeedo <= 1708) { autoText = "1025 mV"; - } else if(socSpeedo >= 1709) { + } else if (socSpeedo >= 1709) { autoText = "1000 mV"; } @@ -1018,70 +906,40 @@ protected: }; ValueThresholds marikovmaxT(1075, 1150); - addConfigButton( - KipConfigValue_marikoSocVmax, - "SoC Max Volt", - ValueRange(0, 12, 1, "", 0), - "SoC Max Volt", - &marikovmaxT, - {}, - marikovmaxconf, - false, - true - ); + addConfigButton(KipConfigValue_marikoSocVmax, "SoC Max Volt", ValueRange(0, 12, 1, "", 0), "SoC Max Volt", &marikovmaxT, {}, + marikovmaxconf, false, true); } addConfigToggle(KipConfigValue_hpMode, "HP Mode", true); std::map emc_voltage_label = { - {1100000, "Default (Mariko)"}, - {1125000, "Default (Erista)"}, - {1175000, "Rating"}, - {1212500, "Safe Max (Mariko)"}, - {1237500, "Safe Max (Erista)"}, - {1250000, "Unsafe Max"}, + { 1100000, "Default (Mariko)" }, { 1125000, "Default (Erista)" }, { 1175000, "Rating" }, + { 1212500, "Safe Max (Mariko)" }, { 1237500, "Safe Max (Erista)" }, { 1250000, "Unsafe Max" }, }; ValueThresholds vdd2Thresholds(IsMariko() ? 1212500 : 1237500, IsMariko() ? 1250000 : 1275000); - addConfigButton( - KipConfigValue_commonEmcMemVolt, - "RAM VDD2 Voltage", - ValueRange(912500, 1350000, 12500, "mV", 1000, 1), - "Voltage", - &vdd2Thresholds, - emc_voltage_label, - noNamedValues, - false, - true - ); + addConfigButton(KipConfigValue_commonEmcMemVolt, "RAM VDD2 Voltage", ValueRange(912500, 1350000, 12500, "mV", 1000, 1), "Voltage", + &vdd2Thresholds, emc_voltage_label, noNamedValues, false, true); - if(IsMariko()) { + if (IsMariko()) { ValueThresholds vddqThresholds(675000, 725000); - addConfigButton( - KipConfigValue_marikoEmcVddqVolt, - "RAM VDDQ Voltage", - ValueRange(400000, 750000, 5000, "mV", 1000), - "RAM VDDQ Voltage", - &vddqThresholds, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoEmcVddqVolt, "RAM VDDQ Voltage", ValueRange(400000, 750000, 5000, "mV", 1000), "RAM VDDQ Voltage", + &vddqThresholds, {}, {}, false, true); } if (IsMariko()) { std::vector stepMode = { NamedValue("66MHz", 0), NamedValue("100MHz", 1), - NamedValue("133MHz", 3), // Mantain compatability + NamedValue("133MHz", 3), // Mantain compatability NamedValue("JEDEC.", 2), }; - addConfigButton(KipConfigValue_stepMode, "Step Mode", ValueRange(0, 0, 2, "", 0), "Step Mode", &thresholdsDisabled, {}, stepMode, false, true); + addConfigButton(KipConfigValue_stepMode, "Step Mode", ValueRange(0, 0, 2, "", 0), "Step Mode", &thresholdsDisabled, {}, stepMode, false, + true); } - std::vector emcMaxClock = { }; + std::vector emcMaxClock = {}; RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; if (IsErista()) { @@ -1182,19 +1040,21 @@ protected: }; } - for (auto& nv : emcMaxClock) { + for (auto &nv : emcMaxClock) { if (nv.name != "Disabled") { nv.name = formatMemClockKhzLabel(nv.value, unit); } } if (IsMariko()) { - addConfigButton(KipConfigValue_marikoEmcMaxClock, "Ram Max Clock", ValueRange(0, 1, 1, "", 1), "Ram Max Clock", &thresholdsDisabled, {}, emcMaxClock, false, true); + addConfigButton(KipConfigValue_marikoEmcMaxClock, "Ram Max Clock", ValueRange(0, 1, 1, "", 1), "Ram Max Clock", &thresholdsDisabled, {}, + emcMaxClock, false, true); } else { - addConfigButton(KipConfigValue_eristaEmcMaxClock, "Ram Max Clock", ValueRange(0, 1, 1, "", 1), "Ram Max Clock", &thresholdsDisabled, {}, emcMaxClock, false, true); + addConfigButton(KipConfigValue_eristaEmcMaxClock, "Ram Max Clock", ValueRange(0, 1, 1, "", 1), "Ram Max Clock", &thresholdsDisabled, {}, + emcMaxClock, false, true); } - tsl::elm::ListItem* latenciesSubmenu = new tsl::elm::ListItem("RAM Latency Editor"); + tsl::elm::ListItem *latenciesSubmenu = new tsl::elm::ListItem("RAM Latency Editor"); latenciesSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -1205,7 +1065,7 @@ protected: latenciesSubmenu->setValue(R_ARROW); this->listElement->addItem(latenciesSubmenu); - tsl::elm::ListItem* timingsSubmenu = new tsl::elm::ListItem("RAM Timing Reductions"); + tsl::elm::ListItem *timingsSubmenu = new tsl::elm::ListItem("RAM Timing Reductions"); timingsSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -1216,31 +1076,47 @@ protected: timingsSubmenu->setValue(R_ARROW); this->listElement->addItem(timingsSubmenu); + if (IsMariko()) { + tsl::elm::ListItem *socVoltageTable = new tsl::elm::ListItem("SOC Voltage Table"); + socVoltageTable->setClickListener([](u64 keys) { + if (keys & HidNpadButton_A) { + tsl::changeTo(); + return true; + } + return false; + }); + socVoltageTable->setValue(R_ARROW); + this->listElement->addItem(socVoltageTable); + } } }; class RamTimingsSubmenuGui : public MiscGui { -public: - RamTimingsSubmenuGui() { } + public: + RamTimingsSubmenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } this->listElement->addItem(new CompactCategoryHeader("Memory Timings")); - addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); - addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); - addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); - addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); - addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t8_tREFI, "t8 tREFI", ValueRange(0, 6, 1)); + addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); + addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); + addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); + addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); + addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_t8_tREFI, "t8 tREFI", ValueRange(0, 6, 1)); /* Yes this is duplicated code, yes I don't care. */ std::vector timingTbreakFreqs = { - NamedValue("Disabled", 0), + NamedValue("Disabled", 0), NamedValue("1633 MHz", 1633000), NamedValue("1666 MHz", 1666000), NamedValue("1700 MHz", 1700000), @@ -1309,172 +1185,175 @@ protected: ValueThresholds thresholdsDisabled(0, 0); this->listElement->addItem(new CompactCategoryHeader("Advanced")); - if(IsMariko()) { + if (IsMariko()) { // tBreak / low-high timing graph (live, reads config each frame) { - HocClkConfigValueList* cfgPtr = this->configList; - auto* tbreakGraph = new tsl::elm::CustomDrawer( - [cfgPtr](tsl::gfx::Renderer* renderer, s32 x, s32 y, s32 w, s32 h) { - const s32 t6 = (s32)cfgPtr->values[KipConfigValue_t6_tRTW]; - const s32 t7 = (s32)cfgPtr->values[KipConfigValue_t7_tWTR]; - const s32 lt6 = (s32)cfgPtr->values[KipConfigValue_low_t6_tRTW]; - const s32 lt7 = (s32)cfgPtr->values[KipConfigValue_low_t7_tWTR]; - const s32 t2c = (s32)cfgPtr->values[KipConfigValue_t2_tRP_cap]; - const uint32_t tbk = (uint32_t)cfgPtr->values[KipConfigValue_timingEmcTbreak]; + HocClkConfigValueList *cfgPtr = this->configList; + auto *tbreakGraph = new tsl::elm::CustomDrawer([cfgPtr](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + const s32 t6 = (s32)cfgPtr->values[KipConfigValue_t6_tRTW]; + const s32 t7 = (s32)cfgPtr->values[KipConfigValue_t7_tWTR]; + const s32 lt6 = (s32)cfgPtr->values[KipConfigValue_low_t6_tRTW]; + const s32 lt7 = (s32)cfgPtr->values[KipConfigValue_low_t7_tWTR]; + const s32 t2c = (s32)cfgPtr->values[KipConfigValue_t2_tRP_cap]; + const uint32_t tbk = (uint32_t)cfgPtr->values[KipConfigValue_timingEmcTbreak]; - const tsl::Color cT6 = tsl::Color(4, 14, 15, 15); - const tsl::Color cT7 = tsl::Color(15, 9, 2, 15); - const tsl::Color cT2 = tsl::Color(12, 4, 15, 15); - const tsl::Color cAxis = tsl::Color(5, 5, 5, 15); - const tsl::Color cTbk = tsl::Color(7, 7, 7, 10); + const tsl::Color cT6 = tsl::Color(4, 14, 15, 15); + const tsl::Color cT7 = tsl::Color(15, 9, 2, 15); + const tsl::Color cT2 = tsl::Color(12, 4, 15, 15); + const tsl::Color cAxis = tsl::Color(5, 5, 5, 15); + const tsl::Color cTbk = tsl::Color(7, 7, 7, 10); - const s32 gx = x + 52; - const s32 gw = w - 64; - const s32 gy = y + 14; - const s32 gh = 72; - const s32 axisY = gy + gh; + const s32 gx = x + 52; + const s32 gw = w - 64; + const s32 gy = y + 14; + const s32 gh = 72; + const s32 axisY = gy + gh; - // Y: value 0 = bottom, value 9 = top - auto valY = [&](s32 v) -> s32 { return axisY - v * gh / 9; }; + // Y: value 0 = bottom, value 9 = top + auto valY = [&](s32 v) -> s32 { return axisY - v * gh / 9; }; - constexpr uint32_t kRMin = 1600000u, kRMax = 3300000u; - auto freqX = [&](uint32_t kHz) -> s32 { - if (kHz <= kRMin) return gx; - if (kHz >= kRMax) return gx + gw; - return gx + (s32)((uint64_t)(kHz - kRMin) * (uint32_t)gw / (kRMax - kRMin)); - }; + constexpr uint32_t kRMin = 1600000u, kRMax = 3300000u; + auto freqX = [&](uint32_t kHz) -> s32 { + if (kHz <= kRMin) + return gx; + if (kHz >= kRMax) + return gx + gw; + return gx + (s32)((uint64_t)(kHz - kRMin) * (uint32_t)gw / (kRMax - kRMin)); + }; - // Y-axis guide lines at 0, 3, 6, 9 - for (int v : {0, 3, 6, 9}) { - char buf[4]; snprintf(buf, sizeof(buf), "%d", v); - renderer->drawString(buf, false, x + 4, valY(v) + 5, 12, cAxis); - renderer->drawRect(gx, valY(v), gw, 1, tsl::Color(3, 3, 3, 15)); - } - renderer->drawRect(gx, gy, 1, gh + 1, cAxis); - renderer->drawRect(gx, axisY, gw, 1, cAxis); - - // tBreak vertical divider - if (tbk != 0) { - s32 tx = freqX(tbk); - renderer->drawRect(tx, gy, 1, gh, cTbk); - } - - // Step line: lowVal below tBreak, hiVal at/above tBreak - auto drawTimingLine = [&](s32 lowVal, s32 hiVal, const tsl::Color& c) { - if (tbk == 0 || tbk <= kRMin) { - s32 yy = valY(hiVal) + 1; - renderer->drawRect(gx, yy, gw, 2, c); - renderer->drawCircle(gx, yy + 1, 3, true, c); - renderer->drawCircle(gx + gw - 1, yy + 1, 3, true, c); - } else { - s32 tx = freqX(tbk); - s32 yLow = valY(lowVal) + 1; - s32 yHi = valY(hiVal) + 1; - renderer->drawRect(gx, yLow, tx - gx, 2, c); - renderer->drawRect(tx, yHi, gx + gw - tx, 2, c); - if (yLow != yHi) { - s32 topY = yLow < yHi ? yLow : yHi; - s32 botY = yLow > yHi ? yLow : yHi; - renderer->drawRect(tx, topY, 2, botY - topY + 2, c); - } - renderer->drawCircle(gx, yLow + 1, 3, true, c); - renderer->drawCircle(tx, yLow + 1, 3, true, c); - renderer->drawCircle(tx, yHi + 1, 3, true, c); - renderer->drawCircle(gx + gw - 1, yHi + 1, 3, true, c); - } - }; - - drawTimingLine(lt6, t6, cT6); - drawTimingLine(lt7, t7, cT7); - - // t2 tRP cap: constant line - s32 yT2 = valY(t2c) + 1; - renderer->drawRect(gx, yT2, gw, 2, cT2); - renderer->drawCircle(gx, yT2 + 1, 3, true, cT2); - renderer->drawCircle(gx + gw - 1, yT2 + 1, 3, true, cT2); - - // X-axis ruler with sideways bitmap-font labels - static const uint8_t kDigBmp[10][5] = { - {7,5,5,5,7},{6,2,2,2,7},{7,1,7,4,7},{7,1,3,1,7},{5,5,7,1,1}, - {7,4,7,1,7},{7,4,7,5,7},{7,1,1,2,2},{7,5,7,5,7},{7,5,7,1,7}, - }; - const s32 pix = 2, charH = 3*pix, charW = 5*pix, charGap = 1; - auto drawSidewaysMHz = [&](uint32_t mhz, s32 cx, s32 startY, const tsl::Color& c) { - char buf[8]; snprintf(buf, sizeof(buf), "%u", mhz); - s32 ox = cx - charW / 2; - for (int ci = 0; buf[ci]; ci++) { - int d = buf[ci] - '0'; - if (d < 0 || d > 9) continue; - s32 cy = startY + ci * (charH + charGap); - for (int r = 0; r < 5; r++) - for (int col = 0; col < 3; col++) - if ((kDigBmp[d][r] >> (2-col)) & 1) - renderer->drawRect(ox + (4-r)*pix, cy + col*pix, pix, pix, c); - } - }; - static const uint32_t kRulerMHz[] = { - 1600, 1733, 1866, 2000, 2133, 2266, - 2400, 2533, 2666, 2800, 2933, 3066, 3200, 3300, - }; - for (uint32_t mhz : kRulerMHz) { - s32 fx = freqX(mhz * 1000u); - renderer->drawRect(fx, axisY, 1, 4, cAxis); - drawSidewaysMHz(mhz, fx, axisY + 6, cAxis); - } - - // Legend - s32 ly = y + h - 14; - renderer->drawRect(gx, ly, 14, 3, cT6); - renderer->drawString("t6 tRTW", false, gx + 17, ly + 5, 12, cT6); - renderer->drawRect(gx + 80, ly, 14, 3, cT7); - renderer->drawString("t7 tWTR", false, gx + 97, ly + 5, 12, cT7); - renderer->drawRect(gx + 165, ly, 14, 3, cT2); - renderer->drawString("t2 cap", false, gx + 182, ly + 5, 12, cT2); + // Y-axis guide lines at 0, 3, 6, 9 + for (int v : { 0, 3, 6, 9 }) { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", v); + renderer->drawString(buf, false, x + 4, valY(v) + 5, 12, cAxis); + renderer->drawRect(gx, valY(v), gw, 1, tsl::Color(3, 3, 3, 15)); } - ); + renderer->drawRect(gx, gy, 1, gh + 1, cAxis); + renderer->drawRect(gx, axisY, gw, 1, cAxis); + + // tBreak vertical divider + if (tbk != 0) { + s32 tx = freqX(tbk); + renderer->drawRect(tx, gy, 1, gh, cTbk); + } + + // Step line: lowVal below tBreak, hiVal at/above tBreak + auto drawTimingLine = [&](s32 lowVal, s32 hiVal, const tsl::Color &c) { + if (tbk == 0 || tbk <= kRMin) { + s32 yy = valY(hiVal) + 1; + renderer->drawRect(gx, yy, gw, 2, c); + renderer->drawCircle(gx, yy + 1, 3, true, c); + renderer->drawCircle(gx + gw - 1, yy + 1, 3, true, c); + } else { + s32 tx = freqX(tbk); + s32 yLow = valY(lowVal) + 1; + s32 yHi = valY(hiVal) + 1; + renderer->drawRect(gx, yLow, tx - gx, 2, c); + renderer->drawRect(tx, yHi, gx + gw - tx, 2, c); + if (yLow != yHi) { + s32 topY = yLow < yHi ? yLow : yHi; + s32 botY = yLow > yHi ? yLow : yHi; + renderer->drawRect(tx, topY, 2, botY - topY + 2, c); + } + renderer->drawCircle(gx, yLow + 1, 3, true, c); + renderer->drawCircle(tx, yLow + 1, 3, true, c); + renderer->drawCircle(tx, yHi + 1, 3, true, c); + renderer->drawCircle(gx + gw - 1, yHi + 1, 3, true, c); + } + }; + + drawTimingLine(lt6, t6, cT6); + drawTimingLine(lt7, t7, cT7); + + // t2 tRP cap: constant line + s32 yT2 = valY(t2c) + 1; + renderer->drawRect(gx, yT2, gw, 2, cT2); + renderer->drawCircle(gx, yT2 + 1, 3, true, cT2); + renderer->drawCircle(gx + gw - 1, yT2 + 1, 3, true, cT2); + + // X-axis ruler with sideways bitmap-font labels + static const uint8_t kDigBmp[10][5] = { + { 7, 5, 5, 5, 7 }, { 6, 2, 2, 2, 7 }, { 7, 1, 7, 4, 7 }, { 7, 1, 3, 1, 7 }, { 5, 5, 7, 1, 1 }, + { 7, 4, 7, 1, 7 }, { 7, 4, 7, 5, 7 }, { 7, 1, 1, 2, 2 }, { 7, 5, 7, 5, 7 }, { 7, 5, 7, 1, 7 }, + }; + const s32 pix = 2, charH = 3 * pix, charW = 5 * pix, charGap = 1; + auto drawSidewaysMHz = [&](uint32_t mhz, s32 cx, s32 startY, const tsl::Color &c) { + char buf[8]; + snprintf(buf, sizeof(buf), "%u", mhz); + s32 ox = cx - charW / 2; + for (int ci = 0; buf[ci]; ci++) { + int d = buf[ci] - '0'; + if (d < 0 || d > 9) + continue; + s32 cy = startY + ci * (charH + charGap); + for (int r = 0; r < 5; r++) + for (int col = 0; col < 3; col++) + if ((kDigBmp[d][r] >> (2 - col)) & 1) + renderer->drawRect(ox + (4 - r) * pix, cy + col * pix, pix, pix, c); + } + }; + static const uint32_t kRulerMHz[] = { + 1600, 1733, 1866, 2000, 2133, 2266, 2400, 2533, 2666, 2800, 2933, 3066, 3200, 3300, + }; + for (uint32_t mhz : kRulerMHz) { + s32 fx = freqX(mhz * 1000u); + renderer->drawRect(fx, axisY, 1, 4, cAxis); + drawSidewaysMHz(mhz, fx, axisY + 6, cAxis); + } + + // Legend + s32 ly = y + h - 14; + renderer->drawRect(gx, ly, 14, 3, cT6); + renderer->drawString("t6 tRTW", false, gx + 17, ly + 5, 12, cT6); + renderer->drawRect(gx + 80, ly, 14, 3, cT7); + renderer->drawString("t7 tWTR", false, gx + 97, ly + 5, 12, cT7); + renderer->drawRect(gx + 165, ly, 14, 3, cT2); + renderer->drawString("t2 cap", false, gx + 182, ly + 5, 12, cT2); + }); tbreakGraph->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 150); this->listElement->addItem(tbreakGraph); } - addConfigButton(KipConfigValue_timingEmcTbreak, "RAM-Timing tBreak", ValueRange(0, 1, 1, "", 1), "tBreak", &thresholdsDisabled, {}, timingTbreakFreqs, false, true); - addConfigTrackbar(KipConfigValue_low_t6_tRTW, "Low t6 tRTW", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_low_t7_tWTR, "Low t7 tWTR", ValueRange(0, 9, 1)); + addConfigButton(KipConfigValue_timingEmcTbreak, "RAM-Timing tBreak", ValueRange(0, 1, 1, "", 1), "tBreak", &thresholdsDisabled, {}, + timingTbreakFreqs, false, true); + addConfigTrackbar(KipConfigValue_low_t6_tRTW, "Low t6 tRTW", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_low_t7_tWTR, "Low t7 tWTR", ValueRange(0, 9, 1)); { - auto* spacer = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer*, s32, s32, s32, s32){}); + auto *spacer = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {}); spacer->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 8); this->listElement->addItem(spacer); } - addConfigTrackbar(KipConfigValue_t2_tRP_cap, "1333WL t2 RP Cap", ValueRange(0, 8, 1)); + addConfigTrackbar(KipConfigValue_t2_tRP_cap, "1333WL t2 RP Cap", ValueRange(0, 8, 1)); } - addMappedConfigTrackbar(KipConfigValue_t6_tRTW_fine_tune, "t6 tRTW Fine Tune", - {0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u}, - {"-2", "-1", " 0", "+1", "+2"}); - addMappedConfigTrackbar(KipConfigValue_t7_tWTR_fine_tune, "t7 tWTR Fine Tune", - {0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u}, - {"-3", "-2", "-1", " 0", "+1", "+2", "+3"}); + addMappedConfigTrackbar(KipConfigValue_t6_tRTW_fine_tune, "t6 tRTW Fine Tune", { 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u }, + { "-2", "-1", " 0", "+1", "+2" }); + addMappedConfigTrackbar(KipConfigValue_t7_tWTR_fine_tune, "t7 tWTR Fine Tune", { 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u }, + { "-3", "-2", "-1", " 0", "+1", "+2", "+3" }); } }; class RamLatenciesSubmenuGui : public MiscGui { -public: - RamLatenciesSubmenuGui() { } + public: + RamLatenciesSubmenuGui() { + } - tsl::elm::Element* baseUI() override { - auto* list = new TopAnchoredList(); + tsl::elm::Element *baseUI() override { + auto *list = new TopAnchoredList(); this->listElement = list; this->listUI(); return list; } -protected: - + protected: void normalizeLatencies(const HocClkConfigValue keysArr[4]) { - uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; + uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] + : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; uint32_t vals[4]; for (int i = 0; i < 4; i++) { vals[i] = (uint32_t)this->configList->values[keysArr[i]]; - if (vals[i] == 0xFFFFFFFFu) vals[i] = maxClock; + if (vals[i] == 0xFFFFFFFFu) + vals[i] = maxClock; } uint32_t currentLimit = 0; @@ -1489,10 +1368,13 @@ protected: uint32_t last = 0; for (int i = 0; i < 4; i++) { - if (vals[i] == 0) continue; + if (vals[i] == 0) + continue; - if (vals[i] < last) vals[i] = last; - if (vals[i] > maxClock) vals[i] = maxClock; + if (vals[i] < last) + vals[i] = last; + if (vals[i] > maxClock) + vals[i] = maxClock; last = vals[i]; } @@ -1510,29 +1392,23 @@ protected: return; } - uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; + uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] + : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; - static std::vector kFreqOptions = { }; + static std::vector kFreqOptions = {}; if (IsMariko()) { kFreqOptions = { - 1633000, 1666000, 1700000, 1733000, 1766000, 1800000, - 1833000, 1866000, 1900000, 1933000, 1966000, 1996800, 2000000, - 2033000, 2066000, 2100000, 2133000, 2166000, 2200000, 2233000, - 2266000, 2300000, 2333000, 2366000, 2400000, 2433000, 2466000, - 2500000, 2533000, 2566000, 2600000, 2633000, 2666000, 2700000, - 2733000, 2766000, 2800000, 2833000, 2866000, 2900000, 2933000, - 2966000, 3000000, 3033000, 3066000, 3100000, 3133000, 3166000, - 3200000, 3233000, 3266000, 3300000, + 1633000, 1666000, 1700000, 1733000, 1766000, 1800000, 1833000, 1866000, 1900000, 1933000, 1966000, 1996800, 2000000, + 2033000, 2066000, 2100000, 2133000, 2166000, 2200000, 2233000, 2266000, 2300000, 2333000, 2366000, 2400000, 2433000, + 2466000, 2500000, 2533000, 2566000, 2600000, 2633000, 2666000, 2700000, 2733000, 2766000, 2800000, 2833000, 2866000, + 2900000, 2933000, 2966000, 3000000, 3033000, 3066000, 3100000, 3133000, 3166000, 3200000, 3233000, 3266000, 3300000, }; } else { kFreqOptions = { - 1633000, 1666000, 1700000, 1733000, 1800000, - 1833000, 1862400, 1881600, 1900800, 1920000, 1939200, - 1958400, 1977600, 1996800, 2016000, 2035200, 2054400, - 2073600, 2092800, 2112000, 2131200, 2150400, 2169600, - 2188800, 2208000, 2227200, 2246400, 2265600, 2284800, - 2304000, 2323200, 2342400, 2361600, 2380800, 2400000, + 1633000, 1666000, 1700000, 1733000, 1800000, 1833000, 1862400, 1881600, 1900800, 1920000, 1939200, 1958400, + 1977600, 1996800, 2016000, 2035200, 2054400, 2073600, 2092800, 2112000, 2131200, 2150400, 2169600, 2188800, + 2208000, 2227200, 2246400, 2265600, 2284800, 2304000, 2323200, 2342400, 2361600, 2380800, 2400000, }; } @@ -1549,7 +1425,7 @@ protected: KipConfigValue_write_latency_2133, }; - static const char* kTierLabels[4] = { "1333 Latency Max", "1600 Latency Max", "1866 Latency Max", "2133 Latency Max" }; + static const char *kTierLabels[4] = { "1333 Latency Max", "1600 Latency Max", "1866 Latency Max", "2133 Latency Max" }; auto buildNamedValues = [&](int tierIdx) -> std::vector { std::vector nv; @@ -1559,7 +1435,8 @@ protected: nv.push_back(NamedValue(formatMemClockKhzLabel(maxClock, unit), 0xFFFFFFFFu)); } else { for (uint32_t freq : kFreqOptions) { - if (freq > maxClock) continue; + if (freq > maxClock) + continue; nv.push_back(NamedValue(formatMemClockKhzLabel(freq, unit), freq)); } nv.push_back(NamedValue(formatMemClockKhzLabel(maxClock, unit), maxClock)); @@ -1569,16 +1446,18 @@ protected: }; auto makeValueText = [&](uint32_t rawVal) -> std::string { - if (rawVal == 0) return "-"; - if (rawVal == 0xFFFFFFFFu) return formatMemClockKhzLabel(maxClock, unit); + if (rawVal == 0) + return "-"; + if (rawVal == 0xFFFFFFFFu) + return formatMemClockKhzLabel(maxClock, unit); return formatMemClockKhzLabel(rawVal, unit); }; - auto addLatencyRow = [&](const char* label, int tierIdx, const HocClkConfigValue keysArr[4]) { + auto addLatencyRow = [&](const char *label, int tierIdx, const HocClkConfigValue keysArr[4]) { HocClkConfigValue thisKey = keysArr[tierIdx]; uint32_t currentVal = (uint32_t)this->configList->values[thisKey]; - tsl::elm::ListItem* item = new tsl::elm::ListItem(label); + tsl::elm::ListItem *item = new tsl::elm::ListItem(label); item->setValue(makeValueText(currentVal)); item->setClickListener([this, tierIdx, thisKey, keysArr, label](u64 keys) -> bool { @@ -1594,12 +1473,11 @@ protected: for (int i = 0; i < 4; i++) vals[i] = (uint32_t)this->configList->values[keysArr[i]]; - uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; + uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] + : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; - auto resolveVal = [maxClock](uint32_t v) -> uint32_t { - return (v == 0xFFFFFFFFu) ? maxClock : v; - }; + auto resolveVal = [maxClock](uint32_t v) -> uint32_t { return (v == 0xFFFFFFFFu) ? maxClock : v; }; if (tierIdx == 3) { bool maxOccupied = false; @@ -1623,9 +1501,7 @@ protected: } tsl::changeTo( - displayCurrent, - ValueRange(0, 0, 1, "", 1), - std::string("2133 Latency Max"), + displayCurrent, ValueRange(0, 0, 1, "", 1), std::string("2133 Latency Max"), [this, thisKey, keysArr](uint32_t chosen) -> bool { this->configList->values[thisKey] = chosen; Result rc = hocclkIpcSetConfigValues(this->configList); @@ -1637,12 +1513,7 @@ protected: this->lastContextUpdate = armGetSystemTick(); return true; }, - ValueThresholds(), false, - std::map{}, - opts, - false, - false - ); + ValueThresholds(), false, std::map{}, opts, false, false); return true; } @@ -1669,22 +1540,27 @@ protected: std::vector opts; opts.push_back(NamedValue("-", 0u)); for (uint32_t freq : kFreqOptions) { - if (freq <= lowerBound) continue; - if (freq > maxClock) continue; - if (upperBound != 0 && freq >= upperBound) continue; + if (freq <= lowerBound) + continue; + if (freq > maxClock) + continue; + if (upperBound != 0 && freq >= upperBound) + continue; opts.push_back(NamedValue(formatMemClockKhzLabel(freq, unit), freq)); } uint32_t displayCurrent = resolveVal(vals[tierIdx]); bool currentInList = false; - for (auto& nv : opts) - if (nv.value == displayCurrent) { currentInList = true; break; } - if (!currentInList) displayCurrent = 0; + for (auto &nv : opts) + if (nv.value == displayCurrent) { + currentInList = true; + break; + } + if (!currentInList) + displayCurrent = 0; tsl::changeTo( - displayCurrent, - ValueRange(0, 0, 1, "", 1), - std::string("Latency Max"), + displayCurrent, ValueRange(0, 0, 1, "", 1), std::string("Latency Max"), [this, thisKey, keysArr](uint32_t chosen) -> bool { this->configList->values[thisKey] = chosen; normalizeLatencies(keysArr); @@ -1697,230 +1573,252 @@ protected: this->lastContextUpdate = armGetSystemTick(); return true; }, - ValueThresholds(), false, - std::map{}, - opts, - false, - false - ); + ValueThresholds(), false, std::map{}, opts, false, false); return true; }); this->listElement->addItem(item); this->configButtons[thisKey] = item; - this->configRanges[thisKey] = ValueRange(0, 0, 1, "", 1); + this->configRanges[thisKey] = ValueRange(0, 0, 1, "", 1); this->configNamedValues[thisKey] = buildNamedValues(tierIdx); }; this->listElement->addItem(new CompactCategoryHeader("Latency Graph")); { - HocClkConfigValueList* cfgPtr = this->configList; + HocClkConfigValueList *cfgPtr = this->configList; bool mariko = IsMariko(); - auto* graph = new tsl::elm::CustomDrawer( - [cfgPtr, mariko](tsl::gfx::Renderer* renderer, s32 x, s32 y, s32 w, s32 h) { - static const HocClkConfigValue kR[4] = { - KipConfigValue_read_latency_1333, KipConfigValue_read_latency_1600, - KipConfigValue_read_latency_1866, KipConfigValue_read_latency_2133, - }; - static const HocClkConfigValue kW[4] = { - KipConfigValue_write_latency_1333, KipConfigValue_write_latency_1600, - KipConfigValue_write_latency_1866, KipConfigValue_write_latency_2133, - }; + auto *graph = new tsl::elm::CustomDrawer([cfgPtr, mariko](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + static const HocClkConfigValue kR[4] = { + KipConfigValue_read_latency_1333, + KipConfigValue_read_latency_1600, + KipConfigValue_read_latency_1866, + KipConfigValue_read_latency_2133, + }; + static const HocClkConfigValue kW[4] = { + KipConfigValue_write_latency_1333, + KipConfigValue_write_latency_1600, + KipConfigValue_write_latency_1866, + KipConfigValue_write_latency_2133, + }; - uint32_t capMax = mariko - ? (uint32_t)cfgPtr->values[KipConfigValue_marikoEmcMaxClock] - : (uint32_t)cfgPtr->values[KipConfigValue_eristaEmcMaxClock]; + uint32_t capMax = + mariko ? (uint32_t)cfgPtr->values[KipConfigValue_marikoEmcMaxClock] : (uint32_t)cfgPtr->values[KipConfigValue_eristaEmcMaxClock]; - uint32_t rv[4], wv[4]; - for (int i = 0; i < 4; i++) { - rv[i] = (uint32_t)cfgPtr->values[kR[i]]; - wv[i] = (uint32_t)cfgPtr->values[kW[i]]; - if (rv[i] == 0xFFFFFFFFu) rv[i] = capMax; - if (wv[i] == 0xFFFFFFFFu) wv[i] = capMax; - } - - const tsl::Color cRead = tsl::Color(4, 14, 15, 15); - const tsl::Color cWrite = tsl::Color(15, 9, 2, 15); - const tsl::Color cMerge = tsl::Color(5, 15, 4, 15); - const tsl::Color cAxis = tsl::Color(5, 5, 5, 15); - - const s32 gx = x + (mariko ? 52 : 47); - const s32 gw = w - (mariko ? 64 : 59); - const s32 gy = y + 14; - const s32 gh = 54; - const s32 th = gh / 3; - const s32 axisY = gy + gh; - - auto tierY = [&](int i) -> s32 { return gy + gh - i * th; }; - const uint32_t kRMin = 1600000u; - const uint32_t kRMax = mariko ? 3300000u : 2400000u; - auto freqX = [&](uint32_t kHz) -> s32 { - if (kHz <= kRMin) return gx; - if (kHz >= kRMax) return gx + gw; - return gx + (s32)((uint64_t)(kHz - kRMin) * (uint32_t)gw / (kRMax - kRMin)); - }; - - const char* tierLabels[4] = {"1333", "1600", "1866", "2133"}; - for (int i = 0; i < 4; i++) { - renderer->drawString(tierLabels[i], false, x + 4, tierY(i) + 5, 12, cAxis); - renderer->drawRect(gx, tierY(i), gw, 1, cAxis); - } - renderer->drawRect(gx, gy, 1, gh + 1, cAxis); - renderer->drawRect(gx, axisY, gw, 1, cAxis); - - struct LatSeg { int tier; uint32_t start, end; }; - auto buildSegs = [&](const uint32_t* vals) -> std::vector { - struct Pt { int tier; uint32_t freq; }; - Pt pts[4]; int n = 0; - for (int i = 0; i < 4; i++) - if (vals[i] != 0) pts[n++] = {i, vals[i]}; - if (n == 0) return {}; - std::vector segs; - uint32_t prev = kRMin; - for (int k = 0; k < n; k++) { - if (pts[k].freq > prev) - segs.push_back({pts[k].tier, prev, pts[k].freq}); - prev = pts[k].freq; - } - if (prev < kRMax) - segs.push_back({pts[n-1].tier, prev, kRMax}); - return segs; - }; - - auto rSegs = buildSegs(rv); - auto wSegs = buildSegs(wv); - - auto drawSeriesSegs = [&](const std::vector& segs, - const std::vector& other, - const tsl::Color& c, s32 yOff) - { - for (const auto& seg : segs) { - s32 ty = tierY(seg.tier) + yOff; - s32 tyMrg = tierY(seg.tier); - struct Iv { uint32_t s, e; }; - Iv ovlp[4]; int no = 0; - for (const auto& os : other) { - if (os.tier != seg.tier) continue; - uint32_t s = seg.start > os.start ? seg.start : os.start; - uint32_t e = seg.end < os.end ? seg.end : os.end; - if (s < e) ovlp[no++] = {s, e}; - } - for (int a = 1; a < no; a++) - for (int b = a; b > 0 && ovlp[b-1].s > ovlp[b].s; b--) - { auto t = ovlp[b]; ovlp[b] = ovlp[b-1]; ovlp[b-1] = t; } - uint32_t cur = seg.start; - for (int oi = 0; oi < no; oi++) { - if (cur < ovlp[oi].s) { - s32 x0 = freqX(cur), x1 = freqX(ovlp[oi].s); - if (x1 > x0) renderer->drawRect(x0, ty, x1-x0, 2, c); - } - s32 x0 = freqX(ovlp[oi].s), x1 = freqX(ovlp[oi].e); - if (x1 > x0) renderer->drawRect(x0, tyMrg, x1-x0, 2, cMerge); - cur = ovlp[oi].e; - } - if (cur < seg.end) { - s32 x0 = freqX(cur), x1 = freqX(seg.end); - if (x1 > x0) renderer->drawRect(x0, ty, x1-x0, 2, c); - } - } - for (int k = 0; k+1 < (int)segs.size(); k++) { - if (segs[k].end != segs[k+1].start) continue; - uint32_t transFreq = segs[k].end; - bool otherHere = false; - for (int j = 0; j+1 < (int)other.size(); j++) - if (other[j].end == transFreq && other[j+1].start == transFreq) - { otherHere = true; break; } - s32 fx = freqX(transFreq); - s32 y1 = tierY(segs[k].tier) + yOff; - s32 y2 = tierY(segs[k+1].tier) + yOff; - s32 topY = y1 < y2 ? y1 : y2; - s32 botY = y1 > y2 ? y1 : y2; - if (botY > topY) - renderer->drawRect(fx, topY, 2, botY - topY + 2, otherHere ? cMerge : c); - } - }; - - drawSeriesSegs(rSegs, wSegs, cRead, 0); - drawSeriesSegs(wSegs, rSegs, cWrite, 0); - - static const uint8_t kDigBmp[10][5] = { - {7,5,5,5,7}, // 0 - {6,2,2,2,7}, // 1 - {7,1,7,4,7}, // 2 - {7,1,3,1,7}, // 3 - {5,5,7,1,1}, // 4 - {7,4,7,1,7}, // 5 - {7,4,7,5,7}, // 6 - {7,1,1,2,2}, // 7 - {7,5,7,5,7}, // 8 - {7,5,7,1,7}, // 9 - }; - const s32 charGap = 1; - - auto drawSidewaysMHz = [&](uint32_t mhz, s32 cx, s32 startY, const tsl::Color& c, s32 pixSize) { - char buf[8]; - snprintf(buf, sizeof(buf), "%u", mhz); - s32 cW = 5 * pixSize; - s32 cH = 3 * pixSize; - s32 originX = cx - cW / 2; - for (int ci = 0; buf[ci]; ci++) { - int d = buf[ci] - '0'; - if (d < 0 || d > 9) continue; - s32 cy = startY + ci * (cH + charGap); - for (int r = 0; r < 5; r++) { - for (int col = 0; col < 3; col++) { - if (!((kDigBmp[d][r] >> (2 - col)) & 1)) continue; - renderer->drawRect(originX + (4-r)*pixSize, cy + col*pixSize, pixSize, pixSize, c); - } - } - } - }; - - if (mariko) { - static const uint32_t kRulerMHz[] = { - 1600, 1733, 1866, 2000, 2133, 2266, - 2400, 2533, 2666, 2800, 2933, 3066, 3200, 3300, - }; - for (uint32_t mhz : kRulerMHz) { - s32 fx = freqX(mhz * 1000u); - renderer->drawRect(fx, axisY, 1, 4, cAxis); - drawSidewaysMHz(mhz, fx, axisY + 6, cAxis, 2); - } - } else { - static const uint32_t kEristaRulerMHz[] = { - 1600, 1666, 1733, 1800, 1866, 1933, - 2000, 2066, 2133, 2200, 2266, 2333, 2400, - }; - for (uint32_t mhz : kEristaRulerMHz) { - s32 fx = freqX(mhz * 1000u); - renderer->drawRect(fx, axisY, 1, 4, cAxis); - drawSidewaysMHz(mhz, fx, axisY + 6, cAxis, 2); - } - } - - // Breakpoint dots - for (int i = 0; i < 4; i++) { - s32 ty = tierY(i) + 1; - bool merged = (rv[i] != 0 && rv[i] == wv[i]); - if (merged) { - renderer->drawCircle(freqX(rv[i]), ty, 4, true, cMerge); - } else { - if (rv[i]) renderer->drawCircle(freqX(rv[i]), ty, 4, true, cRead); - if (wv[i]) renderer->drawCircle(freqX(wv[i]), ty, 4, true, cWrite); - } - } - - const s32 ly = axisY + 46; - renderer->drawRect(gx, ly, 14, 3, cRead); - renderer->drawString("Read", false, gx + 17, ly + 5, 12, cRead); - renderer->drawRect(gx + 60, ly, 14, 3, cWrite); - renderer->drawString("Write", false, gx + 77, ly + 5, 12, cWrite); - renderer->drawRect(gx + 125, ly, 14, 3, cMerge); - renderer->drawString("Same", false, gx + 142, ly + 5, 12, cMerge); + uint32_t rv[4], wv[4]; + for (int i = 0; i < 4; i++) { + rv[i] = (uint32_t)cfgPtr->values[kR[i]]; + wv[i] = (uint32_t)cfgPtr->values[kW[i]]; + if (rv[i] == 0xFFFFFFFFu) + rv[i] = capMax; + if (wv[i] == 0xFFFFFFFFu) + wv[i] = capMax; } - ); + + const tsl::Color cRead = tsl::Color(4, 14, 15, 15); + const tsl::Color cWrite = tsl::Color(15, 9, 2, 15); + const tsl::Color cMerge = tsl::Color(5, 15, 4, 15); + const tsl::Color cAxis = tsl::Color(5, 5, 5, 15); + + const s32 gx = x + (mariko ? 52 : 47); + const s32 gw = w - (mariko ? 64 : 59); + const s32 gy = y + 14; + const s32 gh = 54; + const s32 th = gh / 3; + const s32 axisY = gy + gh; + + auto tierY = [&](int i) -> s32 { return gy + gh - i * th; }; + const uint32_t kRMin = 1600000u; + const uint32_t kRMax = mariko ? 3300000u : 2400000u; + auto freqX = [&](uint32_t kHz) -> s32 { + if (kHz <= kRMin) + return gx; + if (kHz >= kRMax) + return gx + gw; + return gx + (s32)((uint64_t)(kHz - kRMin) * (uint32_t)gw / (kRMax - kRMin)); + }; + + const char *tierLabels[4] = { "1333", "1600", "1866", "2133" }; + for (int i = 0; i < 4; i++) { + renderer->drawString(tierLabels[i], false, x + 4, tierY(i) + 5, 12, cAxis); + renderer->drawRect(gx, tierY(i), gw, 1, cAxis); + } + renderer->drawRect(gx, gy, 1, gh + 1, cAxis); + renderer->drawRect(gx, axisY, gw, 1, cAxis); + + struct LatSeg { + int tier; + uint32_t start, end; + }; + auto buildSegs = [&](const uint32_t *vals) -> std::vector { + struct Pt { + int tier; + uint32_t freq; + }; + Pt pts[4]; + int n = 0; + for (int i = 0; i < 4; i++) + if (vals[i] != 0) + pts[n++] = { i, vals[i] }; + if (n == 0) + return {}; + std::vector segs; + uint32_t prev = kRMin; + for (int k = 0; k < n; k++) { + if (pts[k].freq > prev) + segs.push_back({ pts[k].tier, prev, pts[k].freq }); + prev = pts[k].freq; + } + if (prev < kRMax) + segs.push_back({ pts[n - 1].tier, prev, kRMax }); + return segs; + }; + + auto rSegs = buildSegs(rv); + auto wSegs = buildSegs(wv); + + auto drawSeriesSegs = [&](const std::vector &segs, const std::vector &other, const tsl::Color &c, s32 yOff) { + for (const auto &seg : segs) { + s32 ty = tierY(seg.tier) + yOff; + s32 tyMrg = tierY(seg.tier); + struct Iv { + uint32_t s, e; + }; + Iv ovlp[4]; + int no = 0; + for (const auto &os : other) { + if (os.tier != seg.tier) + continue; + uint32_t s = seg.start > os.start ? seg.start : os.start; + uint32_t e = seg.end < os.end ? seg.end : os.end; + if (s < e) + ovlp[no++] = { s, e }; + } + for (int a = 1; a < no; a++) + for (int b = a; b > 0 && ovlp[b - 1].s > ovlp[b].s; b--) { + auto t = ovlp[b]; + ovlp[b] = ovlp[b - 1]; + ovlp[b - 1] = t; + } + uint32_t cur = seg.start; + for (int oi = 0; oi < no; oi++) { + if (cur < ovlp[oi].s) { + s32 x0 = freqX(cur), x1 = freqX(ovlp[oi].s); + if (x1 > x0) + renderer->drawRect(x0, ty, x1 - x0, 2, c); + } + s32 x0 = freqX(ovlp[oi].s), x1 = freqX(ovlp[oi].e); + if (x1 > x0) + renderer->drawRect(x0, tyMrg, x1 - x0, 2, cMerge); + cur = ovlp[oi].e; + } + if (cur < seg.end) { + s32 x0 = freqX(cur), x1 = freqX(seg.end); + if (x1 > x0) + renderer->drawRect(x0, ty, x1 - x0, 2, c); + } + } + for (int k = 0; k + 1 < (int)segs.size(); k++) { + if (segs[k].end != segs[k + 1].start) + continue; + uint32_t transFreq = segs[k].end; + bool otherHere = false; + for (int j = 0; j + 1 < (int)other.size(); j++) + if (other[j].end == transFreq && other[j + 1].start == transFreq) { + otherHere = true; + break; + } + s32 fx = freqX(transFreq); + s32 y1 = tierY(segs[k].tier) + yOff; + s32 y2 = tierY(segs[k + 1].tier) + yOff; + s32 topY = y1 < y2 ? y1 : y2; + s32 botY = y1 > y2 ? y1 : y2; + if (botY > topY) + renderer->drawRect(fx, topY, 2, botY - topY + 2, otherHere ? cMerge : c); + } + }; + + drawSeriesSegs(rSegs, wSegs, cRead, 0); + drawSeriesSegs(wSegs, rSegs, cWrite, 0); + + static const uint8_t kDigBmp[10][5] = { + { 7, 5, 5, 5, 7 }, // 0 + { 6, 2, 2, 2, 7 }, // 1 + { 7, 1, 7, 4, 7 }, // 2 + { 7, 1, 3, 1, 7 }, // 3 + { 5, 5, 7, 1, 1 }, // 4 + { 7, 4, 7, 1, 7 }, // 5 + { 7, 4, 7, 5, 7 }, // 6 + { 7, 1, 1, 2, 2 }, // 7 + { 7, 5, 7, 5, 7 }, // 8 + { 7, 5, 7, 1, 7 }, // 9 + }; + const s32 charGap = 1; + + auto drawSidewaysMHz = [&](uint32_t mhz, s32 cx, s32 startY, const tsl::Color &c, s32 pixSize) { + char buf[8]; + snprintf(buf, sizeof(buf), "%u", mhz); + s32 cW = 5 * pixSize; + s32 cH = 3 * pixSize; + s32 originX = cx - cW / 2; + for (int ci = 0; buf[ci]; ci++) { + int d = buf[ci] - '0'; + if (d < 0 || d > 9) + continue; + s32 cy = startY + ci * (cH + charGap); + for (int r = 0; r < 5; r++) { + for (int col = 0; col < 3; col++) { + if (!((kDigBmp[d][r] >> (2 - col)) & 1)) + continue; + renderer->drawRect(originX + (4 - r) * pixSize, cy + col * pixSize, pixSize, pixSize, c); + } + } + } + }; + + if (mariko) { + static const uint32_t kRulerMHz[] = { + 1600, 1733, 1866, 2000, 2133, 2266, 2400, 2533, 2666, 2800, 2933, 3066, 3200, 3300, + }; + for (uint32_t mhz : kRulerMHz) { + s32 fx = freqX(mhz * 1000u); + renderer->drawRect(fx, axisY, 1, 4, cAxis); + drawSidewaysMHz(mhz, fx, axisY + 6, cAxis, 2); + } + } else { + static const uint32_t kEristaRulerMHz[] = { + 1600, 1666, 1733, 1800, 1866, 1933, 2000, 2066, 2133, 2200, 2266, 2333, 2400, + }; + for (uint32_t mhz : kEristaRulerMHz) { + s32 fx = freqX(mhz * 1000u); + renderer->drawRect(fx, axisY, 1, 4, cAxis); + drawSidewaysMHz(mhz, fx, axisY + 6, cAxis, 2); + } + } + + // Breakpoint dots + for (int i = 0; i < 4; i++) { + s32 ty = tierY(i) + 1; + bool merged = (rv[i] != 0 && rv[i] == wv[i]); + if (merged) { + renderer->drawCircle(freqX(rv[i]), ty, 4, true, cMerge); + } else { + if (rv[i]) + renderer->drawCircle(freqX(rv[i]), ty, 4, true, cRead); + if (wv[i]) + renderer->drawCircle(freqX(wv[i]), ty, 4, true, cWrite); + } + } + + const s32 ly = axisY + 46; + renderer->drawRect(gx, ly, 14, 3, cRead); + renderer->drawString("Read", false, gx + 17, ly + 5, 12, cRead); + renderer->drawRect(gx + 60, ly, 14, 3, cWrite); + renderer->drawString("Write", false, gx + 77, ly + 5, 12, cWrite); + renderer->drawRect(gx + 125, ly, 14, 3, cMerge); + renderer->drawString("Same", false, gx + 142, ly + 5, 12, cMerge); + }); graph->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 150); this->listElement->addItem(graph); } @@ -1936,12 +1834,13 @@ protected: }; class CpuSubmenuGui : public MiscGui { -public: - CpuSubmenuGui() { } + public: + CpuSubmenuGui() { + } -protected: + protected: void listUI() override { - Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work + Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; @@ -1954,131 +1853,51 @@ protected: ValueThresholds eCpuClockThresholdsUV(2091000, 2193000); this->listElement->addItem(new CompactCategoryHeader("CPU Settings")); - if(IsMariko()) { + if (IsMariko()) { addConfigTrackbar(KipConfigValue_marikoCpuUVLow, "CPU Low UV", ValueRange(0, 8, 1)); addConfigTrackbar(KipConfigValue_marikoCpuUVHigh, "CPU High UV", ValueRange(0, 12, 1)); - std::vector marikoTableConf = { - // NamedValue("Auto", 0), - NamedValue("Default", 1), - NamedValue("1581MHz Tbreak", 2), - NamedValue("1683MHz Tbreak", 3), - NamedValue("Extreme UV Table", 4) + std::vector marikoTableConf = { // NamedValue("Auto", 0), + NamedValue("Default", 1), NamedValue("1581MHz Tbreak", 2), NamedValue("1683MHz Tbreak", 3), + NamedValue("Extreme UV Table", 4) }; - addConfigButton( - KipConfigValue_tableConf, - "CPU UV Table", - ValueRange(0, 12, 1, "", 0), - "CPU UV Table", - &thresholdsDisabled, - {}, - marikoTableConf, - false, - true - ); + addConfigButton(KipConfigValue_tableConf, "CPU UV Table", ValueRange(0, 12, 1, "", 0), "CPU UV Table", &thresholdsDisabled, {}, + marikoTableConf, false, true); - addConfigButton( - KipConfigValue_marikoCpuLowVmin, - "CPU Low VMIN", - ValueRange(550, 750, 5, "mV", 1), - "CPU VMIN", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuLowVmin, "CPU Low VMIN", ValueRange(550, 750, 5, "mV", 1), "CPU VMIN", &thresholdsDisabled, {}, + {}, false, true); - addConfigButton( - KipConfigValue_marikoCpuHighVmin, - "CPU High VMIN", - ValueRange(650, 900, 5, "mV", 1), - "CPU VMIN", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuHighVmin, "CPU High VMIN", ValueRange(650, 900, 5, "mV", 1), "CPU VMIN", &thresholdsDisabled, {}, + {}, false, true); ValueThresholds mCpuVoltThresholds(1160, 1180); - addConfigButton( - KipConfigValue_marikoCpuMaxVolt, - "CPU Max Voltage", - ValueRange(1000, 1200, 5, "mV", 1), - "CPU Max Voltage", - &mCpuVoltThresholds, - {}, - {}, - false, - true - ); - + addConfigButton(KipConfigValue_marikoCpuMaxVolt, "CPU Max Voltage", ValueRange(1000, 1200, 5, "mV", 1), "CPU Max Voltage", + &mCpuVoltThresholds, {}, {}, false, true); std::vector maxClkOptions = { - NamedValue("1963 MHz", 1963500), - NamedValue("2091 MHz", 2091000), - NamedValue("2193 MHz", 2193000), - NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), - NamedValue("2499 MHz", 2499000), - NamedValue("2601 MHz", 2601000), - NamedValue("2703 MHz", 2703000), + NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), + NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), }; - addConfigButton( - KipConfigValue_marikoCpuMaxClock, - "CPU Max Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Max Clock", - this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, - {}, - maxClkOptions, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuMaxClock, "CPU Max Clock", ValueRange(0, 0, 1, "", 1), "CPU Max Clock", + this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, + maxClkOptions, false, true); std::vector ClkOptions = { - NamedValue("1963 MHz", 1963500), - NamedValue("2091 MHz", 2091000), - NamedValue("2193 MHz", 2193000), - NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), - NamedValue("2499 MHz", 2499000), - NamedValue("2601 MHz", 2601000), - NamedValue("2703 MHz", 2703000), + NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), + NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), }; std::vector ClkOptionsRamOc = { - NamedValue("1122 MHz", 1122000), - NamedValue("1224 MHz", 1224000), - NamedValue("1326 MHz", 1326000), - NamedValue("1428 MHz", 1428000), - NamedValue("1581 MHz", 1581000), - NamedValue("1683 MHz", 1683000), - NamedValue("1785 MHz", 1785000), - NamedValue("1887 MHz", 1887000), - NamedValue("1963 MHz", 1963500), - NamedValue("2091 MHz", 2091000), - NamedValue("2193 MHz", 2193000), - NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), - NamedValue("2499 MHz", 2499000), - NamedValue("2601 MHz", 2601000), - NamedValue("2703 MHz", 2703000), + NamedValue("1122 MHz", 1122000), NamedValue("1224 MHz", 1224000), NamedValue("1326 MHz", 1326000), NamedValue("1428 MHz", 1428000), + NamedValue("1581 MHz", 1581000), NamedValue("1683 MHz", 1683000), NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), + NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), + NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), }; - addConfigButton( - KipConfigValue_marikoCpuBoostClock, - "CPU Boost Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Boost Clock", - this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, - {}, - ClkOptions, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuBoostClock, "CPU Boost Clock", ValueRange(0, 0, 1, "", 1), "CPU Boost Clock", + this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, ClkOptions, + false, true); std::vector emcMaxClock = { NamedValue("1600 MHz", 1600000), @@ -2136,112 +1955,54 @@ protected: NamedValue("3300 MHz", 3300000, "High speedo needed!"), }; addConfigToggle(HocClkConfigValue_AutoRAMCPUOverclock, "Auto CPU RAM OC"); - addConfigButton( - HocClkConfigValue_AutoRamCpuCpuOCFreq, - "Auto CPU RAM OC CPU clock", - ValueRange(0, 0, 1, "", 1), - "CPU Clock", - &thresholdsDisabled, - {}, - ClkOptionsRamOc, - false, - false - ); - addConfigButton( - HocClkConfigValue_AutoRamCpuRamOCThreshold, - "Auto CPU RAM OC Threshold", - ValueRange(0, 0, 1, "", 1), - "RAM Clock", - &thresholdsDisabled, - {}, - emcMaxClock, - false, - false - ); + addConfigButton(HocClkConfigValue_AutoRamCpuCpuOCFreq, "Auto CPU RAM OC CPU clock", ValueRange(0, 0, 1, "", 1), "CPU Clock", + &thresholdsDisabled, {}, ClkOptionsRamOc, false, false); + addConfigButton(HocClkConfigValue_AutoRamCpuRamOCThreshold, "Auto CPU RAM OC Threshold", ValueRange(0, 0, 1, "", 1), "RAM Clock", + &thresholdsDisabled, {}, emcMaxClock, false, false); } else { addConfigTrackbar(KipConfigValue_eristaCpuUV, "CPU UV", ValueRange(0, 5, 1)); addConfigToggle(KipConfigValue_eristaCpuUnlock, "CPU Unlock", true); - addConfigButton( - KipConfigValue_eristaCpuVmin, - "CPU VMIN", - ValueRange(750, 900, 25, "mV", 1), - "CPU VMIN", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_eristaCpuVmin, "CPU VMIN", ValueRange(750, 900, 25, "mV", 1), "CPU VMIN", &thresholdsDisabled, {}, {}, + false, true); ValueThresholds eCpuVoltThresholds(1235, 1260); - addConfigButton( - KipConfigValue_eristaCpuMaxVolt, - "CPU Max Voltage", - ValueRange(1120, 1260, 5, "mV", 1), - "CPU Max Voltage", - &eCpuVoltThresholds, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_eristaCpuMaxVolt, "CPU Max Voltage", ValueRange(1120, 1260, 5, "mV", 1), "CPU Max Voltage", + &eCpuVoltThresholds, {}, {}, false, true); std::vector maxClkOptions = { - NamedValue("1785 MHz", 1785), - NamedValue("1887 MHz", 1887), - NamedValue("1989 MHz", 1989), - NamedValue("2091 MHz", 2091), - NamedValue("2193 MHz", 2193), - NamedValue("2295 MHz", 2295), - NamedValue("2397 MHz", 2397), + NamedValue("1785 MHz", 1785), NamedValue("1887 MHz", 1887), NamedValue("1989 MHz", 1989), NamedValue("2091 MHz", 2091), + NamedValue("2193 MHz", 2193), NamedValue("2295 MHz", 2295), NamedValue("2397 MHz", 2397), }; ValueThresholds eCpuMaxClockThresholds(1785, 2091); - addConfigButton( - HocClkConfigValue_EristaMaxCpuClock, - "CPU Max Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Max Clock", - &eCpuMaxClockThresholds, - {}, - maxClkOptions, - false - ); + addConfigButton(HocClkConfigValue_EristaMaxCpuClock, "CPU Max Clock", ValueRange(0, 0, 1, "", 1), "CPU Max Clock", + &eCpuMaxClockThresholds, {}, maxClkOptions, false); std::vector ClkOptionsE = { - NamedValue("1785 MHz", 1785000), - NamedValue("1887 MHz", 1887000), - NamedValue("1989 MHz", 1989000), - NamedValue("2091 MHz", 2091000), - NamedValue("2193 MHz", 2193000), - NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), + NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), NamedValue("1989 MHz", 1989000), NamedValue("2091 MHz", 2091000), + NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), NamedValue("2397 MHz", 2397000), }; - addConfigButton( - KipConfigValue_eristaCpuBoostClock, - "CPU Boost Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Boost Clock", - this->configList->values[KipConfigValue_eristaCpuUV] ? &eCpuClockThresholdsUV : &eCpuClockThresholds, - {}, - ClkOptionsE, - false, - true - ); + addConfigButton(KipConfigValue_eristaCpuBoostClock, "CPU Boost Clock", ValueRange(0, 0, 1, "", 1), "CPU Boost Clock", + this->configList->values[KipConfigValue_eristaCpuUV] ? &eCpuClockThresholdsUV : &eCpuClockThresholds, {}, ClkOptionsE, + false, true); + addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); } addConfigToggle(HocClkConfigValue_OverwriteBoostMode, nullptr); - addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); } }; class GpuSubmenuGui : public MiscGui { -public: - GpuSubmenuGui() { } + public: + GpuSubmenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } ValueThresholds thresholdsDisabled(0, 0); std::vector noNamedValues = {}; @@ -2261,65 +2022,29 @@ protected: NamedValue("HiOPT Table", 2), }; std::vector mGpuVoltsVmin = { - NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), - NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), - NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), - NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), - NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), - NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), - NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), - NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), - NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), - NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), - NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), - NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), - NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), - NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), - NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), - NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), - NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), - NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), - NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), - NamedValue("795mV", 795) + NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), NamedValue("495mV", 495), NamedValue("500mV", 500), + NamedValue("505mV", 505), NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), NamedValue("525mV", 525), + NamedValue("530mV", 530), NamedValue("535mV", 535), NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), + NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), NamedValue("570mV", 570), NamedValue("575mV", 575), + NamedValue("580mV", 580), NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), NamedValue("600mV", 600), + NamedValue("605mV", 605), NamedValue("610mV", 610), NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), + NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), NamedValue("645mV", 645), NamedValue("650mV", 650), + NamedValue("655mV", 655), NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), NamedValue("675mV", 675), + NamedValue("680mV", 680), NamedValue("685mV", 685), NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), + NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), + NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), NamedValue("750mV", 750), + NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), + NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), NamedValue("795mV", 795) }; - if(IsErista()) { - addConfigButton( - KipConfigValue_eristaGpuUV, - "GPU Undervolt Table", - ValueRange(0, 1, 1, "", 1), - "GPU Undervolt Table", - &thresholdsDisabled, - {}, - gpuUvConfE, - false, - true - ); - addConfigButton( - KipConfigValue_eristaGpuVmin, - "GPU Minimum Voltage", - ValueRange(675, 875, 5, "mV", 1), - "GPU Minimum Voltage", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + if (IsErista()) { + addConfigButton(KipConfigValue_eristaGpuUV, "GPU Undervolt Table", ValueRange(0, 1, 1, "", 1), "GPU Undervolt Table", &thresholdsDisabled, + {}, gpuUvConfE, false, true); + addConfigButton(KipConfigValue_eristaGpuVmin, "GPU Minimum Voltage", ValueRange(675, 875, 5, "mV", 1), "GPU Minimum Voltage", + &thresholdsDisabled, {}, {}, false, true); } else { - addConfigButton( - KipConfigValue_marikoGpuUV, - "GPU Undervolt Table", - ValueRange(0, 1, 1, "", 1), - "GPU Undervolt Table", - &thresholdsDisabled, - {}, - gpuUvConfM, - false, - true - ); + addConfigButton(KipConfigValue_marikoGpuUV, "GPU Undervolt Table", ValueRange(0, 1, 1, "", 1), "GPU Undervolt Table", &thresholdsDisabled, + {}, gpuUvConfM, false, true); // tsl::elm::ListItem* vminCalcBtn = new tsl::elm::ListItem("Calculate GPU Vmin"); // vminCalcBtn->setClickListener([this](u64 keys) { @@ -2334,19 +2059,11 @@ protected: // return false; // }); - addConfigButton(KipConfigValue_marikoGpuVmin, "GPU VMIN", ValueRange(0, 0, 0, "0", 1), "GPU VMIN", &thresholdsDisabled, {}, mGpuVoltsVmin, false, true); + addConfigButton(KipConfigValue_marikoGpuVmin, "GPU VMIN", ValueRange(0, 0, 0, "0", 1), "GPU VMIN", &thresholdsDisabled, {}, mGpuVoltsVmin, + false, true); ValueThresholds MgpuVmaxThresholds(805, 850); - addConfigButton( - KipConfigValue_marikoGpuVmax, - "GPU Maximum Voltage", - ValueRange(800, 960, 5, "mV", 1), - "GPU Maximum Voltage", - &MgpuVmaxThresholds, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 960, 5, "mV", 1), "GPU Maximum Voltage", + &MgpuVmaxThresholds, {}, {}, false, true); } std::vector gpuOffset = { @@ -2373,17 +2090,8 @@ protected: NamedValue("50 mV", 50), }; - addConfigButton( - KipConfigValue_commonGpuVoltOffset, - "GPU Voltage Offset", - ValueRange(0, 50, 5, "mV", 1), - "GPU Voltage Offset", - &thresholdsDisabled, - {}, - gpuOffset, - false, - true - ); + addConfigButton(KipConfigValue_commonGpuVoltOffset, "GPU Voltage Offset", ValueRange(0, 50, 5, "mV", 1), "GPU Voltage Offset", + &thresholdsDisabled, {}, gpuOffset, false, true); std::vector gpuSchedValues = { NamedValue("Do not override", GpuSchedulingMode_DoNotOverride), @@ -2391,61 +2099,31 @@ protected: NamedValue("Disabled", GpuSchedulingMode_Disabled, "99.7% limit"), }; - addConfigButton( - HocClkConfigValue_GPUScheduling, - "GPU Scheduling Override", - ValueRange(0, 0, 1, "", 0), - "GPU Scheduling Override", - &thresholdsDisabled, - {}, - gpuSchedValues, - false - ); + addConfigButton(HocClkConfigValue_GPUScheduling, "GPU Scheduling Override", ValueRange(0, 0, 1, "", 0), "GPU Scheduling Override", + &thresholdsDisabled, {}, gpuSchedValues, false); - std::vector dvfsOffset = { - NamedValue("-80 mV", 0xFFFFFFB0), - NamedValue("-75 mV", 0xFFFFFFB5), - NamedValue("-70 mV", 0xFFFFFFBA), - NamedValue("-65 mV", 0xFFFFFFBF), - NamedValue("-60 mV", 0xFFFFFFC4), - NamedValue("-55 mV", 0xFFFFFFC9), - NamedValue("-50 mV", 0xFFFFFFCE), - NamedValue("-45 mV", 0xFFFFFFD3), - NamedValue("-40 mV", 0xFFFFFFD8), - NamedValue("-35 mV", 0xFFFFFFDD), - NamedValue("-30 mV", 0xFFFFFFE2), - NamedValue("-25 mV", 0xFFFFFFE7), - NamedValue("-20 mV", 0xFFFFFFEC), - NamedValue("-15 mV", 0xFFFFFFF1), - NamedValue("-10 mV", 0xFFFFFFF6), - NamedValue(" -5 mV", 0xFFFFFFFB), - NamedValue("Disabled", 0), - NamedValue(" +5 mV", 5), - NamedValue("+10 mV", 10), - NamedValue("+15 mV", 15), - NamedValue("+20 mV", 20), - }; + std::vector dvfsOffset = { + NamedValue("-80 mV", 0xFFFFFFB0), NamedValue("-75 mV", 0xFFFFFFB5), NamedValue("-70 mV", 0xFFFFFFBA), NamedValue("-65 mV", 0xFFFFFFBF), + NamedValue("-60 mV", 0xFFFFFFC4), NamedValue("-55 mV", 0xFFFFFFC9), NamedValue("-50 mV", 0xFFFFFFCE), NamedValue("-45 mV", 0xFFFFFFD3), + NamedValue("-40 mV", 0xFFFFFFD8), NamedValue("-35 mV", 0xFFFFFFDD), NamedValue("-30 mV", 0xFFFFFFE2), NamedValue("-25 mV", 0xFFFFFFE7), + NamedValue("-20 mV", 0xFFFFFFEC), NamedValue("-15 mV", 0xFFFFFFF1), NamedValue("-10 mV", 0xFFFFFFF6), NamedValue(" -5 mV", 0xFFFFFFFB), + NamedValue("Disabled", 0), NamedValue(" +5 mV", 5), NamedValue("+10 mV", 10), NamedValue("+15 mV", 15), + NamedValue("+20 mV", 20), + }; - std::vector dvfsValues = { - NamedValue("Disabled", DVFSMode_Disabled), - NamedValue("PCV Hijack", DVFSMode_Hijack), - // NamedValue("Official Service", DVFSMode_OfficialService), - }; + std::vector dvfsValues = { + NamedValue("Disabled", DVFSMode_Disabled), + NamedValue("PCV Hijack", DVFSMode_Hijack), + // NamedValue("Official Service", DVFSMode_OfficialService), + }; - addConfigButton( - HocClkConfigValue_DVFSMode, - "GPU DVFS Mode", - ValueRange(0, 0, 1, "", 0), - "GPU DVFS Mode", - &thresholdsDisabled, - {}, - dvfsValues, - false - ); + addConfigButton(HocClkConfigValue_DVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, + false); - addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false); + addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, + dvfsOffset, false); - tsl::elm::ListItem* customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); + tsl::elm::ListItem *customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); customTableSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -2459,13 +2137,14 @@ protected: }; class GpuCustomTableSubmenuGui : public MiscGui { -public: - GpuCustomTableSubmenuGui() { } + public: + GpuCustomTableSubmenuGui() { + } -protected: + protected: void listUI() override { - Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work + Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; @@ -2477,134 +2156,87 @@ protected: ValueThresholds EgpuVmaxThresholds(950, 975); std::vector mGpuVolts = { - NamedValue("Disabled", 2000), - NamedValue("Auto", 0), - NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), - NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), - NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), - NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), - NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), - NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), - NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), - NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), - NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), - NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), - NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), - NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), - NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), - NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), - NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), - NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), - NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), - NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), - NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), - NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), - NamedValue("810mV", 810), NamedValue("815mV", 815), NamedValue("820mV", 820), - NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), - NamedValue("840mV", 840), NamedValue("845mV", 845), NamedValue("850mV", 850), - NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), - NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), - NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), - NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), - NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), - NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), - NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), - NamedValue("960mV", 960), + NamedValue("Disabled", 2000), NamedValue("Auto", 0), NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), + NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), NamedValue("510mV", 510), NamedValue("515mV", 515), + NamedValue("520mV", 520), NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), NamedValue("540mV", 540), + NamedValue("545mV", 545), NamedValue("550mV", 550), NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), + NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), NamedValue("585mV", 585), NamedValue("590mV", 590), + NamedValue("595mV", 595), NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), NamedValue("615mV", 615), + NamedValue("620mV", 620), NamedValue("625mV", 625), NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), + NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), NamedValue("660mV", 660), NamedValue("665mV", 665), + NamedValue("670mV", 670), NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), NamedValue("690mV", 690), + NamedValue("695mV", 695), NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), + NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), + NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), + NamedValue("770mV", 770), NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), + NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), + NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), NamedValue("840mV", 840), + NamedValue("845mV", 845), NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), + NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), + NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), + NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), + NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), }; std::vector eGpuVolts = { - NamedValue("Disabled", 2000), - NamedValue("Auto", 0), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), - NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), - NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), - NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), - NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), - NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), - NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), - NamedValue("790mV", 790), NamedValue("795mV", 795), NamedValue("800mV", 800), - NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), - NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), - NamedValue("835mV", 835), NamedValue("840mV", 840), NamedValue("845mV", 845), - NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), - NamedValue("865mV", 865), NamedValue("870mV", 870), NamedValue("875mV", 875), - NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), - NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), - NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), - NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), - NamedValue("940mV", 940), NamedValue("945mV", 945), NamedValue("950mV", 950), - NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), - NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), - NamedValue("985mV", 985), NamedValue("990mV", 990), NamedValue("995mV", 995), + NamedValue("Disabled", 2000), NamedValue("Auto", 0), NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), + NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), + NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), + NamedValue("740mV", 740), NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), + NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), + NamedValue("790mV", 790), NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), + NamedValue("815mV", 815), NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), + NamedValue("840mV", 840), NamedValue("845mV", 845), NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), + NamedValue("865mV", 865), NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), + NamedValue("890mV", 890), NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), + NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), + NamedValue("940mV", 940), NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), + NamedValue("965mV", 965), NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), NamedValue("985mV", 985), + NamedValue("990mV", 990), NamedValue("995mV", 995), }; std::vector mGpuVolts_noAuto = { - NamedValue("Disabled", 2000), - NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), - NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), - NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), - NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), - NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), - NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), - NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), - NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), - NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), - NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), - NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), - NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), - NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), - NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), - NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), - NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), - NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), - NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), - NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), - NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), - NamedValue("810mV", 810), NamedValue("815mV", 815), NamedValue("820mV", 820), - NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), - NamedValue("840mV", 840), NamedValue("845mV", 845), NamedValue("850mV", 850), - NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), - NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), - NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), - NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), - NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), - NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), - NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), - NamedValue("960mV", 960), + NamedValue("Disabled", 2000), NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), NamedValue("495mV", 495), + NamedValue("500mV", 500), NamedValue("505mV", 505), NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), + NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), NamedValue("540mV", 540), NamedValue("545mV", 545), + NamedValue("550mV", 550), NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), NamedValue("570mV", 570), + NamedValue("575mV", 575), NamedValue("580mV", 580), NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), + NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), NamedValue("615mV", 615), NamedValue("620mV", 620), + NamedValue("625mV", 625), NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), NamedValue("645mV", 645), + NamedValue("650mV", 650), NamedValue("655mV", 655), NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), + NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), NamedValue("690mV", 690), NamedValue("695mV", 695), + NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), NamedValue("720mV", 720), + NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), + NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), + NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), NamedValue("795mV", 795), + NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), NamedValue("820mV", 820), + NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), NamedValue("840mV", 840), NamedValue("845mV", 845), + NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), NamedValue("870mV", 870), + NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), + NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), + NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), NamedValue("945mV", 945), + NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), }; std::vector eGpuVolts_noAuto = { - NamedValue("Disabled", 2000), - NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), - NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), - NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), - NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), - NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), - NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), - NamedValue("790mV", 790), NamedValue("795mV", 795), NamedValue("800mV", 800), - NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), - NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), - NamedValue("835mV", 835), NamedValue("840mV", 840), NamedValue("845mV", 845), - NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), - NamedValue("865mV", 865), NamedValue("870mV", 870), NamedValue("875mV", 875), - NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), - NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), - NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), - NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), - NamedValue("940mV", 940), NamedValue("945mV", 945), NamedValue("950mV", 950), - NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), - NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), - NamedValue("985mV", 985), NamedValue("990mV", 990), NamedValue("995mV", 995), + NamedValue("Disabled", 2000), NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), + NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), + NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), + NamedValue("770mV", 770), NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), + NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), + NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), NamedValue("840mV", 840), + NamedValue("845mV", 845), NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), + NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), + NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), + NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), + NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), + NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), NamedValue("985mV", 985), NamedValue("990mV", 990), + NamedValue("995mV", 995), }; if (IsMariko()) { - tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Setting GPU Clocks past", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("1228MHz without a proper undervolt", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("can cause degradation or damage", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -2614,38 +2246,62 @@ protected: warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 130); this->listElement->addItem(warningText); - addConfigButton(KipConfigValue_g_volt_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - if(this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_SLT) { - addConfigButton(KipConfigValue_g_volt_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - if(this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HiOPT) - addConfigButton(KipConfigValue_g_volt_1152000, "1152.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - if(this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HighUV) { - addConfigButton(KipConfigValue_g_volt_1228800, "1228.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_1267200, "1267.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_1305600, "1305.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_1344000, "1344.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1382400, "1382.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1420800, "1420.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1459200, "1459.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1497600, "1497.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1536000, "1536.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, + true); + addConfigButton(KipConfigValue_g_volt_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + if (this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_SLT) { + addConfigButton(KipConfigValue_g_volt_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + if (this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HiOPT) + addConfigButton(KipConfigValue_g_volt_1152000, "1152.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + if (this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HighUV) { + addConfigButton(KipConfigValue_g_volt_1228800, "1228.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_1267200, "1267.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_1305600, "1305.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_1344000, "1344.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1382400, "1382.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1420800, "1420.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1459200, "1459.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1497600, "1497.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1536000, "1536.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); } } } else { - tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Setting GPU Clocks past", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("921MHz without a proper undervolt", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("can cause degradation or damage", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -2655,48 +2311,131 @@ protected: warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 130); this->listElement->addItem(warningText); - addConfigButton(KipConfigValue_g_volt_e_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_115200, "115.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_192000, "192.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_268800, "268.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_345600, "345.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_422400, "422.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_499200, "499.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_576000, "576.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_652800, "652.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_729600, "729.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_806400, "806.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_883200, "883.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - if(this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_SLT) - addConfigButton(KipConfigValue_g_volt_e_960000, "960.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - if(this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_HiOPT) { - addConfigButton(KipConfigValue_g_volt_e_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_1036800, "1036.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_e_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_e_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_115200, "115.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_192000, "192.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_268800, "268.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_345600, "345.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_422400, "422.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_499200, "499.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_576000, "576.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_652800, "652.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_729600, "729.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_806400, "806.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_883200, "883.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + if (this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_SLT) + addConfigButton(KipConfigValue_g_volt_e_960000, "960.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts, false, true); + if (this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_HiOPT) { + addConfigButton(KipConfigValue_g_volt_e_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_e_1036800, "1036.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_e_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts_noAuto, false, true); } } } }; +class SocCustomTableSubmenuGui : public MiscGui { + public: + SocCustomTableSubmenuGui() {} -static std::string getValueDisplayText(uint64_t currentValue, - const ValueRange& range, - const std::vector& namedValues) -{ + protected: + void listUI() override { + + Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + + this->listElement->addItem(new CompactCategoryHeader("SOC Custom Voltages")); + + ValueThresholds voltageThresholds(1075, 1150); + + std::vector socVolts = { + NamedValue("No Override", 0), + + NamedValue("637mV", 637), NamedValue("650mV", 650), NamedValue("662mV", 662), NamedValue("675mV", 675), NamedValue("687mV", 687), + NamedValue("700mV", 700), NamedValue("712mV", 712), NamedValue("725mV", 725), NamedValue("737mV", 737), NamedValue("750mV", 750), + NamedValue("762mV", 762), NamedValue("775mV", 775), NamedValue("787mV", 787), NamedValue("800mV", 800), NamedValue("812mV", 812), + NamedValue("825mV", 825), NamedValue("837mV", 837), NamedValue("850mV", 850), NamedValue("862mV", 862), NamedValue("875mV", 875), + NamedValue("887mV", 887), NamedValue("900mV", 900), NamedValue("912mV", 912), NamedValue("925mV", 925), NamedValue("937mV", 937), + NamedValue("950mV", 950), NamedValue("962mV", 962), NamedValue("975mV", 975), NamedValue("987mV", 987), NamedValue("1000mV", 1000), + NamedValue("1012mV", 1012), NamedValue("1025mV", 1025), NamedValue("1037mV", 1037), NamedValue("1050mV", 1050), NamedValue("1062mV", 1062), + NamedValue("1075mV", 1075), NamedValue("1087mV", 1087), NamedValue("1100mV", 1100), NamedValue("1112mV", 1112), NamedValue("1125mV", 1125), + NamedValue("1137mV", 1137), NamedValue("1150mV", 1150), + }; + + addConfigButton(KipConfigValue_g_soc_volt_1866000, "1866MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2000000, "2000MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2133000, "2133MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2200000, "2200MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2266000, "2266MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2333000, "2333MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2400000, "2400MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2433000, "2433MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2466000, "2466MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2533000, "2533MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2566000, "2566MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2600000, "2600MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2666000, "2666MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2700000, "2700MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2733000, "2733MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2766000, "2766MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2800000, "2800MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2833000, "2833MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2900000, "2900MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_2933000, "2933MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_3000000, "3000MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_3033000, "3033MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_3100000, "3100MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_3133000, "3133MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_3166000, "3166MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + addConfigButton(KipConfigValue_g_soc_volt_3200000, "3200MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &voltageThresholds, {}, socVolts, false, true); + } +}; + +static std::string getValueDisplayText(uint64_t currentValue, const ValueRange &range, const std::vector &namedValues) { char valueText[32]; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { return namedValue.name; } @@ -2737,25 +2476,24 @@ void MiscGui::refresh() { for (auto key : emcKeys) { auto it = this->configNamedValues.find(key); if (it != this->configNamedValues.end()) { - for (auto& nv : it->second) - if(nv.name != "Disabled") + for (auto &nv : it->second) + if (nv.name != "Disabled") nv.name = formatMemClockKhzLabel(nv.value, unit); } } - for (const auto& [configVal, button] : this->configButtons) { + for (const auto &[configVal, button] : this->configButtons) { uint64_t currentValue = this->configList->values[configVal]; - const ValueRange& range = this->configRanges[configVal]; + const ValueRange &range = this->configRanges[configVal]; auto namedValuesIt = this->configNamedValues.find(configVal); - const std::vector& namedValues = (namedValuesIt != this->configNamedValues.end()) - ? namedValuesIt->second - : std::vector(); + const std::vector &namedValues = + (namedValuesIt != this->configNamedValues.end()) ? namedValuesIt->second : std::vector(); char valueText[32]; bool foundNamedValue = false; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { snprintf(valueText, sizeof(valueText), "%s", namedValue.name.c_str()); foundNamedValue = true; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h index 43c5e2db..b795b3c1 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h @@ -16,67 +16,51 @@ * */ #pragma once -#include "../../ipc.h" -#include "base_menu_gui.h" -#include #include -#include #include #include + +#include "../../ipc.h" +#include "base_menu_gui.h" #include "freq_choice_gui.h" -#include "value_choice_gui.h" #include "info_gui.h" -class MiscGui : public BaseMenuGui -{ -public: +#include "value_choice_gui.h" +#include +#include +class MiscGui : public BaseMenuGui { + public: MiscGui(); ~MiscGui(); void listUI() override; void refresh() override; -protected: - HocClkConfigValueList* configList; - std::map configButtons; + protected: + HocClkConfigValueList *configList; + std::map configButtons; std::map configRanges; std::map> configNamedValues; - std::map configToggles; - std::map>> configTrackbars; + std::map configToggles; + std::map>> configTrackbars; std::set configButtonSKeys; std::map configButtonSSubtext; std::set emcClockConfigs; - void addConfigToggle(HocClkConfigValue configVal, const char* altName, bool kip = false); - void addConfigTrackbar(HocClkConfigValue configVal, const char* altName, const ValueRange& range, bool kip = true); - void addMappedConfigTrackbar(HocClkConfigValue configVal, const char* altName, - std::vector vals, - std::initializer_list names, bool kip = true); - void addConfigButton(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true, - bool kip = false); + void addConfigToggle(HocClkConfigValue configVal, const char *altName, bool kip = false); + void addConfigTrackbar(HocClkConfigValue configVal, const char *altName, const ValueRange &range, bool kip = true); + void addMappedConfigTrackbar(HocClkConfigValue configVal, const char *altName, std::vector vals, std::initializer_list names, + bool kip = true); + void addConfigButton(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels = {}, + const std::vector &namedValues = {}, bool showDefaultValue = true, bool kip = false); - void addConfigButtonS(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true, - const char* subText = nullptr, - bool kip = false); - void addFreqButton(HocClkConfigValue configVal, - const char* altName, - HocClkModule module, - const std::map& labels = {}); + void addConfigButtonS(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels = {}, + const std::vector &namedValues = {}, bool showDefaultValue = true, const char *subText = nullptr, + bool kip = false); + void addFreqButton(HocClkConfigValue configVal, const char *altName, HocClkModule module, const std::map &labels = {}); void updateConfigToggles(); - tsl::elm::ToggleListItem* enabledToggle; + tsl::elm::ToggleListItem *enabledToggle; u8 frameCounter = 60; bool shouldSaveKip = false; }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h b/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h index e248fc01..0a26bd73 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h +++ b/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h @@ -12,20 +12,24 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include + #include "../elements/base_frame.h" + class TopAnchoredList : public tsl::elm::List { -public: - TopAnchoredList() { m_hasSetInitialFocusHack = true; } + public: + TopAnchoredList() { + m_hasSetInitialFocusHack = true; + } }; class BoxClippedList : public tsl::elm::List { -public: - void draw(tsl::gfx::Renderer* renderer) override { + public: + void draw(tsl::gfx::Renderer *renderer) override { renderer->enableScissoring(0, HOC_BOX_BOTTOM, tsl::cfg::FramebufferWidth, tsl::cfg::FramebufferHeight - HOC_BOX_BOTTOM); tsl::elm::List::draw(renderer); renderer->disableScissoring(); @@ -33,41 +37,37 @@ public: }; class CompactCategoryHeader : public tsl::elm::CategoryHeader { -public: - CompactCategoryHeader(const std::string& text) : tsl::elm::CategoryHeader(text) {} + public: + CompactCategoryHeader(const std::string &text) : tsl::elm::CategoryHeader(text) { + } void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { this->setBoundaries(this->getX(), this->getY(), this->getWidth(), 33); } }; class ImageElement : public tsl::elm::ListItem { -private: - const uint8_t* imgData; + private: + const uint8_t *imgData; uint32_t imgWidth, imgHeight; bool visible; - -public: - ImageElement(const uint8_t* data, uint32_t w, uint32_t h) - : tsl::elm::ListItem(""), imgData(data), imgWidth(w), imgHeight(h), visible(true) {} - + + public: + ImageElement(const uint8_t *data, uint32_t w, uint32_t h) : tsl::elm::ListItem(""), imgData(data), imgWidth(w), imgHeight(h), visible(true) { + } + void setVisible(bool v) { visible = v; } - + virtual void draw(tsl::gfx::Renderer *renderer) override { - if (!visible) return; - + if (!visible) + return; + // Draw image centered horizontally u16 centerX = this->getX() + (this->getWidth() - imgWidth) / 2; - renderer->drawBitmap( - centerX, - this->getY() + 10, - imgWidth, - imgHeight, - imgData - ); + renderer->drawBitmap(centerX, this->getY() + 10, imgWidth, imgHeight, imgData); } - + virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { if (!visible) { // Take up no space when hidden @@ -77,37 +77,38 @@ public: tsl::elm::ListItem::layout(parentX, parentY, parentWidth, parentHeight); } } - + virtual void drawHighlight(tsl::gfx::Renderer *renderer) override { // Do nothing - no highlight } - + virtual bool onClick(u64 keys) override { - return false; // Non-clickable + return false; // Non-clickable } - - virtual Element* requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { - return nullptr; // Make it non-focusable + + virtual Element *requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { + return nullptr; // Make it non-focusable } }; class HideableCategoryHeader : public tsl::elm::CategoryHeader { -private: + private: bool visible; - -public: - HideableCategoryHeader(const std::string& title) - : tsl::elm::CategoryHeader(title), visible(true) {} - + + public: + HideableCategoryHeader(const std::string &title) : tsl::elm::CategoryHeader(title), visible(true) { + } + void setVisible(bool v) { visible = v; } - + virtual void draw(tsl::gfx::Renderer *renderer) override { - if (!visible) return; + if (!visible) + return; tsl::elm::CategoryHeader::draw(renderer); } - + virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { if (!visible) { this->setBoundaries(parentX, parentY, 0, 0); @@ -118,34 +119,34 @@ public: }; class FocusableDrawer : public tsl::elm::CustomDrawer { -public: - template - FocusableDrawer(Args&&... args) : tsl::elm::CustomDrawer(std::forward(args)...) { + public: + template FocusableDrawer(Args &&...args) : tsl::elm::CustomDrawer(std::forward(args)...) { m_isItem = true; } - Element* requestFocus(Element*, tsl::FocusDirection) override { + Element *requestFocus(Element *, tsl::FocusDirection) override { return this; } - void drawHighlight(tsl::gfx::Renderer*) override {} + void drawHighlight(tsl::gfx::Renderer *) override { + } }; class HideableCustomDrawer : public tsl::elm::Element { -private: + private: bool visible; u32 height; - -public: - HideableCustomDrawer(u32 h) - : Element(), visible(true), height(h) {} - + + public: + HideableCustomDrawer(u32 h) : Element(), visible(true), height(h) { + } + void setVisible(bool v) { visible = v; } - + virtual void draw(tsl::gfx::Renderer *renderer) override { // Empty drawer - just for spacing } - + virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { if (!visible) { this->setBoundaries(parentX, parentY, 0, 0); @@ -153,8 +154,8 @@ public: this->setBoundaries(parentX, parentY, parentWidth, height); } } - - virtual Element* requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { + + virtual Element *requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { return nullptr; } }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp index eaf4e6be..1131a410 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp @@ -16,44 +16,27 @@ * along with this program. If not, see . * */ -#include "ult_ext.h" -#include "value_choice_gui.h" +#include +#include + #include "../format.h" #include "fatal_gui.h" -#include -#include +#include "ult_ext.h" +#include "value_choice_gui.h" -ValueChoiceGui::ValueChoiceGui(std::uint32_t selectedValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds, - bool enableThresholds, - std::map labels, - std::vector namedValues, - bool showDefaultValue, - bool showDNO) - : selectedValue(selectedValue), - range(range), - categoryName(categoryName), - listener(listener), - thresholds(thresholds), - enableThresholds(enableThresholds), - labels(labels), - namedValues(namedValues), - showDefaultValue(showDefaultValue), - showDNO(showDNO) -{ +ValueChoiceGui::ValueChoiceGui(std::uint32_t selectedValue, const ValueRange &range, const std::string &categoryName, ValueChoiceListener listener, + const ValueThresholds &thresholds, bool enableThresholds, std::map labels, + std::vector namedValues, bool showDefaultValue, bool showDNO) + : selectedValue(selectedValue), range(range), categoryName(categoryName), listener(listener), thresholds(thresholds), + enableThresholds(enableThresholds), labels(labels), namedValues(namedValues), showDefaultValue(showDefaultValue), showDNO(showDNO) { } -ValueChoiceGui::~ValueChoiceGui() -{ +ValueChoiceGui::~ValueChoiceGui() { } -std::string ValueChoiceGui::formatValue(std::uint32_t value) -{ +std::string ValueChoiceGui::formatValue(std::uint32_t value) { std::ostringstream oss; - if(showDefaultValue) { + if (showDefaultValue) { if (value == 0) { return this->showDNO ? FREQ_DEFAULT_TEXT : VALUE_DEFAULT_TEXT; } @@ -66,12 +49,11 @@ std::string ValueChoiceGui::formatValue(std::uint32_t value) return oss.str(); } -int ValueChoiceGui::getSafetyLevel(std::uint32_t value) -{ - if(thresholds.warning == 0 && thresholds.danger == 0) { +int ValueChoiceGui::getSafetyLevel(std::uint32_t value) { + if (thresholds.warning == 0 && thresholds.danger == 0) { return 0; } - + if (value > thresholds.danger) { return 2; } @@ -81,8 +63,7 @@ int ValueChoiceGui::getSafetyLevel(std::uint32_t value) return 0; } -tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, bool selected, int safety) -{ +tsl::elm::ListItem *ValueChoiceGui::createValueListItem(std::uint32_t value, bool selected, int safety) { std::string text = formatValue(value); std::string rightText = ""; @@ -92,34 +73,32 @@ tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, boo } if (selected) { - const_cast(rightText) = "\uE14B"; + const_cast(rightText) = "\uE14B"; } - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(text, rightText, false); - switch (safety) - { - case 0: - listItem->setTextColor(tsl::Color(255, 255, 255, 255)); - listItem->setValueColor(tsl::Color(255, 255, 255, 255)); - break; - case 1: - listItem->setTextColor(tsl::Color(255, 165, 0, 255)); - listItem->setValueColor(tsl::Color(255, 165, 0, 255)); - break; - case 2: - listItem->setTextColor(tsl::Color(255, 0, 0, 255)); - listItem->setValueColor(tsl::Color(255, 0, 0, 255)); - break; + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, rightText, false); + switch (safety) { + case 0: + listItem->setTextColor(tsl::Color(255, 255, 255, 255)); + listItem->setValueColor(tsl::Color(255, 255, 255, 255)); + break; + case 1: + listItem->setTextColor(tsl::Color(255, 165, 0, 255)); + listItem->setValueColor(tsl::Color(255, 165, 0, 255)); + break; + case 2: + listItem->setTextColor(tsl::Color(255, 0, 0, 255)); + listItem->setValueColor(tsl::Color(255, 0, 0, 255)); + break; } // Make annotation grey if (!rightText.empty() && !selected) listItem->setValueColor(tsl::Color(180, 180, 180, 255)); - else if(selected) - listItem->setValueColor(tsl::infoTextColor); - - listItem->setClickListener([this, value](u64 keys) - { + else if (selected) + listItem->setValueColor(tsl::infoTextColor); + + listItem->setClickListener([this, value](u64 keys) { if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) { if (this->listener(value)) { tsl::goBack(); @@ -131,37 +110,34 @@ tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, boo return listItem; } -tsl::elm::ListItem* ValueChoiceGui::createNamedValueListItem(const NamedValue& namedValue, bool selected, int safety) -{ +tsl::elm::ListItem *ValueChoiceGui::createNamedValueListItem(const NamedValue &namedValue, bool selected, int safety) { std::string text = namedValue.name; if (selected) { - const_cast(namedValue.rightText) = "\uE14B"; + const_cast(namedValue.rightText) = "\uE14B"; } - - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(text, namedValue.rightText, false); - switch (safety) - { - case 0: - listItem->setTextColor(tsl::Color(255, 255, 255, 255)); - listItem->setValueColor(tsl::Color(255, 255, 255, 255)); - break; - case 1: - listItem->setTextColor(tsl::Color(255, 165, 0, 255)); - listItem->setValueColor(tsl::Color(255, 165, 0, 255)); - break; - case 2: - listItem->setTextColor(tsl::Color(255, 0, 0, 255)); - listItem->setValueColor(tsl::Color(255, 0, 0, 255)); - break; + + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, namedValue.rightText, false); + switch (safety) { + case 0: + listItem->setTextColor(tsl::Color(255, 255, 255, 255)); + listItem->setValueColor(tsl::Color(255, 255, 255, 255)); + break; + case 1: + listItem->setTextColor(tsl::Color(255, 165, 0, 255)); + listItem->setValueColor(tsl::Color(255, 165, 0, 255)); + break; + case 2: + listItem->setTextColor(tsl::Color(255, 0, 0, 255)); + listItem->setValueColor(tsl::Color(255, 0, 0, 255)); + break; } if (!namedValue.rightText.empty() && !selected) listItem->setValueColor(tsl::Color(180, 180, 180, 255)); - else if(selected) - listItem->setValueColor(tsl::infoTextColor); + else if (selected) + listItem->setValueColor(tsl::infoTextColor); - listItem->setClickListener([this, value = namedValue.value](u64 keys) - { + listItem->setClickListener([this, value = namedValue.value](u64 keys) { if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) { if (this->listener(value)) { tsl::goBack(); @@ -173,8 +149,7 @@ tsl::elm::ListItem* ValueChoiceGui::createNamedValueListItem(const NamedValue& n return listItem; } -void ValueChoiceGui::listUI() -{ +void ValueChoiceGui::listUI() { if (!categoryName.empty()) { this->listElement->addItem(new tsl::elm::CategoryHeader(categoryName)); } @@ -182,20 +157,19 @@ void ValueChoiceGui::listUI() if (showDefaultValue) { this->listElement->addItem(this->createValueListItem(0, this->selectedValue == 0, 0)); } - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { int safety = enableThresholds ? getSafetyLevel(namedValue.value) : 0; bool selected = (namedValue.value == this->selectedValue); this->listElement->addItem(this->createNamedValueListItem(namedValue, selected, safety)); } - + if (namedValues.empty()) { - for (std::uint32_t value = range.min; value <= range.max; value += range.step) - { + for (std::uint32_t value = range.min; value <= range.max; value += range.step) { int safety = getSafetyLevel(value); bool selected = (value == this->selectedValue); this->listElement->addItem(this->createValueListItem(value, selected, safety)); } } - + this->listElement->jumpToItem("", "\uE14B"); } \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h index 49c7883d..4aeaf05e 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h @@ -17,11 +17,12 @@ * */ #pragma once -#include #include -#include +#include #include +#include #include + #include "base_menu_gui.h" using ValueChoiceListener = std::function; @@ -34,33 +35,32 @@ struct ValueRange { std::string suffix; std::uint32_t divisor; int decimalPlaces; - ValueRange() - : min(0), max(0), step(1), suffix(""), divisor(1), decimalPlaces(0) {} - ValueRange(std::uint32_t min, std::uint32_t max, std::uint32_t step, - const std::string& suffix = "", std::uint32_t divisor = 1, int decimalPlaces = 0) - : min(min), max(max), step(step), suffix(suffix), - divisor(divisor), decimalPlaces(decimalPlaces) {} + ValueRange() : min(0), max(0), step(1), suffix(""), divisor(1), decimalPlaces(0) { + } + ValueRange(std::uint32_t min, std::uint32_t max, std::uint32_t step, const std::string &suffix = "", std::uint32_t divisor = 1, + int decimalPlaces = 0) + : min(min), max(max), step(step), suffix(suffix), divisor(divisor), decimalPlaces(decimalPlaces) { + } }; struct ValueThresholds { std::uint32_t warning; std::uint32_t danger; - ValueThresholds(std::uint32_t warning = 0, std::uint32_t danger = 0) - : warning(warning), danger(danger) {} + ValueThresholds(std::uint32_t warning = 0, std::uint32_t danger = 0) : warning(warning), danger(danger) { + } }; struct NamedValue { std::string name; std::uint32_t value; std::string rightText; - - NamedValue(const std::string& name, std::uint32_t value, const std::string& rightText = "") - : name(name), value(value), rightText(rightText) {} + + NamedValue(const std::string &name, std::uint32_t value, const std::string &rightText = "") : name(name), value(value), rightText(rightText) { + } }; -class ValueChoiceGui : public BaseMenuGui -{ -protected: +class ValueChoiceGui : public BaseMenuGui { + protected: std::uint32_t selectedValue; ValueRange range; std::string categoryName; @@ -68,47 +68,37 @@ protected: ValueThresholds thresholds; bool enableThresholds; std::map labels; - + std::vector namedValues; bool showDefaultValue = true; bool showDNO = false; - tsl::elm::ListItem* createValueListItem(std::uint32_t value, bool selected, int safety); - tsl::elm::ListItem* createNamedValueListItem(const NamedValue& namedValue, bool selected, int safety); + tsl::elm::ListItem *createValueListItem(std::uint32_t value, bool selected, int safety); + tsl::elm::ListItem *createNamedValueListItem(const NamedValue &namedValue, bool selected, int safety); std::string formatValue(std::uint32_t value); int getSafetyLevel(std::uint32_t value); - -public: - ValueChoiceGui(std::uint32_t selectedValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds = ValueThresholds(), - bool enableThresholds = false, - std::map labels = {}, - std::vector namedValues = {}, - bool showDefaultValue = true, + + public: + ValueChoiceGui(std::uint32_t selectedValue, const ValueRange &range, const std::string &categoryName, ValueChoiceListener listener, + const ValueThresholds &thresholds = ValueThresholds(), bool enableThresholds = false, + std::map labels = {}, std::vector namedValues = {}, bool showDefaultValue = true, bool showDNO = false); ~ValueChoiceGui(); - - void addNamedValue(const std::string& name, std::uint32_t value, const std::string& rightText = "") - { + + void addNamedValue(const std::string &name, std::uint32_t value, const std::string &rightText = "") { namedValues.emplace_back(name, value, rightText); } - - void addNamedValues(const std::vector& values) - { + + void addNamedValues(const std::vector &values) { namedValues.insert(namedValues.end(), values.begin(), values.end()); } - - void clearNamedValues() - { + + void clearNamedValues() { namedValues.clear(); } - - void setShowDefaultValue(bool show) - { + + void setShowDefaultValue(bool show) { showDefaultValue = show; } - + void listUI() override; }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/style.h b/Source/hoc-clk/overlay/src/ui/style.h index 45692881..2c718ac9 100644 --- a/Source/hoc-clk/overlay/src/ui/style.h +++ b/Source/hoc-clk/overlay/src/ui/style.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,7 +24,6 @@ * -------------------------------------------------------------------------- */ - #pragma once #include diff --git a/Source/hoc-clk/sysmodule/Makefile b/Source/hoc-clk/sysmodule/Makefile index e54363df..7964f564 100644 --- a/Source/hoc-clk/sysmodule/Makefile +++ b/Source/hoc-clk/sysmodule/Makefile @@ -28,8 +28,8 @@ INCLUDES := ../common/include src/hos src/soc src/i2c src/util src/pwr src/ipc EXEFS_SRC := exefs_src LIBNAMES := minIni # major minor patch -TARGET_VERSION := 2.4.0 -KIP_VERSION := 240 +TARGET_VERSION := 2.4.1 +KIP_VERSION := 241 CUST_REV := 4 #--------------------------------------------------------------------------------- diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index ee4d068a..bc79045d 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -24,31 +24,32 @@ * -------------------------------------------------------------------------- */ -#include "../hos/apm_ext.h" -#include -#include -#include -#include -#include -#include +#include #include -#include +#include +#include +#include #include #include -#include -#include "../display/display_refresh_rate.hpp" -#include +#include +#include +#include +#include "../display/display_refresh_rate.hpp" +#include "../file/file_utils.hpp" +#include "../hos/apm_ext.h" +#include "../hos/integrations.hpp" +#include "../hos/rgltr.h" +#include "../tsensor/aotag.hpp" +#include "../tsensor/soctherm.hpp" #include "board.hpp" #include "board_fuse.hpp" #include "board_load.hpp" -#include "board_volt.hpp" #include "board_misc.hpp" -#include "../tsensor/soctherm.hpp" -#include "../tsensor/aotag.hpp" -#include "../hos/integrations.hpp" -#include "../file/file_utils.hpp" -#include "../hos/rgltr.h" +#include "board_volt.hpp" +#include +#include + namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -62,25 +63,25 @@ namespace board { u32 fd = 0, fd2 = 0; - #define PMC_BASE 0x7000E400 - #define APB_MISC_GP_HIDREV 0x804 - #define GP_HIDREV_MAJOR_T210 0x1 - #define GP_HIDREV_MAJOR_T210B01 0x2 - #define APB_BASE 0x70000000 - #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) - #define FUSE_OFFSET 0x800 +#define PMC_BASE 0x7000E400 +#define APB_MISC_GP_HIDREV 0x804 +#define GP_HIDREV_MAJOR_T210 0x1 +#define GP_HIDREV_MAJOR_T210B01 0x2 +#define APB_BASE 0x70000000 +#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) +#define FUSE_OFFSET 0x800 void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); - u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV); + u32 hidrev = *(u32 *)(apbVirtAddr + APB_MISC_GP_HIDREV); if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) { gSocType = HocClkSocType_Mariko; } else { gSocType = HocClkSocType_Erista; } - u32 odm4 = *(u32*)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4)); + u32 odm4 = *(u32 *)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4)); if (gSocType == HocClkSocType_Mariko) { switch ((odm4 & 0xF0000) >> 16) { @@ -123,7 +124,7 @@ namespace board { rc = psmInitialize(); ASSERT_RESULT_OK(rc, "psmInitialize"); - if(HOSSVC_HAS_TC) { + if (HOSSVC_HAS_TC) { rc = tcInitialize(); ASSERT_RESULT_OK(rc, "tcInitialize"); } @@ -170,7 +171,7 @@ namespace board { batteryInfoInitialize(); - tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG + tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG // PMC exosphere check SecmonArgs args = {}; @@ -178,18 +179,21 @@ namespace board { args.X[1] = PMC_BASE; svcCallSecureMonitor(&args); - if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed + if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed tsensor::InitializeAotag(GetSocType() == HocClkSocType_Mariko); } Result pwmCheck = 1; - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { + if (hosversionAtLeast(6, 0, 0) && R_SUCCEEDED(pwmInitialize())) { pwmCheck = pwmOpenSession2(&iCon, 0x3D000001); } StartMiscThread(pwmCheck, &iCon); - display::DisplayRefreshConfig cfg = {.clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr, .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), .isRetroSUPER = integrations::GetRETROSuperStatus()}; + display::DisplayRefreshConfig cfg = { .clkVirtAddr = clkVirtAddr, + .dsiVirtAddr = dsiVirtAddr, + .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), + .isRetroSUPER = integrations::GetRETROSuperStatus() }; display::Initialize(&cfg); CacheDfllData(); @@ -243,7 +247,7 @@ namespace board { args.X[1] = MC_REGISTER_BASE + MC_EMEM_CFG_0; svcCallSecureMonitor(&args); - if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed + if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed notification::writeNotification("Horizon OC\nSecmon read failed!\n This may be a hardware issue!"); return false; } @@ -270,4 +274,4 @@ namespace board { return false; /* stub for now. */ } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 266f87db..453d5fa0 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -26,18 +26,20 @@ #pragma once -#include #include +#include + +#include "../mapping/mem_map.hpp" +#include "board_freq.hpp" #include "board_fuse.hpp" #include "board_load.hpp" #include "board_name.hpp" -#include "board_freq.hpp" +#include "board_profile.hpp" #include "board_sensor.hpp" #include "board_volt.hpp" -#include "board_profile.hpp" -#include "../mapping/mem_map.hpp" -#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0)) -#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0)) + +#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8, 0, 0)) +#define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0)) namespace board { extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -46,7 +48,7 @@ namespace board { extern HocClkConsoleType gConsoleType; extern FuseData fuseData; extern u8 speedoBracket; - + void Initialize(); void Exit(); HocClkSocType GetSocType(); @@ -58,4 +60,4 @@ namespace board { FuseData *GetFuseData(); bool IsUsingRetroSuperDisplay(); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 588ee016..8386d8ef 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -24,24 +24,25 @@ * -------------------------------------------------------------------------- */ -#include #include -#include "../hos/apm_ext.h" #include -#include "../i2c/i2cDrv.h" -#include #include +#include +#include #include -#include -#include + #include "../display/display_refresh_rate.hpp" +#include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../hos/apm_ext.h" +#include "../i2c/i2cDrv.h" +#include "../soc/gm20b.hpp" +#include "../soc/pllmb.hpp" #include "board.hpp" #include "board_name.hpp" -#include "../file/errors.hpp" -#include "../soc/pllmb.hpp" -#include "../file/config.hpp" -#include "../soc/gm20b.hpp" -#include "../file/config.hpp" +#include +#include + namespace board { static u32 currentInjectedHz = 0; static u32 gMarikoGm20bCutoff = 1228800000; @@ -80,12 +81,12 @@ namespace board { ASSERT_RESULT_OK(pcvSetClockRate(moduleID, hz), "pcvSetClockRate"); } - void HandleCpuUv() - { + void HandleCpuUv() { if (board::GetSocType() == HocClkSocType_Erista) - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); } void SetHz(HocClkModule module, u32 hz) { @@ -101,7 +102,8 @@ namespace board { return; } - bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) && hz < gMarikoGm20bCutoff; + bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) && + hz < gMarikoGm20bCutoff; u32 pcvHz = useGm20b ? ((hz + 76800000 - 1) / 76800000) * 76800000 : hz; @@ -129,7 +131,7 @@ namespace board { PcvSetHz(GetPcvModule(module), pcvHz); } } - if(config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) { + if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) { HandleCpuUv(); } if (useGm20b) { @@ -181,7 +183,9 @@ namespace board { case HocClkModule_GPU: return t210ClkGpuFreq(); case HocClkModule_MEM: - return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL ? pllmb::getRamClockRatePLLMB() : t210ClkMemFreq(); + return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL + ? pllmb::getRamClockRatePLLMB() + : t210ClkMemFreq(); case HocClkModule_Display: return GetDisplayRate(hz); default: @@ -197,7 +201,6 @@ namespace board { s32 tmpInMaxCount = maxCount; s32 tmpOutCount = 0; - if (HOSSVC_HAS_CLKRST) { ClkrstSession session = {}; @@ -230,20 +233,20 @@ namespace board { void ResetToStock() { Result rc; - if (hosversionAtLeast(9,0,0)) { + if (hosversionAtLeast(9, 0, 0)) { std::uint32_t confId = 0; rc = apmExtGetCurrentPerformanceConfiguration(&confId); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); - HocClkApmConfiguration* apmConfiguration = nullptr; + HocClkApmConfiguration *apmConfiguration = nullptr; for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) { - if(hocclk_g_apm_configurations[i].id == confId) { + if (hocclk_g_apm_configurations[i].id == confId) { apmConfiguration = &hocclk_g_apm_configurations[i]; break; } } - if(!apmConfiguration) { + if (!apmConfiguration) { ERROR_THROW("Unknown apm configuration: %x", confId); } @@ -263,4 +266,4 @@ namespace board { void ResetToStockDisplay() { display::SetRate(60); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp index 1b247749..fa774cbe 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp @@ -25,16 +25,18 @@ */ #pragma once -#include #include -#include "../hos/apm_ext.h" #include -#include #include +#include +#include #include + +#include "../file/errors.hpp" +#include "../hos/apm_ext.h" #include #include -#include "../file/errors.hpp" + namespace board { @@ -46,12 +48,11 @@ namespace board { void GetFreqList(HocClkModule module, u32 *outList, u32 maxCount, u32 *outCount); u32 GetHighestDockedDisplayRate(); void HandleCpuUv(); - + void ResetToStock(); void ResetToStockDisplay(); - template - void ResetToStockModule(Getter getHzFunc, HocClkModule module) { + template void ResetToStockModule(Getter getHzFunc, HocClkModule module) { Result rc = 0; if (hosversionAtLeast(9, 0, 0)) { @@ -59,7 +60,7 @@ namespace board { rc = apmExtGetCurrentPerformanceConfiguration(&confId); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); - HocClkApmConfiguration* apmConfiguration = nullptr; + HocClkApmConfiguration *apmConfiguration = nullptr; for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) { if (hocclk_g_apm_configurations[i].id == confId) { @@ -84,15 +85,15 @@ namespace board { } inline void ResetToStockCpu() { - ResetToStockModule([](const HocClkApmConfiguration& cfg) {return cfg.cpu_hz; }, HocClkModule_CPU); + ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.cpu_hz; }, HocClkModule_CPU); } inline void ResetToStockGpu() { - ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.gpu_hz; }, HocClkModule_GPU); + ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.gpu_hz; }, HocClkModule_GPU); } inline void ResetToStockMem() { - ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.mem_hz; }, HocClkModule_MEM); + ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.mem_hz; }, HocClkModule_MEM); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp index dbfd0b7a..3fd3b849 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp @@ -15,51 +15,48 @@ * */ -#include -#include -#include "board_fuse.hpp" #include +#include +#include + #include "board.hpp" +#include "board_fuse.hpp" + namespace board { void SetGpuBracket(u16 speedo, u8 &gpuBracket) { - if(GetSocType() == HocClkSocType_Mariko) { - if (speedo <= 1624) { + switch (speedo) { + // Mariko + case 1300 ... 1624: gpuBracket = 0; - return; - } - - if (speedo <= 1689) { + break; + case 1625 ... 1689: gpuBracket = 1; - return; - } - - if (speedo <= 1753) { + break; + case 1690 ... 1753: gpuBracket = 2; - return; - } + break; + case 1754 ... 1849: + gpuBracket = 3; + break; - /* >= 1754 */ - gpuBracket = 3; - } else { - switch(speedo) { - case 1850 ... 1925: - gpuBracket = 0; - break; - case 1926 ... 2025: - gpuBracket = 1; - break; - case 2026 ... 2100: - gpuBracket = 2; - break; - case 2101 ... 2200: - gpuBracket = 3; - break; - default: - gpuBracket = 0; - break; - } + // Erista + case 1850 ... 1925: + gpuBracket = 0; + break; + case 1926 ... 2025: + gpuBracket = 1; + break; + case 2026 ... 2100: + gpuBracket = 2; + break; + case 2101 ... 2200: + gpuBracket = 3; + break; + default: + gpuBracket = 0; + break; } } @@ -70,12 +67,12 @@ namespace board { speedo.cpuSpeedo = *reinterpret_cast(fusePtr + FUSE_CPU_SPEEDO_0_CALIB); speedo.gpuSpeedo = *reinterpret_cast(fusePtr + FUSE_CPU_SPEEDO_2_CALIB); speedo.socSpeedo = *reinterpret_cast(fusePtr + FUSE_SOC_SPEEDO_0_CALIB); - speedo.cpuIDDQ = *reinterpret_cast(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4; - speedo.gpuIDDQ = *reinterpret_cast(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5; - speedo.socIDDQ = *reinterpret_cast(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4; - speedo.waferX = *reinterpret_cast(fusePtr + FUSE_OPT_X_COORDINATE); - speedo.waferY = *reinterpret_cast(fusePtr + FUSE_OPT_Y_COORDINATE); - speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX; + speedo.cpuIDDQ = *reinterpret_cast(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4; + speedo.gpuIDDQ = *reinterpret_cast(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5; + speedo.socIDDQ = *reinterpret_cast(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4; + speedo.waferX = *reinterpret_cast(fusePtr + FUSE_OPT_X_COORDINATE); + speedo.waferY = *reinterpret_cast(fusePtr + FUSE_OPT_Y_COORDINATE); + speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp index 4acb11b2..5d81f835 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp @@ -37,4 +37,4 @@ namespace board { void ReadFuses(FuseData &speedo, u64 fuseVa); void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index 8428b62a..bf814453 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -24,22 +24,24 @@ * -------------------------------------------------------------------------- */ -#include +#include +#include #include -#include "../hos/apm_ext.h" #include -#include +#include #include +#include +#include +#include +#include #include + +#include "../hos/apm_ext.h" +#include "board.hpp" +#include "board_misc.hpp" #include #include -#include -#include -#include -#include -#include -#include "board_misc.hpp" -#include "board.hpp" + namespace board { @@ -61,23 +63,24 @@ namespace board { constexpr double Systemtickfrequency = 19200000.0 * (static_cast(CpuTimeOutNs) / 1'000'000'000.0); void GpuLoadThread(void *ptr) { - #define gpu_samples_average 8 - #define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715 - uint32_t gpu_load_array[gpu_samples_average] = {0}; +#define gpu_samples_average 8 +#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715 + uint32_t gpu_load_array[gpu_samples_average] = { 0 }; size_t i = 0; - if (R_SUCCEEDED(nvCheck_load)) do { - u32 temp; - if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) { - gpu_load_array[i++ % gpu_samples_average] = temp; - gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; - } - svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) - } while(true); + if (R_SUCCEEDED(nvCheck_load)) + do { + u32 temp; + if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) { + gpu_load_array[i++ % gpu_samples_average] = temp; + gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; + } + svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) + } while (true); } void CheckCore(void *idletickPtr) { - u64* idletick = static_cast(idletickPtr); - while(true) { + u64 *idletick = static_cast(idletickPtr); + while (true) { u64 idletickA; u64 idletickB; svcGetInfo(&idletickB, InfoType_IdleTickCount, INVALID_HANDLE, -1); @@ -107,11 +110,11 @@ namespace board { float cpuUsage0 = std::clamp(((Systemtickfrequency - idletick0) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); float cpuUsage1 = std::clamp(((Systemtickfrequency - idletick1) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); float cpuUsage2 = std::clamp(((Systemtickfrequency - idletick2) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); - return std::round(std::max({cpuUsage0, cpuUsage1, cpuUsage2})); + return std::round(std::max({ cpuUsage0, cpuUsage1, cpuUsage2 })); } u32 GetPartLoad(HocClkPartLoad loadSource) { - switch(loadSource) { + switch (loadSource) { case HocClkPartLoad_EMC: return t210EmcLoadAll(); case HocClkPartLoad_EMCCpu: @@ -148,9 +151,9 @@ namespace board { } namespace { - constexpr u32 NVschedCtrlEnable = 0x00000601; + constexpr u32 NVschedCtrlEnable = 0x00000601; constexpr u32 NVschedCtrlDisable = 0x00000602; - } + } // namespace void SetGpuSchedulingMode(GpuSchedulingMode mode, GpuSchedulingOverrideMethod method) { if (R_FAILED(nvCheckSched) && method == GpuSchedulingOverrideMethod_NvService) { @@ -160,7 +163,8 @@ namespace board { u32 temp; bool enabled = false; switch (mode) { - case GpuSchedulingMode_DoNotOverride: break; + case GpuSchedulingMode_DoNotOverride: + break; case GpuSchedulingMode_Disabled: if (method == GpuSchedulingOverrideMethod_NvService) { nvIoctl(_fd2, NVschedCtrlDisable, &temp); @@ -198,4 +202,4 @@ namespace board { nvCheckSched = nvSched; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.hpp b/Source/hoc-clk/sysmodule/src/board/board_load.hpp index 2b039787..d742d4cb 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.hpp @@ -25,8 +25,9 @@ */ #pragma once -#include #include +#include + namespace board { @@ -37,4 +38,4 @@ namespace board { void SchedSetFD2(u32 fd2); void NvSchedSucceed(Result nvSched); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp index d7402d9a..b2315cf1 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp @@ -24,9 +24,9 @@ * -------------------------------------------------------------------------- */ -#include -#include #include +#include +#include namespace board { @@ -68,4 +68,4 @@ namespace board { threadClose(&miscThread); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.hpp b/Source/hoc-clk/sysmodule/src/board/board_misc.hpp index 666535c9..05521dc9 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.hpp @@ -26,9 +26,9 @@ #pragma once -#include #include #include +#include namespace board { @@ -36,4 +36,4 @@ namespace board { void ExitMiscThread(); u8 GetFanLevel(); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_name.cpp b/Source/hoc-clk/sysmodule/src/board/board_name.cpp index 45c0497d..b390edc9 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_name.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_name.cpp @@ -24,8 +24,9 @@ * -------------------------------------------------------------------------- */ -#include #include +#include + #include "board.hpp" namespace board { @@ -50,4 +51,4 @@ namespace board { return hocclkFormatPowerSensor(sensor, pretty); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_name.hpp b/Source/hoc-clk/sysmodule/src/board/board_name.hpp index 591bd763..26a88cd0 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_name.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_name.hpp @@ -25,8 +25,8 @@ */ #pragma once -#include #include +#include namespace board { @@ -35,4 +35,4 @@ namespace board { const char *GetThermalSensorName(HocClkThermalSensor sensor, bool pretty); const char *GetPowerSensorName(HocClkPowerSensor sensor, bool pretty); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp index 4a43b32a..6d7da57e 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp @@ -24,16 +24,17 @@ * -------------------------------------------------------------------------- */ -#include #include -#include "../hos/apm_ext.h" #include -#include #include +#include +#include #include + +#include "../hos/apm_ext.h" +#include "board.hpp" #include #include -#include "board.hpp" namespace board { @@ -60,4 +61,4 @@ namespace board { return HocClkProfile_Handheld; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.hpp b/Source/hoc-clk/sysmodule/src/board/board_profile.hpp index 32657b91..c99344fe 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.hpp @@ -28,7 +28,5 @@ #include namespace board { - HocClkProfile GetProfile(); - } diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index f7fc3492..3e88eba3 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -24,24 +24,26 @@ * -------------------------------------------------------------------------- */ -#include -#include -#include "../hos/apm_ext.h" -#include -#include "../i2c/i2cDrv.h" -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include #include -#include "board.hpp" -#include "../tsensor/soctherm.hpp" +#include +#include +#include + +#include "../file/config.hpp" +#include "../hos/apm_ext.h" +#include "../i2c/i2cDrv.h" #include "../tsensor/aotag.hpp" #include "../tsensor/bq24193.hpp" -#include "../file/config.hpp" +#include "../tsensor/soctherm.hpp" +#include "board.hpp" +#include +#include + namespace board { @@ -52,7 +54,7 @@ namespace board { tsensor::TSensorTemps temps = {}; tsensor::ReadTSensors(temps); - switch(sensor) { + switch (sensor) { case HocClkThermalSensor_SOC: { millis = tmp451TempSoc(); break; @@ -127,4 +129,4 @@ namespace board { return 0; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp index b322eda0..baa925c2 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp @@ -33,4 +33,4 @@ namespace board { s32 GetTemperatureMilli(HocClkThermalSensor sensor); s32 GetPowerMw(HocClkPowerSensor sensor); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index e0b5967f..e37f0e63 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -1,8 +1,8 @@ /* * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * + * * Copyright (c) B3711 - * + * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. @@ -17,22 +17,24 @@ * */ -#include +#include +#include #include #include #include -#include -#include +#include + +#include "../file/file_utils.hpp" +#include "../hos/rgltr.h" +#include "../i2c/i2cDrv.h" #include "board.hpp" #include "board_freq.hpp" #include "board_volt.hpp" -#include "../file/file_utils.hpp" -#include "../i2c/i2cDrv.h" -#include "../hos/rgltr.h" + namespace board { GpuVoltData voltData = {}; - u32 cpuVoltTable[32] = {}; // 32LUT + u32 cpuVoltTable[32] = {}; // 32LUT u64 cldvfs; CpuDfllData cachedTune; @@ -50,54 +52,30 @@ namespace board { u32 tune1_high; }; - EristaCpuUvEntry eristaCpuUvTableLowBracket[6] = { // <2118 CPU speedo - {0xFFEAD0FF, 0x25501d0}, - {0xffff, 0x27007ff}, - {0xefff, 0x27407ff}, - {0xdfff, 0x27807ff}, - {0xdfdf, 0x27a07ff}, - {0xcfdf, 0x37007ff}, + EristaCpuUvEntry eristaCpuUvTableLowBracket[6] = { + // <2118 CPU speedo + { 0xFFEAD0FF, 0x25501d0 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff }, + { 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff }, }; EristaCpuUvEntry eristaCpuUvTableHighBracket[6] = { - {0xFFEAD0FF, 0x20091d9}, - {0xffff, 0x27007ff}, - {0xefff, 0x27407ff}, - {0xdfff, 0x27807ff}, - {0xdfdf, 0x27a07ff}, - {0xcfdf, 0x37007ff}, + { 0xFFEAD0FF, 0x20091d9 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff }, + { 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff }, }; MarikoCpuUvEntry marikoCpuUvLow[12] = { - {0xffa0, 0xffff, 0x21107ff, 0}, - {0x0, 0xffdf, 0x21107ff, 0x27207ff}, - {0xffdf, 0xffdf, 0x21107ff, 0x27307ff}, - {0xffff, 0xffdf, 0x21107ff, 0x27407ff}, - {0x0, 0xffdf, 0x21607ff, 0x27707ff}, - {0x0, 0xffdf, 0x21607ff, 0x27807ff}, - {0x0, 0xdfff, 0x21607ff, 0x27b07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27b07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27c07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27d07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27e07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27f07ff}, + { 0xffa0, 0xffff, 0x21107ff, 0 }, { 0x0, 0xffdf, 0x21107ff, 0x27207ff }, { 0xffdf, 0xffdf, 0x21107ff, 0x27307ff }, + { 0xffff, 0xffdf, 0x21107ff, 0x27407ff }, { 0x0, 0xffdf, 0x21607ff, 0x27707ff }, { 0x0, 0xffdf, 0x21607ff, 0x27807ff }, + { 0x0, 0xdfff, 0x21607ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27c07ff }, + { 0xdfff, 0xdfff, 0x21707ff, 0x27d07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27e07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27f07ff }, }; MarikoCpuUvEntry marikoCpuUvHigh[12] = { - {0x0, 0xffff, 0, 0}, - {0x0, 0xffdf, 0, 0x27207ff}, - {0x0, 0xffdf, 0, 0x27307ff}, - {0x0, 0xffdf, 0, 0x27407ff}, - {0x0, 0xffdf, 0, 0x27707ff}, - {0x0, 0xffdf, 0, 0x27807ff}, - {0x0, 0xdfff, 0, 0x27b07ff}, - {0x0, 0xdfff, 0, 0x27c07ff}, - {0x0, 0xdfff, 0, 0x27d07ff}, - {0x0, 0xdfff, 0, 0x27e07ff}, - {0x0, 0xdfff, 0, 0x27f07ff}, - {0x0, 0xdfff, 0, 0x27f07ff}, + { 0x0, 0xffff, 0, 0 }, { 0x0, 0xffdf, 0, 0x27207ff }, { 0x0, 0xffdf, 0, 0x27307ff }, { 0x0, 0xffdf, 0, 0x27407ff }, + { 0x0, 0xffdf, 0, 0x27707ff }, { 0x0, 0xffdf, 0, 0x27807ff }, { 0x0, 0xdfff, 0, 0x27b07ff }, { 0x0, 0xdfff, 0, 0x27c07ff }, + { 0x0, 0xdfff, 0, 0x27d07ff }, { 0x0, 0xdfff, 0, 0x27e07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, }; - } + } // namespace void CacheDfllData() { Result rc = QueryMemoryMapping(&cldvfs, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE); @@ -111,33 +89,33 @@ namespace board { /* TODO: clean up this code. */ void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint) { - u32* tune0_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE0_0); - u32* tune1_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE1_0); - + u32 *tune0_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE0_0); + u32 *tune1_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE1_0); + if (GetSocType() == HocClkSocType_Mariko) { if (GetHz(HocClkModule_CPU) < tbreakPoint && (levelLow || levelHigh)) { if (levelLow) { - *tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low; - *tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low; + *tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low; + *tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low; } return; } else { if (levelLow) { - *tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low; - *tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low; + *tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low; + *tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low; } if (levelHigh) { - *tune0_ptr = marikoCpuUvHigh[levelHigh-1].tune0_high; - *tune1_ptr = marikoCpuUvHigh[levelHigh-1].tune1_high; + *tune0_ptr = marikoCpuUvHigh[levelHigh - 1].tune0_high; + *tune1_ptr = marikoCpuUvHigh[levelHigh - 1].tune1_high; } return; } - if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak + if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak *tune0_ptr = 0xCFFF; *tune1_ptr = 0xFF072201; return; } else if (GetHz(HocClkModule_CPU) >= tbreakPoint || (!levelHigh)) { - *tune0_ptr = cachedTune.tune0High; // per console? + *tune0_ptr = cachedTune.tune0High; // per console? *tune1_ptr = 0xFFF7FF3F; return; } @@ -210,9 +188,9 @@ namespace board { PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq } PowerDomainId; */ - /* - Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me) - */ + /* + Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me) + */ u32 GetVoltage(HocClkVoltage voltage) { u32 out = 0; BatteryChargeInfo info; @@ -225,7 +203,7 @@ namespace board { out = I2c_BuckConverter_GetUvOut(&I2c_VDD2); break; case HocClkVoltage_CPU: - if(GetSocType() == HocClkSocType_Mariko) { + if (GetSocType() == HocClkSocType_Mariko) { out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_CPU); } else { rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Cpu); @@ -234,16 +212,16 @@ namespace board { } break; case HocClkVoltage_GPU: - if(GetSocType() == HocClkSocType_Mariko) { + if (GetSocType() == HocClkSocType_Mariko) { out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_GPU); } else { rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Gpu); rgltrGetVoltage(&s, &out); rgltrCloseSession(&s); - } + } break; case HocClkVoltage_EMCVDDQ: - if(GetSocType() == HocClkSocType_Mariko) { + if (GetSocType() == HocClkSocType_Mariko) { out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_DRAM_VDDQ); } else { out = I2c_BuckConverter_GetUvOut(&I2c_VDD2); @@ -266,8 +244,8 @@ namespace board { Handle GetPcvHandle() { constexpr u64 PcvID = 0x10000000000001a; u64 processIDList[80]{}; - s32 processCount = 0; - Handle handle = INVALID_HANDLE; + s32 processCount = 0; + Handle handle = INVALID_HANDLE; DebugEventInfo debugEvent{}; @@ -306,9 +284,9 @@ namespace board { void CacheGpuVoltTable() { // Likely CPU regulator? UnkRegulator reg = { - .voltageMin = 600000, + .voltageMin = 600000, .voltageStep = 12500, - .voltageMax = 1400000, + .voltageMax = 1400000, }; Handle handle = GetPcvHandle(); @@ -365,17 +343,17 @@ namespace board { } constexpr u32 CpuVoltageTableOffset = 0xB8; - std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table + std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table svcCloseHandle(handle); handle = INVALID_HANDLE; // Print info AFTER we exit the handle to avoid hangs - for(int i = 0; i < (int)std::size(cpuVoltTable); ++i) { + for (int i = 0; i < (int)std::size(cpuVoltTable); ++i) { fileUtils::LogLine("[dvfs] cpu volt %d: %u mV", i, cpuVoltTable[i]); } - for(int i = 0; i < (int)std::size(voltData.voltTable); ++i) { + for (int i = 0; i < (int)std::size(voltData.voltTable); ++i) { fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[0][i]); } return; @@ -420,35 +398,50 @@ namespace board { u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) { u32 baseVolt = 800; - if(GetSocType() == HocClkSocType_Mariko) { + if (GetSocType() == HocClkSocType_Mariko) { static const u32 ramTable[][22] = { - { 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, }, // Bracket 0 - { 2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833, 2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266, }, // Bracket 1 - { 2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366, }, // Bracket 2 - { 2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033, 3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400, }, // Bracket 3 + { + 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, + 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, + }, // Bracket 0 + { + 2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833, + 2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266, + }, // Bracket 1 + { + 2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933, + 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366, + }, // Bracket 2 + { + 2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033, + 3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400, + }, // Bracket 3 }; - static const u32 gpuVoltArray[] = { 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, }; + static const u32 gpuVoltArray[] = { + 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, + }; - if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin - if (bracket >= std::size(ramTable)) bracket = 0; + if (freqMhz <= 1600) + return 0; // DVFS doesnt work below 1600MHz, it will just use vMin + if (bracket >= std::size(ramTable)) + bracket = 0; u32 bracketStart = ramTable[bracket][0]; - - - u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch! - u32 rampSpan = 590 - rampStartVolt; + u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch! + u32 rampSpan = 590 - rampStartVolt; if (freqMhz >= 1633 && freqMhz < bracketStart) { u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633); u32 volt = ((raw + 2) / 5) * 5; - if (volt < rampStartVolt) volt = rampStartVolt; - if (volt > 590) volt = 590; + if (volt < rampStartVolt) + volt = rampStartVolt; + if (volt > 590) + volt = 590; return volt; } - baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1]; for (u32 i = 0; i < std::size(gpuVoltArray); ++i) { if (freqMhz <= ramTable[bracket][i]) { @@ -456,28 +449,105 @@ namespace board { break; } } + return baseVolt; } else { - struct DvfsEntry { u32 freq; u32 volt; }; + struct DvfsEntry { + u32 freq; + u32 volt; + }; static const DvfsEntry ramTable[][19] = { - { {1733,725}, {1800,730}, {1866,735}, {1920,740}, {1958,745}, {1996,750}, {2035,755}, {2073,760}, {2112,765}, {2131,770}, {2150,775}, {2169,780}, {2188,785}, {2227,790}, {2265,795}, {2304,800}, {2342,805}, {2380,810}, {2400,815} }, // Bracket 0 - { {1733,715}, {1800,720}, {1866,725}, {1920,730}, {1958,735}, {1996,740}, {2035,745}, {2073,750}, {2112,755}, {2131,760}, {2150,765}, {2169,770}, {2188,775}, {2227,780}, {2265,785}, {2304,790}, {2342,795}, {2380,800}, {2400,805} }, // Bracket 1 - { {1733,705}, {1800,710}, {1866,715}, {1920,720}, {1958,725}, {1996,730}, {2035,735}, {2073,740}, {2112,745}, {2131,750}, {2150,755}, {2169,760}, {2188,765}, {2227,770}, {2265,775}, {2304,780}, {2342,785}, {2380,790}, {2400,795} }, // Bracket 2 - { {1733,695}, {1800,700}, {1866,705}, {1920,710}, {1958,715}, {1996,720}, {2035,725}, {2073,730}, {2112,735}, {2131,740}, {2150,745}, {2169,750}, {2188,755}, {2227,760}, {2265,765}, {2304,770}, {2342,775}, {2380,780}, {2400,785} }, // Bracket 3 + { { 1733, 725 }, + { 1800, 730 }, + { 1866, 735 }, + { 1920, 740 }, + { 1958, 745 }, + { 1996, 750 }, + { 2035, 755 }, + { 2073, 760 }, + { 2112, 765 }, + { 2131, 770 }, + { 2150, 775 }, + { 2169, 780 }, + { 2188, 785 }, + { 2227, 790 }, + { 2265, 795 }, + { 2304, 800 }, + { 2342, 805 }, + { 2380, 810 }, + { 2400, 815 } }, // Bracket 0 + { { 1733, 715 }, + { 1800, 720 }, + { 1866, 725 }, + { 1920, 730 }, + { 1958, 735 }, + { 1996, 740 }, + { 2035, 745 }, + { 2073, 750 }, + { 2112, 755 }, + { 2131, 760 }, + { 2150, 765 }, + { 2169, 770 }, + { 2188, 775 }, + { 2227, 780 }, + { 2265, 785 }, + { 2304, 790 }, + { 2342, 795 }, + { 2380, 800 }, + { 2400, 805 } }, // Bracket 1 + { { 1733, 705 }, + { 1800, 710 }, + { 1866, 715 }, + { 1920, 720 }, + { 1958, 725 }, + { 1996, 730 }, + { 2035, 735 }, + { 2073, 740 }, + { 2112, 745 }, + { 2131, 750 }, + { 2150, 755 }, + { 2169, 760 }, + { 2188, 765 }, + { 2227, 770 }, + { 2265, 775 }, + { 2304, 780 }, + { 2342, 785 }, + { 2380, 790 }, + { 2400, 795 } }, // Bracket 2 + { { 1733, 695 }, + { 1800, 700 }, + { 1866, 705 }, + { 1920, 710 }, + { 1958, 715 }, + { 1996, 720 }, + { 2035, 725 }, + { 2073, 730 }, + { 2112, 735 }, + { 2131, 740 }, + { 2150, 745 }, + { 2169, 750 }, + { 2188, 755 }, + { 2227, 760 }, + { 2265, 765 }, + { 2304, 770 }, + { 2342, 775 }, + { 2380, 780 }, + { 2400, 785 } }, // Bracket 3 }; - if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin - if (bracket >= std::size(ramTable)) bracket = 0; + if (freqMhz <= 1600) + return 0; // DVFS doesnt work below 1600MHz, it will just use vMin + if (bracket >= std::size(ramTable)) + bracket = 0; - const auto& entries = ramTable[bracket]; + const auto &entries = ramTable[bracket]; baseVolt = entries[std::size(entries) - 1].volt; - for (const auto& entry : entries) { + for (const auto &entry : entries) { if (freqMhz <= entry.freq) { baseVolt = entry.volt; break; } } + return baseVolt; } - - return baseVolt; } -} \ No newline at end of file +} // namespace board \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp index b8906534..41de0023 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp @@ -16,8 +16,9 @@ */ #pragma once -#include #include +#include + namespace board { @@ -37,9 +38,9 @@ namespace board { u32 tune0High; u32 tune1Low; u32 tune1High; - // u32 tune_high_min_millivolts; - // u32 tune_high_margin_millivolts; - // u64 dvco_calibration_max; + // u32 tune_high_min_millivolts; + // u32 tune_high_margin_millivolts; + // u64 dvco_calibration_max; }; void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint); @@ -50,4 +51,4 @@ namespace board { void PcvHijackGpuVolts(u32 vmin); u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/display/aula.cpp b/Source/hoc-clk/sysmodule/src/display/aula.cpp index 7ff02674..7a6297da 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.cpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.cpp @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include "aula.hpp" @@ -23,26 +23,24 @@ // I *think* HOS changes this in some ways, so look into it more namespace AulaDisplay { - #define MMIO_REG32(base, off) *(vu32 *)((base) + (off)) - #define DSI(off) MMIO_REG32(board::dsiVirtAddr, (off) << 2u) - #define DSI_WR_DATA 0xA - #define DSI_TRIGGER 0x13 +#define MMIO_REG32(base, off) *(vu32 *)((base) + (off)) +#define DSI(off) MMIO_REG32(board::dsiVirtAddr, (off) << 2u) +#define DSI_WR_DATA 0xA +#define DSI_TRIGGER 0x13 void _display_dsi_send_cmd(u8 cmd, u32 param, u32 wait) { DSI(DSI_WR_DATA) = (param << 8) | cmd; DSI(DSI_TRIGGER) = DSI_TRIGGER_HOST; if (wait) - svcSleepThread(wait * 1000); // usleep-equivalant + svcSleepThread(wait * 1000); // usleep-equivalant } void SetDisplayColorMode(AulaColorMode mode) { - if(mode == AulaDisplayColorMode_DoNotOverride) + if (mode == AulaDisplayColorMode_DoNotOverride) return; // send display command to change color mode. - _display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, - MIPI_DCS_PRIV_SM_SET_COLOR_MODE | (mode << 8), 0); - + _display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, MIPI_DCS_PRIV_SM_SET_COLOR_MODE | (mode << 8), 0); } -} \ No newline at end of file +} // namespace AulaDisplay \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/display/aula.hpp b/Source/hoc-clk/sysmodule/src/display/aula.hpp index 7c70cc88..14537fd7 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.hpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.hpp @@ -12,10 +12,10 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - +#pragma once #include "../board/board.hpp" namespace AulaDisplay { diff --git a/Source/hoc-clk/sysmodule/src/display/common.hpp b/Source/hoc-clk/sysmodule/src/display/common.hpp index b10cf258..b88ac496 100644 --- a/Source/hoc-clk/sysmodule/src/display/common.hpp +++ b/Source/hoc-clk/sysmodule/src/display/common.hpp @@ -19,14 +19,14 @@ #define _DI_H_ #define DSI_VIDEO_DISABLED 0 -#define DSI_VIDEO_ENABLED 1 +#define DSI_VIDEO_ENABLED 1 #define WINDOW_A 0 #define WINDOW_B 1 #define WINDOW_C 2 #define WINDOW_D 3 #ifndef BIT -#define BIT(n) (1U<<(n)) + #define BIT(n) (1U << (n)) #endif /*! Display registers. */ // All Display/DSI/MIPI register defines and macros are index based (not offset). @@ -37,8 +37,8 @@ #define DC_D_WINBUF_DD_SCRATCH_REGISTER_1 0xEE #define DC_T_WINBUF_TD_SCRATCH_REGISTER_0 0x16D #define DC_T_WINBUF_TD_SCRATCH_REGISTER_1 0x16E -#define DC_COM_SCRATCH_REGISTER_A 0x325 -#define DC_COM_SCRATCH_REGISTER_B 0x326 +#define DC_COM_SCRATCH_REGISTER_A 0x325 +#define DC_COM_SCRATCH_REGISTER_B 0x326 #define DC_A_WINBUF_AD_SCRATCH_REGISTER_0 0xBED #define DC_A_WINBUF_AD_SCRATCH_REGISTER_1 0xBEE #define DC_B_WINBUF_BD_SCRATCH_REGISTER_0 0xDED @@ -48,92 +48,92 @@ // DC_CMD non-shadowed command/sync registers. #define DC_CMD_GENERAL_INCR_SYNCPT 0x00 -#define SYNCPT_GENERAL_INDX(x) (((x) & 0xFF) << 0) -#define SYNCPT_GENERAL_COND(x) (((x) & 0xFF) << 8) -#define COND_REG_WR_SAFE 3 +#define SYNCPT_GENERAL_INDX(x) (((x) & 0xFF) << 0) +#define SYNCPT_GENERAL_COND(x) (((x) & 0xFF) << 8) +#define COND_REG_WR_SAFE 3 #define DC_CMD_GENERAL_INCR_SYNCPT_CNTRL 0x01 -#define SYNCPT_CNTRL_SOFT_RESET BIT(0) -#define SYNCPT_CNTRL_NO_STALL BIT(8) +#define SYNCPT_CNTRL_SOFT_RESET BIT(0) +#define SYNCPT_CNTRL_NO_STALL BIT(8) #define DC_CMD_CONT_SYNCPT_VSYNC 0x28 -#define SYNCPT_VSYNC_INDX(x) (((x) & 0xFF) << 0) -#define SYNCPT_VSYNC_ENABLE BIT(8) +#define SYNCPT_VSYNC_INDX(x) (((x) & 0xFF) << 0) +#define SYNCPT_VSYNC_ENABLE BIT(8) #define DC_CMD_DISPLAY_COMMAND_OPTION0 0x031 #define DC_CMD_DISPLAY_COMMAND 0x32 -#define DISP_CTRL_MODE_STOP (0 << 5) -#define DISP_CTRL_MODE_C_DISPLAY (1 << 5) -#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5) -#define DISP_CTRL_MODE_MASK (3 << 5) +#define DISP_CTRL_MODE_STOP (0 << 5) +#define DISP_CTRL_MODE_C_DISPLAY (1 << 5) +#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5) +#define DISP_CTRL_MODE_MASK (3 << 5) #define DC_CMD_DISPLAY_POWER_CONTROL 0x36 -#define PW0_ENABLE BIT(0) -#define PW1_ENABLE BIT(2) -#define PW2_ENABLE BIT(4) -#define PW3_ENABLE BIT(6) -#define PW4_ENABLE BIT(8) -#define PM0_ENABLE BIT(16) -#define PM1_ENABLE BIT(18) +#define PW0_ENABLE BIT(0) +#define PW1_ENABLE BIT(2) +#define PW2_ENABLE BIT(4) +#define PW3_ENABLE BIT(6) +#define PW4_ENABLE BIT(8) +#define PM0_ENABLE BIT(16) +#define PM1_ENABLE BIT(18) #define DC_CMD_INT_STATUS 0x37 #define DC_CMD_INT_MASK 0x38 #define DC_CMD_INT_ENABLE 0x39 -#define DC_CMD_INT_FRAME_END_INT BIT(1) -#define DC_CMD_INT_V_BLANK_INT BIT(2) +#define DC_CMD_INT_FRAME_END_INT BIT(1) +#define DC_CMD_INT_V_BLANK_INT BIT(2) #define DC_CMD_INT_POLARITY 0x3B #define DC_CMD_STATE_ACCESS 0x40 -#define READ_MUX_ASSEMBLY 0x0 -#define WRITE_MUX_ASSEMBLY 0x0 -#define READ_MUX_ACTIVE BIT(0) -#define WRITE_MUX_ACTIVE BIT(2) +#define READ_MUX_ASSEMBLY 0x0 +#define WRITE_MUX_ASSEMBLY 0x0 +#define READ_MUX_ACTIVE BIT(0) +#define WRITE_MUX_ACTIVE BIT(2) #define DC_CMD_STATE_CONTROL 0x41 -#define GENERAL_ACT_REQ BIT(0) -#define WIN_ACT_REQ 1 -#define WIN_A_ACT_REQ BIT(1) -#define WIN_B_ACT_REQ BIT(2) -#define WIN_C_ACT_REQ BIT(3) -#define WIN_D_ACT_REQ BIT(4) -#define CURSOR_ACT_REQ BIT(7) -#define GENERAL_UPDATE BIT(8) -#define WIN_UPDATE 9 -#define WIN_A_UPDATE BIT(9) -#define WIN_B_UPDATE BIT(10) -#define WIN_C_UPDATE BIT(11) -#define WIN_D_UPDATE BIT(12) -#define CURSOR_UPDATE BIT(15) -#define NC_HOST_TRIG BIT(24) +#define GENERAL_ACT_REQ BIT(0) +#define WIN_ACT_REQ 1 +#define WIN_A_ACT_REQ BIT(1) +#define WIN_B_ACT_REQ BIT(2) +#define WIN_C_ACT_REQ BIT(3) +#define WIN_D_ACT_REQ BIT(4) +#define CURSOR_ACT_REQ BIT(7) +#define GENERAL_UPDATE BIT(8) +#define WIN_UPDATE 9 +#define WIN_A_UPDATE BIT(9) +#define WIN_B_UPDATE BIT(10) +#define WIN_C_UPDATE BIT(11) +#define WIN_D_UPDATE BIT(12) +#define CURSOR_UPDATE BIT(15) +#define NC_HOST_TRIG BIT(24) #define DC_CMD_DISPLAY_WINDOW_HEADER 0x42 -#define WINDOW_SELECT 4 -#define WINDOW_A_SELECT BIT(4) -#define WINDOW_B_SELECT BIT(5) -#define WINDOW_C_SELECT BIT(6) -#define WINDOW_D_SELECT BIT(7) +#define WINDOW_SELECT 4 +#define WINDOW_A_SELECT BIT(4) +#define WINDOW_B_SELECT BIT(5) +#define WINDOW_C_SELECT BIT(6) +#define WINDOW_D_SELECT BIT(7) #define DC_CMD_REG_ACT_CONTROL 0x43 -#define GENERAL_ACT_HCNTR_SEL BIT(0) -#define WIN_A_ACT_HCNTR_SEL BIT(2) -#define WIN_B_ACT_HCNTR_SEL BIT(4) -#define WIN_C_ACT_HCNTR_SEL BIT(6) -#define CURSOR_ACT_HCNTR_SEL BIT(7) -#define WIN_D_ACT_HCNTR_SEL BIT(10) +#define GENERAL_ACT_HCNTR_SEL BIT(0) +#define WIN_A_ACT_HCNTR_SEL BIT(2) +#define WIN_B_ACT_HCNTR_SEL BIT(4) +#define WIN_C_ACT_HCNTR_SEL BIT(6) +#define CURSOR_ACT_HCNTR_SEL BIT(7) +#define WIN_D_ACT_HCNTR_SEL BIT(10) // DC_D_WIN_DD window D instance of DC_WIN #define DC_D_WIN_DD_WIN_OPTIONS 0x80 #define DC_D_WIN_DD_COLOR_DEPTH 0x83 -#define DC_D_WIN_DD_POSITION 0x84 -#define DC_D_WIN_DD_SIZE 0x85 +#define DC_D_WIN_DD_POSITION 0x84 +#define DC_D_WIN_DD_SIZE 0x85 #define DC_D_WIN_DD_LINE_STRIDE 0x8A #define DC_D_WIN_DD_BLEND_LAYER_CONTROL 0x96 -#define DC_D_WIN_DD_BLEND_MATCH_SELECT 0x97 -#define DC_D_WIN_DD_BLEND_ALPHA_1BIT 0x99 +#define DC_D_WIN_DD_BLEND_MATCH_SELECT 0x97 +#define DC_D_WIN_DD_BLEND_ALPHA_1BIT 0x99 // DC_D_WINBUF_DD window D instance of DC_WINBUF -#define DC_D_WINBUF_DD_START_ADDR 0xC0 +#define DC_D_WINBUF_DD_START_ADDR 0xC0 #define DC_D_WINBUF_DD_ADDR_H_OFFSET 0xC6 #define DC_D_WINBUF_DD_ADDR_V_OFFSET 0xC8 #define DC_D_WINBUF_DD_START_ADDR_HI 0xCD @@ -146,174 +146,173 @@ #define DC_COM_CRC_CONTROL 0x300 #define DC_COM_PIN_OUTPUT_ENABLE(x) (0x302 + (x)) #define DC_COM_PIN_OUTPUT_POLARITY(x) (0x306 + (x)) -#define LSC0_OUTPUT_POLARITY_LOW BIT(24) +#define LSC0_OUTPUT_POLARITY_LOW BIT(24) // CMU registers. -#define DC_COM_CMU_CSC_KRR 0x32A -#define DC_COM_CMU_CSC_KGR 0x32B -#define DC_COM_CMU_CSC_KBR 0x32C -#define DC_COM_CMU_CSC_KRG 0x32D -#define DC_COM_CMU_CSC_KGG 0x32E -#define DC_COM_CMU_CSC_KBG 0x32F -#define DC_COM_CMU_CSC_KRB 0x330 -#define DC_COM_CMU_CSC_KGB 0x331 -#define DC_COM_CMU_CSC_KBB 0x332 -#define DC_COM_CMU_LUT1 0x336 -#define LUT1_ADDR(x) ((x) & 0xFF) -#define LUT1_DATA(x) (((x) & 0xFFF) << 16) -#define LUT1_READ_DATA(x) (((x) >> 16) & 0xFFF) -#define DC_COM_CMU_LUT2 0x337 -#define LUT2_ADDR(x) ((x) & 0x3FF) -#define LUT2_DATA(x) (((x) & 0xFF) << 16) -#define LUT2_READ_DATA(x) (((x) >> 16) & 0xFF) -#define DC_COM_CMU_LUT1_READ 0x338 -#define LUT1_READ_ADDR(x) (((x) & 0xFF) << 8) -#define LUT1_READ_EN BIT(0) -#define DC_COM_CMU_LUT2_READ 0x339 -#define LUT2_READ_ADDR(x) (((x) & 0x3FF) << 8) -#define LUT2_READ_EN BIT(0) +#define DC_COM_CMU_CSC_KRR 0x32A +#define DC_COM_CMU_CSC_KGR 0x32B +#define DC_COM_CMU_CSC_KBR 0x32C +#define DC_COM_CMU_CSC_KRG 0x32D +#define DC_COM_CMU_CSC_KGG 0x32E +#define DC_COM_CMU_CSC_KBG 0x32F +#define DC_COM_CMU_CSC_KRB 0x330 +#define DC_COM_CMU_CSC_KGB 0x331 +#define DC_COM_CMU_CSC_KBB 0x332 +#define DC_COM_CMU_LUT1 0x336 +#define LUT1_ADDR(x) ((x) & 0xFF) +#define LUT1_DATA(x) (((x) & 0xFFF) << 16) +#define LUT1_READ_DATA(x) (((x) >> 16) & 0xFFF) +#define DC_COM_CMU_LUT2 0x337 +#define LUT2_ADDR(x) ((x) & 0x3FF) +#define LUT2_DATA(x) (((x) & 0xFF) << 16) +#define LUT2_READ_DATA(x) (((x) >> 16) & 0xFF) +#define DC_COM_CMU_LUT1_READ 0x338 +#define LUT1_READ_ADDR(x) (((x) & 0xFF) << 8) +#define LUT1_READ_EN BIT(0) +#define DC_COM_CMU_LUT2_READ 0x339 +#define LUT2_READ_ADDR(x) (((x) & 0x3FF) << 8) +#define LUT2_READ_EN BIT(0) #define DC_COM_DSC_TOP_CTL 0x33E // DC_DISP shadowed registers. #define DC_DISP_DISP_WIN_OPTIONS 0x402 -#define CURSOR_ENABLE BIT(16) -#define SOR_ENABLE BIT(25) -#define SOR1_ENABLE BIT(26) -#define SOR1_TIMING_CYA BIT(27) -#define DSI_ENABLE BIT(29) -#define HDMI_ENABLE BIT(30) - +#define CURSOR_ENABLE BIT(16) +#define SOR_ENABLE BIT(25) +#define SOR1_ENABLE BIT(26) +#define SOR1_TIMING_CYA BIT(27) +#define DSI_ENABLE BIT(29) +#define HDMI_ENABLE BIT(30) #define DC_DISP_DISP_MEM_HIGH_PRIORITY 0x403 #define DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER 0x404 #define DC_DISP_DISP_TIMING_OPTIONS 0x405 -#define VSYNC_H_POSITION(x) (((x) & 0x1FFF) << 0) +#define VSYNC_H_POSITION(x) (((x) & 0x1FFF) << 0) #define DC_DISP_REF_TO_SYNC 0x406 -#define H_REF_TO_SYNC(x) (((x) & 0x1FFF) << 0) // Min 0 pixel clock. -#define V_REF_TO_SYNC(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. +#define H_REF_TO_SYNC(x) (((x) & 0x1FFF) << 0) // Min 0 pixel clock. +#define V_REF_TO_SYNC(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. #define DC_DISP_SYNC_WIDTH 0x407 -#define H_SYNC_WIDTH(x) (((x) & 0x1FFF) << 0) // Min 1 pixel clock. -#define V_SYNC_WIDTH(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. +#define H_SYNC_WIDTH(x) (((x) & 0x1FFF) << 0) // Min 1 pixel clock. +#define V_SYNC_WIDTH(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. #define DC_DISP_BACK_PORCH 0x408 -#define H_BACK_PORCH(x) (((x) & 0x1FFF) << 0) -#define V_BACK_PORCH(x) (((x) & 0x1FFF) << 16) +#define H_BACK_PORCH(x) (((x) & 0x1FFF) << 0) +#define V_BACK_PORCH(x) (((x) & 0x1FFF) << 16) #define DC_DISP_ACTIVE 0x409 -#define H_DISP_ACTIVE(x) (((x) & 0x1FFF) << 0) // Min 16 pixel clock. -#define V_DISP_ACTIVE(x) (((x) & 0x1FFF) << 16) // Min 16 line clock. +#define H_DISP_ACTIVE(x) (((x) & 0x1FFF) << 0) // Min 16 pixel clock. +#define V_DISP_ACTIVE(x) (((x) & 0x1FFF) << 16) // Min 16 line clock. #define DC_DISP_FRONT_PORCH 0x40A -#define H_FRONT_PORCH(x) (((x) & 0x1FFF) << 0) // Min -=PS_=-H_REF_TO_SYNC + 1 -#define V_FRONT_PORCH(x) (((x) & 0x1FFF) << 16) // Min -=PS_=-V_REF_TO_SYNC + 1 +#define H_FRONT_PORCH(x) (((x) & 0x1FFF) << 0) // Min -=PS_=-H_REF_TO_SYNC + 1 +#define V_FRONT_PORCH(x) (((x) & 0x1FFF) << 16) // Min -=PS_=-V_REF_TO_SYNC + 1 #define DC_DISP_DISP_CLOCK_CONTROL 0x42E -#define SHIFT_CLK_DIVIDER(x) ((x) & 0xFF) -#define PIXEL_CLK_DIVIDER_PCD1 (0 << 8) -#define PIXEL_CLK_DIVIDER_PCD1H (1 << 8) -#define PIXEL_CLK_DIVIDER_PCD2 (2 << 8) -#define PIXEL_CLK_DIVIDER_PCD3 (3 << 8) -#define PIXEL_CLK_DIVIDER_PCD4 (4 << 8) -#define PIXEL_CLK_DIVIDER_PCD6 (5 << 8) -#define PIXEL_CLK_DIVIDER_PCD8 (6 << 8) -#define PIXEL_CLK_DIVIDER_PCD9 (7 << 8) -#define PIXEL_CLK_DIVIDER_PCD12 (8 << 8) -#define PIXEL_CLK_DIVIDER_PCD16 (9 << 8) -#define PIXEL_CLK_DIVIDER_PCD18 (10 << 8) -#define PIXEL_CLK_DIVIDER_PCD24 (11 << 8) -#define PIXEL_CLK_DIVIDER_PCD13 (12 << 8) +#define SHIFT_CLK_DIVIDER(x) ((x) & 0xFF) +#define PIXEL_CLK_DIVIDER_PCD1 (0 << 8) +#define PIXEL_CLK_DIVIDER_PCD1H (1 << 8) +#define PIXEL_CLK_DIVIDER_PCD2 (2 << 8) +#define PIXEL_CLK_DIVIDER_PCD3 (3 << 8) +#define PIXEL_CLK_DIVIDER_PCD4 (4 << 8) +#define PIXEL_CLK_DIVIDER_PCD6 (5 << 8) +#define PIXEL_CLK_DIVIDER_PCD8 (6 << 8) +#define PIXEL_CLK_DIVIDER_PCD9 (7 << 8) +#define PIXEL_CLK_DIVIDER_PCD12 (8 << 8) +#define PIXEL_CLK_DIVIDER_PCD16 (9 << 8) +#define PIXEL_CLK_DIVIDER_PCD18 (10 << 8) +#define PIXEL_CLK_DIVIDER_PCD24 (11 << 8) +#define PIXEL_CLK_DIVIDER_PCD13 (12 << 8) #define DC_DISP_DISP_INTERFACE_CONTROL 0x42F -#define DISP_DATA_FORMAT_DF1P1C (0 << 0) -#define DISP_DATA_FORMAT_DF1P2C24B (1 << 0) -#define DISP_DATA_FORMAT_DF1P2C18B (2 << 0) -#define DISP_DATA_FORMAT_DF1P2C16B (3 << 0) -#define DISP_DATA_FORMAT_DF2S (4 << 0) -#define DISP_DATA_FORMAT_DF3S (5 << 0) -#define DISP_DATA_FORMAT_DFSPI (6 << 0) -#define DISP_DATA_FORMAT_DF1P3C24B (7 << 0) -#define DISP_DATA_FORMAT_DF1P3C18B (8 << 0) -#define DISP_ALIGNMENT_MSB (0 << 8) -#define DISP_ALIGNMENT_LSB (1 << 8) -#define DISP_ORDER_RED_BLUE (0 << 9) -#define DISP_ORDER_BLUE_RED (1 << 9) +#define DISP_DATA_FORMAT_DF1P1C (0 << 0) +#define DISP_DATA_FORMAT_DF1P2C24B (1 << 0) +#define DISP_DATA_FORMAT_DF1P2C18B (2 << 0) +#define DISP_DATA_FORMAT_DF1P2C16B (3 << 0) +#define DISP_DATA_FORMAT_DF2S (4 << 0) +#define DISP_DATA_FORMAT_DF3S (5 << 0) +#define DISP_DATA_FORMAT_DFSPI (6 << 0) +#define DISP_DATA_FORMAT_DF1P3C24B (7 << 0) +#define DISP_DATA_FORMAT_DF1P3C18B (8 << 0) +#define DISP_ALIGNMENT_MSB (0 << 8) +#define DISP_ALIGNMENT_LSB (1 << 8) +#define DISP_ORDER_RED_BLUE (0 << 9) +#define DISP_ORDER_BLUE_RED (1 << 9) #define DC_DISP_DISP_COLOR_CONTROL 0x430 -#define BASE_COLOR_SIZE_MASK (0xF << 0) -#define BASE_COLOR_SIZE_666 (0 << 0) -#define BASE_COLOR_SIZE_111 (1 << 0) -#define BASE_COLOR_SIZE_222 (2 << 0) -#define BASE_COLOR_SIZE_333 (3 << 0) -#define BASE_COLOR_SIZE_444 (4 << 0) -#define BASE_COLOR_SIZE_555 (5 << 0) -#define BASE_COLOR_SIZE_565 (6 << 0) -#define BASE_COLOR_SIZE_332 (7 << 0) -#define BASE_COLOR_SIZE_888 (8 << 0) -#define DITHER_CONTROL_MASK (3 << 8) -#define DITHER_CONTROL_DISABLE (0 << 8) -#define DITHER_CONTROL_ORDERED (2 << 8) -#define DITHER_CONTROL_ERRDIFF (3 << 8) -#define DISP_COLOR_SWAP BIT(16) -#define BLANK_COLOR_WHITE BIT(17) -#define CMU_ENABLE BIT(20) +#define BASE_COLOR_SIZE_MASK (0xF << 0) +#define BASE_COLOR_SIZE_666 (0 << 0) +#define BASE_COLOR_SIZE_111 (1 << 0) +#define BASE_COLOR_SIZE_222 (2 << 0) +#define BASE_COLOR_SIZE_333 (3 << 0) +#define BASE_COLOR_SIZE_444 (4 << 0) +#define BASE_COLOR_SIZE_555 (5 << 0) +#define BASE_COLOR_SIZE_565 (6 << 0) +#define BASE_COLOR_SIZE_332 (7 << 0) +#define BASE_COLOR_SIZE_888 (8 << 0) +#define DITHER_CONTROL_MASK (3 << 8) +#define DITHER_CONTROL_DISABLE (0 << 8) +#define DITHER_CONTROL_ORDERED (2 << 8) +#define DITHER_CONTROL_ERRDIFF (3 << 8) +#define DISP_COLOR_SWAP BIT(16) +#define BLANK_COLOR_WHITE BIT(17) +#define CMU_ENABLE BIT(20) #define DC_DISP_SHIFT_CLOCK_OPTIONS 0x431 -#define SC0_H_QUALIFIER_NONE BIT(0) -#define SC1_H_QUALIFIER_NONE BIT(16) +#define SC0_H_QUALIFIER_NONE BIT(0) +#define SC1_H_QUALIFIER_NONE BIT(16) #define DC_DISP_DATA_ENABLE_OPTIONS 0x432 -#define DE_SELECT_ACTIVE_BLANK (0 << 0) -#define DE_SELECT_ACTIVE (1 << 0) -#define DE_SELECT_ACTIVE_IS (2 << 0) -#define DE_CONTROL_ONECLK (0 << 2) -#define DE_CONTROL_NORMAL (1 << 2) -#define DE_CONTROL_EARLY_EXT (2 << 2) -#define DE_CONTROL_EARLY (3 << 2) -#define DE_CONTROL_ACTIVE_BLANK (4 << 2) +#define DE_SELECT_ACTIVE_BLANK (0 << 0) +#define DE_SELECT_ACTIVE (1 << 0) +#define DE_SELECT_ACTIVE_IS (2 << 0) +#define DE_CONTROL_ONECLK (0 << 2) +#define DE_CONTROL_NORMAL (1 << 2) +#define DE_CONTROL_EARLY_EXT (2 << 2) +#define DE_CONTROL_EARLY (3 << 2) +#define DE_CONTROL_ACTIVE_BLANK (4 << 2) // Cursor configuration registers. -#define DC_DISP_CURSOR_FOREGROUND 0x43C -#define DC_DISP_CURSOR_BACKGROUND 0x43D -#define CURSOR_COLOR(r,g,b) (((r) & 0xFF) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16)) +#define DC_DISP_CURSOR_FOREGROUND 0x43C +#define DC_DISP_CURSOR_BACKGROUND 0x43D +#define CURSOR_COLOR(r, g, b) (((r) & 0xFF) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16)) -#define DC_DISP_CURSOR_START_ADDR 0x43E -#define DC_DISP_CURSOR_START_ADDR_NS 0x43F -#define CURSOR_CLIPPING(w) ((w) << 28) -#define CURSOR_CLIP_WIN_A 1 -#define CURSOR_CLIP_WIN_B 2 -#define CURSOR_CLIP_WIN_C 3 -#define CURSOR_SIZE_32 (0 << 24) -#define CURSOR_SIZE_64 (1 << 24) -#define CURSOR_SIZE_128 (2 << 24) -#define CURSOR_SIZE_256 (3 << 24) -#define DC_DISP_CURSOR_POSITION 0x440 -#define DC_DISP_CURSOR_START_ADDR_HI 0x4EC +#define DC_DISP_CURSOR_START_ADDR 0x43E +#define DC_DISP_CURSOR_START_ADDR_NS 0x43F +#define CURSOR_CLIPPING(w) ((w) << 28) +#define CURSOR_CLIP_WIN_A 1 +#define CURSOR_CLIP_WIN_B 2 +#define CURSOR_CLIP_WIN_C 3 +#define CURSOR_SIZE_32 (0 << 24) +#define CURSOR_SIZE_64 (1 << 24) +#define CURSOR_SIZE_128 (2 << 24) +#define CURSOR_SIZE_256 (3 << 24) +#define DC_DISP_CURSOR_POSITION 0x440 +#define DC_DISP_CURSOR_START_ADDR_HI 0x4EC #define DC_DISP_CURSOR_START_ADDR_HI_NS 0x4ED -#define DC_DISP_BLEND_CURSOR_CONTROL 0x4F1 -#define CURSOR_BLEND_2BIT (0 << 24) -#define CURSOR_BLEND_R8G8B8A8 (1 << 24) -#define CURSOR_BLEND_SRC_FACTOR(n) ((n) << 8) -#define CURSOR_BLEND_DST_FACTOR(n) ((n) << 16) -#define CURSOR_BLEND_ZRO 0 -#define CURSOR_BLEND_K1 1 -#define CURSOR_BLEND_NK1 2 +#define DC_DISP_BLEND_CURSOR_CONTROL 0x4F1 +#define CURSOR_BLEND_2BIT (0 << 24) +#define CURSOR_BLEND_R8G8B8A8 (1 << 24) +#define CURSOR_BLEND_SRC_FACTOR(n) ((n) << 8) +#define CURSOR_BLEND_DST_FACTOR(n) ((n) << 16) +#define CURSOR_BLEND_ZRO 0 +#define CURSOR_BLEND_K1 1 +#define CURSOR_BLEND_NK1 2 // End of cursor cfg regs. -#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480 -#define DC_DISP_SD_BL_PARAMETERS 0x4D7 -#define DC_DISP_SD_BL_CONTROL 0x4DC +#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480 +#define DC_DISP_SD_BL_PARAMETERS 0x4D7 +#define DC_DISP_SD_BL_CONTROL 0x4DC #define DC_DISP_BLEND_BACKGROUND_COLOR 0x4E4 -#define DC_DISP_DISPLAY_SPARE0 0x4F7 // Used by SW/HW. -#define DC_DISP_DISPLAY_SPARE1 0x4F8 +#define DC_DISP_DISPLAY_SPARE0 0x4F7 // Used by SW/HW. +#define DC_DISP_DISPLAY_SPARE1 0x4F8 #define DC_WINC_COLOR_PALETTE 0x500 -#define COLOR_PALETTE_IDX(off) (DC_WINC_COLOR_PALETTE + (off)) -#define COLOR_PALETTE_RGB(rgb) (byte_swap_32(rgb) >> 8) +#define COLOR_PALETTE_IDX(off) (DC_WINC_COLOR_PALETTE + (off)) +#define COLOR_PALETTE_RGB(rgb) (byte_swap_32(rgb) >> 8) #define DC_WINC_PALETTE_COLOR_EXT 0x600 #define DC_WINC_H_FILTER_P(p) (0x601 + (p)) @@ -334,85 +333,85 @@ // The following registers are A/B/C shadows of the 0xB80/0xD80/0xF80 registers (see DISPLAY_WINDOW_HEADER). #define DC_WIN_WIN_OPTIONS 0x700 -#define H_DIRECTION BIT(0) -#define V_DIRECTION BIT(2) -#define SCAN_COLUMN BIT(4) -#define COLOR_EXPAND BIT(6) -#define H_FILTER_ENABLE BIT(8) -#define V_FILTER_ENABLE BIT(10) -#define COLOR_PALETTE_ENABLE BIT(16) -#define CSC_ENABLE BIT(18) -#define DV_ENABLE BIT(20) -#define WIN_ENABLE BIT(30) -#define H_FILTER_EXPAND BIT(31) +#define H_DIRECTION BIT(0) +#define V_DIRECTION BIT(2) +#define SCAN_COLUMN BIT(4) +#define COLOR_EXPAND BIT(6) +#define H_FILTER_ENABLE BIT(8) +#define V_FILTER_ENABLE BIT(10) +#define COLOR_PALETTE_ENABLE BIT(16) +#define CSC_ENABLE BIT(18) +#define DV_ENABLE BIT(20) +#define WIN_ENABLE BIT(30) +#define H_FILTER_EXPAND BIT(31) #define DC_WIN_BUFFER_CONTROL 0x702 -#define BUFFER_CONTROL_HOST 0 -#define BUFFER_CONTROL_VI 1 -#define BUFFER_CONTROL_SB2D 4 +#define BUFFER_CONTROL_HOST 0 +#define BUFFER_CONTROL_VI 1 +#define BUFFER_CONTROL_SB2D 4 #define DC_WIN_COLOR_DEPTH 0x703 -#define WIN_COLOR_DEPTH_P1 0x0 -#define WIN_COLOR_DEPTH_P2 0x1 -#define WIN_COLOR_DEPTH_P4 0x2 -#define WIN_COLOR_DEPTH_P8 0x3 -#define WIN_COLOR_DEPTH_B4G4R4A4 0x4 -#define WIN_COLOR_DEPTH_B5G5R5A 0x5 -#define WIN_COLOR_DEPTH_B5G6R5 0x6 -#define WIN_COLOR_DEPTH_AB5G5R5 0x7 -#define WIN_COLOR_DEPTH_B8G8R8A8 0xC -#define WIN_COLOR_DEPTH_R8G8B8A8 0xD -#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 0xE -#define WIN_COLOR_DEPTH_R6x2G6x2B6x2A8 0xF -#define WIN_COLOR_DEPTH_YCbCr422 0x10 -#define WIN_COLOR_DEPTH_YUV422 0x11 -#define WIN_COLOR_DEPTH_YCbCr420P 0x12 -#define WIN_COLOR_DEPTH_YUV420P 0x13 -#define WIN_COLOR_DEPTH_YCbCr422P 0x14 -#define WIN_COLOR_DEPTH_YUV422P 0x15 -#define WIN_COLOR_DEPTH_YCbCr422R 0x16 -#define WIN_COLOR_DEPTH_YUV422R 0x17 -#define WIN_COLOR_DEPTH_YCbCr422RA 0x18 -#define WIN_COLOR_DEPTH_YUV422RA 0x19 -#define WIN_COLOR_DEPTH_X1R5G5B5 0x1E -#define WIN_COLOR_DEPTH_R5G5B5X1 0x1F -#define WIN_COLOR_DEPTH_X1B5G5R5 0x20 -#define WIN_COLOR_DEPTH_B5G5R5X1 0x21 -#define WIN_COLOR_DEPTH_YCbCr444P 0x29 -#define WIN_COLOR_DEPTH_YCrCb420SP 0x2A -#define WIN_COLOR_DEPTH_YCbCr420SP 0x2B -#define WIN_COLOR_DEPTH_YCrCb422SP 0x2C -#define WIN_COLOR_DEPTH_YCbCr422SP 0x2D -#define WIN_COLOR_DEPTH_YUV444P 0x34 -#define WIN_COLOR_DEPTH_YVU420SP 0x35 -#define WIN_COLOR_DEPTH_YUV420SP 0x36 -#define WIN_COLOR_DEPTH_YVU422SP 0x37 -#define WIN_COLOR_DEPTH_YUV422SP 0x38 -#define WIN_COLOR_DEPTH_YVU444SP 0x3B -#define WIN_COLOR_DEPTH_YUV444SP 0x3C +#define WIN_COLOR_DEPTH_P1 0x0 +#define WIN_COLOR_DEPTH_P2 0x1 +#define WIN_COLOR_DEPTH_P4 0x2 +#define WIN_COLOR_DEPTH_P8 0x3 +#define WIN_COLOR_DEPTH_B4G4R4A4 0x4 +#define WIN_COLOR_DEPTH_B5G5R5A 0x5 +#define WIN_COLOR_DEPTH_B5G6R5 0x6 +#define WIN_COLOR_DEPTH_AB5G5R5 0x7 +#define WIN_COLOR_DEPTH_B8G8R8A8 0xC +#define WIN_COLOR_DEPTH_R8G8B8A8 0xD +#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 0xE +#define WIN_COLOR_DEPTH_R6x2G6x2B6x2A8 0xF +#define WIN_COLOR_DEPTH_YCbCr422 0x10 +#define WIN_COLOR_DEPTH_YUV422 0x11 +#define WIN_COLOR_DEPTH_YCbCr420P 0x12 +#define WIN_COLOR_DEPTH_YUV420P 0x13 +#define WIN_COLOR_DEPTH_YCbCr422P 0x14 +#define WIN_COLOR_DEPTH_YUV422P 0x15 +#define WIN_COLOR_DEPTH_YCbCr422R 0x16 +#define WIN_COLOR_DEPTH_YUV422R 0x17 +#define WIN_COLOR_DEPTH_YCbCr422RA 0x18 +#define WIN_COLOR_DEPTH_YUV422RA 0x19 +#define WIN_COLOR_DEPTH_X1R5G5B5 0x1E +#define WIN_COLOR_DEPTH_R5G5B5X1 0x1F +#define WIN_COLOR_DEPTH_X1B5G5R5 0x20 +#define WIN_COLOR_DEPTH_B5G5R5X1 0x21 +#define WIN_COLOR_DEPTH_YCbCr444P 0x29 +#define WIN_COLOR_DEPTH_YCrCb420SP 0x2A +#define WIN_COLOR_DEPTH_YCbCr420SP 0x2B +#define WIN_COLOR_DEPTH_YCrCb422SP 0x2C +#define WIN_COLOR_DEPTH_YCbCr422SP 0x2D +#define WIN_COLOR_DEPTH_YUV444P 0x34 +#define WIN_COLOR_DEPTH_YVU420SP 0x35 +#define WIN_COLOR_DEPTH_YUV420SP 0x36 +#define WIN_COLOR_DEPTH_YVU422SP 0x37 +#define WIN_COLOR_DEPTH_YUV422SP 0x38 +#define WIN_COLOR_DEPTH_YVU444SP 0x3B +#define WIN_COLOR_DEPTH_YUV444SP 0x3C #define DC_WIN_POSITION 0x704 -#define H_POSITION(x) (((x) & 0xFFFF) << 0) // Support negative. -#define V_POSITION(x) (((x) & 0xFFFF) << 16) // Support negative. +#define H_POSITION(x) (((x) & 0xFFFF) << 0) // Support negative. +#define V_POSITION(x) (((x) & 0xFFFF) << 16) // Support negative. #define DC_WIN_SIZE 0x705 -#define H_SIZE(x) (((x) & 0x1FFF) << 0) -#define V_SIZE(x) (((x) & 0x1FFF) << 16) +#define H_SIZE(x) (((x) & 0x1FFF) << 0) +#define V_SIZE(x) (((x) & 0x1FFF) << 16) #define DC_WIN_PRESCALED_SIZE 0x706 -#define H_PRESCALED_SIZE(x) (((x) & 0x7FFF) << 0) -#define V_PRESCALED_SIZE(x) (((x) & 0x1FFF) << 16) +#define H_PRESCALED_SIZE(x) (((x) & 0x7FFF) << 0) +#define V_PRESCALED_SIZE(x) (((x) & 0x1FFF) << 16) #define DC_WIN_H_INITIAL_DDA 0x707 #define DC_WIN_V_INITIAL_DDA 0x708 #define DC_WIN_DDA_INC 0x709 -#define H_DDA_INC(x) (((x) & 0xFFFF) << 0) -#define V_DDA_INC(x) (((x) & 0xFFFF) << 16) +#define H_DDA_INC(x) (((x) & 0xFFFF) << 0) +#define V_DDA_INC(x) (((x) & 0xFFFF) << 16) #define DC_WIN_LINE_STRIDE 0x70A -#define LINE_STRIDE(x) (x) -#define UV_LINE_STRIDE(x) (((x) & 0xFFFF) << 16) +#define LINE_STRIDE(x) (x) +#define UV_LINE_STRIDE(x) (((x) & 0xFFFF) << 16) #define DC_WIN_DV_CONTROL 0x70E #define DV_CTRL_R(r) (((r) & 7) << 16) @@ -420,51 +419,51 @@ #define DV_CTRL_B(b) (((b) & 7) << 0) #define DC_WINBUF_BLEND_LAYER_CONTROL 0x716 -#define WIN_BLEND_DEPTH(x) (((x) & 0xFF) << 0) -#define WIN_K1(x) (((x) & 0xFF) << 8) -#define WIN_K2(x) (((x) & 0xFF) << 16) -#define WIN_BLEND_ENABLE (0 << 24) -#define WIN_BLEND_BYPASS (1 << 24) +#define WIN_BLEND_DEPTH(x) (((x) & 0xFF) << 0) +#define WIN_K1(x) (((x) & 0xFF) << 8) +#define WIN_K2(x) (((x) & 0xFF) << 16) +#define WIN_BLEND_ENABLE (0 << 24) +#define WIN_BLEND_BYPASS (1 << 24) #define DC_WINBUF_BLEND_MATCH_SELECT 0x717 -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ZERO (0 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ONE (1 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1 (2 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_DST (3 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (4 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_SRC (5 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ZERO (0 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ONE (1 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1 (2 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_DST (3 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (4 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_SRC (5 << 0) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ZERO (0 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ONE (1 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1 (2 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K2 (3 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1_TIMES_DST (4 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (5 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_SRC (6 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1 (7 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ZERO (0 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ONE (1 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1 (2 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K2 (3 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1_TIMES_DST (4 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (5 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_SRC (6 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1 (7 << 4) -#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_ZERO (0 << 8) -#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K1 (1 << 8) -#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K2 (2 << 8) +#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_ZERO (0 << 8) +#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K1 (1 << 8) +#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K2 (2 << 8) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ZERO (0 << 12) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ONE (1 << 12) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_NEG_K1_TIMES_SRC (2 << 12) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_K2 (3 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ZERO (0 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ONE (1 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_NEG_K1_TIMES_SRC (2 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_K2 (3 << 12) #define DC_WINBUF_BLEND_ALPHA_1BIT 0x719 -#define WIN_ALPHA_1BIT_WEIGHT0(x) (((x) & 0xFF) << 0) -#define WIN_ALPHA_1BIT_WEIGHT1(x) (((x) & 0xFF) << 8) +#define WIN_ALPHA_1BIT_WEIGHT0(x) (((x) & 0xFF) << 0) +#define WIN_ALPHA_1BIT_WEIGHT1(x) (((x) & 0xFF) << 8) /*! The following registers are A/B/C shadows of the 0xBC0/0xDC0/0xFC0 registers (see DISPLAY_WINDOW_HEADER). */ #define DC_WINBUF_START_ADDR 0x800 #define DC_WINBUF_ADDR_H_OFFSET 0x806 #define DC_WINBUF_ADDR_V_OFFSET 0x808 #define DC_WINBUF_SURFACE_KIND 0x80B -#define PITCH (0 << 0) -#define TILED (1 << 0) -#define BLOCK (2 << 0) -#define BLOCK_HEIGHT(x) (((x) & 0x7) << 4) +#define PITCH (0 << 0) +#define TILED (1 << 0) +#define BLOCK (2 << 0) +#define BLOCK_HEIGHT(x) (((x) & 0x7) << 4) #define DC_WINBUF_MEMFETCH_CONTROL 0x82B @@ -473,57 +472,57 @@ /*! Display serial interface registers. */ #define DSI_INCR_SYNCPT_CNTRL 0x1 -#define DSI_INCR_SYNCPT_SOFT_RESET BIT(0) -#define DSI_INCR_SYNCPT_NO_STALL BIT(8) +#define DSI_INCR_SYNCPT_SOFT_RESET BIT(0) +#define DSI_INCR_SYNCPT_NO_STALL BIT(8) #define DSI_RD_DATA 0x9 #define DSI_WR_DATA 0xA #define DSI_POWER_CONTROL 0xB -#define DSI_POWER_CONTROL_ENABLE 1 +#define DSI_POWER_CONTROL_ENABLE 1 #define DSI_INT_ENABLE 0xC #define DSI_INT_STATUS 0xD #define DSI_INT_MASK 0xE #define DSI_HOST_CONTROL 0xF -#define DSI_HOST_CONTROL_ECC BIT(0) -#define DSI_HOST_CONTROL_CS BIT(1) -#define DSI_HOST_CONTROL_PKT_BTA BIT(2) -#define DSI_HOST_CONTROL_IMM_BTA BIT(3) -#define DSI_HOST_CONTROL_FIFO_SEL BIT(4) -#define DSI_HOST_CONTROL_HS BIT(5) -#define DSI_HOST_CONTROL_RAW BIT(6) -#define DSI_HOST_CONTROL_TX_TRIG_MASK (3 << 12) -#define DSI_HOST_CONTROL_TX_TRIG_SOL (0 << 12) -#define DSI_HOST_CONTROL_TX_TRIG_FIFO (1 << 12) -#define DSI_HOST_CONTROL_TX_TRIG_HOST (2 << 12) -#define DSI_HOST_CONTROL_CRC_RESET BIT(20) -#define DSI_HOST_CONTROL_FIFO_RESET BIT(21) +#define DSI_HOST_CONTROL_ECC BIT(0) +#define DSI_HOST_CONTROL_CS BIT(1) +#define DSI_HOST_CONTROL_PKT_BTA BIT(2) +#define DSI_HOST_CONTROL_IMM_BTA BIT(3) +#define DSI_HOST_CONTROL_FIFO_SEL BIT(4) +#define DSI_HOST_CONTROL_HS BIT(5) +#define DSI_HOST_CONTROL_RAW BIT(6) +#define DSI_HOST_CONTROL_TX_TRIG_MASK (3 << 12) +#define DSI_HOST_CONTROL_TX_TRIG_SOL (0 << 12) +#define DSI_HOST_CONTROL_TX_TRIG_FIFO (1 << 12) +#define DSI_HOST_CONTROL_TX_TRIG_HOST (2 << 12) +#define DSI_HOST_CONTROL_CRC_RESET BIT(20) +#define DSI_HOST_CONTROL_FIFO_RESET BIT(21) #define DSI_CONTROL 0x10 -#define DSI_CONTROL_HOST_ENABLE BIT(0) -#define DSI_CONTROL_VIDEO_ENABLE BIT(1) -#define DSI_CONTROL_SOURCE(s) (((s) & 0x1) << 2) -#define DSI_CONTROL_DCS_ENABLE BIT(3) -#define DSI_CONTROL_LANES(n) (((n) & 0x3) << 4) -#define DSI_CONTROL_TX_TRIG(x) (((x) & 0x3) << 8) -#define DSI_CONTROL_FORMAT(f) (((f) & 0x3) << 12) -#define DSI_CONTROL_CHANNEL(c) (((c) & 0x3) << 16) -#define DSI_CONTROL_HS_CLK_CTRL BIT(20) +#define DSI_CONTROL_HOST_ENABLE BIT(0) +#define DSI_CONTROL_VIDEO_ENABLE BIT(1) +#define DSI_CONTROL_SOURCE(s) (((s) & 0x1) << 2) +#define DSI_CONTROL_DCS_ENABLE BIT(3) +#define DSI_CONTROL_LANES(n) (((n) & 0x3) << 4) +#define DSI_CONTROL_TX_TRIG(x) (((x) & 0x3) << 8) +#define DSI_CONTROL_FORMAT(f) (((f) & 0x3) << 12) +#define DSI_CONTROL_CHANNEL(c) (((c) & 0x3) << 16) +#define DSI_CONTROL_HS_CLK_CTRL BIT(20) #define DSI_SOL_DELAY 0x11 #define DSI_MAX_THRESHOLD 0x12 #define DSI_TRIGGER 0x13 -#define DSI_TRIGGER_VIDEO BIT(0) -#define DSI_TRIGGER_HOST BIT(1) +#define DSI_TRIGGER_VIDEO BIT(0) +#define DSI_TRIGGER_HOST BIT(1) #define DSI_TX_CRC 0x14 #define DSI_STATUS 0x15 -#define DSI_STATUS_RX_FIFO_SIZE 0x1F -#define DSI_STATUS_TX_FIFO_SIZE 0x20 // Actual depth is 64. +#define DSI_STATUS_RX_FIFO_SIZE 0x1F +#define DSI_STATUS_TX_FIFO_SIZE 0x20 // Actual depth is 64. #define DSI_INIT_SEQ_CONTROL 0x1A #define DSI_INIT_SEQ_DATA_0 0x1B @@ -548,8 +547,8 @@ #define DSI_PKT_LEN_2_3 0x35 #define DSI_PKT_LEN_4_5 0x36 #define DSI_PKT_LEN_6_7 0x37 -#define PKT0_LEN(x) (((x) & 0xFFFF) << 0) -#define PKT1_LEN(x) (((x) & 0xFFFF) << 16) +#define PKT0_LEN(x) (((x) & 0xFFFF) << 0) +#define PKT1_LEN(x) (((x) & 0xFFFF) << 16) #define DSI_PHY_TIMING_0 0x3C #define DSI_PHY_TIMING_1 0x3D @@ -557,34 +556,34 @@ #define DSI_BTA_TIMING 0x3F #define DSI_TIMEOUT_0 0x44 -#define DSI_TIMEOUT_HTX(x) (((x) & 0xFFFF) << 0) -#define DSI_TIMEOUT_LRX(x) (((x) & 0xFFFF) << 16) +#define DSI_TIMEOUT_HTX(x) (((x) & 0xFFFF) << 0) +#define DSI_TIMEOUT_LRX(x) (((x) & 0xFFFF) << 16) #define DSI_TIMEOUT_1 0x45 -#define DSI_TIMEOUT_TA(x) (((x) & 0xFFFF) << 0) -#define DSI_TIMEOUT_PR(x) (((x) & 0xFFFF) << 16) +#define DSI_TIMEOUT_TA(x) (((x) & 0xFFFF) << 0) +#define DSI_TIMEOUT_PR(x) (((x) & 0xFFFF) << 16) #define DSI_TO_TALLY 0x46 #define DSI_PAD_CONTROL_0 0x4B -#define DSI_PAD_CONTROL_VS1_PDIO_CLK BIT(8) -#define DSI_PAD_CONTROL_VS1_PDIO(x) (((x) & 0xF) << 0) -#define DSI_PAD_CONTROL_VS1_PULLDN_CLK BIT(24) -#define DSI_PAD_CONTROL_VS1_PULLDN(x) (((x) & 0xF) << 16) +#define DSI_PAD_CONTROL_VS1_PDIO_CLK BIT(8) +#define DSI_PAD_CONTROL_VS1_PDIO(x) (((x) & 0xF) << 0) +#define DSI_PAD_CONTROL_VS1_PULLDN_CLK BIT(24) +#define DSI_PAD_CONTROL_VS1_PULLDN(x) (((x) & 0xF) << 16) #define DSI_PAD_CONTROL_CD 0x4C #define DSI_VIDEO_MODE_CONTROL 0x4E -#define DSI_CMD_PKT_VID_ENABLE 1 -#define DSI_DSI_LINE_TYPE(x) ((x) << 1) +#define DSI_CMD_PKT_VID_ENABLE 1 +#define DSI_DSI_LINE_TYPE(x) ((x) << 1) #define DSI_PAD_CONTROL_1 0x4F #define DSI_PAD_CONTROL_2 0x50 #define DSI_PAD_CONTROL_3 0x51 -#define DSI_PAD_PREEMP_PU(x) (((x) & 0x3) << 0) -#define DSI_PAD_PREEMP_PD(x) (((x) & 0x3) << 4) -#define DSI_PAD_PREEMP_PU_CLK(x) (((x) & 0x3) << 8) -#define DSI_PAD_PREEMP_PD_CLK(x) (((x) & 0x3) << 12) +#define DSI_PAD_PREEMP_PU(x) (((x) & 0x3) << 0) +#define DSI_PAD_PREEMP_PD(x) (((x) & 0x3) << 4) +#define DSI_PAD_PREEMP_PU_CLK(x) (((x) & 0x3) << 8) +#define DSI_PAD_PREEMP_PD_CLK(x) (((x) & 0x3) << 12) #define DSI_PAD_CONTROL_4 0x52 #define DSI_PAD_CONTROL_5_B01 0x53 @@ -594,10 +593,10 @@ #define DSI_INIT_SEQ_DATA_15_B01 0x62 /*! DSI packet defines */ -#define DSI_ESCAPE_CMD 0x87 -#define DSI_ACK_NO_ERR 0x84 +#define DSI_ESCAPE_CMD 0x87 +#define DSI_ACK_NO_ERR 0x84 -#define ACK_ERROR_RES 0x02 +#define ACK_ERROR_RES 0x02 #define GEN_LONG_RD_RES 0x1A #define DCS_LONG_RD_RES 0x1C #define GEN_1_BYTE_SHORT_RD_RES 0x11 @@ -606,187 +605,187 @@ #define DCS_2_BYTE_SHORT_RD_RES 0x22 /*! MIPI registers. */ -#define MIPI_CAL_MIPI_CAL_CTRL (0x00 / 0x4) -#define MIPI_CAL_CIL_MIPI_CAL_STATUS (0x08 / 0x4) -#define MIPI_CAL_CILA_MIPI_CAL_CONFIG (0x14 / 0x4) -#define MIPI_CAL_CILB_MIPI_CAL_CONFIG (0x18 / 0x4) -#define MIPI_CAL_CILC_MIPI_CAL_CONFIG (0x1C / 0x4) -#define MIPI_CAL_CILD_MIPI_CAL_CONFIG (0x20 / 0x4) -#define MIPI_CAL_CILE_MIPI_CAL_CONFIG (0x24 / 0x4) -#define MIPI_CAL_CILF_MIPI_CAL_CONFIG (0x28 / 0x4) -#define MIPI_CAL_DSIA_MIPI_CAL_CONFIG (0x38 / 0x4) -#define MIPI_CAL_DSIB_MIPI_CAL_CONFIG (0x3C / 0x4) -#define MIPI_CAL_DSIC_MIPI_CAL_CONFIG (0x40 / 0x4) -#define MIPI_CAL_DSID_MIPI_CAL_CONFIG (0x44 / 0x4) -#define MIPI_CAL_MIPI_BIAS_PAD_CFG0 (0x58 / 0x4) -#define MIPI_CAL_MIPI_BIAS_PAD_CFG1 (0x5C / 0x4) -#define MIPI_CAL_MIPI_BIAS_PAD_CFG2 (0x60 / 0x4) +#define MIPI_CAL_MIPI_CAL_CTRL (0x00 / 0x4) +#define MIPI_CAL_CIL_MIPI_CAL_STATUS (0x08 / 0x4) +#define MIPI_CAL_CILA_MIPI_CAL_CONFIG (0x14 / 0x4) +#define MIPI_CAL_CILB_MIPI_CAL_CONFIG (0x18 / 0x4) +#define MIPI_CAL_CILC_MIPI_CAL_CONFIG (0x1C / 0x4) +#define MIPI_CAL_CILD_MIPI_CAL_CONFIG (0x20 / 0x4) +#define MIPI_CAL_CILE_MIPI_CAL_CONFIG (0x24 / 0x4) +#define MIPI_CAL_CILF_MIPI_CAL_CONFIG (0x28 / 0x4) +#define MIPI_CAL_DSIA_MIPI_CAL_CONFIG (0x38 / 0x4) +#define MIPI_CAL_DSIB_MIPI_CAL_CONFIG (0x3C / 0x4) +#define MIPI_CAL_DSIC_MIPI_CAL_CONFIG (0x40 / 0x4) +#define MIPI_CAL_DSID_MIPI_CAL_CONFIG (0x44 / 0x4) +#define MIPI_CAL_MIPI_BIAS_PAD_CFG0 (0x58 / 0x4) +#define MIPI_CAL_MIPI_BIAS_PAD_CFG1 (0x5C / 0x4) +#define MIPI_CAL_MIPI_BIAS_PAD_CFG2 (0x60 / 0x4) #define MIPI_CAL_DSIA_MIPI_CAL_CONFIG_2 (0x64 / 0x4) #define MIPI_CAL_DSIB_MIPI_CAL_CONFIG_2 (0x68 / 0x4) #define MIPI_CAL_DSIC_MIPI_CAL_CONFIG_2 (0x70 / 0x4) #define MIPI_CAL_DSID_MIPI_CAL_CONFIG_2 (0x74 / 0x4) /*! MIPI CMDs. */ -#define MIPI_DSI_V_SYNC_START 0x01 -#define MIPI_DSI_COLOR_MODE_OFF 0x02 +#define MIPI_DSI_V_SYNC_START 0x01 +#define MIPI_DSI_COLOR_MODE_OFF 0x02 #define MIPI_DSI_END_OF_TRANSMISSION 0x08 -#define MIPI_DSI_NULL_PACKET 0x09 -#define MIPI_DSI_V_SYNC_END 0x11 -#define MIPI_DSI_COLOR_MODE_ON 0x12 -#define MIPI_DSI_BLANKING_PACKET 0x19 -#define MIPI_DSI_H_SYNC_START 0x21 +#define MIPI_DSI_NULL_PACKET 0x09 +#define MIPI_DSI_V_SYNC_END 0x11 +#define MIPI_DSI_COLOR_MODE_ON 0x12 +#define MIPI_DSI_BLANKING_PACKET 0x19 +#define MIPI_DSI_H_SYNC_START 0x21 #define MIPI_DSI_SHUTDOWN_PERIPHERAL 0x22 -#define MIPI_DSI_H_SYNC_END 0x31 -#define MIPI_DSI_TURN_ON_PERIPHERAL 0x32 +#define MIPI_DSI_H_SYNC_END 0x31 +#define MIPI_DSI_TURN_ON_PERIPHERAL 0x32 #define MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE 0x37 -#define MIPI_DSI_DCS_SHORT_WRITE 0x05 -#define MIPI_DSI_DCS_READ 0x06 +#define MIPI_DSI_DCS_SHORT_WRITE 0x05 +#define MIPI_DSI_DCS_READ 0x06 #define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15 -#define MIPI_DSI_DCS_LONG_WRITE 0x39 +#define MIPI_DSI_DCS_LONG_WRITE 0x39 -#define MIPI_DSI_GENERIC_LONG_WRITE 0x29 -#define MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM 0x03 -#define MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM 0x13 -#define MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM 0x23 +#define MIPI_DSI_GENERIC_LONG_WRITE 0x29 +#define MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM 0x03 +#define MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM 0x13 +#define MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM 0x23 #define MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM 0x04 #define MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM 0x14 #define MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM 0x24 /*! MIPI DCS CMDs. */ -#define MIPI_DCS_NOP 0x00 -#define MIPI_DCS_SOFT_RESET 0x01 -#define MIPI_DCS_GET_COMPRESSION_MODE 0x03 -#define MIPI_DCS_GET_DISPLAY_ID 0x04 -#define MIPI_DCS_GET_DISPLAY_ID1 0xDA // GET_DISPLAY_ID Byte0, Module Manufacturer ID. -#define MIPI_DCS_GET_DISPLAY_ID2 0xDB // GET_DISPLAY_ID Byte1, Module/Driver Version ID. -#define MIPI_DCS_GET_DISPLAY_ID3 0xDC // GET_DISPLAY_ID Byte2, Module/Driver ID. -#define MIPI_DCS_GET_NUM_ERRORS 0x05 // 1 byte. -#define MIPI_DCS_GET_RED_CHANNEL 0x06 -#define MIPI_DCS_GET_GREEN_CHANNEL 0x07 -#define MIPI_DCS_GET_BLUE_CHANNEL 0x08 -#define MIPI_DCS_GET_DISPLAY_STATUS 0x09 // 4 bytes. -#define MIPI_DCS_GET_POWER_MODE 0x0A // 1 byte. 2: DISON, 3: NORON, 4: SLPOUT, 7: BSTON. -#define MIPI_DCS_GET_ADDRESS_MODE 0x0B // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. -#define MIPI_DCS_GET_PIXEL_FORMAT 0x0C // 1 byte. 4-6: DPI. -#define MIPI_DCS_GET_DISPLAY_MODE 0x0D // 1 byte. 0-2: GCS, 3: ALLPOFF, 4: ALLPON, 5: INVON. -#define MIPI_DCS_GET_SIGNAL_MODE 0x0E // 1 byte. 0: EODSI, 2: DEON, 3: PCLKON, 4: VSON, 5: HSON, 7: TEON. -#define MIPI_DCS_GET_DIAGNOSTIC_RESULT 0x0F // 1 byte. 6: FUNDT, 7: REGLD. -#define MIPI_DCS_ENTER_SLEEP_MODE 0x10 -#define MIPI_DCS_EXIT_SLEEP_MODE 0x11 -#define MIPI_DCS_ENTER_PARTIAL_MODE 0x12 -#define MIPI_DCS_ENTER_NORMAL_MODE 0x13 -#define MIPI_DCS_EXIT_INVERT_MODE 0x20 -#define MIPI_DCS_ENTER_INVERT_MODE 0x21 -#define MIPI_DCS_ALL_PIXELS_OFF 0x22 -#define MIPI_DCS_ALL_PIXELS_ON 0x23 -#define MIPI_DCS_SET_CONTRAST 0x25 // VCON in 40mV steps. 7-bit integer. -#define MIPI_DCS_SET_GAMMA_CURVE 0x26 // 1 byte. 0-7: GC. -#define MIPI_DCS_SET_DISPLAY_OFF 0x28 -#define MIPI_DCS_SET_DISPLAY_ON 0x29 -#define MIPI_DCS_SET_COLUMN_ADDRESS 0x2A -#define MIPI_DCS_SET_PAGE_ADDRESS 0x2B -#define MIPI_DCS_WRITE_MEMORY_START 0x2C -#define MIPI_DCS_WRITE_LUT 0x2D // 24-bit: 192 bytes. -#define MIPI_DCS_READ_MEMORY_START 0x2E -#define MIPI_DCS_SET_PARTIAL_ROWS 0x30 -#define MIPI_DCS_SET_PARTIAL_COLUMNS 0x31 -#define MIPI_DCS_SET_SCROLL_AREA 0x33 -#define MIPI_DCS_SET_TEAR_OFF 0x34 -#define MIPI_DCS_SET_TEAR_ON 0x35 -#define MIPI_DCS_SET_ADDRESS_MODE 0x36 // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. -#define MIPI_DCS_SET_SCROLL_START 0x37 -#define MIPI_DCS_EXIT_IDLE_MODE 0x38 -#define MIPI_DCS_ENTER_IDLE_MODE 0x39 -#define MIPI_DCS_SET_PIXEL_FORMAT 0x3A // 1 byte. 4-6: DPI. +#define MIPI_DCS_NOP 0x00 +#define MIPI_DCS_SOFT_RESET 0x01 +#define MIPI_DCS_GET_COMPRESSION_MODE 0x03 +#define MIPI_DCS_GET_DISPLAY_ID 0x04 +#define MIPI_DCS_GET_DISPLAY_ID1 0xDA // GET_DISPLAY_ID Byte0, Module Manufacturer ID. +#define MIPI_DCS_GET_DISPLAY_ID2 0xDB // GET_DISPLAY_ID Byte1, Module/Driver Version ID. +#define MIPI_DCS_GET_DISPLAY_ID3 0xDC // GET_DISPLAY_ID Byte2, Module/Driver ID. +#define MIPI_DCS_GET_NUM_ERRORS 0x05 // 1 byte. +#define MIPI_DCS_GET_RED_CHANNEL 0x06 +#define MIPI_DCS_GET_GREEN_CHANNEL 0x07 +#define MIPI_DCS_GET_BLUE_CHANNEL 0x08 +#define MIPI_DCS_GET_DISPLAY_STATUS 0x09 // 4 bytes. +#define MIPI_DCS_GET_POWER_MODE 0x0A // 1 byte. 2: DISON, 3: NORON, 4: SLPOUT, 7: BSTON. +#define MIPI_DCS_GET_ADDRESS_MODE 0x0B // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. +#define MIPI_DCS_GET_PIXEL_FORMAT 0x0C // 1 byte. 4-6: DPI. +#define MIPI_DCS_GET_DISPLAY_MODE 0x0D // 1 byte. 0-2: GCS, 3: ALLPOFF, 4: ALLPON, 5: INVON. +#define MIPI_DCS_GET_SIGNAL_MODE 0x0E // 1 byte. 0: EODSI, 2: DEON, 3: PCLKON, 4: VSON, 5: HSON, 7: TEON. +#define MIPI_DCS_GET_DIAGNOSTIC_RESULT 0x0F // 1 byte. 6: FUNDT, 7: REGLD. +#define MIPI_DCS_ENTER_SLEEP_MODE 0x10 +#define MIPI_DCS_EXIT_SLEEP_MODE 0x11 +#define MIPI_DCS_ENTER_PARTIAL_MODE 0x12 +#define MIPI_DCS_ENTER_NORMAL_MODE 0x13 +#define MIPI_DCS_EXIT_INVERT_MODE 0x20 +#define MIPI_DCS_ENTER_INVERT_MODE 0x21 +#define MIPI_DCS_ALL_PIXELS_OFF 0x22 +#define MIPI_DCS_ALL_PIXELS_ON 0x23 +#define MIPI_DCS_SET_CONTRAST 0x25 // VCON in 40mV steps. 7-bit integer. +#define MIPI_DCS_SET_GAMMA_CURVE 0x26 // 1 byte. 0-7: GC. +#define MIPI_DCS_SET_DISPLAY_OFF 0x28 +#define MIPI_DCS_SET_DISPLAY_ON 0x29 +#define MIPI_DCS_SET_COLUMN_ADDRESS 0x2A +#define MIPI_DCS_SET_PAGE_ADDRESS 0x2B +#define MIPI_DCS_WRITE_MEMORY_START 0x2C +#define MIPI_DCS_WRITE_LUT 0x2D // 24-bit: 192 bytes. +#define MIPI_DCS_READ_MEMORY_START 0x2E +#define MIPI_DCS_SET_PARTIAL_ROWS 0x30 +#define MIPI_DCS_SET_PARTIAL_COLUMNS 0x31 +#define MIPI_DCS_SET_SCROLL_AREA 0x33 +#define MIPI_DCS_SET_TEAR_OFF 0x34 +#define MIPI_DCS_SET_TEAR_ON 0x35 +#define MIPI_DCS_SET_ADDRESS_MODE 0x36 // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. +#define MIPI_DCS_SET_SCROLL_START 0x37 +#define MIPI_DCS_EXIT_IDLE_MODE 0x38 +#define MIPI_DCS_ENTER_IDLE_MODE 0x39 +#define MIPI_DCS_SET_PIXEL_FORMAT 0x3A // 1 byte. 4-6: DPI. #define MIPI_DCS_WRITE_MEMORY_CONTINUE 0x3C -#define MIPI_DCS_READ_MEMORY_CONTINUE 0x3E -#define MIPI_DCS_GET_3D_CONTROL 0x3F -#define MIPI_DCS_SET_VSYNC_TIMING 0x40 -#define MIPI_DCS_SET_TEAR_SCANLINE 0x44 -#define MIPI_DCS_GET_SCANLINE 0x45 +#define MIPI_DCS_READ_MEMORY_CONTINUE 0x3E +#define MIPI_DCS_GET_3D_CONTROL 0x3F +#define MIPI_DCS_SET_VSYNC_TIMING 0x40 +#define MIPI_DCS_SET_TEAR_SCANLINE 0x44 +#define MIPI_DCS_GET_SCANLINE 0x45 #define MIPI_DCS_SET_TEAR_SCANLINE_WIDTH 0x46 -#define MIPI_DCS_GET_SCANLINE_WIDTH 0x47 -#define MIPI_DSI_AREA_COLOR_MODE 0x4C -#define MIPI_DCS_SET_BRIGHTNESS 0x51 // DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL. 1 byte. 0-7: DBV. -#define MIPI_DCS_GET_BRIGHTNESS 0x52 // 1 byte. 0-7: DBV. -#define MIPI_DCS_SET_CONTROL_DISPLAY 0x53 // 1 byte. 2: BL, 3: DD, 5: BCTRL. -#define MIPI_DCS_GET_CONTROL_DISPLAY 0x54 // 1 byte. 2: BL, 3: DD, 5: BCTRL. -#define MIPI_DCS_SET_CABC_VALUE 0x55 // 1 byte. 0-32: C, 4-7: C. -#define MIPI_DCS_GET_CABC_VALUE 0x56 // 1 byte. 0-32: C, 4-7: C. -#define MIPI_DCS_SET_CABC_MIN_BRI 0x5E // 1 byte. 0-7: CMB. -#define MIPI_DCS_GET_CABC_MIN_BRI 0x5F // 1 byte. 0-7: CMB. -#define MIPI_DCS_GET_AUTO_BRI_DIAG_RES 0x68 // 1 byte. 6-7: D. -#define MIPI_DCS_READ_DDB_START 0xA1 -#define MIPI_DCS_READ_DDB_CONTINUE 0xA8 // 0x100 size. +#define MIPI_DCS_GET_SCANLINE_WIDTH 0x47 +#define MIPI_DSI_AREA_COLOR_MODE 0x4C +#define MIPI_DCS_SET_BRIGHTNESS 0x51 // DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL. 1 byte. 0-7: DBV. +#define MIPI_DCS_GET_BRIGHTNESS 0x52 // 1 byte. 0-7: DBV. +#define MIPI_DCS_SET_CONTROL_DISPLAY 0x53 // 1 byte. 2: BL, 3: DD, 5: BCTRL. +#define MIPI_DCS_GET_CONTROL_DISPLAY 0x54 // 1 byte. 2: BL, 3: DD, 5: BCTRL. +#define MIPI_DCS_SET_CABC_VALUE 0x55 // 1 byte. 0-32: C, 4-7: C. +#define MIPI_DCS_GET_CABC_VALUE 0x56 // 1 byte. 0-32: C, 4-7: C. +#define MIPI_DCS_SET_CABC_MIN_BRI 0x5E // 1 byte. 0-7: CMB. +#define MIPI_DCS_GET_CABC_MIN_BRI 0x5F // 1 byte. 0-7: CMB. +#define MIPI_DCS_GET_AUTO_BRI_DIAG_RES 0x68 // 1 byte. 6-7: D. +#define MIPI_DCS_READ_DDB_START 0xA1 +#define MIPI_DCS_READ_DDB_CONTINUE 0xA8 // 0x100 size. /*! MIPI DCS Panel Private CMDs. */ -#define MIPI_DCS_PRIV_SM_SET_COLOR_MODE 0xA0 // 43 bytes. +#define MIPI_DCS_PRIV_SM_SET_COLOR_MODE 0xA0 // 43 bytes. #define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0 -#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 // OLED backlight tuning. Byte7: PWM transition time in frames. +#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 // OLED backlight tuning. Byte7: PWM transition time in frames. #define MIPI_DCS_PRIV_SET_POWER_CONTROL 0xB1 -#define MIPI_DCS_PRIV_SET_EXTC 0xB9 // Enable extended commands. -#define MIPI_DCS_PRIV_UNK_BD 0xBD -#define MIPI_DCS_PRIV_UNK_D5 0xD5 -#define MIPI_DCS_PRIV_UNK_D6 0xD6 -#define MIPI_DCS_PRIV_UNK_D8 0xD8 -#define MIPI_DCS_PRIV_UNK_D9 0xD9 -#define MIPI_DCS_PRIV_SM_DISPLAY_ID 0xDD - // LVL1 LVL2 LVL3 UNK0 UNK1 -#define MIPI_DCS_PRIV_SM_SET_REGS_LOCK 0xE2 // Samsung: Lock (default): 5A5A A5A5 A5A5 A500 A500. Lock/Unlock: A5/5A. LVL1 group is normal registers. -#define MIPI_DCS_PRIV_READ_EXTC_CMD_SPI 0xFE // Read EXTC Command In SPI. 1 byte. 0-6: EXT_SPI_CNT, 7:EXT_SP. -#define MIPI_DCS_PRIV_SET_EXTC_CMD_REG 0xFF // EXTC Command Set enable register. 5 bytes. Pass: FF 98 06 04, PAGE. +#define MIPI_DCS_PRIV_SET_EXTC 0xB9 // Enable extended commands. +#define MIPI_DCS_PRIV_UNK_BD 0xBD +#define MIPI_DCS_PRIV_UNK_D5 0xD5 +#define MIPI_DCS_PRIV_UNK_D6 0xD6 +#define MIPI_DCS_PRIV_UNK_D8 0xD8 +#define MIPI_DCS_PRIV_UNK_D9 0xD9 +#define MIPI_DCS_PRIV_SM_DISPLAY_ID 0xDD +// LVL1 LVL2 LVL3 UNK0 UNK1 +#define MIPI_DCS_PRIV_SM_SET_REGS_LOCK 0xE2 // Samsung: Lock (default): 5A5A A5A5 A5A5 A500 A500. Lock/Unlock: A5/5A. LVL1 group is normal registers. +#define MIPI_DCS_PRIV_READ_EXTC_CMD_SPI 0xFE // Read EXTC Command In SPI. 1 byte. 0-6: EXT_SPI_CNT, 7:EXT_SP. +#define MIPI_DCS_PRIV_SET_EXTC_CMD_REG 0xFF // EXTC Command Set enable register. 5 bytes. Pass: FF 98 06 04, PAGE. /*! MIPI DCS Panel Private CMDs PAGE 1. */ -#define MIPI_DCS_PRIV_GET_DISPLAY_ID4 0x00 -#define MIPI_DCS_PRIV_GET_DISPLAY_ID5 0x01 -#define MIPI_DCS_PRIV_GET_DISPLAY_ID6 0x02 +#define MIPI_DCS_PRIV_GET_DISPLAY_ID4 0x00 +#define MIPI_DCS_PRIV_GET_DISPLAY_ID5 0x01 +#define MIPI_DCS_PRIV_GET_DISPLAY_ID6 0x02 /*! MIPI DCS CMD Defines. */ -#define DCS_POWER_MODE_DISPLAY_ON BIT(2) -#define DCS_POWER_MODE_NORMAL_MODE BIT(3) -#define DCS_POWER_MODE_SLEEP_MODE BIT(4) -#define DCS_POWER_MODE_PARTIAL_MODE BIT(5) -#define DCS_POWER_MODE_IDLE_MODE BIT(6) +#define DCS_POWER_MODE_DISPLAY_ON BIT(2) +#define DCS_POWER_MODE_NORMAL_MODE BIT(3) +#define DCS_POWER_MODE_SLEEP_MODE BIT(4) +#define DCS_POWER_MODE_PARTIAL_MODE BIT(5) +#define DCS_POWER_MODE_IDLE_MODE BIT(6) -#define DCS_ADDRESS_MODE_V_FLIP BIT(0) -#define DCS_ADDRESS_MODE_H_FLIP BIT(1) -#define DCS_ADDRESS_MODE_LATCH_RL BIT(2) // Latch Data Order. -#define DCS_ADDRESS_MODE_BGR_COLOR BIT(3) -#define DCS_ADDRESS_MODE_LINE_ORDER BIT(4) // Line Refresh Order. -#define DCS_ADDRESS_MODE_SWAP_XY BIT(5) // Page/Column Addressing Reverse Order. -#define DCS_ADDRESS_MODE_MIRROR_X BIT(6) // Column Address Order. -#define DCS_ADDRESS_MODE_MIRROR_Y BIT(7) // Page Address Order. -#define DCS_ADDRESS_MODE_ROTATION_MASK (0xF << 4) -#define DCS_ADDRESS_MODE_ROTATION_90 (DCS_ADDRESS_MODE_SWAP_XY | DCS_ADDRESS_MODE_LINE_ORDER) -#define DCS_ADDRESS_MODE_ROTATION_180 (DCS_ADDRESS_MODE_MIRROR_X | DCS_ADDRESS_MODE_LINE_ORDER) -#define DCS_ADDRESS_MODE_ROTATION_270 (DCS_ADDRESS_MODE_SWAP_XY) +#define DCS_ADDRESS_MODE_V_FLIP BIT(0) +#define DCS_ADDRESS_MODE_H_FLIP BIT(1) +#define DCS_ADDRESS_MODE_LATCH_RL BIT(2) // Latch Data Order. +#define DCS_ADDRESS_MODE_BGR_COLOR BIT(3) +#define DCS_ADDRESS_MODE_LINE_ORDER BIT(4) // Line Refresh Order. +#define DCS_ADDRESS_MODE_SWAP_XY BIT(5) // Page/Column Addressing Reverse Order. +#define DCS_ADDRESS_MODE_MIRROR_X BIT(6) // Column Address Order. +#define DCS_ADDRESS_MODE_MIRROR_Y BIT(7) // Page Address Order. +#define DCS_ADDRESS_MODE_ROTATION_MASK (0xF << 4) +#define DCS_ADDRESS_MODE_ROTATION_90 (DCS_ADDRESS_MODE_SWAP_XY | DCS_ADDRESS_MODE_LINE_ORDER) +#define DCS_ADDRESS_MODE_ROTATION_180 (DCS_ADDRESS_MODE_MIRROR_X | DCS_ADDRESS_MODE_LINE_ORDER) +#define DCS_ADDRESS_MODE_ROTATION_270 (DCS_ADDRESS_MODE_SWAP_XY) -#define DCS_GAMMA_CURVE_NONE 0 -#define DCS_GAMMA_CURVE_GC0_1_8 BIT(0) -#define DCS_GAMMA_CURVE_GC1_2_5 BIT(1) -#define DCS_GAMMA_CURVE_GC2_1_0 BIT(2) -#define DCS_GAMMA_CURVE_GC3_1_0 BIT(3) // Are there more? +#define DCS_GAMMA_CURVE_NONE 0 +#define DCS_GAMMA_CURVE_GC0_1_8 BIT(0) +#define DCS_GAMMA_CURVE_GC1_2_5 BIT(1) +#define DCS_GAMMA_CURVE_GC2_1_0 BIT(2) +#define DCS_GAMMA_CURVE_GC3_1_0 BIT(3) // Are there more? -#define DCS_CONTROL_DISPLAY_SM_FLASHLIGHT BIT(2) -#define DCS_CONTROL_DISPLAY_BACKLIGHT_CTRL BIT(2) -#define DCS_CONTROL_DISPLAY_DIMMING_CTRL BIT(3) // Transition fading. +#define DCS_CONTROL_DISPLAY_SM_FLASHLIGHT BIT(2) +#define DCS_CONTROL_DISPLAY_BACKLIGHT_CTRL BIT(2) +#define DCS_CONTROL_DISPLAY_DIMMING_CTRL BIT(3) // Transition fading. #define DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL BIT(5) -#define DCS_CONTROL_DISPLAY_HBM_CTRL0 BIT(6) -#define DCS_CONTROL_DISPLAY_HBM_CTRL1 BIT(7) +#define DCS_CONTROL_DISPLAY_HBM_CTRL0 BIT(6) +#define DCS_CONTROL_DISPLAY_HBM_CTRL1 BIT(7) -#define DCS_SM_COLOR_MODE_SATURATED 0x00 // Disabled. Based on Vivid but over-saturated. -#define DCS_SM_COLOR_MODE_WASHED 0x45 -#define DCS_SM_COLOR_MODE_BASIC 0x03 // Real natural profile. -#define DCS_SM_COLOR_MODE_POR_RESET 0x20 // Reset value on power on. -#define DCS_SM_COLOR_MODE_NATURAL 0x23 // Not actually natural.. Extra saturation. -#define DCS_SM_COLOR_MODE_VIVID 0x65 // Saturated. -#define DCS_SM_COLOR_MODE_NIGHT0 0x43 // Based on Washed Out. -#define DCS_SM_COLOR_MODE_NIGHT1 0x15 // Based on Basic. -#define DCS_SM_COLOR_MODE_NIGHT2 0x35 // Based on Natural. -#define DCS_SM_COLOR_MODE_NIGHT3 0x75 // Based on Vivid. +#define DCS_SM_COLOR_MODE_SATURATED 0x00 // Disabled. Based on Vivid but over-saturated. +#define DCS_SM_COLOR_MODE_WASHED 0x45 +#define DCS_SM_COLOR_MODE_BASIC 0x03 // Real natural profile. +#define DCS_SM_COLOR_MODE_POR_RESET 0x20 // Reset value on power on. +#define DCS_SM_COLOR_MODE_NATURAL 0x23 // Not actually natural.. Extra saturation. +#define DCS_SM_COLOR_MODE_VIVID 0x65 // Saturated. +#define DCS_SM_COLOR_MODE_NIGHT0 0x43 // Based on Washed Out. +#define DCS_SM_COLOR_MODE_NIGHT1 0x15 // Based on Basic. +#define DCS_SM_COLOR_MODE_NIGHT2 0x35 // Based on Natural. +#define DCS_SM_COLOR_MODE_NIGHT3 0x75 // Based on Vivid. -#define DCS_SM_COLOR_MODE_ENABLE BIT(0) +#define DCS_SM_COLOR_MODE_ENABLE BIT(0) #define PANEL_SM_BL_CANDELA_MAX 2047 diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp index 6aa4a9c6..50ea9caa 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp @@ -12,26 +12,27 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include "display_refresh_rate.hpp" -#include #include #include +#include #include +#include "display_refresh_rate.hpp" + namespace display { - #define DSI_CLOCK_HZ 234000000llu - #define NVDISP_GET_MODE2 0x803C021B - #define NVDISP_SET_MODE2 0x403C021C - #define NVDISP_VALIDATE_MODE2 0xC03C021D - #define NVDISP_GET_MODE_DB2 0xEF20021E - #define NVDISP_GET_PANEL_DATA 0xC01C0226 +#define DSI_CLOCK_HZ 234000000llu +#define NVDISP_GET_MODE2 0x803C021B +#define NVDISP_SET_MODE2 0x403C021C +#define NVDISP_VALIDATE_MODE2 0xC03C021D +#define NVDISP_GET_MODE_DB2 0xEF20021E +#define NVDISP_GET_PANEL_DATA 0xC01C0226 - #define MAX_REFRESH_RATE 72 +#define MAX_REFRESH_RATE 72 - static DisplayRefreshConfig g_config = {0}; + static DisplayRefreshConfig g_config = { 0 }; static bool g_initialized = false; static uint8_t g_dockedHighestRefreshRate = 60; @@ -41,7 +42,8 @@ namespace display { static bool g_canChangeRefreshRateDocked = false; static uint8_t g_lastVActiveSet = 0; - static const uint8_t g_dockedRefreshRates[] = {40, 45, 50, 55, 60, 70, 72, 75, 80, 90, 95, 100, 110, 120, 130, 140, 144, 150, 160, 165, 170, 180, 190, 200, 210, 220, 230, 240}; + static const uint8_t g_dockedRefreshRates[] = { 40, 45, 50, 55, 60, 70, 72, 75, 80, 90, 95, 100, 110, 120, + 130, 140, 144, 150, 160, 165, 170, 180, 190, 200, 210, 220, 230, 240 }; // Calculate with this tool: // https://tomverbeure.github.io/video_timings_calculator?horiz_pixels=1920&vert_pixels=1080&refresh_rate=240&margins=false&interlaced=false&bpc=8&color_fmt=rgb444&video_opt=false&custom_hblank=80&custom_vblank=6 @@ -59,83 +61,85 @@ namespace display { } DockedTimings; */ static const DockedTimings g_dockedTimings1080p[] = { - {8, 32, 40, 7, 8, 6, 0, 88080}, // 40Hz - {8, 32, 40, 9, 8, 6, 0, 99270}, // 45Hz - {528, 44, 148, 4, 5, 36, 31, 148500}, // 50Hz - {8, 32, 40, 15, 8, 6, 0, 121990}, // 55Hz - {88, 44, 148, 4, 5, 36, 16, 148500}, // 60Hz - {8, 32, 40, 22, 8, 6, 0, 156240}, // 70Hz - {8, 32, 40, 23, 8, 6, 0, 160848}, // 72Hz - {8, 32, 40, 25, 8, 6, 0, 167850}, // 75Hz - {8, 32, 40, 28, 8, 6, 0, 179520}, // 80Hz - {8, 32, 40, 33, 8, 6, 0, 202860}, // 90Hz - {8, 32, 40, 36, 8, 6, 0, 214700}, // 95Hz - {528, 44, 148, 4, 5, 36, 64, 297000}, // 100Hz - {8, 32, 40, 44, 8, 6, 0, 250360}, // 110Hz - {88, 44, 148, 4, 5, 36, 63, 297000}, // 120Hz - {8, 32, 40, 55, 8, 6, 0, 298750}, //130Hz CVT-RBv2 - {8, 32, 40, 61, 8, 6, 0, 323400}, //140Hz CVT-RBv2 - {8, 32, 40, 63, 8, 6, 0, 333216}, //144Hz CVT-RBv2 - {8, 32, 40, 67, 8, 6, 0, 348300}, //150Hz CVT-RBv2 - {8, 32, 40, 72, 8, 6, 0, 373120}, //160Hz CVT-RBv2 - {8, 32, 40, 75, 8, 6, 0, 385770}, //165Hz CVT-RBv2 - {8, 32, 40, 78, 8, 6, 0, 398480}, //170Hz CVT-RBv2 - {8, 32, 40, 84, 8, 6, 0, 424080}, //180Hz CVT-RBv2 - {8, 32, 40, 90, 8, 6, 0, 449920}, //190Hz CVT-RBv2 - {8, 32, 40, 96, 8, 6, 0, 476000}, //200Hz CVT-RBv2 - {8, 32, 40, 102, 8, 6, 0, 502320}, //210Hz CVT-RBv2 - {8, 32, 40, 108, 8, 6, 0, 528880}, //220Hz CVT-RBv2 - {8, 32, 40, 114, 8, 6, 0, 555680}, //230Hz CVT-RBv2 - {8, 32, 40, 121, 8, 6, 0, 583200}, //240Hz CVT-RBv2 + { 8, 32, 40, 7, 8, 6, 0, 88080 }, // 40Hz + { 8, 32, 40, 9, 8, 6, 0, 99270 }, // 45Hz + { 528, 44, 148, 4, 5, 36, 31, 148500 }, // 50Hz + { 8, 32, 40, 15, 8, 6, 0, 121990 }, // 55Hz + { 88, 44, 148, 4, 5, 36, 16, 148500 }, // 60Hz + { 8, 32, 40, 22, 8, 6, 0, 156240 }, // 70Hz + { 8, 32, 40, 23, 8, 6, 0, 160848 }, // 72Hz + { 8, 32, 40, 25, 8, 6, 0, 167850 }, // 75Hz + { 8, 32, 40, 28, 8, 6, 0, 179520 }, // 80Hz + { 8, 32, 40, 33, 8, 6, 0, 202860 }, // 90Hz + { 8, 32, 40, 36, 8, 6, 0, 214700 }, // 95Hz + { 528, 44, 148, 4, 5, 36, 64, 297000 }, // 100Hz + { 8, 32, 40, 44, 8, 6, 0, 250360 }, // 110Hz + { 88, 44, 148, 4, 5, 36, 63, 297000 }, // 120Hz + { 8, 32, 40, 55, 8, 6, 0, 298750 }, // 130Hz CVT-RBv2 + { 8, 32, 40, 61, 8, 6, 0, 323400 }, // 140Hz CVT-RBv2 + { 8, 32, 40, 63, 8, 6, 0, 333216 }, // 144Hz CVT-RBv2 + { 8, 32, 40, 67, 8, 6, 0, 348300 }, // 150Hz CVT-RBv2 + { 8, 32, 40, 72, 8, 6, 0, 373120 }, // 160Hz CVT-RBv2 + { 8, 32, 40, 75, 8, 6, 0, 385770 }, // 165Hz CVT-RBv2 + { 8, 32, 40, 78, 8, 6, 0, 398480 }, // 170Hz CVT-RBv2 + { 8, 32, 40, 84, 8, 6, 0, 424080 }, // 180Hz CVT-RBv2 + { 8, 32, 40, 90, 8, 6, 0, 449920 }, // 190Hz CVT-RBv2 + { 8, 32, 40, 96, 8, 6, 0, 476000 }, // 200Hz CVT-RBv2 + { 8, 32, 40, 102, 8, 6, 0, 502320 }, // 210Hz CVT-RBv2 + { 8, 32, 40, 108, 8, 6, 0, 528880 }, // 220Hz CVT-RBv2 + { 8, 32, 40, 114, 8, 6, 0, 555680 }, // 230Hz CVT-RBv2 + { 8, 32, 40, 121, 8, 6, 0, 583200 }, // 240Hz CVT-RBv2 // technically you can go to 476hz, but in practice, why would you? }; // These timings *should* work but are untested static const HandheldTimings g_handheldTimingsRETRO[] = { - {72, 136, 72, 1, 660, 9, 78000}, // 40Hz - {72, 136, 72, 1, 612, 9, 77982}, // 41Hz - {72, 136, 72, 1, 567, 9, 77994}, // 42Hz - {72, 136, 72, 1, 524, 9, 78002}, // 43Hz - {72, 136, 72, 1, 483, 9, 78012}, // 44Hz - {72, 136, 72, 1, 443, 9, 77985}, // 45Hz - {72, 136, 72, 1, 406, 9, 78016}, // 46Hz - {72, 136, 72, 1, 370, 9, 78020}, // 47Hz - {72, 136, 72, 1, 335, 9, 78000}, // 48Hz - {72, 136, 72, 1, 302, 9, 78008}, // 49Hz - {72, 136, 72, 1, 270, 9, 78000}, // 50Hz - {72, 136, 72, 1, 239, 9, 77979}, // 51Hz - {72, 136, 72, 1, 210, 9, 78000}, // 52Hz - {72, 136, 72, 1, 182, 9, 78016}, // 53Hz - {72, 136, 72, 1, 154, 9, 77976}, // 54Hz - {72, 136, 72, 1, 128, 9, 77990}, // 55Hz - {72, 136, 72, 1, 103, 9, 78008}, // 56Hz - {72, 136, 72, 1, 78, 9, 77976}, // 57Hz - {72, 136, 72, 1, 55, 9, 78010}, // 58Hz - {72, 136, 72, 1, 32, 9, 77998}, // 59Hz - {72, 136, 72, 1, 10, 9, 78000}, // 60Hz + { 72, 136, 72, 1, 660, 9, 78000 }, // 40Hz + { 72, 136, 72, 1, 612, 9, 77982 }, // 41Hz + { 72, 136, 72, 1, 567, 9, 77994 }, // 42Hz + { 72, 136, 72, 1, 524, 9, 78002 }, // 43Hz + { 72, 136, 72, 1, 483, 9, 78012 }, // 44Hz + { 72, 136, 72, 1, 443, 9, 77985 }, // 45Hz + { 72, 136, 72, 1, 406, 9, 78016 }, // 46Hz + { 72, 136, 72, 1, 370, 9, 78020 }, // 47Hz + { 72, 136, 72, 1, 335, 9, 78000 }, // 48Hz + { 72, 136, 72, 1, 302, 9, 78008 }, // 49Hz + { 72, 136, 72, 1, 270, 9, 78000 }, // 50Hz + { 72, 136, 72, 1, 239, 9, 77979 }, // 51Hz + { 72, 136, 72, 1, 210, 9, 78000 }, // 52Hz + { 72, 136, 72, 1, 182, 9, 78016 }, // 53Hz + { 72, 136, 72, 1, 154, 9, 77976 }, // 54Hz + { 72, 136, 72, 1, 128, 9, 77990 }, // 55Hz + { 72, 136, 72, 1, 103, 9, 78008 }, // 56Hz + { 72, 136, 72, 1, 78, 9, 77976 }, // 57Hz + { 72, 136, 72, 1, 55, 9, 78010 }, // 58Hz + { 72, 136, 72, 1, 32, 9, 77998 }, // 59Hz + { 72, 136, 72, 1, 10, 9, 78000 }, // 60Hz }; - static const MinMaxRefreshRate g_handheldModeRefreshRate = {40, 80}; + static const MinMaxRefreshRate g_handheldModeRefreshRate = { 40, 80 }; static uint8_t _getDockedRefreshRateIterator(uint32_t refreshRate) { for (size_t i = 0; i < sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]); i++) { - if (g_dockedRefreshRates[i] == refreshRate) return i; + if (g_dockedRefreshRates[i] == refreshRate) + return i; } return 0xFF; } - static void _changeOledElvssSettings(const uint32_t* offsets, const uint32_t* value, uint32_t size, uint32_t start) { - if (!g_config.dsiVirtAddr || !value || !size) return; + static void _changeOledElvssSettings(const uint32_t *offsets, const uint32_t *value, uint32_t size, uint32_t start) { + if (!g_config.dsiVirtAddr || !value || !size) + return; - volatile uint32_t* dsi = (uint32_t*)g_config.dsiVirtAddr; - - #define DSI_VIDEO_MODE_CONTROL 0x4E - #define DSI_WR_DATA 0xA - #define DSI_TRIGGER 0x13 - #define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15 - #define MIPI_DSI_DCS_LONG_WRITE 0x39 - #define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0 - #define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 + volatile uint32_t *dsi = (uint32_t *)g_config.dsiVirtAddr; + +#define DSI_VIDEO_MODE_CONTROL 0x4E +#define DSI_WR_DATA 0xA +#define DSI_TRIGGER 0x13 +#define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15 +#define MIPI_DSI_DCS_LONG_WRITE 0x39 +#define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0 +#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 dsi[DSI_VIDEO_MODE_CONTROL] = true; svcSleepThread(20000000); @@ -164,9 +168,10 @@ namespace display { g_config.isDocked = isDocked; } - bool Initialize(const DisplayRefreshConfig* config) { - if (!config) return false; - + bool Initialize(const DisplayRefreshConfig *config) { + if (!config) + return false; + g_config = *config; g_initialized = true; return true; @@ -175,34 +180,38 @@ namespace display { void CorrectOledGamma(uint32_t refresh_rate) { static uint32_t last_refresh_rate = 60; static int counter = 0; - + if (g_config.isDocked || refresh_rate < 45 || refresh_rate > 60) { last_refresh_rate = 60; return; } - + if (counter != 9) { counter++; return; } counter = 0; - uint32_t offsets[] = {0x1A, 0x24, 0x25}; - uint32_t values[] = {2, 0, 0x83}; - + uint32_t offsets[] = { 0x1A, 0x24, 0x25 }; + uint32_t values[] = { 2, 0, 0x83 }; + if (refresh_rate == 60) { - if (last_refresh_rate == 60) return; + if (last_refresh_rate == 60) + return; } else if (refresh_rate == 45) { - if (last_refresh_rate == 45) return; - uint32_t vals[] = {4, 1, 0}; + if (last_refresh_rate == 45) + return; + uint32_t vals[] = { 4, 1, 0 }; memcpy(values, vals, sizeof(vals)); } else if (refresh_rate == 50) { - if (last_refresh_rate == 50) return; - uint32_t vals[] = {3, 1, 0}; + if (last_refresh_rate == 50) + return; + uint32_t vals[] = { 3, 1, 0 }; memcpy(values, vals, sizeof(vals)); } else if (refresh_rate == 55) { - if (last_refresh_rate == 55) return; - uint32_t vals[] = {3, 1, 0}; + if (last_refresh_rate == 55) + return; + uint32_t vals[] = { 3, 1, 0 }; memcpy(values, vals, sizeof(vals)); } else { return; @@ -227,69 +236,72 @@ namespace display { static void _getDockedHighestRefreshRate(uint32_t fd_in) { uint8_t highestRefreshRate = 60; uint32_t fd = fd_in; - - if(!fd) nvOpen(&fd, "/dev/nvdisp-disp1"); - NvdcModeDB2 db2 = {0}; + + if (!fd) + nvOpen(&fd, "/dev/nvdisp-disp1"); + NvdcModeDB2 db2 = { 0 }; int rc = nvIoctl(fd, NVDISP_GET_MODE_DB2, &db2); - + if (rc == 0) { for (size_t i = 0; i < db2.num_modes; i++) { - if (db2.modes[i].hActive < 1920 || db2.modes[i].vActive < 1080) + if (db2.modes[i].hActive < 1920 || db2.modes[i].vActive < 1080) continue; - + uint32_t v_total = db2.modes[i].vActive + db2.modes[i].vSyncWidth + db2.modes[i].vFrontPorch + db2.modes[i].vBackPorch; uint32_t h_total = db2.modes[i].hActive + db2.modes[i].hSyncWidth + db2.modes[i].hFrontPorch + db2.modes[i].hBackPorch; double refreshRate = round((double)(db2.modes[i].pclkKHz * 1000) / (double)(v_total * h_total)); - - if (highestRefreshRate < (uint8_t)refreshRate) + + if (highestRefreshRate < (uint8_t)refreshRate) highestRefreshRate = (uint8_t)refreshRate; } } else { g_dockedHighestRefreshRate = 60; } - + const size_t numRates = sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]); - if (highestRefreshRate > g_dockedRefreshRates[numRates - 1]) + if (highestRefreshRate > g_dockedRefreshRates[numRates - 1]) highestRefreshRate = g_dockedRefreshRates[numRates - 1]; - - NvdcMode2 display_b = {0}; + + NvdcMode2 display_b = { 0 }; rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); - + struct dpaux_read_0x100 { uint32_t cmd; uint32_t addr; uint32_t size; struct { unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char downspread; unsigned char training_pattern; unsigned char lane_pattern[4]; unsigned char unk2[8]; } set; - } dpaux = {6, 0x100, 0x10}; - + } dpaux = { 6, 0x100, 0x10 }; + rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); if (rc == 0) { g_dockedLinkRate = dpaux.set.link_rate; - // if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && ) + // if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && ) // highestRefreshRate = 75; } - - if (!fd_in) nvClose(fd); + + if (!fd_in) + nvClose(fd); g_dockedHighestRefreshRate = highestRefreshRate; } static bool _setPLLDHandheldRefreshRate(uint32_t new_refreshRate) { - if (!g_config.clkVirtAddr) return false; + if (!g_config.clkVirtAddr) + return false; uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp0")) { return false; } - + struct dpaux_read { uint32_t cmd; uint32_t addr; @@ -298,24 +310,26 @@ namespace display { unsigned int rev_minor : 4; unsigned int rev_major : 4; unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char unk2[13]; } DPCD; - } dpaux = {6, 0, 0x10}; - + } dpaux = { 6, 0, 0x10 }; + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); nvClose(fd); - if (rc != 0x75c) return false; + if (rc != 0x75c) + return false; + + PLLD_BASE base = { 0 }; + PLLD_MISC misc = { 0 }; + memcpy(&base, (void *)(g_config.clkVirtAddr + 0xD0), 4); + memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4); - PLLD_BASE base = {0}; - PLLD_MISC misc = {0}; - memcpy(&base, (void*)(g_config.clkVirtAddr + 0xD0), 4); - memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4); - uint32_t value = ((base.PLLD_DIVN / base.PLLD_DIVM) * 10) / 4; - if (value == 0 || value == 80) return false; + if (value == 0 || value == 80) + return false; if (new_refreshRate > g_handheldModeRefreshRate.max) { new_refreshRate = g_handheldModeRefreshRate.max; @@ -337,7 +351,8 @@ namespace display { } } } - if (!skip) new_refreshRate = 60; + if (!skip) + new_refreshRate = 60; } uint32_t pixelClock = (9375 * ((4096 * ((2 * base.PLLD_DIVN) + 1)) + misc.PLLD_SDM_DIN)) / (8 * base.PLLD_DIVM); @@ -354,35 +369,34 @@ namespace display { uint64_t expected_pixel_clock = (DSI_CLOCK_HZ * new_refreshRate) / 60; misc.PLLD_SDM_DIN = ((8 * base.PLLD_DIVM * expected_pixel_clock) / 9375) - (4096 * ((2 * base.PLLD_DIVN) + 1)); - memcpy((void*)(g_config.clkVirtAddr + 0xD0), &base, 4); - memcpy((void*)(g_config.clkVirtAddr + 0xDC), &misc, 4); + memcpy((void *)(g_config.clkVirtAddr + 0xD0), &base, 4); + memcpy((void *)(g_config.clkVirtAddr + 0xDC), &misc, 4); return true; } static bool _setNvDispDockedRefreshRate(uint32_t new_refreshRate) { if (g_config.isLite || !g_canChangeRefreshRateDocked) return false; - + uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp1")) { return false; } - - NvdcMode2 display_b = {0}; + + NvdcMode2 display_b = { 0 }; int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { nvClose(fd); return false; } - + if (!display_b.pclkKHz) { nvClose(fd); return false; } - - if (!((display_b.vActive == 480 && display_b.hActive == 720) || - (display_b.vActive == 720 && display_b.hActive == 1280) || - (display_b.vActive == 1080 && display_b.hActive == 1920))) { + + if (!((display_b.vActive == 480 && display_b.hActive == 720) || (display_b.vActive == 720 && display_b.hActive == 1280) || + (display_b.vActive == 1080 && display_b.hActive == 1920))) { nvClose(fd); return false; } @@ -394,15 +408,15 @@ namespace display { uint32_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint32_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; uint32_t refreshRateNow = ((display_b.pclkKHz) * 1000 + 999) / (h_total * v_total); - + int8_t itr = -1; const size_t numRates = sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]); - + // Find closest matching refresh rate if ((new_refreshRate <= 60) && ((60 % new_refreshRate) == 0)) { itr = _getDockedRefreshRateIterator(60); } - + if (itr == -1) { for (size_t i = 0; i < numRates; i++) { uint8_t val = g_dockedRefreshRates[i]; @@ -412,7 +426,7 @@ namespace display { } } } - + if (itr == -1) { if (!g_config.matchLowestDocked) { itr = _getDockedRefreshRateIterator(60); @@ -425,9 +439,10 @@ namespace display { } } } - - if (itr == -1) itr = _getDockedRefreshRateIterator(60); - + + if (itr == -1) + itr = _getDockedRefreshRateIterator(60); + // Clamp to highest allowed refresh rate if (g_dockedRefreshRates[itr] > g_dockedHighestRefreshRate) { for (int8_t i = itr; i >= 0; i--) { @@ -437,7 +452,7 @@ namespace display { } } } - + if (refreshRateNow == g_dockedRefreshRates[itr]) { nvClose(fd); return true; @@ -460,46 +475,47 @@ namespace display { display_b.sync = 3; display_b.bitsPerPixel = 24; } - + rc = nvIoctl(fd, NVDISP_VALIDATE_MODE2, &display_b); if (rc == 0) { rc = nvIoctl(fd, NVDISP_SET_MODE2, &display_b); } } - + nvClose(fd); return true; } static bool _setNvDispHandheldRefreshRate(uint32_t new_refreshRate) { - if (!g_config.isRetroSUPER) return false; - + if (!g_config.isRetroSUPER) + return false; + if (!g_config.displaySync) { g_wasRetroSuperTurnedOff = false; } else if (g_wasRetroSuperTurnedOff) { svcSleepThread(2000000000); g_wasRetroSuperTurnedOff = false; } - + svcSleepThread(1000000000); - + uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp0")) { return false; } - - NvdcMode2 display_b = {0}; + + NvdcMode2 display_b = { 0 }; int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { nvClose(fd); return false; } - + if (!display_b.pclkKHz) { nvClose(fd); return false; } - + if ((display_b.vActive == 1280 && display_b.hActive == 720) == false) { nvClose(fd); return false; @@ -529,7 +545,8 @@ namespace display { } } } - if (!skip) new_refreshRate = 60; + if (!skip) + new_refreshRate = 60; } if (new_refreshRate == refreshRateNow) { @@ -552,25 +569,25 @@ namespace display { nvIoctl(fd, NVDISP_SET_MODE2, &display_b); } } - + nvClose(fd); return true; } bool SetRate(uint32_t new_refreshRate) { - if (!new_refreshRate || !g_initialized) return false; + if (!new_refreshRate || !g_initialized) + return false; uint32_t fd = 0; - + if (g_config.isRetroSUPER && !g_config.isDocked) { return _setNvDispHandheldRefreshRate(new_refreshRate); } else if ((!g_config.isRetroSUPER && g_config.isLite) || R_FAILED(nvOpen(&fd, "/dev/nvdisp-disp1"))) { - if (_setPLLDHandheldRefreshRate(new_refreshRate) == false) + if (_setPLLDHandheldRefreshRate(new_refreshRate) == false) return false; - } - else { + } else { struct dpaux_read { uint32_t cmd; uint32_t addr; @@ -579,48 +596,49 @@ namespace display { unsigned int rev_minor : 4; unsigned int rev_major : 4; unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char unk2[13]; } DPCD; - } dpaux = {6, 0, 0x10}; - + } dpaux = { 6, 0, 0x10 }; + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); nvClose(fd); - + if (rc != 0) { - if (!g_config.isRetroSUPER) { - return _setPLLDHandheldRefreshRate(new_refreshRate); - } else { - return _setNvDispHandheldRefreshRate(new_refreshRate); - } + if (!g_config.isRetroSUPER) { + return _setPLLDHandheldRefreshRate(new_refreshRate); + } else { + return _setNvDispHandheldRefreshRate(new_refreshRate); + } } else { - if(g_config.isDocked) + if (g_config.isDocked) return _setNvDispDockedRefreshRate(new_refreshRate); - else + else return true; } } return false; } - bool GetRate(uint32_t* out_refreshRate, bool internal) { - if (!out_refreshRate || !g_initialized || !g_config.clkVirtAddr) return false; + bool GetRate(uint32_t *out_refreshRate, bool internal) { + if (!out_refreshRate || !g_initialized || !g_config.clkVirtAddr) + return false; static uint32_t value = 60; if (g_config.isRetroSUPER && !g_config.isDocked) { uint32_t fd = 0; - PLLD_BASE temp = {0}; - PLLD_MISC misc = {0}; - memcpy(&temp, (void*)(g_config.clkVirtAddr + 0xD0), 4); - memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4); - + PLLD_BASE temp = { 0 }; + PLLD_MISC misc = { 0 }; + memcpy(&temp, (void *)(g_config.clkVirtAddr + 0xD0), 4); + memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4); + value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4; - + if (value != 0 && value != 80) { if (!nvOpen(&fd, "/dev/nvdisp-disp0")) { - NvdcMode2 display_b = {0}; + NvdcMode2 display_b = { 0 }; if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; @@ -634,21 +652,21 @@ namespace display { } else { g_wasRetroSuperTurnedOff = true; } - } - else if ((!g_config.isPossiblySpoofedRetro) || (g_config.isPossiblySpoofedRetro && !g_config.isRetroSUPER)) { - PLLD_BASE temp = {0}; - PLLD_MISC misc = {0}; - memcpy(&temp, (void*)(g_config.clkVirtAddr + 0xD0), 4); - memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4); - + } else if ((!g_config.isPossiblySpoofedRetro) || (g_config.isPossiblySpoofedRetro && !g_config.isRetroSUPER)) { + PLLD_BASE temp = { 0 }; + PLLD_MISC misc = { 0 }; + memcpy(&temp, (void *)(g_config.clkVirtAddr + 0xD0), 4); + memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4); + value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4; - + if (value == 0 || value == 80) { // Docked mode - if (g_config.isLite) return false; - + if (g_config.isLite) + return false; + g_config.isDocked = true; - + if (!g_canChangeRefreshRateDocked) { uint32_t fd = 0; if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { @@ -658,19 +676,19 @@ namespace display { uint32_t size; struct { unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char downspread; unsigned char training_pattern; unsigned char lane_pattern[4]; unsigned char unk2[8]; } set; - } dpaux = {6, 0x100, 0x10}; - + } dpaux = { 6, 0x100, 0x10 }; + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); nvClose(fd); - + if (rc == 0) { _getDockedHighestRefreshRate(0); g_canChangeRefreshRateDocked = true; @@ -682,24 +700,24 @@ namespace display { return false; } } - if(internal) { + if (internal) { *out_refreshRate = value; return true; } uint32_t fd = 0; if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { - NvdcMode2 display_b = {0}; + NvdcMode2 display_b = { 0 }; if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { if (!display_b.pclkKHz) { nvClose(fd); return false; } - + if (g_lastVActive != display_b.vActive) { g_lastVActive = display_b.vActive; _getDockedHighestRefreshRate(fd); } - + uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; uint64_t pixelClock = display_b.pclkKHz * 1000 + 999; @@ -711,16 +729,14 @@ namespace display { } else { value = 60; } - } - else if (!g_config.isRetroSUPER) { + } else if (!g_config.isRetroSUPER) { // Handheld mode g_config.isDocked = false; g_canChangeRefreshRateDocked = false; - + uint32_t pixelClock = (9375ULL * ((4096 * ((2 * temp.PLLD_DIVN) + 1)) + misc.PLLD_SDM_DIN)) / (8 * temp.PLLD_DIVM); value = pixelClock / (DSI_CLOCK_HZ / 60); - } - else { + } else { return false; } } @@ -733,4 +749,4 @@ namespace display { g_initialized = false; memset(&g_config, 0, sizeof(g_config)); } -} \ No newline at end of file +} // namespace display \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp index 32e91272..b145abf1 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp @@ -12,14 +12,14 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once -#include #include #include +#include namespace display { typedef struct { uint16_t hFrontPorch; @@ -71,35 +71,35 @@ namespace display { } NvdcModeDB2; typedef struct { - unsigned int PLLD_DIVM: 8; - unsigned int reserved_1: 3; - unsigned int PLLD_DIVN: 8; - unsigned int reserved_2: 1; - unsigned int PLLD_DIVP: 3; - unsigned int CSI_CLK_SRC: 1; - unsigned int reserved_3: 1; - unsigned int PLL_D: 1; - unsigned int reserved_4: 1; - unsigned int PLLD_LOCK: 1; - unsigned int reserved_5: 1; - unsigned int PLLD_REF_DIS: 1; - unsigned int PLLD_ENABLE: 1; - unsigned int PLLD_BYPASS: 1; + unsigned int PLLD_DIVM : 8; + unsigned int reserved_1 : 3; + unsigned int PLLD_DIVN : 8; + unsigned int reserved_2 : 1; + unsigned int PLLD_DIVP : 3; + unsigned int CSI_CLK_SRC : 1; + unsigned int reserved_3 : 1; + unsigned int PLL_D : 1; + unsigned int reserved_4 : 1; + unsigned int PLLD_LOCK : 1; + unsigned int reserved_5 : 1; + unsigned int PLLD_REF_DIS : 1; + unsigned int PLLD_ENABLE : 1; + unsigned int PLLD_BYPASS : 1; } PLLD_BASE; typedef struct { - signed int PLLD_SDM_DIN: 16; - unsigned int PLLD_EN_SDM: 1; - unsigned int PLLD_LOCK_OVERRIDE: 1; - unsigned int PLLD_EN_LCKDET: 1; - unsigned int PLLD_FREQLOCK: 1; - unsigned int PLLD_IDDQ: 1; - unsigned int PLLD_ENABLE_CLK: 1; - unsigned int PLLD_KVCO: 1; - unsigned int PLLD_KCP: 2; - unsigned int PLLD_PTS: 2; - unsigned int PLLD_LDPULSE_ADJ: 3; - unsigned int reserved: 2; + signed int PLLD_SDM_DIN : 16; + unsigned int PLLD_EN_SDM : 1; + unsigned int PLLD_LOCK_OVERRIDE : 1; + unsigned int PLLD_EN_LCKDET : 1; + unsigned int PLLD_FREQLOCK : 1; + unsigned int PLLD_IDDQ : 1; + unsigned int PLLD_ENABLE_CLK : 1; + unsigned int PLLD_KVCO : 1; + unsigned int PLLD_KCP : 2; + unsigned int PLLD_PTS : 2; + unsigned int PLLD_LDPULSE_ADJ : 3; + unsigned int reserved : 2; } PLLD_MISC; typedef struct { @@ -116,12 +116,12 @@ namespace display { bool displaySyncDocked; bool displaySyncDockedOutOfFocus60; } DisplayRefreshConfig; - bool Initialize(const DisplayRefreshConfig* config); + bool Initialize(const DisplayRefreshConfig *config); void SetDockedState(bool isDocked); bool SetRate(uint32_t new_refreshRate); - bool GetRate(uint32_t* out_refreshRate, bool internal); + bool GetRate(uint32_t *out_refreshRate, bool internal); uint8_t GetDockedHighestAllowed(void); void CorrectOledGamma(uint32_t refresh_rate); void SetAllowedDockedRatesIPC(uint32_t refreshRates, bool is720p); void Shutdown(void); -} \ No newline at end of file +} // namespace display \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index caa39989..d911cebb 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -24,29 +24,30 @@ * -------------------------------------------------------------------------- */ -#include "config.hpp" -#include -#include -#include -#include #include +#include #include #include -#include -#include -#include -#include -#include -#include "../hos/apm_ext.h" #include -#include +#include #include +#include +#include +#include +#include #include -#include -#include +#include + #include "../board/board.hpp" +#include "../hos/apm_ext.h" +#include "config.hpp" #include "errors.hpp" #include "file_utils.hpp" +#include +#include +#include +#include +#include namespace config { @@ -57,7 +58,7 @@ namespace config { bool gLoaded = false; std::string gPath; time_t gMtime = 0; - std::atomic_bool gEnabled{false}; + std::atomic_bool gEnabled{ false }; std::uint32_t gOverrideFreqs[HocClkModule_EnumMax]; std::map, std::uint32_t> gProfileMHzMap; std::map gProfileCountMap; @@ -83,11 +84,12 @@ namespace config { return 0; } - std::uint32_t FindClockHzFromProfiles(std::uint64_t tid, HocClkModule module, std::initializer_list profiles, u32 mhzMultiplier = 1000000) { + std::uint32_t FindClockHzFromProfiles(std::uint64_t tid, HocClkModule module, std::initializer_list profiles, + u32 mhzMultiplier = 1000000) { std::uint32_t mhz = 0; if (gLoaded) { - for (auto profile: profiles) { + for (auto profile : profiles) { mhz = FindClockMHz(tid, module, profile); if (mhz) { break; @@ -98,7 +100,7 @@ namespace config { return std::max((std::uint32_t)0, mhz * mhzMultiplier); } - int BrowseIniFunc(const char* section, const char* key, const char* value, void* userdata) { + int BrowseIniFunc(const char *section, const char *key, const char *value, void *userdata) { (void)userdata; std::uint64_t input; if (!strcmp(section, CONFIG_VAL_SECTION)) { @@ -129,14 +131,14 @@ namespace config { HocClkModule parsedModule = HocClkModule_EnumMax; for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { - const char* profileCode = board::GetProfileName((HocClkProfile)profile, false); + const char *profileCode = board::GetProfileName((HocClkProfile)profile, false); size_t profileCodeLen = strlen(profileCode); if (!strncmp(key, profileCode, profileCodeLen) && key[profileCodeLen] == '_') { - const char* subkey = key + profileCodeLen + 1; + const char *subkey = key + profileCodeLen + 1; for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { - const char* moduleCode = board::GetModuleName((HocClkModule)module, false); + const char *moduleCode = board::GetModuleName((HocClkModule)module, false); size_t moduleCodeLen = strlen(moduleCode); if (!strncmp(subkey, moduleCode, moduleCodeLen) && subkey[moduleCodeLen] == '\0') { parsedProfile = (HocClkProfile)profile; @@ -191,7 +193,7 @@ namespace config { gLoaded = true; } - } + } // namespace void Initialize() { gPath = FILE_CONFIG_DIR "/config.ini"; @@ -209,12 +211,12 @@ namespace config { } void Exit() { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; Close(); } bool Refresh() { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; if (!gLoaded || gMtime != CheckModificationTime()) { Load(); return true; @@ -223,30 +225,34 @@ namespace config { } bool HasProfilesLoaded() { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; return gLoaded; } std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw) { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; switch (profile) { case HocClkProfile_Handheld: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_Handheld}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, { HocClkProfile_Handheld }, returnRaw ? 1 : 1000000); case HocClkProfile_HandheldCharging: case HocClkProfile_HandheldChargingUSB: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_HandheldChargingUSB, HocClkProfile_HandheldCharging, HocClkProfile_Handheld}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, + { HocClkProfile_HandheldChargingUSB, HocClkProfile_HandheldCharging, HocClkProfile_Handheld }, + returnRaw ? 1 : 1000000); case HocClkProfile_HandheldChargingOfficial: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_HandheldChargingOfficial, HocClkProfile_HandheldCharging, HocClkProfile_Handheld}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, + { HocClkProfile_HandheldChargingOfficial, HocClkProfile_HandheldCharging, HocClkProfile_Handheld }, + returnRaw ? 1 : 1000000); case HocClkProfile_Docked: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_Docked}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, { HocClkProfile_Docked }, returnRaw ? 1 : 1000000); default: ERROR_THROW("Unhandled HocClkProfile: %u", profile); } return 0; } - void GetProfiles(std::uint64_t tid, HocClkTitleProfileList* out_profiles) { - std::scoped_lock lock{gConfigMutex}; + void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles) { + std::scoped_lock lock{ gConfigMutex }; for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { out_profiles->mhzMap[profile][module] = FindClockMHz(tid, (HocClkModule)module, (HocClkProfile)profile); @@ -254,11 +260,11 @@ namespace config { } } - bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList* profiles, bool immediate) { - std::scoped_lock lock{gConfigMutex}; + bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate) { + std::scoped_lock lock{ gConfigMutex }; uint8_t numProfiles = 0; - char section[17] = {0}; + char section[17] = { 0 }; snprintf(section, sizeof(section), "%016lX", tid); std::vector keys; @@ -266,16 +272,15 @@ namespace config { keys.reserve(+HocClkProfile_EnumMax * +HocClkModule_EnumMax); values.reserve(+HocClkProfile_EnumMax * +HocClkModule_EnumMax); - std::uint32_t* mhz = &profiles->mhz[0]; + std::uint32_t *mhz = &profiles->mhz[0]; for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { if (*mhz) { numProfiles++; - std::string key = std::string(board::GetProfileName((HocClkProfile)profile, false)) + - "_" + - board::GetModuleName((HocClkModule)module, false); + std::string key = + std::string(board::GetProfileName((HocClkProfile)profile, false)) + "_" + board::GetModuleName((HocClkModule)module, false); std::string value = std::to_string(*mhz); keys.push_back(key); @@ -285,8 +290,8 @@ namespace config { } } - std::vector keyPointers; - std::vector valuePointers; + std::vector keyPointers; + std::vector valuePointers; keyPointers.reserve(keys.size() + 1); valuePointers.reserve(values.size() + 1); @@ -337,45 +342,45 @@ namespace config { void SetOverrideHz(HocClkModule module, std::uint32_t hz) { ASSERT_ENUM_VALID(HocClkModule, module); - std::scoped_lock lock{gOverrideMutex}; + std::scoped_lock lock{ gOverrideMutex }; gOverrideFreqs[module] = hz; } std::uint32_t GetOverrideHz(HocClkModule module) { ASSERT_ENUM_VALID(HocClkModule, module); - std::scoped_lock lock{gOverrideMutex}; + std::scoped_lock lock{ gOverrideMutex }; return gOverrideFreqs[module]; } std::uint64_t GetConfigValue(HocClkConfigValue kval) { ASSERT_ENUM_VALID(HocClkConfigValue, kval); - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; return configValues[kval]; } - const char* GetConfigValueName(HocClkConfigValue kval, bool pretty) { + const char *GetConfigValueName(HocClkConfigValue kval, bool pretty) { ASSERT_ENUM_VALID(HocClkConfigValue, kval); return hocclkFormatConfigValue(kval, pretty); } - void GetConfigValues(HocClkConfigValueList* out_configValues) { - std::scoped_lock lock{gConfigMutex}; + void GetConfigValues(HocClkConfigValueList *out_configValues) { + std::scoped_lock lock{ gConfigMutex }; for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { out_configValues->values[kval] = configValues[kval]; } } - bool SetConfigValues(HocClkConfigValueList* configValues, bool immediate) { - std::scoped_lock lock{gConfigMutex}; + bool SetConfigValues(HocClkConfigValueList *configValues, bool immediate) { + std::scoped_lock lock{ gConfigMutex }; - std::vector iniKeys; + std::vector iniKeys; std::vector iniValues; iniKeys.reserve(HocClkConfigValue_EnumMax + 1); iniValues.reserve(HocClkConfigValue_EnumMax); for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { if (!hocclkValidConfigValue((HocClkConfigValue)kval, configValues->values[kval]) || - configValues->values[kval] == hocclkDefaultConfigValue((HocClkConfigValue)kval)) { + configValues->values[kval] == hocclkDefaultConfigValue((HocClkConfigValue)kval)) { continue; } iniValues.push_back(std::to_string(configValues->values[kval])); @@ -384,9 +389,9 @@ namespace config { iniKeys.push_back(NULL); - std::vector valuePointers; + std::vector valuePointers; valuePointers.reserve(iniValues.size() + 1); - for (const auto& val : iniValues) { + for (const auto &val : iniValues) { valuePointers.push_back(val.c_str()); } valuePointers.push_back(NULL); @@ -414,11 +419,11 @@ namespace config { return false; } - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; std::uint64_t defaultValue = hocclkDefaultConfigValue(kval); - std::vector iniKeys; + std::vector iniKeys; std::vector iniValues; iniKeys.reserve(2); iniValues.reserve(1); @@ -427,9 +432,9 @@ namespace config { iniValues.push_back(""); iniKeys.push_back(NULL); - std::vector valuePointers; + std::vector valuePointers; valuePointers.reserve(iniValues.size() + 1); - for (const auto& val : iniValues) { + for (const auto &val : iniValues) { valuePointers.push_back(val.c_str()); } valuePointers.push_back(NULL); @@ -453,9 +458,9 @@ namespace config { return false; } - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; - std::vector iniKeys; + std::vector iniKeys; std::vector iniValues; iniKeys.reserve(2); iniValues.reserve(1); @@ -464,7 +469,7 @@ namespace config { iniValues.push_back(std::to_string(value)); iniKeys.push_back(NULL); - std::vector valuePointers; + std::vector valuePointers; valuePointers.reserve(2); valuePointers.push_back(iniValues[0].c_str()); valuePointers.push_back(NULL); @@ -480,8 +485,8 @@ namespace config { return true; } - void DeleteKey(const char* section, const char* key) { - std::scoped_lock lock{gConfigMutex}; + void DeleteKey(const char *section, const char *key) { + std::scoped_lock lock{ gConfigMutex }; ini_puts(section, key, NULL, gPath.c_str()); } -} +} // namespace config diff --git a/Source/hoc-clk/sysmodule/src/file/config.hpp b/Source/hoc-clk/sysmodule/src/file/config.hpp index bcc50fb3..969fa24b 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.hpp +++ b/Source/hoc-clk/sysmodule/src/file/config.hpp @@ -40,8 +40,8 @@ namespace config { bool HasProfilesLoaded(); std::uint8_t GetProfileCount(std::uint64_t tid); - void GetProfiles(std::uint64_t tid, HocClkTitleProfileList* out_profiles); - bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList* profiles, bool immediate); + void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles); + bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate); std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw); void SetEnabled(bool enabled); @@ -50,13 +50,13 @@ namespace config { std::uint32_t GetOverrideHz(HocClkModule module); std::uint64_t GetConfigValue(HocClkConfigValue val); - const char* GetConfigValueName(HocClkConfigValue val, bool pretty); - void GetConfigValues(HocClkConfigValueList* out_configValues); - bool SetConfigValues(HocClkConfigValueList* configValues, bool immediate); + const char *GetConfigValueName(HocClkConfigValue val, bool pretty); + void GetConfigValues(HocClkConfigValueList *out_configValues); + bool SetConfigValues(HocClkConfigValueList *configValues, bool immediate); bool ResetConfigValue(HocClkConfigValue kval); bool SetConfigValue(HocClkConfigValue kval, std::uint64_t value, bool immediate = true); - void DeleteKey(const char* section, const char* key); - + void DeleteKey(const char *section, const char *key); + extern uint64_t configValues[HocClkConfigValue_EnumMax]; -} +} // namespace config diff --git a/Source/hoc-clk/sysmodule/src/file/errors.cpp b/Source/hoc-clk/sysmodule/src/file/errors.cpp index 7e19444f..14625cdd 100644 --- a/Source/hoc-clk/sysmodule/src/file/errors.cpp +++ b/Source/hoc-clk/sysmodule/src/file/errors.cpp @@ -24,13 +24,14 @@ * -------------------------------------------------------------------------- */ -#include "errors.hpp" -#include "file_utils.hpp" #include #include +#include "errors.hpp" +#include "file_utils.hpp" + namespace errors { - void ThrowException(const char* format, ...) { + void ThrowException(const char *format, ...) { va_list args; va_start(args, format); fileUtils::LogLine(format, args); @@ -38,4 +39,4 @@ namespace errors { diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); // throw std::runtime_error(msg); } -} +} // namespace errors diff --git a/Source/hoc-clk/sysmodule/src/file/errors.hpp b/Source/hoc-clk/sysmodule/src/file/errors.hpp index 8dc5dc27..ff9d5c7b 100644 --- a/Source/hoc-clk/sysmodule/src/file/errors.hpp +++ b/Source/hoc-clk/sysmodule/src/file/errors.hpp @@ -26,14 +26,13 @@ #pragma once -#include #include +#include #define ERROR_THROW(format, ...) errors::ThrowException(format "\n in %s:%u", ##__VA_ARGS__, __FILE__, __LINE__) #define ERROR_RESULT_THROW(rc, format, ...) ERROR_THROW(format "\n RC: [0x%x] %04d-%04d", ##__VA_ARGS__, rc, R_MODULE(rc), R_DESCRIPTION(rc)) -#define ASSERT_RESULT_OK(rc, format, ...) \ - if (R_FAILED(rc)) \ - { \ +#define ASSERT_RESULT_OK(rc, format, ...) \ + if (R_FAILED(rc)) { \ ERROR_RESULT_THROW(rc, "ASSERT_RESULT_OK: " format, ##__VA_ARGS__); \ } #define ASSERT_ENUM_VALID(n, v) \ @@ -43,6 +42,6 @@ namespace errors { - void ThrowException(const char* format, ...); + void ThrowException(const char *format, ...); } diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index d7693016..efa651a4 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -24,12 +24,13 @@ * -------------------------------------------------------------------------- */ -#include "file_utils.hpp" -#include "../hos/apm_ext.h" #include -#include #include +#include #include + +#include "../hos/apm_ext.h" +#include "file_utils.hpp" #include #include @@ -52,7 +53,7 @@ namespace fileUtils { return; } - FILE* file = fopen(FILE_LOG_FLAG_PATH, "r"); + FILE *file = fopen(FILE_LOG_FLAG_PATH, "r"); if (file) { g_log_enabled = true; fclose(file); @@ -63,11 +64,11 @@ namespace fileUtils { g_last_flag_check = now; } - void InitializeThreadFunc(void* args) { + void InitializeThreadFunc(void *args) { Initialize(); } - } + } // namespace bool IsInitialized() { return g_has_initialized; @@ -77,8 +78,8 @@ namespace fileUtils { return g_log_enabled; } - void LogLine(const char* format, ...) { - std::scoped_lock lock{g_log_mutex}; + void LogLine(const char *format, ...) { + std::scoped_lock lock{ g_log_mutex }; va_list args; va_start(args, format); @@ -86,7 +87,7 @@ namespace fileUtils { RefreshFlags(false); if (g_log_enabled) { - FILE* file = fopen(FILE_LOG_FILE_PATH, "a"); + FILE *file = fopen(FILE_LOG_FILE_PATH, "a"); if (file) { timespec now = {}; @@ -102,10 +103,10 @@ namespace fileUtils { va_end(args); } - void WriteContextToCsv(const HocClkContext* context) { - std::scoped_lock lock{g_csv_mutex}; + void WriteContextToCsv(const HocClkContext *context) { + std::scoped_lock lock{ g_csv_mutex }; - FILE* file = fopen(FILE_CONTEXT_CSV_PATH, "a"); + FILE *file = fopen(FILE_CONTEXT_CSV_PATH, "a"); if (file) { // Print header @@ -134,7 +135,8 @@ namespace fileUtils { struct timespec now; clock_gettime(CLOCK_REALTIME, &now); - fprintf(file, "%ld%03ld,%s,%016lx", now.tv_sec, now.tv_nsec / 1000000UL, hocclkFormatProfile(context->profile, false), context->applicationId); + fprintf(file, "%ld%03ld,%s,%016lx", now.tv_sec, now.tv_nsec / 1000000UL, hocclkFormatProfile(context->profile, false), + context->applicationId); for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { fprintf(file, ",%d", context->freqs[module]); @@ -164,7 +166,7 @@ namespace fileUtils { } void InitializeAsync() { - Thread initThread = {0}; + Thread initThread = { 0 }; threadCreate(&initThread, InitializeThreadFunc, NULL, NULL, 0x4000, 0x15, 0); threadStart(&initThread); } @@ -210,4 +212,4 @@ namespace fileUtils { fsExit(); } -} +} // namespace fileUtils diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index d00bd8f5..80460f46 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -26,13 +26,13 @@ #pragma once -#include -#include -#include -#include #include #include #include +#include +#include +#include +#include #define FILE_CONFIG_DIR "/config/" CONFIG_DIR #define FILE_FLAG_CHECK_INTERVAL_NS (10000ULL * 1000000000ULL) @@ -47,7 +47,7 @@ namespace fileUtils { bool IsInitialized(); bool IsLogEnabled(); void InitializeAsync(); - void LogLine(const char* format, ...); - void WriteContextToCsv(const HocClkContext* context); + void LogLine(const char *format, ...); + void WriteContextToCsv(const HocClkContext *context); -} +} // namespace fileUtils diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index e32ba593..785bd2ab 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -15,17 +15,17 @@ * */ -#include "kip.hpp" -#include "../i2c/i2cDrv.h" #include "../board/board.hpp" -#include "file_utils.hpp" +#include "../i2c/i2cDrv.h" #include "../mgr/clock_manager.hpp" +#include "file_utils.hpp" +#include "kip.hpp" + namespace kip { bool kipAvailable = false; - void SetKipData() - { + void SetKipData() { // TODO: figure out if this REALLY causes issues (i doubt it) // if(board::GetSocType() == HocClkSocType_Mariko) { // if(R_FAILED(I2c_BuckConverter_SetMvOut(&I2c_Mariko_DRAM_VDDQ, config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt) / 1000))) { @@ -34,7 +34,7 @@ namespace kip { // } // } CustomizeTable table; - FILE* fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r+b"); + FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r+b"); if (fp == NULL) { notification::writeNotification("Horizon OC\nKip opening failed"); @@ -50,7 +50,7 @@ namespace kip { return; } - u32 custRev = cust_get_cust_rev(&table); + u32 custRev = cust_get_cust_rev(&table); u32 kipVersion = cust_get_kip_version(&table); if (custRev < CUST_REV || kipVersion < KIP_VERSION) { fclose(fp); @@ -135,6 +135,10 @@ namespace kip { table.eristaGpuVoltArray[i] = config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_e_76800 + i)); } + for (size_t i = 0; i < 26; ++i) { + table.marikoSocVoltArray[i] = config::GetConfigValue((HocClkConfigValue) (KipConfigValue_g_soc_volt_1866000 + i)); + } + CUST_WRITE_FIELD_BATCH(&table, t6_tRTW_fine_tune, config::GetConfigValue(KipConfigValue_t6_tRTW_fine_tune)); CUST_WRITE_FIELD_BATCH(&table, t7_tWTR_fine_tune, config::GetConfigValue(KipConfigValue_t7_tWTR_fine_tune)); @@ -149,10 +153,11 @@ namespace kip { HocClkConfigValueList configValues; config::GetConfigValues(&configValues); - configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum + configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum if (config::SetConfigValues(&configValues, true)) { - fileUtils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); + fileUtils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], + configValues.values[KipConfigValue_custRev]); for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); } @@ -164,9 +169,8 @@ namespace kip { // I know this is very hacky, but the config system in the sysmodule doesn't really support writing - void GetKipData() - { - FILE* fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "rb"); + void GetKipData() { + FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "rb"); if (fp == NULL) { notification::writeNotification("Horizon OC\nKip opening failed"); @@ -192,22 +196,23 @@ namespace kip { // return; // } - if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { + if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && + !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { MigrateKipData(cust_get_cust_rev(&table), cust_get_kip_version(&table)); SetKipData(); notification::writeNotification("Horizon OC\nKIP has been updated\nPlease reboot your console"); return; } if (config::GetConfigValue(HocClkConfigValue_IsFirstLoad) == true) { - configValues.values[HocClkConfigValue_IsFirstLoad] = (u64)false; + configValues.values[HocClkConfigValue_IsFirstLoad] = (u64) false; notification::writeNotification("Horizon OC has been installed"); } - configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum + configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum // configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table); - clockManager::gContext.custRev = cust_get_cust_rev(&table); + clockManager::gContext.custRev = cust_get_cust_rev(&table); - u32 custRev = cust_get_cust_rev(&table); + u32 custRev = cust_get_cust_rev(&table); u32 kipVersion = cust_get_kip_version(&table); if (custRev < CUST_REV || kipVersion < KIP_VERSION) { notification::writeNotification("Horizon OC\nOutdated kip detected!\nPlease update Horizon OC"); @@ -223,7 +228,7 @@ namespace kip { clockManager::gContext.kipVersion = kipVersion; configValues.values[KipConfigValue_custRev] = cust_get_cust_rev(&table); - configValues.values[KipConfigValue_KipVersion] = cust_get_kip_version(&table); // Run this after the check so we can do migration process + configValues.values[KipConfigValue_KipVersion] = cust_get_kip_version(&table); // Run this after the check so we can do migration process configValues.values[KipConfigValue_hpMode] = cust_get_hp_mode(&table); configValues.values[KipConfigValue_commonEmcMemVolt] = cust_get_common_emc_volt(&table); @@ -289,12 +294,17 @@ namespace kip { configValues.values[KipConfigValue_g_volt_e_76800 + i] = cust_get_erista_gpu_volt(&table, i); } + for (size_t i = 0; i < 26; ++i) { + configValues.values[KipConfigValue_g_soc_volt_1866000 + i] = cust_get_mariko_soc_volt(&table, i); + } + configValues.values[KipConfigValue_t7_tWTR_fine_tune] = cust_get_tWTR_fine_tune(&table); configValues.values[KipConfigValue_t6_tRTW_fine_tune] = cust_get_tRTW_fine_tune(&table); if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) { if (config::SetConfigValues(&configValues, true)) { - fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); + fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], + configValues.values[KipConfigValue_custRev]); for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); } @@ -312,16 +322,17 @@ namespace kip { HocClkConfigValueList configValues; config::GetConfigValues(&configValues); u32 previousVersion = configValues.values[KipConfigValue_KipVersion]; - if(previousVersion < 240 && version >= 240) { + if (previousVersion < 240 && version >= 240) { // <2.4.0 -> 2.4.0 migration // add marikoGpuBootVolt with default value of 800mV configValues.values[KipConfigValue_marikoGpuBootVolt] = 800; - configValues.values[KipConfigValue_marikoGpuUV] += 2; // Raise UV levels - configValues.values[KipConfigValue_commonGpuVoltOffset] = (u32)(-(s64)(configValues.values[KipConfigValue_commonGpuVoltOffset])); // Migrate GPU Volt Offset + configValues.values[KipConfigValue_marikoGpuUV] += 2; // Raise UV levels + configValues.values[KipConfigValue_commonGpuVoltOffset] = + (u32)(-(s64)(configValues.values[KipConfigValue_commonGpuVoltOffset])); // Migrate GPU Volt Offset // Raise min cpu vmin - if(configValues.values[KipConfigValue_eristaCpuVmin] < 750) { + if (configValues.values[KipConfigValue_eristaCpuVmin] < 750) { configValues.values[KipConfigValue_eristaCpuVmin] = 750; } @@ -332,5 +343,4 @@ namespace kip { } config::SetConfigValues(&configValues, true); } -} - +} // namespace kip diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index a30b0fa7..b7302cb3 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -16,21 +16,23 @@ */ #pragma once -#include -#include -#include +#include +#include #include #include +#include +#include +#include + #include "config.hpp" #include "file_utils.hpp" -#include -#include + namespace kip { extern bool kipAvailable; typedef struct { - u8 cust[4]; + u8 cust[4]; u32 custRev; u32 kipVersion; u32 hpMode; @@ -90,6 +92,7 @@ namespace kip { u32 eristaGpuVoltArray[27]; u32 marikoGpuVoltArray[24]; + s32 marikoSocVoltArray[26]; u32 t6_tRTW_fine_tune; u32 t7_tWTR_fine_tune; @@ -97,24 +100,25 @@ namespace kip { u32 reserved[60]; } CustomizeTable; - #define CUST_MAGIC "CUST" - #define CUST_MAGIC_LEN 4 +#define CUST_MAGIC "CUST" +#define CUST_MAGIC_LEN 4 typedef struct { - FILE* file; + FILE *file; long offset; CustomizeTable cached_table; bool has_cache; } CustHandle; - static inline bool cust_find_offset(FILE* f, long* out_offset) { + static inline bool cust_find_offset(FILE *f, long *out_offset) { u8 buf[512]; long pos = 0; fseek(f, 0, SEEK_SET); while (1) { size_t r = fread(buf, 1, sizeof(buf), f); - if (r < CUST_MAGIC_LEN) break; + if (r < CUST_MAGIC_LEN) + break; for (size_t i = 0; i <= r - CUST_MAGIC_LEN; i++) { if (memcmp(&buf[i], CUST_MAGIC, CUST_MAGIC_LEN) == 0) { @@ -130,23 +134,28 @@ namespace kip { static long cachedCustOffset = -1; - static inline long cust_get_offset(FILE* f) { - if (cachedCustOffset >= 0) return cachedCustOffset; + static inline long cust_get_offset(FILE *f) { + if (cachedCustOffset >= 0) + return cachedCustOffset; long off; - if (!cust_find_offset(f, &off)) return -1; + if (!cust_find_offset(f, &off)) + return -1; cachedCustOffset = off; return off; } - static inline bool cust_read_table_f(FILE* f, CustomizeTable* out) { + static inline bool cust_read_table_f(FILE *f, CustomizeTable *out) { long off = cust_get_offset(f); - if (off < 0) return false; + if (off < 0) + return false; fseek(f, 0, SEEK_END); - if (off + (long)sizeof(CustomizeTable) > ftell(f)) return false; + if (off + (long)sizeof(CustomizeTable) > ftell(f)) + return false; fseek(f, off, SEEK_SET); - if (fread(out, 1, sizeof(CustomizeTable), f) != sizeof(CustomizeTable)) return false; + if (fread(out, 1, sizeof(CustomizeTable), f) != sizeof(CustomizeTable)) + return false; if (memcmp(out->cust, CUST_MAGIC, CUST_MAGIC_LEN) != 0) { cachedCustOffset = -1; @@ -155,12 +164,14 @@ namespace kip { return true; } - static inline bool cust_write_table_f(FILE* f, const CustomizeTable* in) { + static inline bool cust_write_table_f(FILE *f, const CustomizeTable *in) { long off = cust_get_offset(f); - if (off < 0) return false; + if (off < 0) + return false; fseek(f, 0, SEEK_END); - if (off + (long)sizeof(CustomizeTable) > ftell(f)) return false; + if (off + (long)sizeof(CustomizeTable) > ftell(f)) + return false; fseek(f, off, SEEK_SET); bool ok = fwrite(in, 1, sizeof(CustomizeTable), f) == sizeof(CustomizeTable); @@ -168,246 +179,482 @@ namespace kip { return ok; } - static inline bool cust_read_table(const char* path, CustomizeTable* out) { - FILE* f = fopen(path, "rb"); - if (!f) return false; + static inline bool cust_read_table(const char *path, CustomizeTable *out) { + FILE *f = fopen(path, "rb"); + if (!f) + return false; bool ok = cust_read_table_f(f, out); fclose(f); return ok; } - static inline bool cust_write_table(const char* path, const CustomizeTable* in) { - FILE* f = fopen(path, "r+b"); - if (!f) return false; + static inline bool cust_write_table(const char *path, const CustomizeTable *in) { + FILE *f = fopen(path, "r+b"); + if (!f) + return false; bool ok = cust_write_table_f(f, in); fclose(f); return ok; } - static inline bool cust_read_and_cache(const char* path, CustomizeTable* out) { + static inline bool cust_read_and_cache(const char *path, CustomizeTable *out) { return cust_read_table(path, out); } - #define CUST_WRITE_FIELD_BATCH(table, field, val) \ - do { \ - (table)->field = (val); \ - } while (0) +#define CUST_WRITE_FIELD_BATCH(table, field, val) \ + do { \ + (table)->field = (val); \ + } while (0) - #define CUST_WRITE_FIELD(path, field, val) \ - do { \ - CustomizeTable t; \ - if (!cust_read_table(path, &t)) return false; \ - t.field = (val); \ - return cust_write_table(path, &t); \ - } while (0) +#define CUST_WRITE_FIELD(path, field, val) \ + do { \ + CustomizeTable t; \ + if (!cust_read_table(path, &t)) \ + return false; \ + t.field = (val); \ + return cust_write_table(path, &t); \ + } while (0) // static inline bool cust_set_cust_rev(const char* p, u32 v) { CUST_WRITE_FIELD(p, custRev, v); } // static inline bool cust_set_mtc_conf(const char* p, u32 v) { CUST_WRITE_FIELD(p, mtcConf, v); } - static inline bool cust_set_hp_mode(const char* p, u32 v) { CUST_WRITE_FIELD(p, hpMode, v); } + static inline bool cust_set_hp_mode(const char *p, u32 v) { + CUST_WRITE_FIELD(p, hpMode, v); + } - static inline bool cust_set_common_emc_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, commonEmcMemVolt, v); } - static inline bool cust_set_erista_emc_max(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaEmcMaxClock, v); } - static inline bool cust_set_step_mode(const char* p, u32 v) { CUST_WRITE_FIELD(p, stepMode, v); } - static inline bool cust_set_mariko_emc_max(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoEmcMaxClock, v); } - static inline bool cust_set_mariko_emc_vddq(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoEmcVddqVolt, v); } - static inline bool cust_set_emc_dvb_shift(const char* p, u32 v) { CUST_WRITE_FIELD(p, emcDvbShift, v); } + static inline bool cust_set_common_emc_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, commonEmcMemVolt, v); + } + static inline bool cust_set_erista_emc_max(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaEmcMaxClock, v); + } + static inline bool cust_set_step_mode(const char *p, u32 v) { + CUST_WRITE_FIELD(p, stepMode, v); + } + static inline bool cust_set_mariko_emc_max(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoEmcMaxClock, v); + } + static inline bool cust_set_mariko_emc_vddq(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoEmcVddqVolt, v); + } + static inline bool cust_set_emc_dvb_shift(const char *p, u32 v) { + CUST_WRITE_FIELD(p, emcDvbShift, v); + } - static inline bool cust_set_tRCD(const char* p, u32 v) { CUST_WRITE_FIELD(p, t1_tRCD, v); } - static inline bool cust_set_tRP(const char* p, u32 v) { CUST_WRITE_FIELD(p, t2_tRP, v); } - static inline bool cust_set_tRAS(const char* p, u32 v) { CUST_WRITE_FIELD(p, t3_tRAS, v); } - static inline bool cust_set_tRRD(const char* p, u32 v) { CUST_WRITE_FIELD(p, t4_tRRD, v); } - static inline bool cust_set_tRFC(const char* p, u32 v) { CUST_WRITE_FIELD(p, t5_tRFC, v); } - static inline bool cust_set_tRTW(const char* p, u32 v) { CUST_WRITE_FIELD(p, t6_tRTW, v); } - static inline bool cust_set_tWTR(const char* p, u32 v) { CUST_WRITE_FIELD(p, t7_tWTR, v); } - static inline bool cust_set_tREFI(const char* p, u32 v) { CUST_WRITE_FIELD(p, t8_tREFI, v); } - static inline bool cust_set_tRP_cap(const char* p, u32 v) { CUST_WRITE_FIELD(p, t2_tRP_cap, v); } - static inline bool cust_set_timing_emc_tbreak(const char* p, u32 v) { CUST_WRITE_FIELD(p, timingEmcTbreak, v); } - static inline bool cust_set_low_tRTW(const char* p, u32 v) { CUST_WRITE_FIELD(p, low_t6_tRTW, v); } - static inline bool cust_set_low_tWTR(const char* p, u32 v) { CUST_WRITE_FIELD(p, low_t7_tWTR, v); } - static inline bool cust_set_tRTW_fine_tune(const char* p, u32 v) { CUST_WRITE_FIELD(p, t6_tRTW_fine_tune, v); } - static inline bool cust_set_tWTR_fine_tune(const char* p, u32 v) { CUST_WRITE_FIELD(p, t7_tWTR_fine_tune, v); } + static inline bool cust_set_tRCD(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t1_tRCD, v); + } + static inline bool cust_set_tRP(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t2_tRP, v); + } + static inline bool cust_set_tRAS(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t3_tRAS, v); + } + static inline bool cust_set_tRRD(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t4_tRRD, v); + } + static inline bool cust_set_tRFC(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t5_tRFC, v); + } + static inline bool cust_set_tRTW(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t6_tRTW, v); + } + static inline bool cust_set_tWTR(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t7_tWTR, v); + } + static inline bool cust_set_tREFI(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t8_tREFI, v); + } + static inline bool cust_set_tRP_cap(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t2_tRP_cap, v); + } + static inline bool cust_set_timing_emc_tbreak(const char *p, u32 v) { + CUST_WRITE_FIELD(p, timingEmcTbreak, v); + } + static inline bool cust_set_low_tRTW(const char *p, u32 v) { + CUST_WRITE_FIELD(p, low_t6_tRTW, v); + } + static inline bool cust_set_low_tWTR(const char *p, u32 v) { + CUST_WRITE_FIELD(p, low_t7_tWTR, v); + } + static inline bool cust_set_tRTW_fine_tune(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t6_tRTW_fine_tune, v); + } + static inline bool cust_set_tWTR_fine_tune(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t7_tWTR_fine_tune, v); + } - static inline bool cust_set_read_latency_1333(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1333, v); } - static inline bool cust_set_read_latency_1600(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1600, v); } - static inline bool cust_set_read_latency_1866(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1866, v); } - static inline bool cust_set_read_latency_2133(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency2133, v); } + static inline bool cust_set_read_latency_1333(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency1333, v); + } + static inline bool cust_set_read_latency_1600(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency1600, v); + } + static inline bool cust_set_read_latency_1866(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency1866, v); + } + static inline bool cust_set_read_latency_2133(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency2133, v); + } - static inline bool cust_set_write_latency_1333(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1333, v); } - static inline bool cust_set_write_latency_1600(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1600, v); } - static inline bool cust_set_write_latency_1866(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1866, v); } - static inline bool cust_set_write_latency_2133(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency2133, v); } + static inline bool cust_set_write_latency_1333(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency1333, v); + } + static inline bool cust_set_write_latency_1600(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency1600, v); + } + static inline bool cust_set_write_latency_1866(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency1866, v); + } + static inline bool cust_set_write_latency_2133(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency2133, v); + } - static inline bool cust_set_erista_cpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuUV, v); } - static inline bool cust_set_eristaCpuVmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuVmin, v); } - static inline bool cust_set_erista_cpu_max_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuMaxVolt, v); } - static inline bool cust_set_eristaCpuUnlock(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuUnlock, v); } + static inline bool cust_set_erista_cpu_uv(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuUV, v); + } + static inline bool cust_set_eristaCpuVmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuVmin, v); + } + static inline bool cust_set_erista_cpu_max_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuMaxVolt, v); + } + static inline bool cust_set_eristaCpuUnlock(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuUnlock, v); + } - static inline bool cust_set_mariko_cpu_uv_low(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuUVLow, v); } - static inline bool cust_set_mariko_cpu_uv_high(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuUVHigh, v); } - static inline bool cust_set_mariko_cpu_low_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuLowVmin, v); } - static inline bool cust_set_mariko_cpu_high_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuHighVmin, v); } - static inline bool cust_set_mariko_cpu_max_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuMaxVolt, v); } - static inline bool cust_set_erista_cpu_boost(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuBoostClock, v); } - static inline bool cust_set_mariko_cpu_boost(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuBoostClock, v); } + static inline bool cust_set_mariko_cpu_uv_low(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuUVLow, v); + } + static inline bool cust_set_mariko_cpu_uv_high(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuUVHigh, v); + } + static inline bool cust_set_mariko_cpu_low_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuLowVmin, v); + } + static inline bool cust_set_mariko_cpu_high_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuHighVmin, v); + } + static inline bool cust_set_mariko_cpu_max_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuMaxVolt, v); + } + static inline bool cust_set_erista_cpu_boost(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuBoostClock, v); + } + static inline bool cust_set_mariko_cpu_boost(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuBoostClock, v); + } - static inline bool cust_set_erista_gpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuUV, v); } - static inline bool cust_set_erista_gpu_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuVmin, v); } - static inline bool cust_set_mariko_gpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuUV, v); } - static inline bool cust_set_mariko_gpu_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuVmin, v); } - static inline bool cust_set_mariko_gpu_boot_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuBootVolt, v); } - static inline bool cust_set_mariko_gpu_vmax(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuVmax, v); } - static inline bool cust_set_common_gpu_offset(const char* p, u32 v) { CUST_WRITE_FIELD(p, commonGpuVoltOffset, v); } - static inline bool cust_set_marikoCpuMaxClock(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuMaxClock, v); } - static inline bool cust_set_marikoSocVmax(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoSocVmax, v); } + static inline bool cust_set_erista_gpu_uv(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaGpuUV, v); + } + static inline bool cust_set_erista_gpu_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaGpuVmin, v); + } + static inline bool cust_set_mariko_gpu_uv(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuUV, v); + } + static inline bool cust_set_mariko_gpu_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuVmin, v); + } + static inline bool cust_set_mariko_gpu_boot_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuBootVolt, v); + } + static inline bool cust_set_mariko_gpu_vmax(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuVmax, v); + } + static inline bool cust_set_common_gpu_offset(const char *p, u32 v) { + CUST_WRITE_FIELD(p, commonGpuVoltOffset, v); + } + static inline bool cust_set_marikoCpuMaxClock(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuMaxClock, v); + } + static inline bool cust_set_marikoSocVmax(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoSocVmax, v); + } /* GPU VOLT ARRAY HELPERS */ - static inline bool cust_set_erista_gpu_volt(const char* p, int idx, u32 v) { - if (idx < 0 || idx >= 27) return false; + static inline bool cust_set_erista_gpu_volt(const char *p, int idx, u32 v) { + if (idx < 0 || idx >= 27) + return false; CustomizeTable t; - if (!cust_read_table(p, &t)) return false; + if (!cust_read_table(p, &t)) + return false; t.eristaGpuVoltArray[idx] = v; return cust_write_table(p, &t); } - static inline bool cust_set_mariko_gpu_volt(const char* p, int idx, u32 v) { - if (idx < 0 || idx >= 24) return false; + static inline bool cust_set_mariko_gpu_volt(const char *p, int idx, u32 v) { + if (idx < 0 || idx >= 24) + return false; CustomizeTable t; - if (!cust_read_table(p, &t)) return false; + if (!cust_read_table(p, &t)) + return false; t.marikoGpuVoltArray[idx] = v; return cust_write_table(p, &t); } - static inline u32 cust_get_field(const CustomizeTable* t, u32 offset) { - if (!t) return 0; - return *(u32*)((u8*)t + offset); + static inline bool cust_set_mariko_soc_volt(const char *p, int idx, u32 v) { + if (idx < 0 || idx >= 26) { + return false; + } + + CustomizeTable t; + if (!cust_read_table(p, &t)) { + return false; + } + + t.marikoSocVoltArray[idx] = v; + + return cust_write_table(p, &t); } - #define CUST_GET_FIELD(table, field) ((table) ? (table)->field : 0) + static inline u32 cust_get_field(const CustomizeTable *t, u32 offset) { + if (!t) + return 0; + return *(u32 *)((u8 *)t + offset); + } - static inline u32 cust_get_cust_rev(const CustomizeTable* t) { return CUST_GET_FIELD(t, custRev); } - static inline u32 cust_get_kip_version(const CustomizeTable* t) { return CUST_GET_FIELD(t, kipVersion); } +#define CUST_GET_FIELD(table, field) ((table) ? (table)->field : 0) + + static inline u32 cust_get_cust_rev(const CustomizeTable *t) { + return CUST_GET_FIELD(t, custRev); + } + static inline u32 cust_get_kip_version(const CustomizeTable *t) { + return CUST_GET_FIELD(t, kipVersion); + } // static inline u32 cust_get_mtc_conf(const CustomizeTable* t) { return CUST_GET_FIELD(t, mtcConf); } - static inline u32 cust_get_hp_mode(const CustomizeTable* t) { return CUST_GET_FIELD(t, hpMode); } + static inline u32 cust_get_hp_mode(const CustomizeTable *t) { + return CUST_GET_FIELD(t, hpMode); + } - static inline u32 cust_get_common_emc_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, commonEmcMemVolt); } - static inline u32 cust_get_erista_emc_max(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaEmcMaxClock); } - static inline u32 cust_get_step_mode(const CustomizeTable* t) { return CUST_GET_FIELD(t, stepMode); } - static inline u32 cust_get_mariko_emc_max(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoEmcMaxClock); } - static inline u32 cust_get_mariko_emc_vddq(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoEmcVddqVolt); } - static inline u32 cust_get_emc_dvb_shift(const CustomizeTable* t) { return CUST_GET_FIELD(t, emcDvbShift); } + static inline u32 cust_get_common_emc_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, commonEmcMemVolt); + } + static inline u32 cust_get_erista_emc_max(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaEmcMaxClock); + } + static inline u32 cust_get_step_mode(const CustomizeTable *t) { + return CUST_GET_FIELD(t, stepMode); + } + static inline u32 cust_get_mariko_emc_max(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoEmcMaxClock); + } + static inline u32 cust_get_mariko_emc_vddq(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoEmcVddqVolt); + } + static inline u32 cust_get_emc_dvb_shift(const CustomizeTable *t) { + return CUST_GET_FIELD(t, emcDvbShift); + } - static inline u32 cust_get_tRCD(const CustomizeTable* t) { return CUST_GET_FIELD(t, t1_tRCD); } - static inline u32 cust_get_tRP(const CustomizeTable* t) { return CUST_GET_FIELD(t, t2_tRP); } - static inline u32 cust_get_tRAS(const CustomizeTable* t) { return CUST_GET_FIELD(t, t3_tRAS); } - static inline u32 cust_get_tRRD(const CustomizeTable* t) { return CUST_GET_FIELD(t, t4_tRRD); } - static inline u32 cust_get_tRFC(const CustomizeTable* t) { return CUST_GET_FIELD(t, t5_tRFC); } - static inline u32 cust_get_tRTW(const CustomizeTable* t) { return CUST_GET_FIELD(t, t6_tRTW); } - static inline u32 cust_get_tWTR(const CustomizeTable* t) { return CUST_GET_FIELD(t, t7_tWTR); } - static inline u32 cust_get_tREFI(const CustomizeTable* t) { return CUST_GET_FIELD(t, t8_tREFI); } - static inline u32 cust_get_tRP_cap(const CustomizeTable* t) { return CUST_GET_FIELD(t, t2_tRP_cap); } - static inline u32 cust_get_timing_emc_tbreak(const CustomizeTable* t) { return CUST_GET_FIELD(t, timingEmcTbreak); } - static inline u32 cust_get_low_t6_tRTW(const CustomizeTable* t) { return CUST_GET_FIELD(t, low_t6_tRTW); } - static inline u32 cust_get_low_t7_tWTR(const CustomizeTable* t) { return CUST_GET_FIELD(t, low_t7_tWTR); } - static inline u32 cust_get_tRTW_fine_tune(const CustomizeTable* t) { return CUST_GET_FIELD(t, t6_tRTW_fine_tune); } - static inline u32 cust_get_tWTR_fine_tune(const CustomizeTable* t) { return CUST_GET_FIELD(t, t7_tWTR_fine_tune); } + static inline u32 cust_get_tRCD(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t1_tRCD); + } + static inline u32 cust_get_tRP(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t2_tRP); + } + static inline u32 cust_get_tRAS(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t3_tRAS); + } + static inline u32 cust_get_tRRD(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t4_tRRD); + } + static inline u32 cust_get_tRFC(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t5_tRFC); + } + static inline u32 cust_get_tRTW(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t6_tRTW); + } + static inline u32 cust_get_tWTR(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t7_tWTR); + } + static inline u32 cust_get_tREFI(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t8_tREFI); + } + static inline u32 cust_get_tRP_cap(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t2_tRP_cap); + } + static inline u32 cust_get_timing_emc_tbreak(const CustomizeTable *t) { + return CUST_GET_FIELD(t, timingEmcTbreak); + } + static inline u32 cust_get_low_t6_tRTW(const CustomizeTable *t) { + return CUST_GET_FIELD(t, low_t6_tRTW); + } + static inline u32 cust_get_low_t7_tWTR(const CustomizeTable *t) { + return CUST_GET_FIELD(t, low_t7_tWTR); + } + static inline u32 cust_get_tRTW_fine_tune(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t6_tRTW_fine_tune); + } + static inline u32 cust_get_tWTR_fine_tune(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t7_tWTR_fine_tune); + } - static inline u32 cust_get_read_latency_1333(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1333); } - static inline u32 cust_get_read_latency_1600(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1600); } - static inline u32 cust_get_read_latency_1866(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1866); } - static inline u32 cust_get_read_latency_2133(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency2133); } + static inline u32 cust_get_read_latency_1333(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency1333); + } + static inline u32 cust_get_read_latency_1600(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency1600); + } + static inline u32 cust_get_read_latency_1866(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency1866); + } + static inline u32 cust_get_read_latency_2133(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency2133); + } - static inline u32 cust_get_write_latency_1333(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1333); } - static inline u32 cust_get_write_latency_1600(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1600); } - static inline u32 cust_get_write_latency_1866(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1866); } - static inline u32 cust_get_write_latency_2133(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency2133); } + static inline u32 cust_get_write_latency_1333(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency1333); + } + static inline u32 cust_get_write_latency_1600(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency1600); + } + static inline u32 cust_get_write_latency_1866(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency1866); + } + static inline u32 cust_get_write_latency_2133(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency2133); + } - static inline u32 cust_get_erista_cpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuUV); } - static inline u32 cust_get_eristaCpuVmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuVmin); } - static inline u32 cust_get_erista_cpu_max_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuMaxVolt); } - static inline u32 cust_get_eristaCpuUnlock(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuUnlock); } + static inline u32 cust_get_erista_cpu_uv(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuUV); + } + static inline u32 cust_get_eristaCpuVmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuVmin); + } + static inline u32 cust_get_erista_cpu_max_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuMaxVolt); + } + static inline u32 cust_get_eristaCpuUnlock(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuUnlock); + } - static inline u32 cust_get_mariko_cpu_uv_low(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuUVLow); } - static inline u32 cust_get_mariko_cpu_uv_high(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuUVHigh); } - static inline u32 cust_get_mariko_cpu_low_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuLowVmin); } - static inline u32 cust_get_mariko_cpu_high_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuHighVmin); } - static inline u32 cust_get_mariko_cpu_max_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuMaxVolt); } - static inline u32 cust_get_erista_cpu_boost(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuBoostClock); } - static inline u32 cust_get_mariko_cpu_boost(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuBoostClock); } - static inline u32 cust_get_table_conf(const CustomizeTable* t) { return CUST_GET_FIELD(t, tableConf); } + static inline u32 cust_get_mariko_cpu_uv_low(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuUVLow); + } + static inline u32 cust_get_mariko_cpu_uv_high(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuUVHigh); + } + static inline u32 cust_get_mariko_cpu_low_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuLowVmin); + } + static inline u32 cust_get_mariko_cpu_high_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuHighVmin); + } + static inline u32 cust_get_mariko_cpu_max_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuMaxVolt); + } + static inline u32 cust_get_erista_cpu_boost(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuBoostClock); + } + static inline u32 cust_get_mariko_cpu_boost(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuBoostClock); + } + static inline u32 cust_get_table_conf(const CustomizeTable *t) { + return CUST_GET_FIELD(t, tableConf); + } - static inline u32 cust_get_erista_gpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaGpuUV); } - static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaGpuVmin); } - static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuUV); } - static inline u32 cust_get_mariko_gpu_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuVmin); } - static inline u32 cust_get_mariko_gpu_boot_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuBootVolt); } - static inline u32 cust_get_mariko_gpu_vmax(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuVmax); } - static inline u32 cust_get_common_gpu_offset(const CustomizeTable* t) { return CUST_GET_FIELD(t, commonGpuVoltOffset); } - static inline u32 cust_get_marikoCpuMaxClock(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuMaxClock); } - static inline u32 cust_get_marikoSocVmax(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoSocVmax); } + static inline u32 cust_get_erista_gpu_uv(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaGpuUV); + } + static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaGpuVmin); + } + static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuUV); + } + static inline u32 cust_get_mariko_gpu_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuVmin); + } + static inline u32 cust_get_mariko_gpu_boot_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuBootVolt); + } + static inline u32 cust_get_mariko_gpu_vmax(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuVmax); + } + static inline u32 cust_get_common_gpu_offset(const CustomizeTable *t) { + return CUST_GET_FIELD(t, commonGpuVoltOffset); + } + static inline u32 cust_get_marikoCpuMaxClock(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuMaxClock); + } + static inline u32 cust_get_marikoSocVmax(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoSocVmax); + } - static inline u32 cust_get_erista_gpu_volt(const CustomizeTable* t, int idx) { - if (!t || idx < 0 || idx >= 27) return 0; + static inline u32 cust_get_erista_gpu_volt(const CustomizeTable *t, int idx) { + if (!t || idx < 0 || idx >= 27) + return 0; return t->eristaGpuVoltArray[idx]; } - static inline u32 cust_get_mariko_gpu_volt(const CustomizeTable* t, int idx) { - if (!t || idx < 0 || idx >= 24) return 0; + static inline u32 cust_get_mariko_gpu_volt(const CustomizeTable *t, int idx) { + if (!t || idx < 0 || idx >= 24) + return 0; return t->marikoGpuVoltArray[idx]; } - #define DECL_ERISTA_GPU_VOLT_HELPER(freq, idx) \ - static inline bool cust_set_erista_gpu_volt_##freq( \ - const char* p, u32 v) { \ - return cust_set_erista_gpu_volt(p, idx, v); \ + static inline u32 cust_get_mariko_soc_volt(const CustomizeTable *t, int idx) { + if (!t || idx < 0 || idx >= 26) + return 0; + return t->marikoSocVoltArray[idx]; } - #define DECL_MARIKO_GPU_VOLT_HELPER(freq, idx) \ - static inline bool cust_set_mariko_gpu_volt_##freq( \ - const char* p, u32 v) { \ - return cust_set_mariko_gpu_volt(p, idx, v); \ +#define DECL_ERISTA_GPU_VOLT_HELPER(freq, idx) \ + static inline bool cust_set_erista_gpu_volt_##freq(const char *p, u32 v) { \ + return cust_set_erista_gpu_volt(p, idx, v); \ } - DECL_ERISTA_GPU_VOLT_HELPER(76800, 0) - DECL_ERISTA_GPU_VOLT_HELPER(115200, 1) - DECL_ERISTA_GPU_VOLT_HELPER(153600, 2) - DECL_ERISTA_GPU_VOLT_HELPER(192000, 3) - DECL_ERISTA_GPU_VOLT_HELPER(230400, 4) - DECL_ERISTA_GPU_VOLT_HELPER(268800, 5) - DECL_ERISTA_GPU_VOLT_HELPER(307200, 6) - DECL_ERISTA_GPU_VOLT_HELPER(345600, 7) - DECL_ERISTA_GPU_VOLT_HELPER(384000, 8) - DECL_ERISTA_GPU_VOLT_HELPER(422400, 9) - DECL_ERISTA_GPU_VOLT_HELPER(460800, 10) - DECL_ERISTA_GPU_VOLT_HELPER(499200, 11) - DECL_ERISTA_GPU_VOLT_HELPER(537600, 12) - DECL_ERISTA_GPU_VOLT_HELPER(576000, 13) - DECL_ERISTA_GPU_VOLT_HELPER(614400, 14) - DECL_ERISTA_GPU_VOLT_HELPER(652800, 15) - DECL_ERISTA_GPU_VOLT_HELPER(691200, 16) - DECL_ERISTA_GPU_VOLT_HELPER(729600, 17) - DECL_ERISTA_GPU_VOLT_HELPER(768000, 18) - DECL_ERISTA_GPU_VOLT_HELPER(806400, 19) - DECL_ERISTA_GPU_VOLT_HELPER(844800, 20) - DECL_ERISTA_GPU_VOLT_HELPER(883200, 21) - DECL_ERISTA_GPU_VOLT_HELPER(921600, 22) - DECL_ERISTA_GPU_VOLT_HELPER(960000, 23) - DECL_ERISTA_GPU_VOLT_HELPER(998400, 24) +#define DECL_MARIKO_GPU_VOLT_HELPER(freq, idx) \ + static inline bool cust_set_mariko_gpu_volt_##freq(const char *p, u32 v) { \ + return cust_set_mariko_gpu_volt(p, idx, v); \ + } + + #define DECL_MARIKO_SOC_VOLT_HELPER(freq, idx) \ + static inline bool cust_set_mariko_soc_volt_##freq(const char *p, u32 v) { \ + return cust_set_mariko_soc_volt(p, idx, v); \ + } + + DECL_ERISTA_GPU_VOLT_HELPER(76800, 0) + DECL_ERISTA_GPU_VOLT_HELPER(115200, 1) + DECL_ERISTA_GPU_VOLT_HELPER(153600, 2) + DECL_ERISTA_GPU_VOLT_HELPER(192000, 3) + DECL_ERISTA_GPU_VOLT_HELPER(230400, 4) + DECL_ERISTA_GPU_VOLT_HELPER(268800, 5) + DECL_ERISTA_GPU_VOLT_HELPER(307200, 6) + DECL_ERISTA_GPU_VOLT_HELPER(345600, 7) + DECL_ERISTA_GPU_VOLT_HELPER(384000, 8) + DECL_ERISTA_GPU_VOLT_HELPER(422400, 9) + DECL_ERISTA_GPU_VOLT_HELPER(460800, 10) + DECL_ERISTA_GPU_VOLT_HELPER(499200, 11) + DECL_ERISTA_GPU_VOLT_HELPER(537600, 12) + DECL_ERISTA_GPU_VOLT_HELPER(576000, 13) + DECL_ERISTA_GPU_VOLT_HELPER(614400, 14) + DECL_ERISTA_GPU_VOLT_HELPER(652800, 15) + DECL_ERISTA_GPU_VOLT_HELPER(691200, 16) + DECL_ERISTA_GPU_VOLT_HELPER(729600, 17) + DECL_ERISTA_GPU_VOLT_HELPER(768000, 18) + DECL_ERISTA_GPU_VOLT_HELPER(806400, 19) + DECL_ERISTA_GPU_VOLT_HELPER(844800, 20) + DECL_ERISTA_GPU_VOLT_HELPER(883200, 21) + DECL_ERISTA_GPU_VOLT_HELPER(921600, 22) + DECL_ERISTA_GPU_VOLT_HELPER(960000, 23) + DECL_ERISTA_GPU_VOLT_HELPER(998400, 24) DECL_ERISTA_GPU_VOLT_HELPER(1036800, 25) DECL_ERISTA_GPU_VOLT_HELPER(1075200, 26) - DECL_MARIKO_GPU_VOLT_HELPER(76800, 0) - DECL_MARIKO_GPU_VOLT_HELPER(153600, 1) - DECL_MARIKO_GPU_VOLT_HELPER(230400, 2) - DECL_MARIKO_GPU_VOLT_HELPER(307200, 3) - DECL_MARIKO_GPU_VOLT_HELPER(384000, 4) - DECL_MARIKO_GPU_VOLT_HELPER(460800, 5) - DECL_MARIKO_GPU_VOLT_HELPER(537600, 6) - DECL_MARIKO_GPU_VOLT_HELPER(614400, 7) - DECL_MARIKO_GPU_VOLT_HELPER(691200, 8) - DECL_MARIKO_GPU_VOLT_HELPER(768000, 9) - DECL_MARIKO_GPU_VOLT_HELPER(844800, 10) - DECL_MARIKO_GPU_VOLT_HELPER(921600, 11) - DECL_MARIKO_GPU_VOLT_HELPER(998400, 12) + DECL_MARIKO_GPU_VOLT_HELPER(76800, 0) + DECL_MARIKO_GPU_VOLT_HELPER(153600, 1) + DECL_MARIKO_GPU_VOLT_HELPER(230400, 2) + DECL_MARIKO_GPU_VOLT_HELPER(307200, 3) + DECL_MARIKO_GPU_VOLT_HELPER(384000, 4) + DECL_MARIKO_GPU_VOLT_HELPER(460800, 5) + DECL_MARIKO_GPU_VOLT_HELPER(537600, 6) + DECL_MARIKO_GPU_VOLT_HELPER(614400, 7) + DECL_MARIKO_GPU_VOLT_HELPER(691200, 8) + DECL_MARIKO_GPU_VOLT_HELPER(768000, 9) + DECL_MARIKO_GPU_VOLT_HELPER(844800, 10) + DECL_MARIKO_GPU_VOLT_HELPER(921600, 11) + DECL_MARIKO_GPU_VOLT_HELPER(998400, 12) DECL_MARIKO_GPU_VOLT_HELPER(1075200, 13) DECL_MARIKO_GPU_VOLT_HELPER(1152000, 14) DECL_MARIKO_GPU_VOLT_HELPER(1228800, 15) @@ -420,60 +667,97 @@ namespace kip { DECL_MARIKO_GPU_VOLT_HELPER(1497600, 22) DECL_MARIKO_GPU_VOLT_HELPER(1536000, 23) - #define DECL_ERISTA_GPU_VOLT_GET(freq, idx) \ - static inline u32 cust_get_erista_gpu_volt_##freq##_val(const char* p) { \ - CustomizeTable t; \ - if (!cust_read_table(p, &t)) return 0; \ - return cust_get_erista_gpu_volt(&t, idx); \ + DECL_MARIKO_SOC_VOLT_HELPER(1866000, 0) + DECL_MARIKO_SOC_VOLT_HELPER(2000000, 1) + DECL_MARIKO_SOC_VOLT_HELPER(2133000, 2) + DECL_MARIKO_SOC_VOLT_HELPER(2200000, 3) + DECL_MARIKO_SOC_VOLT_HELPER(2266000, 4) + DECL_MARIKO_SOC_VOLT_HELPER(2333000, 5) + DECL_MARIKO_SOC_VOLT_HELPER(2400000, 6) + DECL_MARIKO_SOC_VOLT_HELPER(2433000, 7) + DECL_MARIKO_SOC_VOLT_HELPER(2466000, 8) + DECL_MARIKO_SOC_VOLT_HELPER(2533000, 9) + DECL_MARIKO_SOC_VOLT_HELPER(2566000, 10) + DECL_MARIKO_SOC_VOLT_HELPER(2600000, 11) + DECL_MARIKO_SOC_VOLT_HELPER(2666000, 12) + DECL_MARIKO_SOC_VOLT_HELPER(2700000, 13) + DECL_MARIKO_SOC_VOLT_HELPER(2733000, 14) + DECL_MARIKO_SOC_VOLT_HELPER(2766000, 15) + DECL_MARIKO_SOC_VOLT_HELPER(2800000, 16) + DECL_MARIKO_SOC_VOLT_HELPER(2833000, 17) + DECL_MARIKO_SOC_VOLT_HELPER(2900000, 18) + DECL_MARIKO_SOC_VOLT_HELPER(2933000, 19) + DECL_MARIKO_SOC_VOLT_HELPER(3000000, 20) + DECL_MARIKO_SOC_VOLT_HELPER(3033000, 21) + DECL_MARIKO_SOC_VOLT_HELPER(3100000, 22) + DECL_MARIKO_SOC_VOLT_HELPER(3133000, 23) + DECL_MARIKO_SOC_VOLT_HELPER(3166000, 24) + DECL_MARIKO_SOC_VOLT_HELPER(3200000, 25) + +#define DECL_ERISTA_GPU_VOLT_GET(freq, idx) \ + static inline u32 cust_get_erista_gpu_volt_##freq##_val(const char *p) { \ + CustomizeTable t; \ + if (!cust_read_table(p, &t)) \ + return 0; \ + return cust_get_erista_gpu_volt(&t, idx); \ } - #define DECL_MARIKO_GPU_VOLT_GET(freq, idx) \ - static inline u32 cust_get_mariko_gpu_volt_##freq##_val(const char* p) { \ - CustomizeTable t; \ - if (!cust_read_table(p, &t)) return 0; \ - return cust_get_mariko_gpu_volt(&t, idx); \ +#define DECL_MARIKO_GPU_VOLT_GET(freq, idx) \ + static inline u32 cust_get_mariko_gpu_volt_##freq##_val(const char *p) { \ + CustomizeTable t; \ + if (!cust_read_table(p, &t)) \ + return 0; \ + return cust_get_mariko_gpu_volt(&t, idx); \ } - DECL_ERISTA_GPU_VOLT_GET(76800, 0) - DECL_ERISTA_GPU_VOLT_GET(115200, 1) - DECL_ERISTA_GPU_VOLT_GET(153600, 2) - DECL_ERISTA_GPU_VOLT_GET(192000, 3) - DECL_ERISTA_GPU_VOLT_GET(230400, 4) - DECL_ERISTA_GPU_VOLT_GET(268800, 5) - DECL_ERISTA_GPU_VOLT_GET(307200, 6) - DECL_ERISTA_GPU_VOLT_GET(345600, 7) - DECL_ERISTA_GPU_VOLT_GET(384000, 8) - DECL_ERISTA_GPU_VOLT_GET(422400, 9) - DECL_ERISTA_GPU_VOLT_GET(460800, 10) - DECL_ERISTA_GPU_VOLT_GET(499200, 11) - DECL_ERISTA_GPU_VOLT_GET(537600, 12) - DECL_ERISTA_GPU_VOLT_GET(576000, 13) - DECL_ERISTA_GPU_VOLT_GET(614400, 14) - DECL_ERISTA_GPU_VOLT_GET(652800, 15) - DECL_ERISTA_GPU_VOLT_GET(691200, 16) - DECL_ERISTA_GPU_VOLT_GET(729600, 17) - DECL_ERISTA_GPU_VOLT_GET(768000, 18) - DECL_ERISTA_GPU_VOLT_GET(806400, 19) - DECL_ERISTA_GPU_VOLT_GET(844800, 20) - DECL_ERISTA_GPU_VOLT_GET(883200, 21) - DECL_ERISTA_GPU_VOLT_GET(921600, 22) - DECL_ERISTA_GPU_VOLT_GET(960000, 23) - DECL_ERISTA_GPU_VOLT_GET(998400, 24) + #define DECL_MARIKO_SOC_VOLT_GET(freq, idx) \ + static inline u32 cust_get_mariko_soc_volt_##freq##_val(const char *p) { \ + CustomizeTable t; \ + if (!cust_read_table(p, &t)) \ + return 0; \ + return cust_get_mariko_soc_volt(&t, idx); \ + } + + DECL_ERISTA_GPU_VOLT_GET(76800, 0) + DECL_ERISTA_GPU_VOLT_GET(115200, 1) + DECL_ERISTA_GPU_VOLT_GET(153600, 2) + DECL_ERISTA_GPU_VOLT_GET(192000, 3) + DECL_ERISTA_GPU_VOLT_GET(230400, 4) + DECL_ERISTA_GPU_VOLT_GET(268800, 5) + DECL_ERISTA_GPU_VOLT_GET(307200, 6) + DECL_ERISTA_GPU_VOLT_GET(345600, 7) + DECL_ERISTA_GPU_VOLT_GET(384000, 8) + DECL_ERISTA_GPU_VOLT_GET(422400, 9) + DECL_ERISTA_GPU_VOLT_GET(460800, 10) + DECL_ERISTA_GPU_VOLT_GET(499200, 11) + DECL_ERISTA_GPU_VOLT_GET(537600, 12) + DECL_ERISTA_GPU_VOLT_GET(576000, 13) + DECL_ERISTA_GPU_VOLT_GET(614400, 14) + DECL_ERISTA_GPU_VOLT_GET(652800, 15) + DECL_ERISTA_GPU_VOLT_GET(691200, 16) + DECL_ERISTA_GPU_VOLT_GET(729600, 17) + DECL_ERISTA_GPU_VOLT_GET(768000, 18) + DECL_ERISTA_GPU_VOLT_GET(806400, 19) + DECL_ERISTA_GPU_VOLT_GET(844800, 20) + DECL_ERISTA_GPU_VOLT_GET(883200, 21) + DECL_ERISTA_GPU_VOLT_GET(921600, 22) + DECL_ERISTA_GPU_VOLT_GET(960000, 23) + DECL_ERISTA_GPU_VOLT_GET(998400, 24) DECL_ERISTA_GPU_VOLT_GET(1036800, 25) DECL_ERISTA_GPU_VOLT_GET(1075200, 26) - DECL_MARIKO_GPU_VOLT_GET(76800, 0) - DECL_MARIKO_GPU_VOLT_GET(153600, 1) - DECL_MARIKO_GPU_VOLT_GET(230400, 2) - DECL_MARIKO_GPU_VOLT_GET(307200, 3) - DECL_MARIKO_GPU_VOLT_GET(384000, 4) - DECL_MARIKO_GPU_VOLT_GET(460800, 5) - DECL_MARIKO_GPU_VOLT_GET(537600, 6) - DECL_MARIKO_GPU_VOLT_GET(614400, 7) - DECL_MARIKO_GPU_VOLT_GET(691200, 8) - DECL_MARIKO_GPU_VOLT_GET(768000, 9) - DECL_MARIKO_GPU_VOLT_GET(844800, 10) - DECL_MARIKO_GPU_VOLT_GET(921600, 11) - DECL_MARIKO_GPU_VOLT_GET(998400, 12) + DECL_MARIKO_GPU_VOLT_GET(76800, 0) + DECL_MARIKO_GPU_VOLT_GET(153600, 1) + DECL_MARIKO_GPU_VOLT_GET(230400, 2) + DECL_MARIKO_GPU_VOLT_GET(307200, 3) + DECL_MARIKO_GPU_VOLT_GET(384000, 4) + DECL_MARIKO_GPU_VOLT_GET(460800, 5) + DECL_MARIKO_GPU_VOLT_GET(537600, 6) + DECL_MARIKO_GPU_VOLT_GET(614400, 7) + DECL_MARIKO_GPU_VOLT_GET(691200, 8) + DECL_MARIKO_GPU_VOLT_GET(768000, 9) + DECL_MARIKO_GPU_VOLT_GET(844800, 10) + DECL_MARIKO_GPU_VOLT_GET(921600, 11) + DECL_MARIKO_GPU_VOLT_GET(998400, 12) DECL_MARIKO_GPU_VOLT_GET(1075200, 13) DECL_MARIKO_GPU_VOLT_GET(1152000, 14) DECL_MARIKO_GPU_VOLT_GET(1228800, 15) @@ -485,7 +769,35 @@ namespace kip { DECL_MARIKO_GPU_VOLT_GET(1459200, 21) DECL_MARIKO_GPU_VOLT_GET(1497600, 22) DECL_MARIKO_GPU_VOLT_GET(1536000, 23) + + DECL_MARIKO_SOC_VOLT_GET(1866000, 0) + DECL_MARIKO_SOC_VOLT_GET(2000000, 1) + DECL_MARIKO_SOC_VOLT_GET(2133000, 2) + DECL_MARIKO_SOC_VOLT_GET(2200000, 3) + DECL_MARIKO_SOC_VOLT_GET(2266000, 4) + DECL_MARIKO_SOC_VOLT_GET(2333000, 5) + DECL_MARIKO_SOC_VOLT_GET(2400000, 6) + DECL_MARIKO_SOC_VOLT_GET(2433000, 7) + DECL_MARIKO_SOC_VOLT_GET(2466000, 8) + DECL_MARIKO_SOC_VOLT_GET(2533000, 9) + DECL_MARIKO_SOC_VOLT_GET(2566000, 10) + DECL_MARIKO_SOC_VOLT_GET(2600000, 11) + DECL_MARIKO_SOC_VOLT_GET(2666000, 12) + DECL_MARIKO_SOC_VOLT_GET(2700000, 13) + DECL_MARIKO_SOC_VOLT_GET(2733000, 14) + DECL_MARIKO_SOC_VOLT_GET(2766000, 15) + DECL_MARIKO_SOC_VOLT_GET(2800000, 16) + DECL_MARIKO_SOC_VOLT_GET(2833000, 17) + DECL_MARIKO_SOC_VOLT_GET(2900000, 18) + DECL_MARIKO_SOC_VOLT_GET(2933000, 19) + DECL_MARIKO_SOC_VOLT_GET(3000000, 20) + DECL_MARIKO_SOC_VOLT_GET(3033000, 21) + DECL_MARIKO_SOC_VOLT_GET(3100000, 22) + DECL_MARIKO_SOC_VOLT_GET(3133000, 23) + DECL_MARIKO_SOC_VOLT_GET(3166000, 24) + DECL_MARIKO_SOC_VOLT_GET(3200000, 25) + void MigrateKipData(u32 custRev, u32 version); void SetKipData(); void GetKipData(); -} \ No newline at end of file +} // namespace kip \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/apm_ext.c b/Source/hoc-clk/sysmodule/src/hos/apm_ext.c index 1448cfde..98dde745 100644 --- a/Source/hoc-clk/sysmodule/src/hos/apm_ext.c +++ b/Source/hoc-clk/sysmodule/src/hos/apm_ext.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,60 +24,50 @@ * -------------------------------------------------------------------------- */ +#include #include "apm_ext.h" -#include - static Service g_apmSrv; static Service g_apmSysSrv; static atomic_size_t g_refCnt; -Result apmExtInitialize(void) -{ +Result apmExtInitialize(void) { g_refCnt++; - if (serviceIsActive(&g_apmSrv)) - { + if (serviceIsActive(&g_apmSrv)) { return 0; } Result rc = 0; rc = smGetService(&g_apmSrv, "apm"); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = smGetService(&g_apmSysSrv, "apm:sys"); } - if (R_FAILED(rc)) - { + if (R_FAILED(rc)) { apmExtExit(); } return rc; } -void apmExtExit(void) -{ - if (--g_refCnt == 0) - { +void apmExtExit(void) { + if (--g_refCnt == 0) { serviceClose(&g_apmSrv); serviceClose(&g_apmSysSrv); } } -Result apmExtGetPerformanceMode(u32* out_mode) -{ +Result apmExtGetPerformanceMode(u32 *out_mode) { return serviceDispatchOut(&g_apmSrv, 1, *out_mode); } -Result apmExtSysRequestPerformanceMode(u32 mode) -{ +Result apmExtSysRequestPerformanceMode(u32 mode) { return serviceDispatchIn(&g_apmSysSrv, 0, mode); } -Result apmExtGetCurrentPerformanceConfiguration(u32* out_conf) -{ +Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf) { return serviceDispatchOut(&g_apmSysSrv, 7, *out_conf); } diff --git a/Source/hoc-clk/sysmodule/src/hos/apm_ext.h b/Source/hoc-clk/sysmodule/src/hos/apm_ext.h index e032fb35..292fd072 100644 --- a/Source/hoc-clk/sysmodule/src/hos/apm_ext.h +++ b/Source/hoc-clk/sysmodule/src/hos/apm_ext.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include @@ -37,19 +35,19 @@ extern "C" Result apmExtInitialize(void); void apmExtExit(void); -Result apmExtGetPerformanceMode(u32* out_mode); +Result apmExtGetPerformanceMode(u32 *out_mode); Result apmExtSysRequestPerformanceMode(u32 mode); -Result apmExtGetCurrentPerformanceConfiguration(u32* out_conf); +Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf); Result apmExtSysRequestPerformanceMode(u32 mode); Result apmExtSysSetCpuBoostMode(u32 mode); Result apmExtGetPerformanceMode(u32 *out_mode); Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf); -inline bool apmExtIsCPUBoosted(u32 conf_id) { // CPU boosted to 1785 MHz +inline bool apmExtIsCPUBoosted(u32 conf_id) { // CPU boosted to 1785 MHz return (conf_id == 0x92220009 || conf_id == 0x9222000A); }; -inline bool apmExtIsBoostMode(u32 conf_id) { // GPU throttled to 76.8 MHz +inline bool apmExtIsBoostMode(u32 conf_id) { // GPU throttled to 76.8 MHz return (conf_id >= 0x92220009 && conf_id <= 0x9222000C); }; diff --git a/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c b/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c index 69d961f5..a5112dd8 100644 --- a/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c +++ b/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,26 +24,24 @@ * -------------------------------------------------------------------------- */ - #include HocClkApmConfiguration hocclk_g_apm_configurations[] = { - {0x00010000, 1020000000, 384000000, 1600000000}, - {0x00010001, 1020000000, 768000000, 1600000000}, - {0x00010002, 1224000000, 691200000, 1600000000}, - {0x00020000, 1020000000, 230400000, 1600000000}, - {0x00020001, 1020000000, 307200000, 1600000000}, - {0x00020002, 1224000000, 230400000, 1600000000}, - {0x00020003, 1020000000, 307200000, 1331200000}, - {0x00020004, 1020000000, 384000000, 1331200000}, - {0x00020005, 1020000000, 307200000, 1065600000}, - {0x00020006, 1020000000, 384000000, 1065600000}, - {0x92220007, 1020000000, 460800000, 1600000000}, - {0x92220008, 1020000000, 460800000, 1331200000}, - {0x92220009, 1785000000, 76800000, 1600000000}, - {0x9222000A, 1785000000, 76800000, 1331200000}, - {0x9222000B, 1020000000, 76800000, 1600000000}, - {0x9222000C, 1020000000, 76800000, 1331200000}, - {0, 0, 0, 0}, + { 0x00010000, 1020000000, 384000000, 1600000000 }, + { 0x00010001, 1020000000, 768000000, 1600000000 }, + { 0x00010002, 1224000000, 691200000, 1600000000 }, + { 0x00020000, 1020000000, 230400000, 1600000000 }, + { 0x00020001, 1020000000, 307200000, 1600000000 }, + { 0x00020002, 1224000000, 230400000, 1600000000 }, + { 0x00020003, 1020000000, 307200000, 1331200000 }, + { 0x00020004, 1020000000, 384000000, 1331200000 }, + { 0x00020005, 1020000000, 307200000, 1065600000 }, + { 0x00020006, 1020000000, 384000000, 1065600000 }, + { 0x92220007, 1020000000, 460800000, 1600000000 }, + { 0x92220008, 1020000000, 460800000, 1331200000 }, + { 0x92220009, 1785000000, 76800000, 1600000000 }, + { 0x9222000A, 1785000000, 76800000, 1331200000 }, + { 0x9222000B, 1020000000, 76800000, 1600000000 }, + { 0x9222000C, 1020000000, 76800000, 1331200000 }, + { 0, 0, 0, 0 }, }; - diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index 6707d9ee..88dade23 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -15,16 +15,17 @@ * */ -#include "integrations.hpp" -#include #include + +#include "integrations.hpp" #include "process_management.hpp" +#include namespace integrations { namespace { - NxFpsSharedBlock* gNxFps = nullptr; + NxFpsSharedBlock *gNxFps = nullptr; SharedMemory gSharedMemory = {}; bool gSharedMemoryUsed = false; Handle gRemoteSharedMemory = 1; @@ -38,7 +39,8 @@ namespace integrations { svcCloseHandle(saltysd); break; } - if (i == 66) return false; + if (i == 66) + return false; svcSleepThread(1'000'000); } @@ -56,7 +58,7 @@ namespace integrations { void SearchSharedMemoryBlock(uintptr_t base) { ptrdiff_t search_offset = 0; while (search_offset < 0x1000) { - gNxFps = (NxFpsSharedBlock*)(base + search_offset); + gNxFps = (NxFpsSharedBlock *)(base + search_offset); if (gNxFps->MAGIC == 0x465053) return; search_offset += 4; @@ -74,21 +76,21 @@ namespace integrations { gSharedMemoryUsed = true; } - } + } // namespace bool GetSysDockState() { - struct stat st = {0}; + struct stat st = { 0 }; return stat("sdmc:/atmosphere/contents/42000000000000A0/flags/boot2.flag", &st) == 0; } bool GetSaltyNXState() { - struct stat st = {0}; + struct stat st = { 0 }; return stat("sdmc:/atmosphere/contents/0000000000534C56/flags/boot2.flag", &st) == 0; } bool GetRETROSuperStatus() { - struct stat st = {0}; - return stat("sdmc:/config/horizon-oc/retro.flag", &st) == 0; // TODO: unhardcode this + struct stat st = { 0 }; + return stat("sdmc:/config/horizon-oc/retro.flag", &st) == 0; // TODO: unhardcode this } void LoadSaltyNX() { @@ -143,13 +145,15 @@ namespace integrations { resolutionLookup = 1; return 0; } else if (resolutionLookup == 1) { - if (gNxFps->renderCalls[0].calls != 0xFFFF) resolutionLookup = 2; - else return 0; + if (gNxFps->renderCalls[0].calls != 0xFFFF) + resolutionLookup = 2; + else + return 0; } - + return gNxFps->renderCalls[0].height == 0 ? gNxFps->viewportCalls[0].height : gNxFps->renderCalls[0].height; } return 0; } -} +} // namespace integrations diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp index 143a5b4c..fe5a8c0f 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp @@ -17,8 +17,8 @@ #pragma once -#include #include +#include namespace integrations { @@ -39,9 +39,9 @@ namespace integrations { uint8_t SetActiveBuffers; union { struct { - bool handheld: 1; - bool docked: 1; - unsigned int reserved: 6; + bool handheld : 1; + bool docked : 1; + unsigned int reserved : 6; } NX_PACKED ds; uint8_t general; } displaySync; @@ -66,4 +66,4 @@ namespace integrations { u8 GetSaltyNXFPS(); u16 GetSaltyNXResolutionHeight(); -} +} // namespace integrations diff --git a/Source/hoc-clk/sysmodule/src/hos/notification.cpp b/Source/hoc-clk/sysmodule/src/hos/notification.cpp index f6ff1c38..c5a4f5f0 100644 --- a/Source/hoc-clk/sysmodule/src/hos/notification.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/notification.cpp @@ -15,14 +15,13 @@ * */ - #include "notification.h" namespace notification { - void writeNotification(const std::string& message) { - static const char* flagPath = "sdmc:/config/ultrahand/flags/NOTIFICATIONS.flag"; + void writeNotification(const std::string &message) { + static const char *flagPath = "sdmc:/config/ultrahand/flags/NOTIFICATIONS.flag"; - FILE* flagFile = fopen(flagPath, "r"); + FILE *flagFile = fopen(flagPath, "r"); if (!flagFile) { return; } @@ -31,7 +30,7 @@ namespace notification { std::string filename = "hoc-" + std::to_string(std::time(nullptr)) + ".notify"; std::string fullPath = "sdmc:/config/ultrahand/notifications/" + filename; - FILE* file = fopen(fullPath.c_str(), "w"); + FILE *file = fopen(fullPath.c_str(), "w"); if (file) { fprintf(file, "{\n"); fprintf(file, " \"text\": \"%s\",\n", message.c_str()); @@ -40,4 +39,4 @@ namespace notification { fclose(file); } } -} +} // namespace notification diff --git a/Source/hoc-clk/sysmodule/src/hos/notification.h b/Source/hoc-clk/sysmodule/src/hos/notification.h index 3f1b1558..105d1512 100644 --- a/Source/hoc-clk/sysmodule/src/hos/notification.h +++ b/Source/hoc-clk/sysmodule/src/hos/notification.h @@ -12,14 +12,14 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once -#include -#include #include +#include +#include namespace notification { - void writeNotification(const std::string& message); + void writeNotification(const std::string &message); } diff --git a/Source/hoc-clk/sysmodule/src/hos/pcv_types.h b/Source/hoc-clk/sysmodule/src/hos/pcv_types.h index 03899f35..057240df 100644 --- a/Source/hoc-clk/sysmodule/src/hos/pcv_types.h +++ b/Source/hoc-clk/sysmodule/src/hos/pcv_types.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -26,24 +26,23 @@ */ /* -* Switch Power domains (max77620): -* Name | Usage | uV step | uV min | uV default | uV max | Init -*-------+---------------+---------+--------+------------+---------+------------------ -* sd0 | SoC | 12500 | 600000 | 625000 | 1400000 | 1.125V (pkg1.1) -* sd1 | SDRAM | 12500 | 600000 | 1125000 | 1125000 | 1.1V (pkg1.1) -* sd2 | ldo{0-1, 7-8} | 12500 | 600000 | 1325000 | 1350000 | 1.325V (pcv) -* sd3 | 1.8V general | 12500 | 600000 | 1800000 | 1800000 | -* ldo0 | Display Panel | 25000 | 800000 | 1200000 | 1200000 | 1.2V (pkg1.1) -* ldo1 | XUSB, PCIE | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) -* ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 | -* ldo3 | GC ASIC | 50000 | 800000 | 3100000 | 3100000 | 3.1V (pcv) -* ldo4 | RTC | 12500 | 800000 | 850000 | 850000 | 0.85V (AO, pcv) -* ldo5 | GC Card | 50000 | 800000 | 1800000 | 1800000 | 1.8V (pcv) -* ldo6 | Touch, ALS | 50000 | 800000 | 2900000 | 2900000 | 2.9V (pcv) -* ldo7 | XUSB | 50000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) -* ldo8 | XUSB, DP, MCU | 50000 | 800000 | 1050000 | 2800000 | 1.05V/2.8V (pcv) -*/ - + * Switch Power domains (max77620): + * Name | Usage | uV step | uV min | uV default | uV max | Init + *-------+---------------+---------+--------+------------+---------+------------------ + * sd0 | SoC | 12500 | 600000 | 625000 | 1400000 | 1.125V (pkg1.1) + * sd1 | SDRAM | 12500 | 600000 | 1125000 | 1125000 | 1.1V (pkg1.1) + * sd2 | ldo{0-1, 7-8} | 12500 | 600000 | 1325000 | 1350000 | 1.325V (pcv) + * sd3 | 1.8V general | 12500 | 600000 | 1800000 | 1800000 | + * ldo0 | Display Panel | 25000 | 800000 | 1200000 | 1200000 | 1.2V (pkg1.1) + * ldo1 | XUSB, PCIE | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) + * ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 | + * ldo3 | GC ASIC | 50000 | 800000 | 3100000 | 3100000 | 3.1V (pcv) + * ldo4 | RTC | 12500 | 800000 | 850000 | 850000 | 0.85V (AO, pcv) + * ldo5 | GC Card | 50000 | 800000 | 1800000 | 1800000 | 1.8V (pcv) + * ldo6 | Touch, ALS | 50000 | 800000 | 2900000 | 2900000 | 2.9V (pcv) + * ldo7 | XUSB | 50000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) + * ldo8 | XUSB, DP, MCU | 50000 | 800000 | 1050000 | 2800000 | 1.05V/2.8V (pcv) + */ // GPIOs T210: 3: 3.3V, 5: CPU PMIC, 6: GPU PMIC, 7: DSI/VI 1.2V powered by ldo0. @@ -66,15 +65,15 @@ */ /* -* MAX77620_AME_GPIO: control GPIO modes (bits 0 - 7 correspond to GPIO0 - GPIO7); 0 -> GPIO, 1 -> alt-mode -* MAX77620_REG_GPIOx: 0x9 sets output and enable -*/ + * MAX77620_AME_GPIO: control GPIO modes (bits 0 - 7 correspond to GPIO0 - GPIO7); 0 -> GPIO, 1 -> alt-mode + * MAX77620_REG_GPIOx: 0x9 sets output and enable + */ typedef enum { - PcvPowerDomain_Max77620_Sd0 = 0, - PcvPowerDomain_Max77620_Sd1 = 1, - PcvPowerDomain_Max77620_Sd2 = 2, - PcvPowerDomain_Max77620_Sd3 = 3, + PcvPowerDomain_Max77620_Sd0 = 0, + PcvPowerDomain_Max77620_Sd1 = 1, + PcvPowerDomain_Max77620_Sd2 = 2, + PcvPowerDomain_Max77620_Sd3 = 3, PcvPowerDomain_Max77620_Ldo0 = 4, PcvPowerDomain_Max77620_Ldo1 = 5, PcvPowerDomain_Max77620_Ldo2 = 6, @@ -84,18 +83,18 @@ typedef enum { PcvPowerDomain_Max77620_Ldo6 = 10, PcvPowerDomain_Max77620_Ldo7 = 11, PcvPowerDomain_Max77620_Ldo8 = 12, - PcvPowerDomain_Max77621_Cpu = 13, - PcvPowerDomain_Max77621_Gpu = 14, - PcvPowerDomain_Max77812_Cpu = 15, - PcvPowerDomain_Max77812_Gpu = 16, + PcvPowerDomain_Max77621_Cpu = 13, + PcvPowerDomain_Max77621_Gpu = 14, + PcvPowerDomain_Max77812_Cpu = 15, + PcvPowerDomain_Max77812_Gpu = 16, PcvPowerDomain_Max77812_Dram = 17, } PowerDomain; typedef enum { - PcvPowerDomainId_Max77620_Sd0 = 0x3A000080, - PcvPowerDomainId_Max77620_Sd1 = 0x3A000081, // vdd2 - PcvPowerDomainId_Max77620_Sd2 = 0x3A000082, - PcvPowerDomainId_Max77620_Sd3 = 0x3A000083, + PcvPowerDomainId_Max77620_Sd0 = 0x3A000080, + PcvPowerDomainId_Max77620_Sd1 = 0x3A000081, // vdd2 + PcvPowerDomainId_Max77620_Sd2 = 0x3A000082, + PcvPowerDomainId_Max77620_Sd3 = 0x3A000083, PcvPowerDomainId_Max77620_Ldo0 = 0x3A0000A0, PcvPowerDomainId_Max77620_Ldo1 = 0x3A0000A1, PcvPowerDomainId_Max77620_Ldo2 = 0x3A0000A2, @@ -105,9 +104,9 @@ typedef enum { PcvPowerDomainId_Max77620_Ldo6 = 0x3A0000A6, PcvPowerDomainId_Max77620_Ldo7 = 0x3A0000A7, PcvPowerDomainId_Max77620_Ldo8 = 0x3A0000A8, - PcvPowerDomainId_Max77621_Cpu = 0x3A000003, - PcvPowerDomainId_Max77621_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Cpu = 0x3A000003, - PcvPowerDomainId_Max77812_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq + PcvPowerDomainId_Max77621_Cpu = 0x3A000003, + PcvPowerDomainId_Max77621_Gpu = 0x3A000004, + PcvPowerDomainId_Max77812_Cpu = 0x3A000003, + PcvPowerDomainId_Max77812_Gpu = 0x3A000004, + PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq } PowerDomainId; \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp index d3bbb8ab..1c2869fd 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp @@ -24,19 +24,20 @@ * -------------------------------------------------------------------------- */ - -#include "process_management.hpp" -#include "../file/file_utils.hpp" -#include "../file/errors.hpp" #include +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" +#include "process_management.hpp" + + namespace processManagement { namespace { - constexpr u64 Qlaunch = 0x0100000000001000ULL; + constexpr u64 Qlaunch = 0x0100000000001000ULL; constexpr u32 IsQlaunch = 0x20f; Service pdmqryClone; - } + } // namespace void Initialize() { Result rc = 0; @@ -50,11 +51,10 @@ namespace processManagement { rc = pdmqryInitialize(); ASSERT_RESULT_OK(rc, "pdmqryInitialize"); - Service* pdmqrySrv = pdmqryGetServiceSession(); + Service *pdmqrySrv = pdmqryGetServiceSession(); serviceClone(pdmqrySrv, &pdmqryClone); serviceClose(pdmqrySrv); memcpy(pdmqrySrv, &pdmqryClone, sizeof(Service)); - } void WaitForQLaunch() { @@ -62,12 +62,12 @@ namespace processManagement { u64 pid = 0; do { rc = pmdmntGetProcessId(&pid, Qlaunch); - svcSleepThread(50 * 1000000ULL); // 50ms + svcSleepThread(50 * 1000000ULL); // 50ms } while (R_FAILED(rc)); } // Ty to Masa for this function! - Result isApplicationOutOfFocus(bool* outOfFocus) { + Result isApplicationOutOfFocus(bool *outOfFocus) { static s32 last_total_entries = 0; static bool isOutOfFocus = false; s32 total_entries = 0; @@ -77,12 +77,15 @@ namespace processManagement { u64 PIDnow; Result rc = pmdmntGetApplicationProcessId(&PIDnow); - if(R_FAILED(rc)) return rc; + if (R_FAILED(rc)) + return rc; rc = pmdmntGetProgramId(&TIDnow, PIDnow); - if(R_FAILED(rc)) return rc; + if (R_FAILED(rc)) + return rc; rc = pdmqryGetAvailablePlayEventRange(&total_entries, &start_entry_index, &end_entry_index); - if (R_FAILED(rc)) return rc; + if (R_FAILED(rc)) + return rc; if (total_entries == last_total_entries) { *outOfFocus = isOutOfFocus; return 0; @@ -92,13 +95,16 @@ namespace processManagement { PdmPlayEvent events[16]; s32 out = 0; s32 start_entry = end_entry_index - 15; - if (start_entry < 0) start_entry = 0; + if (start_entry < 0) + start_entry = 0; rc = pdmqryQueryPlayEvent(start_entry, events, sizeof(events) / sizeof(events[0]), &out); - if (R_FAILED(rc)) return rc; - if (out == 0) return 1; + if (R_FAILED(rc)) + return rc; + if (out == 0) + return 1; int itr = -1; - for (int i = out-1; i >= 0; i--) { + for (int i = out - 1; i >= 0; i--) { if (events[i].play_event_type != PdmPlayEventType_Applet) continue; if (events[i].event_data.applet.applet_id != AppletId_application) @@ -112,8 +118,6 @@ namespace processManagement { TID.parts.part[0] = events[i].event_data.applet.program_id[1]; TID.parts.part[1] = events[i].event_data.applet.program_id[0]; - - if (TID.full != (TIDnow & ~0xFFF)) continue; else { @@ -121,9 +125,11 @@ namespace processManagement { break; } } - if (itr == -1) return 1; + if (itr == -1) + return 1; - bool isOut = events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus || events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus4; + bool isOut = events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus || + events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus4; *outOfFocus = isOut; isOutOfFocus = isOut; return 0; @@ -158,4 +164,4 @@ namespace processManagement { pdmqryExit(); } -} +} // namespace processManagement diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.hpp b/Source/hoc-clk/sysmodule/src/hos/process_management.hpp index f7660076..6714e067 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.hpp @@ -24,7 +24,6 @@ * -------------------------------------------------------------------------- */ - #pragma once #include @@ -33,7 +32,7 @@ namespace processManagement { void Initialize(); void WaitForQLaunch(); u64 GetCurrentApplicationId(); - Result isApplicationOutOfFocus(bool* outOfFocus); + Result isApplicationOutOfFocus(bool *outOfFocus); void Exit(); -} +} // namespace processManagement diff --git a/Source/hoc-clk/sysmodule/src/hos/psm_ext.c b/Source/hoc-clk/sysmodule/src/hos/psm_ext.c index e21faf05..7e389ab3 100644 --- a/Source/hoc-clk/sysmodule/src/hos/psm_ext.c +++ b/Source/hoc-clk/sysmodule/src/hos/psm_ext.c @@ -12,44 +12,55 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + #include "psm_ext.h" -const char* PsmPowerRoleToStr(PsmPowerRole role) { +const char *PsmPowerRoleToStr(PsmPowerRole role) { switch (role) { - case PsmPowerRole_Sink: return "Sink"; - case PsmPowerRole_Source: return "Source"; - default: return "Unknown"; + case PsmPowerRole_Sink: + return "Sink"; + case PsmPowerRole_Source: + return "Source"; + default: + return "Unknown"; } } -const char* PsmInfoChargerTypeToStr(PsmInfoChargerType type) { +const char *PsmInfoChargerTypeToStr(PsmInfoChargerType type) { switch (type) { - case PsmInfoChargerType_None: return "None"; - case PsmInfoChargerType_PD: return "USB-C PD"; + case PsmInfoChargerType_None: + return "None"; + case PsmInfoChargerType_PD: + return "USB-C PD"; case PsmInfoChargerType_TypeC_1500mA: - case PsmInfoChargerType_TypeC_3000mA: return "USB-C"; - case PsmInfoChargerType_DCP: return "USB DCP"; - case PsmInfoChargerType_CDP: return "USB CDP"; - case PsmInfoChargerType_SDP: return "USB SDP"; + case PsmInfoChargerType_TypeC_3000mA: + return "USB-C"; + case PsmInfoChargerType_DCP: + return "USB DCP"; + case PsmInfoChargerType_CDP: + return "USB CDP"; + case PsmInfoChargerType_SDP: + return "USB SDP"; case PsmInfoChargerType_Apple_500mA: case PsmInfoChargerType_Apple_1000mA: - case PsmInfoChargerType_Apple_2000mA: return "Apple"; - default: return "Unknown"; + case PsmInfoChargerType_Apple_2000mA: + return "Apple"; + default: + return "Unknown"; } } -bool PsmIsChargerConnected(const PsmChargeInfo* info) { +bool PsmIsChargerConnected(const PsmChargeInfo *info) { return info->ChargerType != PsmInfoChargerType_None; } -bool PsmIsCharging(const PsmChargeInfo* info) { +bool PsmIsCharging(const PsmChargeInfo *info) { return PsmIsChargerConnected(info) && ((info->unk_x14 >> 8) & 1); } -PsmBatteryState PsmGetBatteryState(const PsmChargeInfo* info) { +PsmBatteryState PsmGetBatteryState(const PsmChargeInfo *info) { if (!PsmIsChargerConnected(info)) return PsmBatteryState_Discharging; if (!PsmIsCharging(info)) @@ -57,11 +68,15 @@ PsmBatteryState PsmGetBatteryState(const PsmChargeInfo* info) { return PsmBatteryState_FastCharging; } -const char* PsmGetBatteryStateIcon(const PsmChargeInfo* info) { +const char *PsmGetBatteryStateIcon(const PsmChargeInfo *info) { switch (PsmGetBatteryState(info)) { - case PsmBatteryState_Discharging: return "\u25c0"; // ◀ - case PsmBatteryState_ChargingPaused:return "| |"; - case PsmBatteryState_FastCharging: return "\u25b6"; // ▶ - default: return "?"; + case PsmBatteryState_Discharging: + return "\u25c0"; // ◀ + case PsmBatteryState_ChargingPaused: + return "| |"; + case PsmBatteryState_FastCharging: + return "\u25b6"; // ▶ + default: + return "?"; } } diff --git a/Source/hoc-clk/sysmodule/src/hos/psm_ext.h b/Source/hoc-clk/sysmodule/src/hos/psm_ext.h index 8ba88c8a..7f9f914a 100644 --- a/Source/hoc-clk/sysmodule/src/hos/psm_ext.h +++ b/Source/hoc-clk/sysmodule/src/hos/psm_ext.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -20,75 +20,68 @@ #include typedef enum { - PsmPDC_NewPDO = 1, //Received new Power Data Object - PsmPDC_NoPD = 2, //No Power Delivery source is detected - PsmPDC_AcceptedRDO = 3 //Received and accepted Request Data Object -} PsmChargeInfoPDC; //BM92T series + PsmPDC_NewPDO = 1, // Received new Power Data Object + PsmPDC_NoPD = 2, // No Power Delivery source is detected + PsmPDC_AcceptedRDO = 3 // Received and accepted Request Data Object +} PsmChargeInfoPDC; // BM92T series + +typedef enum { PsmPowerRole_Sink = 1, PsmPowerRole_Source = 2 } PsmPowerRole; + +const char *PsmPowerRoleToStr(PsmPowerRole role); typedef enum { - PsmPowerRole_Sink = 1, - PsmPowerRole_Source = 2 -} PsmPowerRole; - -const char* PsmPowerRoleToStr(PsmPowerRole role); - -typedef enum { - PsmInfoChargerType_None = 0, - PsmInfoChargerType_PD = 1, + PsmInfoChargerType_None = 0, + PsmInfoChargerType_PD = 1, PsmInfoChargerType_TypeC_1500mA = 2, PsmInfoChargerType_TypeC_3000mA = 3, - PsmInfoChargerType_DCP = 4, - PsmInfoChargerType_CDP = 5, - PsmInfoChargerType_SDP = 6, - PsmInfoChargerType_Apple_500mA = 7, + PsmInfoChargerType_DCP = 4, + PsmInfoChargerType_CDP = 5, + PsmInfoChargerType_SDP = 6, + PsmInfoChargerType_Apple_500mA = 7, PsmInfoChargerType_Apple_1000mA = 8, PsmInfoChargerType_Apple_2000mA = 9 } PsmInfoChargerType; -const char* PsmInfoChargerTypeToStr(PsmInfoChargerType type); +const char *PsmInfoChargerTypeToStr(PsmInfoChargerType type); typedef enum { - PsmFlags_NoHub = BIT(0), //If hub is disconnected - PsmFlags_Rail = BIT(8), //At least one Joy-con is charging from rail - PsmFlags_SPDSRC = BIT(12), //OTG - PsmFlags_ACC = BIT(16) //Accessory + PsmFlags_NoHub = BIT(0), // If hub is disconnected + PsmFlags_Rail = BIT(8), // At least one Joy-con is charging from rail + PsmFlags_SPDSRC = BIT(12), // OTG + PsmFlags_ACC = BIT(16) // Accessory } PsmChargeInfoFlags; typedef struct { - int32_t InputCurrentLimit; //Input (Sink) current limit in mA - int32_t VBUSCurrentLimit; //Output (Source/VBUS/OTG) current limit in mA - int32_t ChargeCurrentLimit; //Battery charging current limit in mA (512mA when Docked, 768mA when BatteryTemperature < 17.0 C) - int32_t ChargeVoltageLimit; //Battery charging voltage limit in mV (3952mV when BatteryTemperature >= 51.0 C) - int32_t unk_x10; //Possibly an emum, getting the same value as PowerRole in all tested cases - int32_t unk_x14; //Possibly flags - PsmChargeInfoPDC PDCState; //Power Delivery Controller State - int32_t BatteryTemperature; //Battery temperature in milli C - int32_t RawBatteryCharge; //Raw battery charged capacity per cent-mille (i.e. 100% = 100000 pcm) - int32_t VoltageAvg; //Voltage avg in mV (more in Notes) - int32_t BatteryAge; //Battery age (capacity full / capacity design) per cent-mille (i.e. 100% = 100000 pcm) + int32_t InputCurrentLimit; // Input (Sink) current limit in mA + int32_t VBUSCurrentLimit; // Output (Source/VBUS/OTG) current limit in mA + int32_t ChargeCurrentLimit; // Battery charging current limit in mA (512mA when Docked, 768mA when BatteryTemperature < 17.0 C) + int32_t ChargeVoltageLimit; // Battery charging voltage limit in mV (3952mV when BatteryTemperature >= 51.0 C) + int32_t unk_x10; // Possibly an emum, getting the same value as PowerRole in all tested cases + int32_t unk_x14; // Possibly flags + PsmChargeInfoPDC PDCState; // Power Delivery Controller State + int32_t BatteryTemperature; // Battery temperature in milli C + int32_t RawBatteryCharge; // Raw battery charged capacity per cent-mille (i.e. 100% = 100000 pcm) + int32_t VoltageAvg; // Voltage avg in mV (more in Notes) + int32_t BatteryAge; // Battery age (capacity full / capacity design) per cent-mille (i.e. 100% = 100000 pcm) PsmPowerRole PowerRole; PsmInfoChargerType ChargerType; - int32_t ChargerVoltageLimit; //Charger and external device voltage limit in mV - int32_t ChargerCurrentLimit; //Charger and external device current limit in mA - PsmChargeInfoFlags Flags; //Unknown flags + int32_t ChargerVoltageLimit; // Charger and external device voltage limit in mV + int32_t ChargerCurrentLimit; // Charger and external device current limit in mA + PsmChargeInfoFlags Flags; // Unknown flags } PsmChargeInfo; typedef enum { - Psm_EnableBatteryCharging = 2, - Psm_DisableBatteryCharging = 3, - Psm_EnableFastBatteryCharging = 10, - Psm_DisableFastBatteryCharging = 11, - Psm_GetBatteryChargeInfoFields = 17, + Psm_EnableBatteryCharging = 2, + Psm_DisableBatteryCharging = 3, + Psm_EnableFastBatteryCharging = 10, + Psm_DisableFastBatteryCharging = 11, + Psm_GetBatteryChargeInfoFields = 17, } IPsmServerCmd; -bool PsmIsChargerConnected(const PsmChargeInfo* info); -bool PsmIsCharging(const PsmChargeInfo* info); +bool PsmIsChargerConnected(const PsmChargeInfo *info); +bool PsmIsCharging(const PsmChargeInfo *info); -typedef enum { - PsmBatteryState_Discharging, - PsmBatteryState_ChargingPaused, - PsmBatteryState_FastCharging -} PsmBatteryState; +typedef enum { PsmBatteryState_Discharging, PsmBatteryState_ChargingPaused, PsmBatteryState_FastCharging } PsmBatteryState; -PsmBatteryState PsmGetBatteryState(const PsmChargeInfo* info); -const char* PsmGetBatteryStateIcon(const PsmChargeInfo* info); \ No newline at end of file +PsmBatteryState PsmGetBatteryState(const PsmChargeInfo *info); +const char *PsmGetBatteryStateIcon(const PsmChargeInfo *info); \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/pwm.c b/Source/hoc-clk/sysmodule/src/hos/pwm.c index 09c14268..fcc533fe 100644 --- a/Source/hoc-clk/sysmodule/src/hos/pwm.c +++ b/Source/hoc-clk/sysmodule/src/hos/pwm.c @@ -12,11 +12,12 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #define NX_SERVICE_ASSUME_NON_DOMAIN #include + #include "../util/service_guard.h" #include "pwm.h" @@ -32,18 +33,15 @@ void _pwmCleanup(void) { serviceClose(&g_pwmSrv); } -Service* pwmGetServiceSession(void) { +Service *pwmGetServiceSession(void) { return &g_pwmSrv; } Result pwmOpenSession2(PwmChannelSession *out, u32 device_code) { - return serviceDispatchIn(&g_pwmSrv, 2, device_code, - .out_num_objects = 1, - .out_objects = &out->s, - ); + return serviceDispatchIn(&g_pwmSrv, 2, device_code, .out_num_objects = 1, .out_objects = &out->s, ); } -Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out) { +Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double *out) { return serviceDispatchOut(&c->s, 7, *out); } diff --git a/Source/hoc-clk/sysmodule/src/hos/pwm.h b/Source/hoc-clk/sysmodule/src/hos/pwm.h index ccc24e02..f58c5755 100644 --- a/Source/hoc-clk/sysmodule/src/hos/pwm.h +++ b/Source/hoc-clk/sysmodule/src/hos/pwm.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -29,11 +29,11 @@ typedef struct { Result pwmInitialize(void); void pwmExit(void); -Service* pwmGetServiceSession(void); +Service *pwmGetServiceSession(void); Result pwmOpenSession2(PwmChannelSession *out, u32 device_code); -Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out); +Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double *out); void pwmChannelSessionClose(PwmChannelSession *c); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr.h b/Source/hoc-clk/sysmodule/src/hos/rgltr.h index 33268b8a..26150fdf 100644 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr.h +++ b/Source/hoc-clk/sysmodule/src/hos/rgltr.h @@ -12,13 +12,15 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include + #include "pcv_types.h" + typedef struct { Service s; } RgltrSession; @@ -27,12 +29,12 @@ Result rgltrInitialize(void); void rgltrExit(void); -Service* rgltrGetServiceSession(void); +Service *rgltrGetServiceSession(void); -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); -void rgltrCloseSession(RgltrSession* session); -Result rgltrGetVoltage(RgltrSession* session, u32 *out_volt); +Result rgltrOpenSession(RgltrSession *session_out, PowerDomainId module_id); +void rgltrCloseSession(RgltrSession *session); +Result rgltrGetVoltage(RgltrSession *session, u32 *out_volt); Result rgltrGetPowerModuleNumLimit(u32 *out); -Result rgltrGetVoltageEnabled(RgltrSession* session, u32 *out); -Result rgltrRequestVoltage(RgltrSession* session, u32 microvolt); -Result rgltrCancelVoltageRequest(RgltrSession* session); \ No newline at end of file +Result rgltrGetVoltageEnabled(RgltrSession *session, u32 *out); +Result rgltrRequestVoltage(RgltrSession *session, u32 microvolt); +Result rgltrCancelVoltageRequest(RgltrSession *session); \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp index 4904df88..d583f739 100644 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp @@ -12,13 +12,15 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include + #include "rgltr.h" #include "rgltr_services.h" // for extern Service g_rgltrSrv, etc. + // Global service handle Service g_rgltrSrv; @@ -33,18 +35,12 @@ void rgltrExit(void) { serviceClose(&g_rgltrSrv); } -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id) { +Result rgltrOpenSession(RgltrSession *session_out, PowerDomainId module_id) { const u32 in = (u32)module_id; - return serviceDispatchIn( - &g_rgltrSrv, - 0, - in, - .out_num_objects = 1, - .out_objects = &session_out->s - ); + return serviceDispatchIn(&g_rgltrSrv, 0, in, .out_num_objects = 1, .out_objects = &session_out->s); } -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt) { +Result rgltrGetVoltage(RgltrSession *session, u32 *out_volt) { u32 temp = 0; Result rc = serviceDispatchOut(&session->s, 4, temp); if (R_SUCCEEDED(rc)) { @@ -53,14 +49,14 @@ Result rgltrGetVoltage(RgltrSession* session, u32* out_volt) { return rc; } -Result rgltrRequestVoltage(RgltrSession* session, u32 microvolt) { +Result rgltrRequestVoltage(RgltrSession *session, u32 microvolt) { return serviceDispatchIn(&session->s, 5, microvolt); } -Result rgltrCancelVoltageRequest(RgltrSession* session) { +Result rgltrCancelVoltageRequest(RgltrSession *session) { return serviceDispatch(&session->s, 6); } -void rgltrCloseSession(RgltrSession* session) { +void rgltrCloseSession(RgltrSession *session) { serviceClose(&session->s); } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h index d8a886bf..c1a5cd29 100644 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h +++ b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h @@ -12,21 +12,23 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include // for Service, Result, hosversionBefore(), smGetService(), serviceClose(), etc. -#include "rgltr.h" // for RgltrSession, PowerDomainId, etc. + +#include "rgltr.h" // for RgltrSession, PowerDomainId, etc. + extern Service g_rgltrSrv; Result rgltrInitialize(void); -void rgltrExit(void); +void rgltrExit(void); -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); +Result rgltrOpenSession(RgltrSession *session_out, PowerDomainId module_id); -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt); +Result rgltrGetVoltage(RgltrSession *session, u32 *out_volt); -void rgltrCloseSession(RgltrSession* session); \ No newline at end of file +void rgltrCloseSession(RgltrSession *session); \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.c b/Source/hoc-clk/sysmodule/src/i2c/i2c.c index 61d090b7..cfdeb177 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.c +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,22 +24,15 @@ * -------------------------------------------------------------------------- */ - #include "i2c.h" #define I2C_CMD_SND 0 #define I2C_CMD_RCV 1 -Result i2csessionExtRegReceive(I2cSession* s, u8 in, void* out, u8 out_size) -{ - u8 cmdlist[5] = { - I2C_CMD_SND | (I2cTransactionOption_Start << 6), - sizeof(in), - in, +Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size) { + u8 cmdlist[5] = { I2C_CMD_SND | (I2cTransactionOption_Start << 6), sizeof(in), in, - I2C_CMD_RCV | (I2cTransactionOption_All << 6), - out_size - }; + I2C_CMD_RCV | (I2cTransactionOption_All << 6), out_size }; return i2csessionExecuteCommandList(s, out, out_size, cmdlist, sizeof(cmdlist)); } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.h b/Source/hoc-clk/sysmodule/src/i2c/i2c.h index c3dbe340..91a099de 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,17 +24,15 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include -Result i2csessionExtRegReceive(I2cSession* s, u8 in, void* out, u8 out_size); +Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size); #ifdef __cplusplus } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp index 1b72ad99..93222148 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include "i2cDrv.h" @@ -37,8 +37,12 @@ Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { } Result I2cRead_OutU8(I2cDevice dev, u8 reg, u8 *out) { - struct { u8 reg; } __attribute__((packed)) cmd; - struct { u8 val; } __attribute__((packed)) rec; + struct { + u8 reg; + } __attribute__((packed)) cmd; + struct { + u8 val; + } __attribute__((packed)) rec; I2cSession _session; Result res = i2cOpenSession(&_session, dev); @@ -63,8 +67,12 @@ Result I2cRead_OutU8(I2cDevice dev, u8 reg, u8 *out) { } Result I2cRead_OutU16(I2cDevice dev, u8 reg, u16 *out) { - struct { u8 reg; } __attribute__((packed)) cmd; - struct { u16 val; } __attribute__((packed)) rec; + struct { + u8 reg; + } __attribute__((packed)) cmd; + struct { + u16 val; + } __attribute__((packed)) rec; I2cSession _session; Result res = i2cOpenSession(&_session, dev); @@ -94,20 +102,20 @@ float I2c_Max17050_GetBatteryCurrent() { if (res) return 0.f; - const float SenseResistor = 5.; // in uOhm - const float CGain = 1.99993; + const float SenseResistor = 5.; // in uOhm + const float CGain = 1.99993; return (s16)val * (1.5625 / (SenseResistor * CGain)); } -u32 I2c_BuckConverter_MultiplierToMvOut(const I2c_BuckConverter_Domain* domain, u8 multiplier) { +u32 I2c_BuckConverter_MultiplierToMvOut(const I2c_BuckConverter_Domain *domain, u8 multiplier) { return (domain->uv_min + domain->uv_step * multiplier) / 1000; } -u32 I2c_BuckConverter_MultiplierToUvOut(const I2c_BuckConverter_Domain* domain, u8 multiplier) { +u32 I2c_BuckConverter_MultiplierToUvOut(const I2c_BuckConverter_Domain *domain, u8 multiplier) { return domain->uv_min + domain->uv_step * multiplier; } -u8 I2c_BuckConverter_MvOutToMultiplier(const I2c_BuckConverter_Domain* domain, u32 mvolt) { +u8 I2c_BuckConverter_MvOutToMultiplier(const I2c_BuckConverter_Domain *domain, u32 mvolt) { u32 uvolt = mvolt * 1000; if (uvolt < domain->uv_min) uvolt = domain->uv_min; @@ -117,7 +125,7 @@ u8 I2c_BuckConverter_MvOutToMultiplier(const I2c_BuckConverter_Domain* domain, u return (uvolt - domain->uv_min) / domain->uv_step; } -u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain) { +u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain *domain) { u8 val; // Retry 5 times if received POR value for (int i = 0; i < 5; i++) { @@ -133,7 +141,7 @@ u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain) { return I2c_BuckConverter_MultiplierToMvOut(domain, val & domain->volt_mask); } -u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain) { +u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain *domain) { u8 val; // Retry 5 times if received POR value for (int i = 0; i < 5; i++) { @@ -149,7 +157,7 @@ u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain) { return I2c_BuckConverter_MultiplierToUvOut(domain, val & domain->volt_mask); } -Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain* domain, u32 mvolt) { +Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain *domain, u32 mvolt) { u8 val; Result res = I2cRead_OutU8(domain->device, domain->reg, &val); if (R_FAILED(res)) @@ -179,7 +187,7 @@ u8 I2c_Bq24193_Convert_mA_Raw(u32 ma) { // Adjustment is required u8 raw = 0; - if (ma > MA_RANGE_MAX) // capping + if (ma > MA_RANGE_MAX) // capping ma = MA_RANGE_MAX; bool pct20 = ma <= (MA_RANGE_MIN - 64); @@ -188,8 +196,8 @@ u8 I2c_Bq24193_Convert_mA_Raw(u32 ma) { raw |= 0x1; } - ma -= ma % 100; // round to 100 - ma -= (MA_RANGE_MIN - 64); // ceiling + ma -= ma % 100; // round to 100 + ma -= (MA_RANGE_MIN - 64); // ceiling raw |= (ma >> 6) << 2; return raw; @@ -219,4 +227,78 @@ Result I2c_Bq24193_GetFastChargeCurrentLimit(u32 *ma) { Result I2c_Bq24193_SetFastChargeCurrentLimit(u32 ma) { u8 raw = I2c_Bq24193_Convert_mA_Raw(ma); return I2cSet_U8(I2cDevice_Bq24193, BQ24193_CHARGE_CURRENT_CONTROL_REG, raw); -} \ No newline at end of file +} + +// Converts mA to the raw value for bits [2:0] of REG00 +static u8 I2c_Bq24193_Convert_InputmA_Raw(u32 ma) { + if (ma <= 100) + return 0b000; + if (ma <= 150) + return 0b001; + if (ma <= 500) + return 0b010; + if (ma <= 900) + return 0b011; + if (ma <= 1200) + return 0b100; + if (ma <= 1500) + return 0b101; + if (ma <= 2000) + return 0b110; + return 0b111; // 3000mA max +} + +Result I2c_Bq24193_SetInputCurrentLimit(u32 ma) { + // don't do anything if it's disabled + if (ma == 0) + return 0; + + u8 raw; + Result res = I2cRead_OutU8(I2cDevice_Bq24193, BQ24193_INPUT_SOURCE_CONTROL_REG, &raw); + if (R_FAILED(res)) + return res; + + raw &= ~0x07; + raw |= I2c_Bq24193_Convert_InputmA_Raw(ma); + + return I2cSet_U8(I2cDevice_Bq24193, BQ24193_INPUT_SOURCE_CONTROL_REG, raw); +} + +// not used +Result I2c_Bq24193_GetInputCurrentLimit(u32 *ma) { + u8 raw; + Result res = I2cRead_OutU8(I2cDevice_Bq24193, BQ24193_INPUT_SOURCE_CONTROL_REG, &raw); + if (R_FAILED(res)) + return res; + + switch (raw & 0x07) { + case 0b000: + *ma = 100; + break; + case 0b001: + *ma = 150; + break; + case 0b010: + *ma = 500; + break; + case 0b011: + *ma = 900; + break; + case 0b100: + *ma = 1200; + break; + case 0b101: + *ma = 1500; + break; + case 0b110: + *ma = 2000; + break; + case 0b111: + *ma = 3000; + break; + default: + *ma = 0; + break; + } + return 0; +} diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h index 161306fe..3f561045 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h @@ -22,12 +22,12 @@ const u8 MAX17050_CURRENT_REG = 0x0A; // Buck Converter typedef enum I2c_BuckConverter_Reg { I2c_Max77620_SD0VOLT_REG = 0x16, - I2c_Max77620_SD1VOLT_REG = 0x17, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 - I2c_Max77620_LDO0VOLT_REG = 0x23, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 - I2c_Max77621_VOLT_REG = 0x00, + I2c_Max77620_SD1VOLT_REG = 0x17, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 + I2c_Max77620_LDO0VOLT_REG = 0x23, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 + I2c_Max77621_VOLT_REG = 0x00, I2c_Max77812_CPUVOLT_REG = 0x26, I2c_Max77812_GPUVOLT_REG = 0x23, - I2c_Max77812_MEMVOLT_REG = 0x25, // Master 3 (GPU 1 + 2, DRAM 3, CPU 4), used for Mariko VDDQ + I2c_Max77812_MEMVOLT_REG = 0x25, // Master 3 (GPU 1 + 2, DRAM 3, CPU 4), used for Mariko VDDQ } I2c_BuckConverter_Reg; typedef struct I2c_BuckConverter_Domain { @@ -40,22 +40,32 @@ typedef struct I2c_BuckConverter_Domain { u8 por_val; } I2c_BuckConverter_Domain; -const I2c_BuckConverter_Domain I2c_SOC = { I2cDevice_Max77620Pmic, I2c_Max77620_SD0VOLT_REG, 0x7F, 12500, 600000, 1400000, }; -const I2c_BuckConverter_Domain I2c_VDD2 = { I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x7F, 12500, 600000, 1350000, }; -const I2c_BuckConverter_Domain I2c_Display = { I2cDevice_Max77620Pmic, I2c_Max77620_LDO0VOLT_REG, 0x3F, 25000, 800000, 1325000, }; -const I2c_BuckConverter_Domain I2c_Erista_CPU = { I2cDevice_Max77621Cpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, }; -const I2c_BuckConverter_Domain I2c_Erista_GPU = { I2cDevice_Max77621Gpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, }; -const I2c_BuckConverter_Domain I2c_Mariko_CPU = { I2cDevice_Max77812_2, I2c_Max77812_CPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; -const I2c_BuckConverter_Domain I2c_Mariko_GPU = { I2cDevice_Max77812_2, I2c_Max77812_GPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; -const I2c_BuckConverter_Domain I2c_Mariko_DRAM_VDDQ = { I2cDevice_Max77812_2, I2c_Max77812_MEMVOLT_REG, 0xFF, 5000, 250000, 700000, 0x78 }; +const I2c_BuckConverter_Domain I2c_SOC = { + I2cDevice_Max77620Pmic, I2c_Max77620_SD0VOLT_REG, 0x7F, 12500, 600000, 1400000, +}; +const I2c_BuckConverter_Domain I2c_VDD2 = { + I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x7F, 12500, 600000, 1350000, +}; +const I2c_BuckConverter_Domain I2c_Display = { + I2cDevice_Max77620Pmic, I2c_Max77620_LDO0VOLT_REG, 0x3F, 25000, 800000, 1325000, +}; +const I2c_BuckConverter_Domain I2c_Erista_CPU = { + I2cDevice_Max77621Cpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, +}; +const I2c_BuckConverter_Domain I2c_Erista_GPU = { + I2cDevice_Max77621Gpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, +}; +const I2c_BuckConverter_Domain I2c_Mariko_CPU = { I2cDevice_Max77812_2, I2c_Max77812_CPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; +const I2c_BuckConverter_Domain I2c_Mariko_GPU = { I2cDevice_Max77812_2, I2c_Max77812_GPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; +const I2c_BuckConverter_Domain I2c_Mariko_DRAM_VDDQ = { I2cDevice_Max77812_2, I2c_Max77812_MEMVOLT_REG, 0xFF, 5000, 250000, 700000, 0x78 }; -u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain); -u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain); -Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain* domain, u32 mvolt); +u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain *domain); +u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain *domain); +Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain *domain, u32 mvolt); // Bq24193 Battery management u32 I2c_Bq24193_Convert_Raw_mA(u8 raw); -u8 I2c_Bq24193_Convert_mA_Raw(u32 ma); +u8 I2c_Bq24193_Convert_mA_Raw(u32 ma); Result I2c_Bq24193_GetFastChargeCurrentLimit(u32 *ma); Result I2c_Bq24193_SetFastChargeCurrentLimit(u32 ma); @@ -63,4 +73,9 @@ Result I2c_Bq24193_SetFastChargeCurrentLimit(u32 ma); const u32 MA_RANGE_MIN = 512; const u32 MA_RANGE_MAX = 4544; -const u8 BQ24193_CHARGE_CURRENT_CONTROL_REG = 0x2; \ No newline at end of file +const u8 BQ24193_CHARGE_CURRENT_CONTROL_REG = 0x2; + +Result I2c_Bq24193_SetInputCurrentLimit(u32 ma); +Result I2c_Bq24193_GetInputCurrentLimit(u32 *ma); + +const u8 BQ24193_INPUT_SOURCE_CONTROL_REG = 0x00; \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.c b/Source/hoc-clk/sysmodule/src/i2c/max17050.c index cecca39c..8f82c14c 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max17050.c +++ b/Source/hoc-clk/sysmodule/src/i2c/max17050.c @@ -22,15 +22,15 @@ * */ -#include "max17050.h" #include "i2c.h" +#include "max17050.h" #define MAX17050_WAIT_NS 1000000000UL -#define MAX17050_VCELL 0x09 -#define MAX17050_Current 0x0A +#define MAX17050_VCELL 0x09 +#define MAX17050_Current 0x0A #define MAX17050_AvgCurrent 0x0B -#define MAX17050_AvgVCELL 0x19 +#define MAX17050_AvgVCELL 0x19 #define MAX17050_BOARD_CGAIN 2 #define MAX17050_BOARD_SNS_RESISTOR_UOHM 5000 @@ -40,15 +40,13 @@ static u64 g_update_ticks = 0; static s32 g_power_now = 0; static s32 g_power_avg = 0; -static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) -{ +static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) { s64 ma, mv; - u16 values[3] = {0}; + u16 values[3] = { 0 }; Result rc = i2csessionExtRegReceive(&g_i2c_session, MAX17050_VCELL, values, sizeof(values)); - if (R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { ma = (s16)values[1]; ma = ma * 1562500 / (MAX17050_BOARD_SNS_RESISTOR_UOHM * MAX17050_BOARD_CGAIN); @@ -57,13 +55,11 @@ static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) *out_mw_now = ma * mv / 1000000; } - if (R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = i2csessionExtRegReceive(&g_i2c_session, MAX17050_AvgVCELL, values, sizeof(u16)); } - if (R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { ma = (s16)values[2]; ma = ma * 1562500 / (MAX17050_BOARD_SNS_RESISTOR_UOHM * MAX17050_BOARD_CGAIN); @@ -75,50 +71,42 @@ static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) return rc; } -static void _max17050_update() -{ +static void _max17050_update() { u64 ticks = armGetSystemTick(); - if(armTicksToNs(ticks - g_update_ticks) <= MAX17050_WAIT_NS) - { + if (armTicksToNs(ticks - g_update_ticks) <= MAX17050_WAIT_NS) { return; } g_update_ticks = ticks; - if(!serviceIsActive(&g_i2c_session.s)) - { + if (!serviceIsActive(&g_i2c_session.s)) { return; } _max17050_get_power(&g_power_now, &g_power_avg); } -Result max17050Initialize(void) -{ +Result max17050Initialize(void) { Result rc = i2cInitialize(); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = i2cOpenSession(&g_i2c_session, I2cDevice_Max17050); } return rc; } -void max17050Exit(void) -{ +void max17050Exit(void) { i2csessionClose(&g_i2c_session); i2cExit(); } -s32 max17050PowerNow(void) -{ +s32 max17050PowerNow(void) { _max17050_update(); return g_power_now; } -s32 max17050PowerAvg(void) -{ +s32 max17050PowerAvg(void) { _max17050_update(); return g_power_avg; } diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.h b/Source/hoc-clk/sysmodule/src/i2c/max17050.h index a22046db..ffdd177e 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max17050.h +++ b/Source/hoc-clk/sysmodule/src/i2c/max17050.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.c b/Source/hoc-clk/sysmodule/src/i2c/tmp451.c index e465a2c5..e82383b4 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.c +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.c @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -#include "tmp451.h" #include "i2c.h" +#include "tmp451.h" #define TMP451_WAIT_NS 1000000000UL -#define TMP451_PCB_TEMP_REG 0x00 -#define TMP451_SOC_TEMP_REG 0x01 +#define TMP451_PCB_TEMP_REG 0x00 +#define TMP451_SOC_TEMP_REG 0x01 #define TMP451_SOC_TMP_DEC_REG 0x10 #define TMP451_PCB_TMP_DEC_REG 0x15 @@ -33,37 +33,31 @@ static u64 g_update_ticks = 0; static s32 g_temp_pcb = 0; static s32 g_temp_soc = 0; -static Result _tmp451_get_temp(u8 reg, u8 dec_reg, s32* out) -{ +static Result _tmp451_get_temp(u8 reg, u8 dec_reg, s32 *out) { u8 val = 0; Result rc = i2csessionExtRegReceive(&g_i2c_session, reg, &val, sizeof(val)); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { *out = (s32)val * 1000; rc = i2csessionExtRegReceive(&g_i2c_session, dec_reg, &val, sizeof(val)); } - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { *out += ((s32)(val >> 4) * 625) / 10; } return rc; } -static void _tmp451_update() -{ +static void _tmp451_update() { u64 ticks = armGetSystemTick(); - if(armTicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) - { + if (armTicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) { return; } g_update_ticks = ticks; - if(!serviceIsActive(&g_i2c_session.s)) - { + if (!serviceIsActive(&g_i2c_session.s)) { return; } @@ -71,32 +65,27 @@ static void _tmp451_update() _tmp451_get_temp(TMP451_SOC_TEMP_REG, TMP451_SOC_TMP_DEC_REG, &g_temp_soc); } -Result tmp451Initialize(void) -{ +Result tmp451Initialize(void) { Result rc = i2cInitialize(); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = i2cOpenSession(&g_i2c_session, I2cDevice_Tmp451); } return rc; } -void tmp451Exit(void) -{ +void tmp451Exit(void) { i2csessionClose(&g_i2c_session); i2cExit(); } -s32 tmp451TempPcb(void) -{ +s32 tmp451TempPcb(void) { _tmp451_update(); return g_temp_pcb; } -s32 tmp451TempSoc(void) -{ +s32 tmp451TempSoc(void) { _tmp451_update(); return g_temp_soc; } diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.h b/Source/hoc-clk/sysmodule/src/i2c/tmp451.h index 9faf2480..7872b59e 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.h +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c index 986612c6..340d9b18 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,14 +24,12 @@ * -------------------------------------------------------------------------- */ - -#include "ipc_server.h" #include -Result ipcServerInit(IpcServer* server, const char* name, u32 max_sessions) -{ - if(max_sessions < 1 || max_sessions > (MAX_WAIT_OBJECTS - 1)) - { +#include "ipc_server.h" + +Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions) { + if (max_sessions < 1 || max_sessions > (MAX_WAIT_OBJECTS - 1)) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } @@ -40,27 +38,22 @@ Result ipcServerInit(IpcServer* server, const char* name, u32 max_sessions) server->count = 0; Result rc = smRegisterService(&server->handles[0], server->srvName, false, max_sessions); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { server->count = 1; } return rc; } -Result ipcServerExit(IpcServer* server) -{ - for(u32 i = 0; i < server->count; i++) - { +Result ipcServerExit(IpcServer *server) { + for (u32 i = 0; i < server->count; i++) { svcCloseHandle(server->handles[i]); } server->count = 0; return smUnregisterService(server->srvName); } -static Result _ipcServerAddSession(IpcServer* server, Handle session) -{ - if(server->count >= server->max) - { +static Result _ipcServerAddSession(IpcServer *server, Handle session) { + if (server->count >= server->max) { return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); } @@ -69,84 +62,70 @@ static Result _ipcServerAddSession(IpcServer* server, Handle session) return 0; } -static Result _ipcServerDeleteSession(IpcServer* server, u32 index) -{ - if(!index || index >= server->count) - { +static Result _ipcServerDeleteSession(IpcServer *server, u32 index) { + if (!index || index >= server->count) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } svcCloseHandle(server->handles[index]); - for(u32 j = index; j < (server->count - 1); j++) - { + for (u32 j = index; j < (server->count - 1); j++) { server->handles[j] = server->handles[j + 1]; } server->count--; return 0; } -static Result _ipcServerParseRequest(IpcServerRequest* r) -{ - u8* base = armGetTls(); +static Result _ipcServerParseRequest(IpcServerRequest *r) { + u8 *base = armGetTls(); r->hipc = hipcParseRequest(base); r->data.cmdId = 0; r->data.size = 0; - r->data.ptr = NULL; + r->data.ptr = NULL; - if(r->hipc.meta.type == CmifCommandType_Request) - { - IpcServerRawHeader* header = cmifGetAlignedDataStart(r->hipc.data.data_words, base); + if (r->hipc.meta.type == CmifCommandType_Request) { + IpcServerRawHeader *header = cmifGetAlignedDataStart(r->hipc.data.data_words, base); size_t dataSize = r->hipc.meta.num_data_words * 4; - if(!header || dataSize < sizeof(IpcServerRawHeader) || header->magic != CMIF_IN_HEADER_MAGIC) - { + if (!header || dataSize < sizeof(IpcServerRawHeader) || header->magic != CMIF_IN_HEADER_MAGIC) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } r->data.cmdId = header->cmdId; - if(dataSize > sizeof(IpcServerRawHeader)) - { + if (dataSize > sizeof(IpcServerRawHeader)) { r->data.size = dataSize - sizeof(IpcServerRawHeader); - r->data.ptr = ((u8*)header) + sizeof(IpcServerRawHeader); + r->data.ptr = ((u8 *)header) + sizeof(IpcServerRawHeader); } } return 0; } -static void _ipcServerPrepareResponse(Result rc, void* data, size_t dataSize) -{ - u8* base = armGetTls(); - HipcRequest hipc = hipcMakeRequestInline(base, - .type = CmifCommandType_Request, - .num_data_words = (sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, - ); +static void _ipcServerPrepareResponse(Result rc, void *data, size_t dataSize) { + u8 *base = armGetTls(); + HipcRequest hipc = + hipcMakeRequestInline(base, .type = CmifCommandType_Request, .num_data_words = (sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, ); - IpcServerRawHeader* rawHeader = cmifGetAlignedDataStart(hipc.data_words, base); + IpcServerRawHeader *rawHeader = cmifGetAlignedDataStart(hipc.data_words, base); rawHeader->magic = CMIF_OUT_HEADER_MAGIC; rawHeader->result = rc; - if(R_SUCCEEDED(rc)) - { - memcpy(((u8*)rawHeader) + sizeof(IpcServerRawHeader), data, dataSize); + if (R_SUCCEEDED(rc)) { + memcpy(((u8 *)rawHeader) + sizeof(IpcServerRawHeader), data, dataSize); } } -static Result _ipcServerProcessNewSession(IpcServer* server) -{ +static Result _ipcServerProcessNewSession(IpcServer *server) { Handle session; Result rc = svcAcceptSession(&session, server->handles[0]); - if(R_SUCCEEDED(rc) && R_FAILED(rc = _ipcServerAddSession(server, session))) - { + if (R_SUCCEEDED(rc) && R_FAILED(rc = _ipcServerAddSession(server, session))) { svcCloseHandle(session); } return rc; } -static Result _ipcServerProcessSession(IpcServer* server, IpcServerRequestHandler handler, void* userdata, u32 handleIndex) -{ +static Result _ipcServerProcessSession(IpcServer *server, IpcServerRequestHandler handler, void *userdata, u32 handleIndex) { s32 unusedIndex; IpcServerRequest r; size_t dataSize = 0; @@ -154,21 +133,14 @@ static Result _ipcServerProcessSession(IpcServer* server, IpcServerRequestHandle bool close = false; Result rc = svcReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 1, 0, UINT64_MAX); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = _ipcServerParseRequest(&r); } - if(R_SUCCEEDED(rc)) - { - switch(r.hipc.meta.type) - { + if (R_SUCCEEDED(rc)) { + switch (r.hipc.meta.type) { case CmifCommandType_Request: - _ipcServerPrepareResponse( - handler(userdata, &r, data, &dataSize), - data, - dataSize - ); + _ipcServerPrepareResponse(handler(userdata, &r, data, &dataSize), data, dataSize); break; case CmifCommandType_Close: _ipcServerPrepareResponse(0, NULL, 0); @@ -180,42 +152,33 @@ static Result _ipcServerProcessSession(IpcServer* server, IpcServerRequestHandle } rc = svcReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 0, server->handles[handleIndex], 0); - if(rc == KERNELRESULT(TimedOut)) - { + if (rc == KERNELRESULT(TimedOut)) { rc = 0; } } - if(R_FAILED(rc) || close) - { + if (R_FAILED(rc) || close) { _ipcServerDeleteSession(server, handleIndex); } return rc; } -Result ipcServerProcess(IpcServer* server, IpcServerRequestHandler handler, void* userdata) -{ +Result ipcServerProcess(IpcServer *server, IpcServerRequestHandler handler, void *userdata) { s32 handleIndex = -1; Result rc = svcWaitSynchronization(&handleIndex, server->handles, server->count, UINT64_MAX); - if(R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= server->count)) - { + if (R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= server->count)) { rc = MAKERESULT(Module_Libnx, LibnxError_NotFound); } - if(R_SUCCEEDED(rc)) - { - if(handleIndex) - { + if (R_SUCCEEDED(rc)) { + if (handleIndex) { rc = _ipcServerProcessSession(server, handler, userdata, handleIndex); - } - else - { + } else { rc = _ipcServerProcessNewSession(server); } } return rc; } - diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h index 0c8f294b..7b5a24c8 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,55 +24,48 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include #define IPC_SERVER_EXT_RESPONSE_MAX_DATA_SIZE (0x100 - 0x10 - sizeof(IpcServerRawHeader)) -typedef struct -{ +typedef struct { u64 magic; - union - { + union { u64 cmdId; u64 result; }; } IpcServerRawHeader; -typedef struct -{ +typedef struct { SmServiceName srvName; Handle handles[MAX_WAIT_OBJECTS]; u32 max; u32 count; } IpcServer; -typedef struct -{ +typedef struct { u64 cmdId; - void* ptr; + void *ptr; size_t size; } IpcServerRequestData; -typedef struct -{ +typedef struct { HipcParsedRequest hipc; IpcServerRequestData data; } IpcServerRequest; -typedef Result (*IpcServerRequestHandler)(void* userdata, const IpcServerRequest* r, u8* out_data, size_t* out_dataSize); +typedef Result (*IpcServerRequestHandler)(void *userdata, const IpcServerRequest *r, u8 *out_data, size_t *out_dataSize); -Result ipcServerInit(IpcServer* server, const char* name, u32 max_sessions); -Result ipcServerExit(IpcServer* server); -Result ipcServerProcess(IpcServer* server, IpcServerRequestHandler handler, void* userdata); -Result ipcServerParseCommand(const IpcServerRequest* r, size_t* out_datasize, void** out_data, u64* out_cmd); +Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions); +Result ipcServerExit(IpcServer *server); +Result ipcServerProcess(IpcServer *server, IpcServerRequestHandler handler, void *userdata); +Result ipcServerParseCommand(const IpcServerRequest *r, size_t *out_datasize, void **out_data, u64 *out_cmd); #ifdef __cplusplus } diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index 34890245..11a40897 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -24,21 +24,22 @@ * -------------------------------------------------------------------------- */ -#include "ipc_service.hpp" #include -#include -#include "../hos/apm_ext.h" #include -#include #include +#include +#include #include + +#include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" +#include "../file/kip.hpp" +#include "../hos/apm_ext.h" +#include "../mgr/clock_manager.hpp" +#include "ipc_service.hpp" #include #include -#include "../file/file_utils.hpp" -#include "../file/errors.hpp" -#include "../mgr/clock_manager.hpp" -#include "../file/config.hpp" -#include "../file/kip.hpp" namespace ipcService { namespace { @@ -48,19 +49,19 @@ namespace ipcService { LockableMutex gThreadMutex; IpcServer gServer; - Result GetApiVersion(u32* out_version) { + Result GetApiVersion(u32 *out_version) { *out_version = HOCCLK_IPC_API_VERSION; return 0; } - Result GetVersionString(char* out_buf, size_t bufSize) { + Result GetVersionString(char *out_buf, size_t bufSize) { if (bufSize) { - strncpy(out_buf, TARGET_VERSION, bufSize-1); + strncpy(out_buf, TARGET_VERSION, bufSize - 1); } return 0; } - Result GetCurrentContext(HocClkContext* out_ctx) { + Result GetCurrentContext(HocClkContext *out_ctx) { *out_ctx = clockManager::GetCurrentContext(); return 0; } @@ -70,7 +71,7 @@ namespace ipcService { return 0; } - Result GetProfileCount(std::uint64_t* tid, std::uint8_t* out_count) { + Result GetProfileCount(std::uint64_t *tid, std::uint8_t *out_count) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -78,7 +79,7 @@ namespace ipcService { return 0; } - Result GetProfiles(std::uint64_t* tid, HocClkTitleProfileList* out_profiles) { + Result GetProfiles(std::uint64_t *tid, HocClkTitleProfileList *out_profiles) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -86,7 +87,7 @@ namespace ipcService { return 0; } - Result SetProfiles(HocClkIpc_SetProfiles_Args* args) { + Result SetProfiles(HocClkIpc_SetProfiles_Args *args) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -97,12 +98,12 @@ namespace ipcService { return 0; } - Result SetEnabled(std::uint8_t* enabled) { + Result SetEnabled(std::uint8_t *enabled) { config::SetEnabled(*enabled); return 0; } - Result SetOverride(HocClkIpc_SetOverride_Args* args) { + Result SetOverride(HocClkIpc_SetOverride_Args *args) { if (!HOCCLK_ENUM_VALID(HocClkModule, args->module)) { return HOCCLK_ERROR(Generic); } @@ -110,7 +111,7 @@ namespace ipcService { return 0; } - Result GetConfigValuesHandler(HocClkConfigValueList* out_configValues) { + Result GetConfigValuesHandler(HocClkConfigValueList *out_configValues) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -118,7 +119,7 @@ namespace ipcService { return 0; } - Result SetConfigValuesHandler(HocClkConfigValueList* configValues) { + Result SetConfigValuesHandler(HocClkConfigValueList *configValues) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -129,30 +130,28 @@ namespace ipcService { return 0; } - Result GetFreqList(HocClkIpc_GetFreqList_Args* args, std::uint32_t* out_list, std::size_t size, std::uint32_t* out_count) { + Result GetFreqList(HocClkIpc_GetFreqList_Args *args, std::uint32_t *out_list, std::size_t size, std::uint32_t *out_count) { if (!HOCCLK_ENUM_VALID(HocClkModule, args->module)) { return HOCCLK_ERROR(Generic); } - if (args->maxCount != size/sizeof(*out_list)) { + if (args->maxCount != size / sizeof(*out_list)) { return HOCCLK_ERROR(Generic); } clockManager::GetFreqList(args->module, out_list, args->maxCount, out_count); return 0; } - Result ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8* out_data, size_t* out_dataSize) { + Result ServiceHandlerFunc(void *arg, const IpcServerRequest *r, u8 *out_data, size_t *out_dataSize) { (void)arg; switch (r->data.cmdId) { case HocClkIpcCmd_GetApiVersion: *out_dataSize = sizeof(u32); - return GetApiVersion((u32*)out_data); + return GetApiVersion((u32 *)out_data); case HocClkIpcCmd_GetVersionString: if (r->hipc.meta.num_recv_buffers >= 1) { - return GetVersionString( - (char*)hipcGetBufferAddress(r->hipc.data.recv_buffers), - hipcGetBufferSize(r->hipc.data.recv_buffers) - ); + return GetVersionString((char *)hipcGetBufferAddress(r->hipc.data.recv_buffers), + hipcGetBufferSize(r->hipc.data.recv_buffers)); } break; @@ -160,7 +159,7 @@ namespace ipcService { if (r->data.size >= sizeof(std::uint64_t) && r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); if (bufSize >= sizeof(HocClkContext)) { - return GetCurrentContext((HocClkContext*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + return GetCurrentContext((HocClkContext *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); } } break; @@ -171,7 +170,7 @@ namespace ipcService { case HocClkIpcCmd_GetProfileCount: if (r->data.size >= sizeof(std::uint64_t)) { *out_dataSize = sizeof(std::uint8_t); - return GetProfileCount((std::uint64_t*)r->data.ptr, (std::uint8_t*)out_data); + return GetProfileCount((std::uint64_t *)r->data.ptr, (std::uint8_t *)out_data); } break; @@ -179,26 +178,27 @@ namespace ipcService { if (r->data.size >= sizeof(std::uint64_t) && r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); if (bufSize >= sizeof(HocClkTitleProfileList)) { - return GetProfiles((std::uint64_t*)r->data.ptr, (HocClkTitleProfileList*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + return GetProfiles((std::uint64_t *)r->data.ptr, + (HocClkTitleProfileList *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); } } break; case HocClkIpcCmd_SetProfiles: if (r->data.size >= sizeof(HocClkIpc_SetProfiles_Args)) { - return SetProfiles((HocClkIpc_SetProfiles_Args*)r->data.ptr); + return SetProfiles((HocClkIpc_SetProfiles_Args *)r->data.ptr); } break; case HocClkIpcCmd_SetEnabled: if (r->data.size >= sizeof(std::uint8_t)) { - return SetEnabled((std::uint8_t*)r->data.ptr); + return SetEnabled((std::uint8_t *)r->data.ptr); } break; case HocClkIpcCmd_SetOverride: if (r->data.size >= sizeof(HocClkIpc_SetOverride_Args)) { - return SetOverride((HocClkIpc_SetOverride_Args*)r->data.ptr); + return SetOverride((HocClkIpc_SetOverride_Args *)r->data.ptr); } break; @@ -206,7 +206,7 @@ namespace ipcService { if (r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); if (bufSize >= sizeof(HocClkConfigValueList)) { - return GetConfigValuesHandler((HocClkConfigValueList*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + return GetConfigValuesHandler((HocClkConfigValueList *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); } } break; @@ -215,7 +215,7 @@ namespace ipcService { if (r->hipc.meta.num_send_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.send_buffers); if (bufSize >= sizeof(HocClkConfigValueList)) { - return SetConfigValuesHandler((HocClkConfigValueList*)hipcGetBufferAddress(r->hipc.data.send_buffers)); + return SetConfigValuesHandler((HocClkConfigValueList *)hipcGetBufferAddress(r->hipc.data.send_buffers)); } } break; @@ -223,12 +223,9 @@ namespace ipcService { case HocClkIpcCmd_GetFreqList: if (r->data.size >= sizeof(HocClkIpc_GetFreqList_Args) && r->hipc.meta.num_recv_buffers >= 1) { *out_dataSize = sizeof(std::uint32_t); - return GetFreqList( - (HocClkIpc_GetFreqList_Args*)r->data.ptr, - (std::uint32_t*)hipcGetBufferAddress(r->hipc.data.recv_buffers), - hipcGetBufferSize(r->hipc.data.recv_buffers), - (std::uint32_t*)out_data - ); + return GetFreqList((HocClkIpc_GetFreqList_Args *)r->data.ptr, + (std::uint32_t *)hipcGetBufferAddress(r->hipc.data.recv_buffers), + hipcGetBufferSize(r->hipc.data.recv_buffers), (std::uint32_t *)out_data); } break; @@ -243,7 +240,7 @@ namespace ipcService { return HOCCLK_ERROR(Generic); } - void ProcessThreadFunc(void* arg) { + void ProcessThreadFunc(void *arg) { (void)arg; Result rc; while (true) { @@ -259,7 +256,7 @@ namespace ipcService { } } - } + } // namespace void Initialize() { std::int32_t priority; @@ -281,7 +278,7 @@ namespace ipcService { } void SetRunning(bool running) { - std::scoped_lock lock{gThreadMutex}; + std::scoped_lock lock{ gThreadMutex }; if (gRunning == running) { return; } @@ -297,4 +294,4 @@ namespace ipcService { } } -} +} // namespace ipcService diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp index d1fcfac3..a8a9928b 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp @@ -35,4 +35,4 @@ namespace ipcService { void Exit(); void SetRunning(bool running); -} +} // namespace ipcService diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index 52e5e0d1..f7c5b0c1 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -27,115 +27,106 @@ #include #include #include - #include +#include "board/board.hpp" +#include "file/config.hpp" #include "file/errors.hpp" #include "file/file_utils.hpp" -#include "board/board.hpp" #include "hos/process_management.hpp" -#include "mgr/clock_manager.hpp" #include "ipc/ipc_service.hpp" -#include "file/config.hpp" +#include "mgr/clock_manager.hpp" + #define INNER_HEAP_SIZE 0x40000 -extern "C" -{ - void virtmemSetup(void); +extern "C" { +void virtmemSetup(void); - extern std::uint32_t __start__; +extern std::uint32_t __start__; - std::uint32_t __nx_applet_type = AppletType_None; - TimeServiceType __nx_time_service_type = TimeServiceType_System; - std::uint32_t __nx_fs_num_sessions = 1; - u32 __nx_nv_transfermem_size = 0x8000; - size_t nx_inner_heap_size = INNER_HEAP_SIZE; - char nx_inner_heap[INNER_HEAP_SIZE]; - NvServiceType __nx_nv_service_type = NvServiceType_Factory; +std::uint32_t __nx_applet_type = AppletType_None; +TimeServiceType __nx_time_service_type = TimeServiceType_System; +std::uint32_t __nx_fs_num_sessions = 1; +u32 __nx_nv_transfermem_size = 0x8000; +size_t nx_inner_heap_size = INNER_HEAP_SIZE; +char nx_inner_heap[INNER_HEAP_SIZE]; +NvServiceType __nx_nv_service_type = NvServiceType_Factory; - // Ty to MasaGratoR for this! - // This is done to save some space as they have no practical use in our case - void* __real___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)); - void* __real__Unwind_Resume(); - void* __real___gxx_personality_v0(); +// Ty to MasaGratoR for this! +// This is done to save some space as they have no practical use in our case +void *__real___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)); +void *__real__Unwind_Resume(); +void *__real___gxx_personality_v0(); - void __wrap___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)) { - abort(); - } - - void __wrap__Unwind_Resume() { - return; - } - - void __wrap___gxx_personality_v0() { - return; - } - - void __libnx_initheap(void) - { - void* addr = nx_inner_heap; - size_t size = nx_inner_heap_size; - - /* Newlib Heap Management */ - extern char* fake_heap_start; - extern char* fake_heap_end; - - fake_heap_start = (char*)addr; - fake_heap_end = (char*)addr + size; - - virtmemSetup(); - } - - void __appInit(void) - { - if (R_FAILED(smInitialize())) - { - fatalThrow(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM)); - } - - Result rc = setsysInitialize(); - if (R_SUCCEEDED(rc)) - { - SetSysFirmwareVersion fw; - rc = setsysGetFirmwareVersion(&fw); - if (R_SUCCEEDED(rc)) - hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); - setsysExit(); - } - - // rc = fanInitialize(); - // if (R_FAILED(rc)) - // diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); - - rc = i2cInitialize(); - if (R_FAILED(rc)) - diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); - - } - - void __appExit(void) - { - // CloseFanControllerThread(); - // fanExit(); - i2cExit(); - setsysExit(); - fsdevUnmountAll(); - fsExit(); - smExit(); - } +void __wrap___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)) { + abort(); } -int main(int argc, char** argv) -{ - Result rc = fileUtils::Initialize(); +void __wrap__Unwind_Resume() { + return; +} + +void __wrap___gxx_personality_v0() { + return; +} + +void __libnx_initheap(void) { + void *addr = nx_inner_heap; + size_t size = nx_inner_heap_size; + + /* Newlib Heap Management */ + extern char *fake_heap_start; + extern char *fake_heap_end; + + fake_heap_start = (char *)addr; + fake_heap_end = (char *)addr + size; + + virtmemSetup(); +} + +void __appInit(void) { + if (R_FAILED(smInitialize())) { + fatalThrow(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM)); + } + + Result rc = setsysInitialize(); + if (R_SUCCEEDED(rc)) { + SetSysFirmwareVersion fw; + rc = setsysGetFirmwareVersion(&fw); + if (R_SUCCEEDED(rc)) + hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); + setsysExit(); + } + + // rc = fanInitialize(); + // if (R_FAILED(rc)) + // diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); + + rc = i2cInitialize(); if (R_FAILED(rc)) - { + diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); +} + +void __appExit(void) { + // CloseFanControllerThread(); + // fanExit(); + i2cExit(); + setsysExit(); + fsdevUnmountAll(); + fsExit(); + smExit(); +} +} + +int main(int argc, char **argv) { + Result rc = fileUtils::Initialize(); + if (R_FAILED(rc)) { fatalThrow(rc); return 1; } config::Initialize(); - config::Refresh(); // Get config from file + config::Refresh(); // Get config from file board::Initialize(); processManagement::Initialize(); @@ -145,7 +136,6 @@ int main(int argc, char** argv) clockManager::Initialize(); ipcService::Initialize(); - clockManager::SetRunning(true); config::SetEnabled(true); ipcService::SetRunning(true); @@ -154,8 +144,7 @@ int main(int argc, char** argv) // InitFanController(table); // StartFanControllerThread(); - while (clockManager::Running()) - { + while (clockManager::Running()) { clockManager::Tick(); clockManager::WaitForNextTick(); } diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index 24081b43..26ae4c33 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -16,10 +16,12 @@ */ #include + #include "../file/file_utils.hpp" -Result QueryMemoryMapping(u64* virtaddr, u64 physaddr, u64 size) { - if(hosversionAtLeast(10,0,0)) { + +Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size) { + if (hosversionAtLeast(10, 0, 0)) { u64 out_size; return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); } else { diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp index b2913979..e00c10ca 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp @@ -18,5 +18,5 @@ #pragma once #include -Result QueryMemoryMapping(u64* virtaddr, u64 physaddr, u64 size); +Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size); Result MapAddress(u64 &va, const u64 &physAddr, const char *name); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index e447eacc..096936ca 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -24,32 +24,31 @@ * -------------------------------------------------------------------------- */ -#include "clock_manager.hpp" -#include -#include "../file/file_utils.hpp" -#include "../board/board.hpp" -#include "../hos/process_management.hpp" -#include "../file/errors.hpp" -#include "../ipc/ipc_service.hpp" -#include "../file/kip.hpp" -#include -#include "../i2c/i2cDrv.h" -#include "../display/display_refresh_rate.hpp" -#include #include -#include "../file/config.hpp" -#include "../hos/integrations.hpp" -#include "../util/lockable_mutex.h" -#include "../file/kip.hpp" -#include "governor.hpp" -#include "../display/aula.hpp" -#include "../soc/gm20b.hpp" +#include +#include +#include -#define HOSPPC_HAS_BOOST (hosversionAtLeast(7,0,0)) +#include "../board/board.hpp" +#include "../display/aula.hpp" +#include "../display/display_refresh_rate.hpp" +#include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" +#include "../file/kip.hpp" +#include "../hos/integrations.hpp" +#include "../hos/process_management.hpp" +#include "../i2c/i2cDrv.h" +#include "../ipc/ipc_service.hpp" +#include "../soc/gm20b.hpp" +#include "../util/lockable_mutex.h" +#include "clock_manager.hpp" +#include "governor.hpp" + +#define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) namespace clockManager { - bool gRunning = false; LockableMutex gContextMutex; HocClkContext gContext = {}; @@ -59,22 +58,20 @@ namespace clockManager { std::uint64_t gLastPowerLogNs = 0; std::uint64_t gLastCsvWriteNs = 0; - bool IsAssignableHz(HocClkModule module, std::uint32_t hz) - { + bool IsAssignableHz(HocClkModule module, std::uint32_t hz) { switch (module) { - case HocClkModule_CPU: - return hz >= 500000000; - case HocClkModule_MEM: - return hz >= 665600000; - default: - return true; + case HocClkModule_CPU: + return hz >= 500000000; + case HocClkModule_MEM: + return hz >= 665600000; + default: + return true; } } - std::uint32_t GetMaxAllowedHz(HocClkModule module, HocClkProfile profile) - { + std::uint32_t GetMaxAllowedHz(HocClkModule module, HocClkProfile profile) { if (config::GetConfigValue(HocClkConfigValue_UncappedClocks)) { - return ~0; // Integer limit, uncapped clocks ON + return ~0; // Integer limit, uncapped clocks ON } else { if (module == HocClkModule_GPU) { if (profile < HocClkProfile_HandheldCharging) { @@ -82,7 +79,7 @@ namespace clockManager { case HocClkSocType_Erista: return 460800000; case HocClkSocType_Mariko: - if(board::GetConsoleType() == HocClkConsoleType_Hoag) { + if (board::GetConsoleType() == HocClkConsoleType_Hoag) { switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { case 0 ... 2: return 614400000; @@ -144,8 +141,7 @@ namespace clockManager { return 0; } - std::uint32_t GetNearestHz(HocClkModule module, std::uint32_t inHz, std::uint32_t maxHz) - { + std::uint32_t GetNearestHz(HocClkModule module, std::uint32_t inHz, std::uint32_t maxHz) { std::uint32_t *freqs = &gFreqTable[module].list[0]; size_t count = gFreqTable[module].count - 1; @@ -163,21 +159,20 @@ namespace clockManager { return freqs[i]; } - void ResetToStockClocks() - { + void ResetToStockClocks() { board::ResetToStockCpu(); if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { if (board::GetSocType() == HocClkSocType_Erista) board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); } board::ResetToStockGpu(); } - bool ConfigIntervalTimeout(HocClkConfigValue intervalMsConfigValue, std::uint64_t ns, std::uint64_t *lastLogNs) - { + bool ConfigIntervalTimeout(HocClkConfigValue intervalMsConfigValue, std::uint64_t ns, std::uint64_t *lastLogNs) { std::uint64_t logInterval = config::GetConfigValue(intervalMsConfigValue) * 1000000ULL; bool shouldLog = logInterval && ((ns - *lastLogNs) > logInterval); @@ -188,9 +183,8 @@ namespace clockManager { return shouldLog; } - void RefreshFreqTableRow(HocClkModule module) - { - std::scoped_lock lock{gContextMutex}; + void RefreshFreqTableRow(HocClkModule module) { + std::scoped_lock lock{ gContextMutex }; std::uint32_t freqs[HOCCLK_FREQ_LIST_MAX]; std::uint32_t count; @@ -201,15 +195,16 @@ namespace clockManager { std::uint32_t *hz = &gFreqTable[module].list[0]; gFreqTable[module].count = 0; - if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Mariko - && config::GetConfigValue(HocClkConfigValue_MarikoMiddleFreqs)) { - constexpr u32 kStep = 38400000; + if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Mariko && + config::GetConfigValue(HocClkConfigValue_MarikoMiddleFreqs)) { + constexpr u32 kStep = 38400000; constexpr u32 kPcvStep = 76800000; u32 kMax = ~0; for (u32 i = 0; i < count; i++) { for (u32 j = 0; j < count; j++) { if (freqs[j] + kStep == freqs[i]) { - if (freqs[j] < kMax) kMax = freqs[j]; + if (freqs[j] < kMax) + kMax = freqs[j]; break; } } @@ -217,7 +212,8 @@ namespace clockManager { if (kMax == ~0u) { kMax = 0; for (u32 i = 0; i < count; i++) { - if (freqs[i] > kMax) kMax = freqs[i]; + if (freqs[i] > kMax) + kMax = freqs[i]; } } @@ -260,40 +256,27 @@ namespace clockManager { // Workaround for PCV bug involving 38.4mhz step rate on erista if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Erista) { - static const struct { - u32 hz; - HocClkConfigValue kval; + static const struct { + u32 hz; + HocClkConfigValue kval; } eristaGpuVoltMap[] = { - { 76800000, KipConfigValue_g_volt_e_76800 }, - { 115200000, KipConfigValue_g_volt_e_115200 }, - { 153600000, KipConfigValue_g_volt_e_153600 }, - { 192000000, KipConfigValue_g_volt_e_192000 }, - { 230400000, KipConfigValue_g_volt_e_230400 }, - { 268800000, KipConfigValue_g_volt_e_268800 }, - { 307200000, KipConfigValue_g_volt_e_307200 }, - { 345600000, KipConfigValue_g_volt_e_345600 }, - { 384000000, KipConfigValue_g_volt_e_384000 }, - { 422400000, KipConfigValue_g_volt_e_422400 }, - { 460800000, KipConfigValue_g_volt_e_460800 }, - { 499200000, KipConfigValue_g_volt_e_499200 }, - { 537600000, KipConfigValue_g_volt_e_537600 }, - { 576000000, KipConfigValue_g_volt_e_576000 }, - { 614400000, KipConfigValue_g_volt_e_614400 }, - { 652800000, KipConfigValue_g_volt_e_652800 }, - { 691200000, KipConfigValue_g_volt_e_691200 }, - { 729600000, KipConfigValue_g_volt_e_729600 }, - { 768000000, KipConfigValue_g_volt_e_768000 }, - { 806400000, KipConfigValue_g_volt_e_806400 }, - { 844800000, KipConfigValue_g_volt_e_844800 }, - { 883200000, KipConfigValue_g_volt_e_883200 }, - { 921600000, KipConfigValue_g_volt_e_921600 }, - { 960000000, KipConfigValue_g_volt_e_960000 }, - { 998400000, KipConfigValue_g_volt_e_998400 }, - {1036800000, KipConfigValue_g_volt_e_1036800 }, - {1075200000, KipConfigValue_g_volt_e_1075200 }, + { 76800000, KipConfigValue_g_volt_e_76800 }, { 115200000, KipConfigValue_g_volt_e_115200 }, + { 153600000, KipConfigValue_g_volt_e_153600 }, { 192000000, KipConfigValue_g_volt_e_192000 }, + { 230400000, KipConfigValue_g_volt_e_230400 }, { 268800000, KipConfigValue_g_volt_e_268800 }, + { 307200000, KipConfigValue_g_volt_e_307200 }, { 345600000, KipConfigValue_g_volt_e_345600 }, + { 384000000, KipConfigValue_g_volt_e_384000 }, { 422400000, KipConfigValue_g_volt_e_422400 }, + { 460800000, KipConfigValue_g_volt_e_460800 }, { 499200000, KipConfigValue_g_volt_e_499200 }, + { 537600000, KipConfigValue_g_volt_e_537600 }, { 576000000, KipConfigValue_g_volt_e_576000 }, + { 614400000, KipConfigValue_g_volt_e_614400 }, { 652800000, KipConfigValue_g_volt_e_652800 }, + { 691200000, KipConfigValue_g_volt_e_691200 }, { 729600000, KipConfigValue_g_volt_e_729600 }, + { 768000000, KipConfigValue_g_volt_e_768000 }, { 806400000, KipConfigValue_g_volt_e_806400 }, + { 844800000, KipConfigValue_g_volt_e_844800 }, { 883200000, KipConfigValue_g_volt_e_883200 }, + { 921600000, KipConfigValue_g_volt_e_921600 }, { 960000000, KipConfigValue_g_volt_e_960000 }, + { 998400000, KipConfigValue_g_volt_e_998400 }, { 1036800000, KipConfigValue_g_volt_e_1036800 }, + { 1075200000, KipConfigValue_g_volt_e_1075200 }, }; bool skip = false; - for (auto& entry : eristaGpuVoltMap) { + for (auto &entry : eristaGpuVoltMap) { if (entry.hz == freqs[i]) { if (config::GetConfigValue(entry.kval) == 2000) { skip = true; @@ -301,7 +284,8 @@ namespace clockManager { break; } } - if (skip) continue; + if (skip) + continue; } *hz = freqs[i]; @@ -314,14 +298,15 @@ namespace clockManager { fileUtils::LogLine("[mgr] count = %u", gFreqTable[module].count); } - bool HandleSafetyFeatures(bool isBoost) - { - if (((tmp451TempSoc() / 1000) > (int)config::GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && config::GetConfigValue(HocClkConfigValue_ThermalThrottle)) { + bool HandleSafetyFeatures(bool isBoost) { + if (((tmp451TempSoc() / 1000) > (int)config::GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && + config::GetConfigValue(HocClkConfigValue_ThermalThrottle)) { ResetToStockClocks(); return true; } - if (config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock) && !isBoost && !governor::isCpuGovernorEnabled && (board::GetSocType() == HocClkSocType_Mariko)) { + if (config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock) && !isBoost && !governor::isCpuGovernorEnabled && + (board::GetSocType() == HocClkSocType_Mariko)) { u32 ramHz = gContext.freqs[HocClkModule_MEM]; u32 threshold = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; if (ramHz >= threshold) { @@ -339,22 +324,26 @@ namespace clockManager { } return false; } - void HandleMiscFeatures() - { + void HandleMiscFeatures() { + // these dont need to run that often, so dont bother static u32 tick = 0; - if(++tick > 10) { + if (++tick > 10) { tick = 0; if (config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) { I2c_Bq24193_SetFastChargeCurrentLimit(config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)); } + if (config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)) { + I2c_Bq24193_SetInputCurrentLimit(config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)); + } + I2c_BuckConverter_SetMvOut(&I2c_Display, config::GetConfigValue(HocClkConfigValue_DisplayVoltage)); - if(board::GetConsoleType() == HocClkConsoleType_Aula) + if (board::GetConsoleType() == HocClkConsoleType_Aula) AulaDisplay::SetDisplayColorMode((AulaColorMode)config::GetConfigValue(HocClkConfigValue_AulaDisplayColorPreset)); - if(config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { + if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { board::HandleCpuUv(); } } @@ -389,11 +378,9 @@ namespace clockManager { } } - - void DVFSReset() - { + void DVFSReset() { if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { - board::PcvHijackGpuVolts(0); // Reset to vMin + board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = gContext.overrideFreqs[HocClkModule_GPU]; if (!targetHz) { @@ -411,8 +398,7 @@ namespace clockManager { } } - void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) - { + void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) { switch (module) { case HocClkModule_CPU: if (!(isBoost || (config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode) && isBoost))) @@ -421,7 +407,9 @@ namespace clockManager { if (board::GetSocType() == HocClkSocType_Erista) board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), + config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); } break; case HocClkModule_GPU: @@ -429,7 +417,7 @@ namespace clockManager { break; case HocClkModule_MEM: board::ResetToStockMem(); - if(!didHijackPcv) { + if (!didHijackPcv) { DVFSReset(); didHijackPcv = true; } @@ -444,8 +432,7 @@ namespace clockManager { } } - void SetClocks(bool isBoost) - { + void SetClocks(bool isBoost) { std::uint32_t targetHz = 0; std::uint32_t maxHz = 0; std::uint32_t nearestHz = 0; @@ -456,16 +443,16 @@ namespace clockManager { if (skipCpuDueToBoost) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); prepareBoostExit = true; - return; // Return if we aren't overwriting boost mode + return; // Return if we aren't overwriting boost mode } if (prepareBoostExit) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); prepareBoostExit = false; } - bool returnRaw = false; // Return a value scaled to MHz instead of raw value + bool returnRaw = false; // Return a value scaled to MHz instead of raw value for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { - u32 oldHz = board::GetHz((HocClkModule)module); // Get Old hz (used primarily for DVFS Logic) + u32 oldHz = board::GetHz((HocClkModule)module); // Get Old hz (used primarily for DVFS Logic) if (module > HocClkModule_MEM) returnRaw = true; @@ -516,12 +503,9 @@ namespace clockManager { nearestHz = GetNearestHz((HocClkModule)module, targetHz, maxHz); if (nearestHz != gContext.freqs[module]) { - fileUtils::LogLine( - "[mgr] %s clock set : %u.%u MHz (target = %u.%u MHz)", - board::GetModuleName((HocClkModule)module, true), - nearestHz / 1000000, nearestHz / 100000 - nearestHz / 1000000 * 10, - targetHz / 1000000, targetHz / 100000 - targetHz / 1000000 * 10 - ); + fileUtils::LogLine("[mgr] %s clock set : %u.%u MHz (target = %u.%u MHz)", board::GetModuleName((HocClkModule)module, true), + nearestHz / 1000000, nearestHz / 100000 - nearestHz / 1000000 * 10, targetHz / 1000000, + targetHz / 100000 - targetHz / 1000000 * 10); // The logic MUST be done in this order otherwise you WILL get crashes if (module == HocClkModule_MEM && targetHz > oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { @@ -539,7 +523,7 @@ namespace clockManager { ApplyGpuDvfs(targetHz); } - if(module == HocClkModule_MEM && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) + if (module == HocClkModule_MEM && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) didHijackPcv = false; } } else { @@ -548,8 +532,7 @@ namespace clockManager { } } - bool RefreshContext() - { + bool RefreshContext() { bool hasChanged = false; std::uint32_t mode = 0; @@ -584,7 +567,8 @@ namespace clockManager { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { hz = board::GetHz((HocClkModule)module); if (hz != 0 && hz != gContext.freqs[module]) { - fileUtils::LogLine("[mgr] %s clock change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, hz / 100000 - hz / 1000000 * 10); + fileUtils::LogLine("[mgr] %s clock change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, + hz / 100000 - hz / 1000000 * 10); gContext.freqs[module] = hz; if (module < HocClkModuleStable_EnumMax) { @@ -596,7 +580,8 @@ namespace clockManager { hz = config::GetOverrideHz((HocClkModule)module); if (hz != gContext.overrideFreqs[module]) { if (hz) { - fileUtils::LogLine("[mgr] %s override change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, hz / 100000 - hz / 1000000 * 10); + fileUtils::LogLine("[mgr] %s override change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, + hz / 100000 - hz / 1000000 * 10); } gContext.overrideFreqs[module] = hz; @@ -615,7 +600,8 @@ namespace clockManager { for (unsigned int sensor = 0; sensor < HocClkThermalSensor_EnumMax; sensor++) { millis = board::GetTemperatureMilli((HocClkThermalSensor)sensor); if (shouldLogTemp) { - fileUtils::LogLine("[mgr] %s temp: %u.%u °C", board::GetThermalSensorName((HocClkThermalSensor)sensor, true), millis / 1000, (millis - millis / 1000 * 1000) / 100); + fileUtils::LogLine("[mgr] %s temp: %u.%u °C", board::GetThermalSensorName((HocClkThermalSensor)sensor, true), millis / 1000, + (millis - millis / 1000 * 1000) / 100); } gContext.temps[sensor] = millis; @@ -645,7 +631,8 @@ namespace clockManager { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { realHz = board::GetRealHz((HocClkModule)module); if (shouldLogFreq) { - fileUtils::LogLine("[mgr] %s real freq: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), realHz / 1000000, realHz / 100000 - realHz / 1000000 * 10); + fileUtils::LogLine("[mgr] %s real freq: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), realHz / 1000000, + realHz / 100000 - realHz / 1000000 * 10); } gContext.realFreqs[module] = realHz; @@ -689,18 +676,17 @@ namespace clockManager { if (gContext.isSaltyNXInstalled) gContext.fps = integrations::GetSaltyNXFPS(); else - gContext.fps = 254; // N/A + gContext.fps = 254; // N/A if (gContext.isSaltyNXInstalled) gContext.resolutionHeight = integrations::GetSaltyNXResolutionHeight(); else - gContext.resolutionHeight = 0; // N/A + gContext.resolutionHeight = 0; // N/A return hasChanged; } - void Initialize() - { + void Initialize() { gContext = {}; gContext.applicationId = 0; gContext.profile = HocClkProfile_Handheld; @@ -738,8 +724,9 @@ namespace clockManager { gContext.dramID = board::GetDramID(); gContext.isDram8GB = board::IsDram8GB(); gContext.consoleType = board::GetConsoleType(); - - board::SetGpuSchedulingMode((GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling), (GpuSchedulingOverrideMethod)config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); + + board::SetGpuSchedulingMode((GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling), + (GpuSchedulingOverrideMethod)config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); gContext.gpuSchedulingMode = (GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling); gContext.isSysDockInstalled = integrations::GetSysDockState(); @@ -752,38 +739,32 @@ namespace clockManager { governor::startThreads(); } - void Exit() - { + void Exit() { governor::exitThreads(); } - HocClkContext GetCurrentContext() - { - std::scoped_lock lock{gContextMutex}; + HocClkContext GetCurrentContext() { + std::scoped_lock lock{ gContextMutex }; return gContext; } - void SetRunning(bool running) - { + void SetRunning(bool running) { gRunning = running; } - bool Running() - { + bool Running() { return gRunning; } - void GetFreqList(HocClkModule module, std::uint32_t *list, std::uint32_t maxCount, std::uint32_t *outCount) - { + void GetFreqList(HocClkModule module, std::uint32_t *list, std::uint32_t maxCount, std::uint32_t *outCount) { ASSERT_ENUM_VALID(HocClkModule, module); *outCount = std::min(maxCount, gFreqTable[module].count); memcpy(list, &gFreqTable[module].list[0], *outCount * sizeof(gFreqTable[0].list[0])); } - void Tick() - { - std::scoped_lock lock{gContextMutex}; + void Tick() { + std::scoped_lock lock{ gContextMutex }; std::uint32_t mode = 0; Result rc = apmExtGetCurrentPerformanceConfiguration(&mode); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); @@ -792,18 +773,18 @@ namespace clockManager { bool shouldSkipClockSet = HandleSafetyFeatures(isBoost); HandleMiscFeatures(); - + // GPU clock should always be the same unless PCV has overwriten our change, so reset it - if ((RefreshContext() || config::Refresh() || (board::GetRealHz(HocClkModule_GPU) != gContext.freqs[HocClkModule_GPU])) && !shouldSkipClockSet) { + if ((RefreshContext() || config::Refresh() || (board::GetRealHz(HocClkModule_GPU) != gContext.freqs[HocClkModule_GPU])) && + !shouldSkipClockSet) { SetClocks(isBoost); } } - void WaitForNextTick() - { + void WaitForNextTick() { if (board::GetHz(HocClkModule_MEM) > 665000000) svcSleepThread(config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); else - svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode + svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode } -} // namespace clockManager +} // namespace clockManager diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp index 34d238d0..8235fbbc 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp @@ -28,6 +28,7 @@ #include #include + #include "../util/lockable_mutex.h" namespace clockManager { @@ -37,7 +38,6 @@ namespace clockManager { std::uint32_t list[HOCCLK_FREQ_LIST_MAX]; }; - extern bool hasChanged; // instance variables @@ -50,7 +50,6 @@ namespace clockManager { extern std::uint64_t gLastPowerLogNs; extern std::uint64_t gLastCsvWriteNs; - void Initialize(); void Exit(); @@ -62,8 +61,8 @@ namespace clockManager { std::uint32_t GetMaxAllowedHz(HocClkModule module, HocClkProfile profile); bool IsAssignableHz(HocClkModule module, std::uint32_t hz); - void GetFreqList(HocClkModule module, std::uint32_t* list, std::uint32_t maxCount, std::uint32_t* outCount); + void GetFreqList(HocClkModule module, std::uint32_t *list, std::uint32_t maxCount, std::uint32_t *outCount); void Tick(); void WaitForNextTick(); -} +} // namespace clockManager diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index 45a0db5f..3bd87f44 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -15,14 +15,15 @@ * */ -#include "governor.hpp" #include "../hos/process_management.hpp" +#include "governor.hpp" #include + namespace governor { - #define POLL_NS 5'000'000 // 5 ms – governor poll rate - #define DOWN_HOLD_TICKS 10 // 50 ms – how long to in POLL_NS to hold while ramping down - #define STEP_UTIL 900 // multiplier for step calculations +#define POLL_NS 5'000'000 // 5 ms – governor poll rate +#define DOWN_HOLD_TICKS 10 // 50 ms – how long to in POLL_NS to hold while ramping down +#define STEP_UTIL 900 // multiplier for step calculations bool isGpuGovernorEnabled = false; bool isCpuGovernorEnabled = false; @@ -44,8 +45,10 @@ namespace governor { } auto resolve = [](u8 app, u8 temp) -> u8 { - if (temp == ComponentGovernor_Disabled) return ComponentGovernor_Disabled; - if (temp != ComponentGovernor_DoNotOverride) return temp; + if (temp == ComponentGovernor_Disabled) + return ComponentGovernor_Disabled; + if (temp != ComponentGovernor_DoNotOverride) + return temp; return app; }; @@ -68,8 +71,10 @@ namespace governor { if (newVrrGovernorState == false && lastVrrGovernorState == true) board::ResetToStockDisplay(); - if (newCpuGovernorState != lastCpuGovernorState || newGpuGovernorState != lastGpuGovernorState || newVrrGovernorState != lastVrrGovernorState) { - fileUtils::LogLine("[mgr] Governor state changed: CPU %s, GPU %s, VRR %s", newCpuGovernorState ? "enabled" : "disabled", newGpuGovernorState ? "enabled" : "disabled", newVrrGovernorState ? "enabled" : "disabled"); + if (newCpuGovernorState != lastCpuGovernorState || newGpuGovernorState != lastGpuGovernorState || + newVrrGovernorState != lastVrrGovernorState) { + fileUtils::LogLine("[mgr] Governor state changed: CPU %s, GPU %s, VRR %s", newCpuGovernorState ? "enabled" : "disabled", + newGpuGovernorState ? "enabled" : "disabled", newVrrGovernorState ? "enabled" : "disabled"); lastCpuGovernorState = newCpuGovernorState; lastGpuGovernorState = newGpuGovernorState; lastVrrGovernorState = newVrrGovernorState; @@ -81,7 +86,7 @@ namespace governor { return (u32)(std::min(hz, static_cast(tableMaxHz))); } - u32 TableIndexForHz(const clockManager::FreqTable& table, u32 targetHz) { + u32 TableIndexForHz(const clockManager::FreqTable &table, u32 targetHz) { for (u32 i = 0; i < table.count; i++) if (table.list[i] >= targetHz) return i; @@ -91,17 +96,13 @@ namespace governor { u32 ResolveTargetHz(HocClkModule module) { u32 hz = clockManager::gContext.overrideFreqs[module]; if (!hz) - hz = config::GetAutoClockHz( - clockManager::gContext.applicationId, module, - clockManager::gContext.profile, false); + hz = config::GetAutoClockHz(clockManager::gContext.applicationId, module, clockManager::gContext.profile, false); if (!hz) - hz = config::GetAutoClockHz( - HOCCLK_GLOBAL_PROFILE_TID, module, - clockManager::gContext.profile, false); + hz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, module, clockManager::gContext.profile, false); return hz; } - void GovernorThread(void* arg) { + void GovernorThread(void *arg) { (void)arg; u32 cpuDownHoldRemaining = 0; @@ -135,8 +136,8 @@ namespace governor { } else { isCpuGovernorInBoostMode = false; - auto& table = clockManager::gFreqTable[HocClkModule_CPU]; - std::scoped_lock lock{clockManager::gContextMutex}; + auto &table = clockManager::gFreqTable[HocClkModule_CPU]; + std::scoped_lock lock{ clockManager::gContextMutex }; u32 cpuLoad = board::GetPartLoad(HocClkPartLoad_CPUMax); u32 tableMaxHz = table.list[table.count - 1]; @@ -146,7 +147,7 @@ namespace governor { if (targetHz && desiredHz > targetHz) desiredHz = targetHz; - if (maxHz && desiredHz > maxHz) + if (maxHz && desiredHz > maxHz) desiredHz = maxHz; u32 newHz = table.list[TableIndexForHz(table, desiredHz)]; @@ -191,8 +192,8 @@ namespace governor { } if (isGpuGovernorEnabled) { - auto& table = clockManager::gFreqTable[HocClkModule_GPU]; - std::scoped_lock lock{clockManager::gContextMutex}; + auto &table = clockManager::gFreqTable[HocClkModule_GPU]; + std::scoped_lock lock{ clockManager::gContextMutex }; u32 gpuLoad = board::GetPartLoad(HocClkPartLoad_GPU); u32 tableMaxHz = table.list[table.count - 1]; @@ -202,7 +203,7 @@ namespace governor { if (targetHz && desiredHz > targetHz) desiredHz = targetHz; - if (maxHz && desiredHz > maxHz) + if (maxHz && desiredHz > maxHz) desiredHz = maxHz; u32 newHz = table.list[TableIndexForHz(table, desiredHz)]; @@ -244,13 +245,15 @@ namespace governor { u8 fps = integrations::GetSaltyNXFPS(); if (fps != 254) { - std::scoped_lock lock{clockManager::gContextMutex}; + std::scoped_lock lock{ clockManager::gContextMutex }; u32 targetHz = clockManager::gContext.overrideFreqs[HocClkModule_Display]; if (!targetHz) { - targetHz = config::GetAutoClockHz(clockManager::gContext.applicationId, HocClkModule_Display, clockManager::gContext.profile, false); + targetHz = config::GetAutoClockHz(clockManager::gContext.applicationId, HocClkModule_Display, + clockManager::gContext.profile, false); if (!targetHz) - targetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, clockManager::gContext.profile, false); + targetHz = + config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, clockManager::gContext.profile, false); } u8 maxDisplay = targetHz ? (u8)targetHz : 60; @@ -292,19 +295,11 @@ namespace governor { } void startThreads() { - threadCreate( - &governorTHREAD, - GovernorThread, - nullptr, - NULL, - 0x2000, - 0x3F, - -2 - ); + threadCreate(&governorTHREAD, GovernorThread, nullptr, NULL, 0x2000, 0x3F, -2); threadStart(&governorTHREAD); } void exitThreads() { threadClose(&governorTHREAD); } -} +} // namespace governor diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp index cb560731..0622eee1 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp @@ -15,17 +15,18 @@ * */ -#include -#include -#include "../board/board.hpp" -#include "clock_manager.hpp" #include -#include "../file/file_utils.hpp" +#include +#include + #include "../board/board.hpp" -#include "../file/errors.hpp" #include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" #include "../hos/integrations.hpp" #include "../util/lockable_mutex.h" +#include "clock_manager.hpp" + namespace governor { extern bool isCpuGovernorInBoostMode; @@ -38,4 +39,4 @@ namespace governor { void startThreads(); void exitThreads(); void HandleGovernor(uint32_t targetHz); -} \ No newline at end of file +} // namespace governor \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/pwr/battery.cpp b/Source/hoc-clk/sysmodule/src/pwr/battery.cpp index 9a405575..621c4217 100644 --- a/Source/hoc-clk/sysmodule/src/pwr/battery.cpp +++ b/Source/hoc-clk/sysmodule/src/pwr/battery.cpp @@ -15,39 +15,26 @@ * */ -#include #include +#include + #include "battery.h" // Internal PSM service handle -static Service g_psmService = {0}; +static Service g_psmService = { 0 }; static bool g_batteryInfoInitialized = false; -static const char* s_chargerTypeStrings[] = { - "None", - "Power Delivery", - "USB-C @ 1.5A", - "USB-C @ 3.0A", - "USB-DCP", - "USB-CDP", - "USB-SDP", - "Apple @ 0.5A", - "Apple @ 1.0A", - "Apple @ 2.0A", +static const char *s_chargerTypeStrings[] = { + "None", "Power Delivery", "USB-C @ 1.5A", "USB-C @ 3.0A", "USB-DCP", "USB-CDP", "USB-SDP", "Apple @ 0.5A", "Apple @ 1.0A", "Apple @ 2.0A", }; -static const char* s_powerRoleStrings[] = { +static const char *s_powerRoleStrings[] = { "Unknown", "Sink", "Source", }; -static const char* s_pdStateStrings[] = { - "Unknown", - "New PDO Received", - "No PD Source", - "RDO Accepted" -}; +static const char *s_pdStateStrings[] = { "Unknown", "New PDO Received", "No PD Source", "RDO Accepted" }; // Internal PSM command implementations static Result psmGetBatteryChargeInfoFields(BatteryChargeInfo *out) { @@ -143,21 +130,21 @@ Result batteryInfoDisableFastCharging(void) { return psmDisableFastBatteryCharging_internal(); } -const char* batteryInfoGetChargerTypeString(BatteryChargerType type) { +const char *batteryInfoGetChargerTypeString(BatteryChargerType type) { if (type < 0 || type > ChargerType_Apple_2000mA) return "Unknown"; return s_chargerTypeStrings[type]; } -const char* batteryInfoGetPowerRoleString(BatteryPowerRole role) { +const char *batteryInfoGetPowerRoleString(BatteryPowerRole role) { if (role < PowerRole_Sink || role > PowerRole_Source) return s_powerRoleStrings[0]; return s_powerRoleStrings[role]; } -const char* batteryInfoGetPDStateString(BatteryPDControllerState state) { +const char *batteryInfoGetPDStateString(BatteryPDControllerState state) { if (state < PDState_NewPDO || state > PDState_AcceptedRDO) return s_pdStateStrings[0]; diff --git a/Source/hoc-clk/sysmodule/src/pwr/battery.h b/Source/hoc-clk/sysmodule/src/pwr/battery.h index 82754bc2..3eb0b452 100644 --- a/Source/hoc-clk/sysmodule/src/pwr/battery.h +++ b/Source/hoc-clk/sysmodule/src/pwr/battery.h @@ -16,57 +16,57 @@ */ #pragma once -#include #include #include +#include typedef enum { - BatteryFlag_NoHub = BIT(0), // Hub is disconnected - BatteryFlag_Rail = BIT(8), // At least one Joy-con is charging from rail - BatteryFlag_SPDSRC = BIT(12), // OTG - BatteryFlag_ACC = BIT(16) // Accessory + BatteryFlag_NoHub = BIT(0), // Hub is disconnected + BatteryFlag_Rail = BIT(8), // At least one Joy-con is charging from rail + BatteryFlag_SPDSRC = BIT(12), // OTG + BatteryFlag_ACC = BIT(16) // Accessory } BatteryChargeFlags; typedef enum { - PDState_NewPDO = 1, // Received new Power Data Object - PDState_NoPD = 2, // No Power Delivery source is detected + PDState_NewPDO = 1, // Received new Power Data Object + PDState_NoPD = 2, // No Power Delivery source is detected PDState_AcceptedRDO = 3 // Received and accepted Request Data Object } BatteryPDControllerState; // Charger type detection typedef enum { - ChargerType_None = 0, - ChargerType_PD = 1, + ChargerType_None = 0, + ChargerType_PD = 1, ChargerType_TypeC_1500mA = 2, ChargerType_TypeC_3000mA = 3, - ChargerType_DCP = 4, // Dedicated Charging Port - ChargerType_CDP = 5, // Charging Downstream Port - ChargerType_SDP = 6, // Standard Downstream Port - ChargerType_Apple_500mA = 7, + ChargerType_DCP = 4, // Dedicated Charging Port + ChargerType_CDP = 5, // Charging Downstream Port + ChargerType_SDP = 6, // Standard Downstream Port + ChargerType_Apple_500mA = 7, ChargerType_Apple_1000mA = 8, ChargerType_Apple_2000mA = 9 } BatteryChargerType; typedef enum { - PowerRole_Sink = 1, // Device is receiving power + PowerRole_Sink = 1, // Device is receiving power PowerRole_Source = 2 // Device is providing power } BatteryPowerRole; typedef struct { - int32_t InputCurrentLimit; // Input (Sink) current limit in mA - int32_t VBUSCurrentLimit; // Output (Source/VBUS/OTG) current limit in mA - int32_t ChargeCurrentLimit; // Battery charging current limit in mA - int32_t ChargeVoltageLimit; // Battery charging voltage limit in mV - int32_t unk_x10; // Unknown field (possibly enum) - int32_t unk_x14; // Unknown field (possibly flags) - BatteryPDControllerState PDControllerState; // PD Controller State - int32_t BatteryTemperature; // Battery temperature in milli-Celsius - int32_t RawBatteryCharge; // Battery charge in percentmille - int32_t VoltageAvg; // Average voltage in mV - int32_t BatteryAge; // Battery health (capacity full/design) in pcm - BatteryPowerRole PowerRole; // Current power role - BatteryChargerType ChargerType; // Type of charger connected - int32_t ChargerVoltageLimit; // Charger voltage limit in mV - int32_t ChargerCurrentLimit; // Charger current limit in mA - BatteryChargeFlags Flags; // Various status flags + int32_t InputCurrentLimit; // Input (Sink) current limit in mA + int32_t VBUSCurrentLimit; // Output (Source/VBUS/OTG) current limit in mA + int32_t ChargeCurrentLimit; // Battery charging current limit in mA + int32_t ChargeVoltageLimit; // Battery charging voltage limit in mV + int32_t unk_x10; // Unknown field (possibly enum) + int32_t unk_x14; // Unknown field (possibly flags) + BatteryPDControllerState PDControllerState; // PD Controller State + int32_t BatteryTemperature; // Battery temperature in milli-Celsius + int32_t RawBatteryCharge; // Battery charge in percentmille + int32_t VoltageAvg; // Average voltage in mV + int32_t BatteryAge; // Battery health (capacity full/design) in pcm + BatteryPowerRole PowerRole; // Current power role + BatteryChargerType ChargerType; // Type of charger connected + int32_t ChargerVoltageLimit; // Charger voltage limit in mV + int32_t ChargerCurrentLimit; // Charger current limit in mA + BatteryChargeFlags Flags; // Various status flags } BatteryChargeInfo; #define IS_BATTERY_CHARGING_ENABLED(info) (((info)->unk_x14 >> 8) & 1) @@ -96,6 +96,6 @@ Result batteryInfoEnableCharging(void); Result batteryInfoDisableCharging(void); Result batteryInfoEnableFastCharging(void); Result batteryInfoDisableFastCharging(void); -const char* batteryInfoGetChargerTypeString(BatteryChargerType type); -const char* batteryInfoGetPowerRoleString(BatteryPowerRole role); -const char* batteryInfoGetPDStateString(BatteryPDControllerState state); +const char *batteryInfoGetChargerTypeString(BatteryChargerType type); +const char *batteryInfoGetPowerRoleString(BatteryPowerRole role); +const char *batteryInfoGetPDStateString(BatteryPDControllerState state); diff --git a/Source/hoc-clk/sysmodule/src/soc/fuse.h b/Source/hoc-clk/sysmodule/src/soc/fuse.h index 107cebd2..68dbfecc 100644 --- a/Source/hoc-clk/sysmodule/src/soc/fuse.h +++ b/Source/hoc-clk/sysmodule/src/soc/fuse.h @@ -4,7 +4,7 @@ * Copyright (c) 2018 balika011 * Copyright (c) 2019-2025 CTCaer * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * + * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. @@ -22,293 +22,283 @@ #define _FUSE_H_ #ifndef BIT -#define BIT(n) (1U<<(n)) +#define BIT(n) (1U << (n)) #endif /*! Fuse registers. */ -#define FUSE_CTRL 0x0 -#define FUSE_ADDR 0x4 -#define FUSE_RDATA 0x8 -#define FUSE_WDATA 0xC -#define FUSE_TIME_RD1 0x10 -#define FUSE_TIME_RD2 0x14 -#define FUSE_TIME_PGM1 0x18 -#define FUSE_TIME_PGM2 0x1C -#define FUSE_PRIV2INTFC 0x20 -#define FUSE_PRIV2INTFC_START_DATA BIT(0) -#define FUSE_PRIV2INTFC_SKIP_RECORDS BIT(1) -#define FUSE_FUSEBYPASS 0x24 -#define FUSE_PRIVATEKEYDISABLE 0x28 -#define FUSE_PRIVKEY_DISABLE BIT(0) -#define FUSE_PRIVKEY_TZ_STICKY_BIT BIT(4) -#define FUSE_DISABLEREGPROGRAM 0x2C -#define FUSE_WRITE_ACCESS_SW 0x30 -#define FUSE_PWR_GOOD_SW 0x34 -#define FUSE_PRIV2RESHIFT 0x3C -#define FUSE_FUSETIME_RD0 0x40 -#define FUSE_FUSETIME_RD1 0x44 -#define FUSE_FUSETIME_RD2 0x48 -#define FUSE_FUSETIME_RD3 0x4C -#define FUSE_PRIVATE_KEY0_NONZERO 0x80 -#define FUSE_PRIVATE_KEY1_NONZERO 0x84 -#define FUSE_PRIVATE_KEY2_NONZERO 0x88 -#define FUSE_PRIVATE_KEY3_NONZERO 0x8C -#define FUSE_PRIVATE_KEY4_NONZERO 0x90 +#define FUSE_CTRL 0x0 +#define FUSE_ADDR 0x4 +#define FUSE_RDATA 0x8 +#define FUSE_WDATA 0xC +#define FUSE_TIME_RD1 0x10 +#define FUSE_TIME_RD2 0x14 +#define FUSE_TIME_PGM1 0x18 +#define FUSE_TIME_PGM2 0x1C +#define FUSE_PRIV2INTFC 0x20 +#define FUSE_PRIV2INTFC_START_DATA BIT(0) +#define FUSE_PRIV2INTFC_SKIP_RECORDS BIT(1) +#define FUSE_FUSEBYPASS 0x24 +#define FUSE_PRIVATEKEYDISABLE 0x28 +#define FUSE_PRIVKEY_DISABLE BIT(0) +#define FUSE_PRIVKEY_TZ_STICKY_BIT BIT(4) +#define FUSE_DISABLEREGPROGRAM 0x2C +#define FUSE_WRITE_ACCESS_SW 0x30 +#define FUSE_PWR_GOOD_SW 0x34 +#define FUSE_PRIV2RESHIFT 0x3C +#define FUSE_FUSETIME_RD0 0x40 +#define FUSE_FUSETIME_RD1 0x44 +#define FUSE_FUSETIME_RD2 0x48 +#define FUSE_FUSETIME_RD3 0x4C +#define FUSE_PRIVATE_KEY0_NONZERO 0x80 +#define FUSE_PRIVATE_KEY1_NONZERO 0x84 +#define FUSE_PRIVATE_KEY2_NONZERO 0x88 +#define FUSE_PRIVATE_KEY3_NONZERO 0x8C +#define FUSE_PRIVATE_KEY4_NONZERO 0x90 /*! Fuse Cached registers */ -#define FUSE_RESERVED_ODM8_B01 0x98 // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM9_B01 0x9C // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM10_B01 0xA0 // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM11_B01 0xA4 // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM12_B01 0xA8 // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM13_B01 0xAC // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM14_B01 0xB0 // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM15_B01 0xB4 // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM16_B01 0xB8 // FUSE_READ_TZ Group 2? Is value -1? -#define FUSE_RESERVED_ODM17_B01 0xBC // FUSE_READ_TZ Group 2? Is value -1? -#define FUSE_RESERVED_ODM18_B01 0xC0 // FUSE_READ_TZ Group 2. -#define FUSE_RESERVED_ODM19_B01 0xC4 // FUSE_READ_TZ Group 2. -#define FUSE_RESERVED_ODM20_B01 0xC8 // FUSE_READ_TZ Group 3. -#define FUSE_RESERVED_ODM21_B01 0xCC // FUSE_READ_TZ Group 3. -#define FUSE_KEK00_B01 0xD0 -#define FUSE_KEK01_B01 0xD4 -#define FUSE_KEK02_B01 0xD8 -#define FUSE_KEK03_B01 0xDC -#define FUSE_BEK00_B01 0xE0 -#define FUSE_BEK01_B01 0xE4 -#define FUSE_BEK02_B01 0xE8 -#define FUSE_BEK03_B01 0xEC -#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4SVT_B01 0xF0 -#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4SVT_B01 0xF4 +#define FUSE_RESERVED_ODM8_B01 0x98 // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM9_B01 0x9C // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM10_B01 0xA0 // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM11_B01 0xA4 // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM12_B01 0xA8 // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM13_B01 0xAC // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM14_B01 0xB0 // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM15_B01 0xB4 // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM16_B01 0xB8 // FUSE_READ_TZ Group 2? Is value -1? +#define FUSE_RESERVED_ODM17_B01 0xBC // FUSE_READ_TZ Group 2? Is value -1? +#define FUSE_RESERVED_ODM18_B01 0xC0 // FUSE_READ_TZ Group 2. +#define FUSE_RESERVED_ODM19_B01 0xC4 // FUSE_READ_TZ Group 2. +#define FUSE_RESERVED_ODM20_B01 0xC8 // FUSE_READ_TZ Group 3. +#define FUSE_RESERVED_ODM21_B01 0xCC // FUSE_READ_TZ Group 3. +#define FUSE_KEK00_B01 0xD0 +#define FUSE_KEK01_B01 0xD4 +#define FUSE_KEK02_B01 0xD8 +#define FUSE_KEK03_B01 0xDC +#define FUSE_BEK00_B01 0xE0 +#define FUSE_BEK01_B01 0xE4 +#define FUSE_BEK02_B01 0xE8 +#define FUSE_BEK03_B01 0xEC +#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4SVT_B01 0xF0 +#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4SVT_B01 0xF4 #define FUSE_OPT_RAM_RTSEL_TSMCPDP_PO4SVT_B01 0xF8 #define FUSE_OPT_RAM_MTSEL_TSMCPDP_PO4SVT_B01 0xFC -#define FUSE_PRODUCTION_MODE 0x100 -#define FUSE_JTAG_SECUREID_VALID 0x104 -#define FUSE_ODM_LOCK 0x108 -#define FUSE_OPT_OPENGL_EN 0x10C -#define FUSE_SKU_INFO 0x110 -#define FUSE_CPU_SPEEDO_0_CALIB 0x114 -#define FUSE_CPU_IDDQ_CALIB 0x118 +#define FUSE_PRODUCTION_MODE 0x100 +#define FUSE_JTAG_SECUREID_VALID 0x104 +#define FUSE_ODM_LOCK 0x108 +#define FUSE_OPT_OPENGL_EN 0x10C +#define FUSE_SKU_INFO 0x110 +#define FUSE_CPU_SPEEDO_0_CALIB 0x114 +#define FUSE_CPU_IDDQ_CALIB 0x118 -#define FUSE_RESERVED_ODM22_B01 0x11C // FUSE_READ_TZ Group 3. -#define FUSE_RESERVED_ODM23_B01 0x120 // FUSE_READ_TZ Group 3. -#define FUSE_RESERVED_ODM24_B01 0x124 // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM22_B01 0x11C // FUSE_READ_TZ Group 3. +#define FUSE_RESERVED_ODM23_B01 0x120 // FUSE_READ_TZ Group 3. +#define FUSE_RESERVED_ODM24_B01 0x124 // FUSE_READ_TZ Group 4. -#define FUSE_OPT_FT_REV 0x128 -#define FUSE_CPU_SPEEDO_1_CALIB 0x12C -#define FUSE_CPU_SPEEDO_2_CALIB 0x130 -#define FUSE_SOC_SPEEDO_0_CALIB 0x134 -#define FUSE_SOC_SPEEDO_1_CALIB 0x138 -#define FUSE_SOC_SPEEDO_2_CALIB 0x13C -#define FUSE_SOC_IDDQ_CALIB 0x140 +#define FUSE_OPT_FT_REV 0x128 +#define FUSE_CPU_SPEEDO_1_CALIB 0x12C +#define FUSE_CPU_SPEEDO_2_CALIB 0x130 +#define FUSE_SOC_SPEEDO_0_CALIB 0x134 +#define FUSE_SOC_SPEEDO_1_CALIB 0x138 +#define FUSE_SOC_SPEEDO_2_CALIB 0x13C +#define FUSE_SOC_IDDQ_CALIB 0x140 -#define FUSE_RESERVED_ODM25_B01 0x144 // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM25_B01 0x144 // FUSE_READ_TZ Group 4. -#define FUSE_FA 0x148 -#define FUSE_RESERVED_PRODUCTION 0x14C -#define FUSE_HDMI_LANE0_CALIB 0x150 -#define FUSE_HDMI_LANE1_CALIB 0x154 -#define FUSE_HDMI_LANE2_CALIB 0x158 -#define FUSE_HDMI_LANE3_CALIB 0x15C -#define FUSE_ENCRYPTION_RATE 0x160 -#define FUSE_PUBLIC_KEY0 0x164 -#define FUSE_PUBLIC_KEY1 0x168 -#define FUSE_PUBLIC_KEY2 0x16C -#define FUSE_PUBLIC_KEY3 0x170 -#define FUSE_PUBLIC_KEY4 0x174 -#define FUSE_PUBLIC_KEY5 0x178 -#define FUSE_PUBLIC_KEY6 0x17C -#define FUSE_PUBLIC_KEY7 0x180 -#define FUSE_TSENSOR1_CALIB 0x184 // CPU1. -#define FUSE_TSENSOR2_CALIB 0x188 // CPU2. +#define FUSE_FA 0x148 +#define FUSE_RESERVED_PRODUCTION 0x14C +#define FUSE_HDMI_LANE0_CALIB 0x150 +#define FUSE_HDMI_LANE1_CALIB 0x154 +#define FUSE_HDMI_LANE2_CALIB 0x158 +#define FUSE_HDMI_LANE3_CALIB 0x15C +#define FUSE_ENCRYPTION_RATE 0x160 +#define FUSE_PUBLIC_KEY0 0x164 +#define FUSE_PUBLIC_KEY1 0x168 +#define FUSE_PUBLIC_KEY2 0x16C +#define FUSE_PUBLIC_KEY3 0x170 +#define FUSE_PUBLIC_KEY4 0x174 +#define FUSE_PUBLIC_KEY5 0x178 +#define FUSE_PUBLIC_KEY6 0x17C +#define FUSE_PUBLIC_KEY7 0x180 +#define FUSE_TSENSOR1_CALIB 0x184 // CPU1. +#define FUSE_TSENSOR2_CALIB 0x188 // CPU2. -#define FUSE_OPT_SECURE_SCC_DIS_B01 0x18C +#define FUSE_OPT_SECURE_SCC_DIS_B01 0x18C -#define FUSE_OPT_CP_REV 0x190 // FUSE style revision - ATE. 0x101 0x100 -#define FUSE_OPT_PFG 0x194 -#define FUSE_TSENSOR0_CALIB 0x198 // CPU0. -#define FUSE_FIRST_BOOTROM_PATCH_SIZE 0x19C -#define FUSE_SECURITY_MODE 0x1A0 -#define FUSE_PRIVATE_KEY0 0x1A4 -#define FUSE_PRIVATE_KEY1 0x1A8 -#define FUSE_PRIVATE_KEY2 0x1AC -#define FUSE_PRIVATE_KEY3 0x1B0 -#define FUSE_PRIVATE_KEY4 0x1B4 -#define FUSE_ARM_JTAG_DIS 0x1B8 -#define FUSE_BOOT_DEVICE_INFO 0x1BC -#define FUSE_RESERVED_SW 0x1C0 -#define FUSE_OPT_VP9_DISABLE 0x1C4 +#define FUSE_OPT_CP_REV 0x190 // FUSE style revision - ATE. 0x101 0x100 +#define FUSE_OPT_PFG 0x194 +#define FUSE_TSENSOR0_CALIB 0x198 // CPU0. +#define FUSE_FIRST_BOOTROM_PATCH_SIZE 0x19C +#define FUSE_SECURITY_MODE 0x1A0 +#define FUSE_PRIVATE_KEY0 0x1A4 +#define FUSE_PRIVATE_KEY1 0x1A8 +#define FUSE_PRIVATE_KEY2 0x1AC +#define FUSE_PRIVATE_KEY3 0x1B0 +#define FUSE_PRIVATE_KEY4 0x1B4 +#define FUSE_ARM_JTAG_DIS 0x1B8 +#define FUSE_BOOT_DEVICE_INFO 0x1BC +#define FUSE_RESERVED_SW 0x1C0 +#define FUSE_OPT_VP9_DISABLE 0x1C4 -#define FUSE_RESERVED_ODM0 0x1C8 -#define FUSE_RESERVED_ODM1 0x1CC -#define FUSE_RESERVED_ODM2 0x1D0 -#define FUSE_RESERVED_ODM3 0x1D4 -#define FUSE_RESERVED_ODM4 0x1D8 -#define FUSE_RESERVED_ODM5 0x1DC -#define FUSE_RESERVED_ODM6 0x1E0 -#define FUSE_RESERVED_ODM7 0x1E4 +#define FUSE_RESERVED_ODM0 0x1C8 +#define FUSE_RESERVED_ODM1 0x1CC +#define FUSE_RESERVED_ODM2 0x1D0 +#define FUSE_RESERVED_ODM3 0x1D4 +#define FUSE_RESERVED_ODM4 0x1D8 +#define FUSE_RESERVED_ODM5 0x1DC +#define FUSE_RESERVED_ODM6 0x1E0 +#define FUSE_RESERVED_ODM7 0x1E4 -#define FUSE_OBS_DIS 0x1E8 +#define FUSE_OBS_DIS 0x1E8 #define FUSE_OPT_NVJTAG_PROTECTION_ENABLE_B01 0x1EC -#define FUSE_USB_CALIB 0x1F0 -#define FUSE_SKU_DIRECT_CONFIG 0x1F4 -#define FUSE_KFUSE_PRIVKEY_CTRL 0x1F8 -#define FUSE_PACKAGE_INFO 0x1FC // 1: MID, 2: DSC. -#define FUSE_OPT_VENDOR_CODE 0x200 -#define FUSE_OPT_FAB_CODE 0x204 -#define FUSE_OPT_LOT_CODE_0 0x208 -#define FUSE_OPT_LOT_CODE_1 0x20C -#define FUSE_OPT_WAFER_ID 0x210 -#define FUSE_OPT_X_COORDINATE 0x214 -#define FUSE_OPT_Y_COORDINATE 0x218 -#define FUSE_OPT_SEC_DEBUG_EN 0x21C -#define FUSE_OPT_OPS_RESERVED 0x220 -#define FUSE_SATA_CALIB 0x224 +#define FUSE_USB_CALIB 0x1F0 +#define FUSE_SKU_DIRECT_CONFIG 0x1F4 +#define FUSE_KFUSE_PRIVKEY_CTRL 0x1F8 +#define FUSE_PACKAGE_INFO 0x1FC // 1: MID, 2: DSC. +#define FUSE_OPT_VENDOR_CODE 0x200 +#define FUSE_OPT_FAB_CODE 0x204 +#define FUSE_OPT_LOT_CODE_0 0x208 +#define FUSE_OPT_LOT_CODE_1 0x20C +#define FUSE_OPT_WAFER_ID 0x210 +#define FUSE_OPT_X_COORDINATE 0x214 +#define FUSE_OPT_Y_COORDINATE 0x218 +#define FUSE_OPT_SEC_DEBUG_EN 0x21C +#define FUSE_OPT_OPS_RESERVED 0x220 +#define FUSE_SATA_CALIB 0x224 -#define FUSE_SPARE_REGISTER_ODM_B01 0x224 +#define FUSE_SPARE_REGISTER_ODM_B01 0x224 -#define FUSE_GPU_IDDQ_CALIB 0x228 -#define FUSE_TSENSOR3_CALIB 0x22C // CPU3. -#define FUSE_CLOCK_BONDOUT0 0x230 -#define FUSE_CLOCK_BONDOUT1 0x234 +#define FUSE_GPU_IDDQ_CALIB 0x228 +#define FUSE_TSENSOR3_CALIB 0x22C // CPU3. +#define FUSE_CLOCK_BONDOUT0 0x230 +#define FUSE_CLOCK_BONDOUT1 0x234 -#define FUSE_RESERVED_ODM26_B01 0x238 // FUSE_READ_TZ Group 4. -#define FUSE_RESERVED_ODM27_B01 0x23C // FUSE_READ_TZ Group 4. -#define FUSE_RESERVED_ODM28_B01 0x240 // MAX77812 phase configuration. FUSE_READ_TZ Group 5. +#define FUSE_RESERVED_ODM26_B01 0x238 // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM27_B01 0x23C // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM28_B01 0x240 // MAX77812 phase configuration. FUSE_READ_TZ Group 5. -#define FUSE_OPT_SAMPLE_TYPE 0x244 -#define FUSE_OPT_SUBREVISION 0x248 // "", "p", "q", "r". e.g: A01p. -#define FUSE_OPT_SW_RESERVED_0 0x24C -#define FUSE_OPT_SW_RESERVED_1 0x250 -#define FUSE_TSENSOR4_CALIB 0x254 // GPU. -#define FUSE_TSENSOR5_CALIB 0x258 // MEM0. -#define FUSE_TSENSOR6_CALIB 0x25C // MEM1. -#define FUSE_TSENSOR7_CALIB 0x260 // PLLX. -#define FUSE_OPT_PRIV_SEC_DIS 0x264 -#define FUSE_PKC_DISABLE 0x268 +#define FUSE_OPT_SAMPLE_TYPE 0x244 +#define FUSE_OPT_SUBREVISION 0x248 // "", "p", "q", "r". e.g: A01p. +#define FUSE_OPT_SW_RESERVED_0 0x24C +#define FUSE_OPT_SW_RESERVED_1 0x250 +#define FUSE_TSENSOR4_CALIB 0x254 // GPU. +#define FUSE_TSENSOR5_CALIB 0x258 // MEM0. +#define FUSE_TSENSOR6_CALIB 0x25C // MEM1. +#define FUSE_TSENSOR7_CALIB 0x260 // PLLX. +#define FUSE_OPT_PRIV_SEC_DIS 0x264 +#define FUSE_PKC_DISABLE 0x268 -#define FUSE_BOOT_SECURITY_INFO_B01 0x268 -#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4HVT_B01 0x26C -#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4HVT_B01 0x270 +#define FUSE_BOOT_SECURITY_INFO_B01 0x268 +#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4HVT_B01 0x26C +#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4HVT_B01 0x270 #define FUSE_OPT_RAM_RTSEL_TSMCPDP_PO4HVT_B01 0x274 #define FUSE_OPT_RAM_MTSEL_TSMCPDP_PO4HVT_B01 0x278 -#define FUSE_FUSE2TSEC_DEBUG_DISABLE 0x27C -#define FUSE_TSENSOR_COMMON 0x280 -#define FUSE_OPT_CP_BIN 0x284 -#define FUSE_OPT_GPU_DISABLE 0x288 -#define FUSE_OPT_FT_BIN 0x28C -#define FUSE_OPT_DONE_MAP 0x290 +#define FUSE_FUSE2TSEC_DEBUG_DISABLE 0x27C +#define FUSE_TSENSOR_COMMON 0x280 +#define FUSE_OPT_CP_BIN 0x284 +#define FUSE_OPT_GPU_DISABLE 0x288 +#define FUSE_OPT_FT_BIN 0x28C +#define FUSE_OPT_DONE_MAP 0x290 -#define FUSE_RESERVED_ODM29_B01 0x294 // FUSE_READ_TZ Group 5? Is value -1? +#define FUSE_RESERVED_ODM29_B01 0x294 // FUSE_READ_TZ Group 5? Is value -1? -#define FUSE_APB2JTAG_DISABLE 0x298 -#define FUSE_ODM_INFO 0x29C // Debug features disable. -#define FUSE_ARM_CRYPT_DE_FEATURE 0x2A8 +#define FUSE_APB2JTAG_DISABLE 0x298 +#define FUSE_ODM_INFO 0x29C // Debug features disable. +#define FUSE_ARM_CRYPT_DE_FEATURE 0x2A8 #define FUSE_OPT_RAM_WTSEL_TSMCPDP_PO4SVT_B01 0x2B0 -#define FUSE_OPT_RAM_RCT_TSMCDP_PO4SVT_B01 0x2B4 -#define FUSE_OPT_RAM_WCT_TSMCDP_PO4SVT_B01 0x2B8 -#define FUSE_OPT_RAM_KP_TSMCDP_PO4SVT_B01 0x2BC +#define FUSE_OPT_RAM_RCT_TSMCDP_PO4SVT_B01 0x2B4 +#define FUSE_OPT_RAM_WCT_TSMCDP_PO4SVT_B01 0x2B8 +#define FUSE_OPT_RAM_KP_TSMCDP_PO4SVT_B01 0x2BC -#define FUSE_WOA_SKU_FLAG 0x2C0 -#define FUSE_ECO_RESERVE_1 0x2C4 -#define FUSE_GCPLEX_CONFIG_FUSE 0x2C8 -#define FUSE_GPU_VPR_AUTO_FETCH_DIS BIT(0) -#define FUSE_GPU_VPR_ENABLED BIT(1) -#define FUSE_GPU_WPR_ENABLED BIT(2) -#define FUSE_PRODUCTION_MONTH 0x2CC -#define FUSE_RAM_REPAIR_INDICATOR 0x2D0 -#define FUSE_TSENSOR9_CALIB 0x2D4 // AOTAG. -#define FUSE_VMIN_CALIBRATION 0x2DC -#define FUSE_AGING_SENSOR_CALIBRATION 0x2E0 -#define FUSE_DEBUG_AUTHENTICATION 0x2E4 -#define FUSE_SECURE_PROVISION_INDEX 0x2E8 -#define FUSE_SECURE_PROVISION_INFO 0x2EC -#define FUSE_OPT_GPU_DISABLE_CP1 0x2F0 -#define FUSE_SPARE_ENDIS 0x2F4 -#define FUSE_ECO_RESERVE_0 0x2F8 // AID. -#define FUSE_RESERVED_CALIB0 0x304 // GPCPLL ADC Calibration. -#define FUSE_RESERVED_CALIB1 0x308 -#define FUSE_OPT_GPU_TPC0_DISABLE 0x30C -#define FUSE_OPT_GPU_TPC0_DISABLE_CP1 0x310 -#define FUSE_OPT_CPU_DISABLE 0x314 -#define FUSE_OPT_CPU_DISABLE_CP1 0x318 -#define FUSE_TSENSOR10_CALIB 0x31C -#define FUSE_TSENSOR10_CALIB_AUX 0x320 -#define FUSE_OPT_RAM_SVOP_DP 0x324 -#define FUSE_OPT_RAM_SVOP_PDP 0x328 -#define FUSE_OPT_RAM_SVOP_REG 0x32C -#define FUSE_OPT_RAM_SVOP_SP 0x330 -#define FUSE_OPT_RAM_SVOP_SMPDP 0x334 +#define FUSE_WOA_SKU_FLAG 0x2C0 +#define FUSE_ECO_RESERVE_1 0x2C4 +#define FUSE_GCPLEX_CONFIG_FUSE 0x2C8 +#define FUSE_GPU_VPR_AUTO_FETCH_DIS BIT(0) +#define FUSE_GPU_VPR_ENABLED BIT(1) +#define FUSE_GPU_WPR_ENABLED BIT(2) +#define FUSE_PRODUCTION_MONTH 0x2CC +#define FUSE_RAM_REPAIR_INDICATOR 0x2D0 +#define FUSE_TSENSOR9_CALIB 0x2D4 // AOTAG. +#define FUSE_VMIN_CALIBRATION 0x2DC +#define FUSE_AGING_SENSOR_CALIBRATION 0x2E0 +#define FUSE_DEBUG_AUTHENTICATION 0x2E4 +#define FUSE_SECURE_PROVISION_INDEX 0x2E8 +#define FUSE_SECURE_PROVISION_INFO 0x2EC +#define FUSE_OPT_GPU_DISABLE_CP1 0x2F0 +#define FUSE_SPARE_ENDIS 0x2F4 +#define FUSE_ECO_RESERVE_0 0x2F8 // AID. +#define FUSE_RESERVED_CALIB0 0x304 // GPCPLL ADC Calibration. +#define FUSE_RESERVED_CALIB1 0x308 +#define FUSE_OPT_GPU_TPC0_DISABLE 0x30C +#define FUSE_OPT_GPU_TPC0_DISABLE_CP1 0x310 +#define FUSE_OPT_CPU_DISABLE 0x314 +#define FUSE_OPT_CPU_DISABLE_CP1 0x318 +#define FUSE_TSENSOR10_CALIB 0x31C +#define FUSE_TSENSOR10_CALIB_AUX 0x320 +#define FUSE_OPT_RAM_SVOP_DP 0x324 +#define FUSE_OPT_RAM_SVOP_PDP 0x328 +#define FUSE_OPT_RAM_SVOP_REG 0x32C +#define FUSE_OPT_RAM_SVOP_SP 0x330 +#define FUSE_OPT_RAM_SVOP_SMPDP 0x334 #define FUSE_OPT_RAM_WTSEL_TSMCPDP_PO4HVT_B01 0x324 -#define FUSE_OPT_RAM_RCT_TSMCDP_PO4HVT_B01 0x328 -#define FUSE_OPT_RAM_WCT_TSMCDP_PO4HVT_B01 0x32c -#define FUSE_OPT_RAM_KP_TSMCDP_PO4HVT_B01 0x330 -#define FUSE_OPT_RAM_SVOP_SP_B01 0x334 +#define FUSE_OPT_RAM_RCT_TSMCDP_PO4HVT_B01 0x328 +#define FUSE_OPT_RAM_WCT_TSMCDP_PO4HVT_B01 0x32c +#define FUSE_OPT_RAM_KP_TSMCDP_PO4HVT_B01 0x330 +#define FUSE_OPT_RAM_SVOP_SP_B01 0x334 -#define FUSE_OPT_GPU_TPC0_DISABLE_CP2 0x338 -#define FUSE_OPT_GPU_TPC1_DISABLE 0x33C -#define FUSE_OPT_GPU_TPC1_DISABLE_CP1 0x340 -#define FUSE_OPT_GPU_TPC1_DISABLE_CP2 0x344 -#define FUSE_OPT_CPU_DISABLE_CP2 0x348 -#define FUSE_OPT_GPU_DISABLE_CP2 0x34C -#define FUSE_USB_CALIB_EXT 0x350 -#define FUSE_RESERVED_FIELD 0x354 // RMA. -#define FUSE_SPARE_REALIGNMENT_REG 0x37C -#define FUSE_SPARE_BIT_0 0x380 +#define FUSE_OPT_GPU_TPC0_DISABLE_CP2 0x338 +#define FUSE_OPT_GPU_TPC1_DISABLE 0x33C +#define FUSE_OPT_GPU_TPC1_DISABLE_CP1 0x340 +#define FUSE_OPT_GPU_TPC1_DISABLE_CP2 0x344 +#define FUSE_OPT_CPU_DISABLE_CP2 0x348 +#define FUSE_OPT_GPU_DISABLE_CP2 0x34C +#define FUSE_USB_CALIB_EXT 0x350 +#define FUSE_RESERVED_FIELD 0x354 // RMA. +#define FUSE_SPARE_REALIGNMENT_REG 0x37C +#define FUSE_SPARE_BIT_0 0x380 //... -#define FUSE_SPARE_BIT_31 0x3FC +#define FUSE_SPARE_BIT_31 0x3FC /*! Fuse commands. */ -#define FUSE_IDLE 0x0 -#define FUSE_READ 0x1 -#define FUSE_WRITE 0x2 -#define FUSE_SENSE 0x3 +#define FUSE_IDLE 0x0 +#define FUSE_READ 0x1 +#define FUSE_WRITE 0x2 +#define FUSE_SENSE 0x3 #define FUSE_CMD_MASK 0x3 /*! Fuse status. */ -#define FUSE_STATUS_RESET 0 -#define FUSE_STATUS_POST_RESET 1 -#define FUSE_STATUS_LOAD_ROW0 2 -#define FUSE_STATUS_LOAD_ROW1 3 -#define FUSE_STATUS_IDLE 4 -#define FUSE_STATUS_READ_SETUP 5 -#define FUSE_STATUS_READ_STROBE 6 -#define FUSE_STATUS_SAMPLE_FUSES 7 -#define FUSE_STATUS_READ_HOLD 8 -#define FUSE_STATUS_FUSE_SRC_SETUP 9 -#define FUSE_STATUS_WRITE_SETUP 10 -#define FUSE_STATUS_WRITE_ADDR_SETUP 11 -#define FUSE_STATUS_WRITE_PROGRAM 12 -#define FUSE_STATUS_WRITE_ADDR_HOLD 13 -#define FUSE_STATUS_FUSE_SRC_HOLD 14 -#define FUSE_STATUS_LOAD_RIR 15 +#define FUSE_STATUS_RESET 0 +#define FUSE_STATUS_POST_RESET 1 +#define FUSE_STATUS_LOAD_ROW0 2 +#define FUSE_STATUS_LOAD_ROW1 3 +#define FUSE_STATUS_IDLE 4 +#define FUSE_STATUS_READ_SETUP 5 +#define FUSE_STATUS_READ_STROBE 6 +#define FUSE_STATUS_SAMPLE_FUSES 7 +#define FUSE_STATUS_READ_HOLD 8 +#define FUSE_STATUS_FUSE_SRC_SETUP 9 +#define FUSE_STATUS_WRITE_SETUP 10 +#define FUSE_STATUS_WRITE_ADDR_SETUP 11 +#define FUSE_STATUS_WRITE_PROGRAM 12 +#define FUSE_STATUS_WRITE_ADDR_HOLD 13 +#define FUSE_STATUS_FUSE_SRC_HOLD 14 +#define FUSE_STATUS_LOAD_RIR 15 #define FUSE_STATUS_READ_BEFORE_WRITE_SETUP 16 -#define FUSE_STATUS_READ_DEASSERT_PD 17 +#define FUSE_STATUS_READ_DEASSERT_PD 17 /*! Fuse cache registers. */ #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) -#define FUSE_ARRAY_WORDS_NUM 192 +#define FUSE_ARRAY_WORDS_NUM 192 #define FUSE_ARRAY_WORDS_NUM_B01 256 -enum -{ - FUSE_NX_HW_TYPE_ICOSA, - FUSE_NX_HW_TYPE_IOWA, - FUSE_NX_HW_TYPE_HOAG, - FUSE_NX_HW_TYPE_AULA -}; +enum { FUSE_NX_HW_TYPE_ICOSA, FUSE_NX_HW_TYPE_IOWA, FUSE_NX_HW_TYPE_HOAG, FUSE_NX_HW_TYPE_AULA }; -enum -{ - FUSE_NX_HW_STATE_PROD, - FUSE_NX_HW_STATE_DEV -}; +enum { FUSE_NX_HW_STATE_PROD, FUSE_NX_HW_STATE_DEV }; #endif diff --git a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp index 0210f735..e2a4e158 100644 --- a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp @@ -14,56 +14,56 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - -#include "gm20b.hpp" #include "../mapping/mem_map.hpp" +#include "gm20b.hpp" + namespace gm20b { u64 gpu_base = 0; - #define GPU_PA 0x57000000 - #define GPU_SIZE 0x1000000 - #define GPU_TRIM_SYS_GPCPLL_CFG 0x00 - #define GPU_TRIM_SYS_GPCPLL_COEFF 0x04 - #define GPU_TRIM_SYS_GPCPLL_CFG2 0x08 - #define GPU_TRIM_SYS_GPCPLL_CFG3 0x0C - #define GPU_TRIM_SYS_GPCPLL_DVFS0 0x10 - #define GPU_TRIM_SYS_GPCPLL_DVFS1 0x14 - #define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x1C - #define GPU_TRIM_SYS_SEL_VCO 0x2C - #define GPU_TRIM_SYS_GPC2CLK_OUT 0x250 +#define GPU_PA 0x57000000 +#define GPU_SIZE 0x1000000 +#define GPU_TRIM_SYS_GPCPLL_CFG 0x00 +#define GPU_TRIM_SYS_GPCPLL_COEFF 0x04 +#define GPU_TRIM_SYS_GPCPLL_CFG2 0x08 +#define GPU_TRIM_SYS_GPCPLL_CFG3 0x0C +#define GPU_TRIM_SYS_GPCPLL_DVFS0 0x10 +#define GPU_TRIM_SYS_GPCPLL_DVFS1 0x14 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x1C +#define GPU_TRIM_SYS_SEL_VCO 0x2C +#define GPU_TRIM_SYS_GPC2CLK_OUT 0x250 - #define GPC_BCAST(x) (*(volatile u32 *)(gpu_base + 0x132800ul + (x))) - #define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(gpu_base + 0x137000ul + (x))) +#define GPC_BCAST(x) (*(volatile u32 *)(gpu_base + 0x132800ul + (x))) +#define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(gpu_base + 0x137000ul + (x))) - #define GPC_BCAST_GPCPLL_DVFS2 0x20 - #define GPC_BCAST_NDIV_SLOWDOWN_DBG 0xa0 +#define GPC_BCAST_GPCPLL_DVFS2 0x20 +#define GPC_BCAST_NDIV_SLOWDOWN_DBG 0xa0 - #define GPCPLL_CFG_ENABLE BIT(0) - #define GPCPLL_CFG_IDDQ BIT(1) - #define GPCPLL_CFG_SYNC_MODE BIT(2) - #define GPCPLL_CFG_LOCK BIT(17) +#define GPCPLL_CFG_ENABLE BIT(0) +#define GPCPLL_CFG_IDDQ BIT(1) +#define GPCPLL_CFG_SYNC_MODE BIT(2) +#define GPCPLL_CFG_LOCK BIT(17) - #define GPCPLL_CFG2_SDM_DIN_MASK 0x000000FFu - #define GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x007FFF00u - #define GPCPLL_CFG2_STEPA_SHIFT 24 - #define GPCPLL_CFG2_STEPA_MASK 0xFF000000u +#define GPCPLL_CFG2_SDM_DIN_MASK 0x000000FFu +#define GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x007FFF00u +#define GPCPLL_CFG2_STEPA_SHIFT 24 +#define GPCPLL_CFG2_STEPA_MASK 0xFF000000u - #define GPCPLL_CFG3_STEPB_SHIFT 16 - #define GPCPLL_CFG3_STEPB_MASK 0x00FF0000u +#define GPCPLL_CFG3_STEPB_SHIFT 16 +#define GPCPLL_CFG3_STEPB_MASK 0x00FF0000u - #define GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007Fu +#define GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007Fu - #define NDIV_SLOWDOWN_SLOWDOWN_USING_PLL BIT(22) - #define NDIV_SLOWDOWN_EN_DYNRAMP BIT(23) +#define NDIV_SLOWDOWN_SLOWDOWN_USING_PLL BIT(22) +#define NDIV_SLOWDOWN_EN_DYNRAMP BIT(23) - #define DYNRAMP_DONE_SYNCED BIT(24) +#define DYNRAMP_DONE_SYNCED BIT(24) - #define GPCPLL_DVFS2_DFS_EXT_STROBE BIT(16) +#define GPCPLL_DVFS2_DFS_EXT_STROBE BIT(16) - #define RAMP_TIMEOUT_US 500 +#define RAMP_TIMEOUT_US 500 static inline void _gpu_mask(u32 reg, u32 mask, u32 val) { u32 tmp = GPU_TRIM_SYS_GPCPLL(reg); @@ -78,12 +78,8 @@ namespace gm20b { } static void _clk_setup_slide() { - _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, - GPCPLL_CFG2_STEPA_MASK, - 0x04u << GPCPLL_CFG2_STEPA_SHIFT); - _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG3, - GPCPLL_CFG3_STEPB_MASK, - 0x05u << GPCPLL_CFG3_STEPB_SHIFT); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, GPCPLL_CFG2_STEPA_MASK, 0x04u << GPCPLL_CFG2_STEPA_SHIFT); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG3, GPCPLL_CFG3_STEPB_MASK, 0x05u << GPCPLL_CFG3_STEPB_SHIFT); } static bool _gpu_pllg_slide(u32 new_divn) { @@ -95,9 +91,7 @@ namespace gm20b { _clk_setup_slide(); - _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, - NDIV_SLOWDOWN_SLOWDOWN_USING_PLL, - NDIV_SLOWDOWN_SLOWDOWN_USING_PLL); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, NDIV_SLOWDOWN_SLOWDOWN_USING_PLL, NDIV_SLOWDOWN_SLOWDOWN_USING_PLL); _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, GPCPLL_CFG2_SDM_DIN_NEW_MASK, 0); @@ -106,9 +100,7 @@ namespace gm20b { GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF) = coeff; usleep(1); - _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, - NDIV_SLOWDOWN_EN_DYNRAMP, - NDIV_SLOWDOWN_EN_DYNRAMP); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, NDIV_SLOWDOWN_EN_DYNRAMP, NDIV_SLOWDOWN_EN_DYNRAMP); int ramp_timeout = RAMP_TIMEOUT_US; bool success = false; @@ -125,9 +117,7 @@ namespace gm20b { _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, GPCPLL_CFG2_SDM_DIN_MASK, 0); } - _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, - NDIV_SLOWDOWN_SLOWDOWN_USING_PLL | NDIV_SLOWDOWN_EN_DYNRAMP, - 0); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, NDIV_SLOWDOWN_SLOWDOWN_USING_PLL | NDIV_SLOWDOWN_EN_DYNRAMP, 0); (void)GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN); return success; @@ -137,11 +127,11 @@ namespace gm20b { if (!gpu_base) QueryMemoryMapping(&gpu_base, GPU_PA, GPU_SIZE); - const u32 osc_khz = 38400; // PLL Hz + const u32 osc_khz = 38400; // PLL Hz u32 coeff = GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF); - u32 divm = coeff & 0xFF; - u32 divp = (coeff >> 16) & 0x3F; + u32 divm = coeff & 0xFF; + u32 divp = (coeff >> 16) & 0x3F; if (divm == 0 || divp == 0) return false; @@ -149,9 +139,11 @@ namespace gm20b { u32 new_divn = (u64)khz * divm * divp * 2 / osc_khz; // L4T clamps the registers here for some reason, do that - if (new_divn < 8) new_divn = 8; - if (new_divn > 255) new_divn = 255; + if (new_divn < 8) + new_divn = 8; + if (new_divn > 255) + new_divn = 255; return _gpu_pllg_slide(new_divn); } -} \ No newline at end of file +} // namespace gm20b \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp b/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp index 4651db16..ec7726cc 100644 --- a/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include <../board/board.hpp> diff --git a/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp index 2b64c0ea..c9ad36bb 100644 --- a/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp @@ -14,35 +14,35 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include "pllmb.hpp" namespace pllmb { - #define GET_BITS(VAL, HIGH, LOW) ((VAL & ((1UL << (HIGH + 1UL)) - 1UL)) >> LOW) - #define GET_BIT(VAL, BIT) GET_BITS(VAL, BIT, BIT) +#define GET_BITS(VAL, HIGH, LOW) ((VAL & ((1UL << (HIGH + 1UL)) - 1UL)) >> LOW) +#define GET_BIT(VAL, BIT) GET_BITS(VAL, BIT, BIT) - static inline volatile u32& REG(uintptr_t addr) { - return *reinterpret_cast(addr); + static inline volatile u32 ®(uintptr_t addr) { + return *reinterpret_cast(addr); } // From jetson nano kernel typedef enum { /* divider = 2 */ - CLK_PLLX = 5, - CLK_PLLM = 2, + CLK_PLLX = 5, + CLK_PLLM = 2, CLK_PLLMB = 37, /* PLLX & PLLG are backup PLLs for CPU & GPU */ /* divider = 1 */ - CLK_CCLK_G = 18, // A57 CPU cluster - CLK_EMC = 36, - } PTO_ID; // PLL Test Output Register ID + CLK_CCLK_G = 18, // A57 CPU cluster + CLK_EMC = 36, + } PTO_ID; // PLL Test Output Register ID /* See if GM20B clock GPC PLL regs are accessible. */ - #define PLLX_MISC0 0xE4 - #define PLLM_MISC2 0x9C +#define PLLX_MISC0 0xE4 +#define PLLM_MISC2 0x9C double ptoGetMHz(PTO_ID pto_id, u32 divider = 1, u32 presel_reg = 0, u32 presel_mask = 0) { u32 pre_val, val, presel_val; @@ -71,7 +71,7 @@ namespace pllmb { REG(board::clkVirtAddr + 0x60) = val | BIT(9); usleep(500); - while(REG(board::clkVirtAddr + 0x64) & BIT(31)) + while (REG(board::clkVirtAddr + 0x64) & BIT(31)) ; val = REG(board::clkVirtAddr + 0x64); @@ -111,6 +111,6 @@ namespace pllmb { u32 pllmb = ptoGetMHz(CLK_PLLMB, 2, PLLM_MISC2, BIT(9)); u32 pllm = ptoGetMHz(CLK_PLLM, 2, PLLM_MISC2, BIT(8)); - return pllmb == 0 ? pllm : pllmb; // pllmb is zeroed out at times, fallback to pllm + return pllmb == 0 ? pllm : pllmb; // pllmb is zeroed out at times, fallback to pllm } -} \ No newline at end of file +} // namespace pllmb \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp index a6aa78f7..e65472fd 100644 --- a/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp @@ -14,15 +14,17 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include -#include #include -#include "../board/board.hpp" #include +#include + +#include "../board/board.hpp" + namespace pllmb { u64 getRamClockRatePLLMB(); diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index da944663..f6f11b06 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -526,23 +526,23 @@ #define CL_DVFS_INTR_STS_0 0x5C #define CL_DVFS_I2C_CLK_DIVISOR_REGISTER_0 0x16C -#define CLK_SOURCE_EMC 0x19c +#define CLK_SOURCE_EMC 0x19c -#define PLLC_BASE 0x080 -#define PLLM_BASE 0x090 -#define PLLP_BASE 0x0a0 -#define PLLA_BASE 0x0b0 -#define PLLU_BASE 0x0c0 -#define _PLLD_BASE 0x0d0 -#define PLLX_BASE 0x0e0 -#define PLLE_BASE 0x0e8 -#define PLLC2_BASE 0x4e8 -#define PLLC3_BASE 0x4fc -#define PLLD2_BASE 0x4b8 -#define PLLRE_BASE 0x4c4 -#define PLLC4_BASE 0x5a4 -#define PLLMB_BASE 0x5e8 -#define PLLA1_BASE 0x6a4 -#define PLLDP_BASE 0x590 +#define PLLC_BASE 0x080 +#define PLLM_BASE 0x090 +#define PLLP_BASE 0x0a0 +#define PLLA_BASE 0x0b0 +#define PLLU_BASE 0x0c0 +#define _PLLD_BASE 0x0d0 +#define PLLX_BASE 0x0e0 +#define PLLE_BASE 0x0e8 +#define PLLC2_BASE 0x4e8 +#define PLLC3_BASE 0x4fc +#define PLLD2_BASE 0x4b8 +#define PLLRE_BASE 0x4c4 +#define PLLC4_BASE 0x5a4 +#define PLLMB_BASE 0x5e8 +#define PLLA1_BASE 0x6a4 +#define PLLDP_BASE 0x590 #define OSC_HZ 38400000ULL \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.c b/Source/hoc-clk/sysmodule/src/soc/t210.c index dd92fb19..d787976f 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.c +++ b/Source/hoc-clk/sysmodule/src/soc/t210.c @@ -33,55 +33,54 @@ /*! PTO_CLK_CNT */ #define PTO_REF_CLK_WIN_CFG_MASK 0xF -#define PTO_REF_CLK_WIN_CFG_16P 0xF -#define PTO_CNT_EN BIT(9) -#define PTO_CNT_RST BIT(10) -#define PTO_CLK_ENABLE BIT(13) -#define PTO_SRC_SEL_SHIFT 14 -#define PTO_SRC_SEL_MASK 0x1FF -#define PTO_DIV_SEL_MASK (3 << 23) -#define PTO_DIV_SEL_GATED (0 << 23) -#define PTO_DIV_SEL_DIV1 (1 << 23) -#define PTO_DIV_SEL_DIV2_RISING (2 << 23) +#define PTO_REF_CLK_WIN_CFG_16P 0xF +#define PTO_CNT_EN BIT(9) +#define PTO_CNT_RST BIT(10) +#define PTO_CLK_ENABLE BIT(13) +#define PTO_SRC_SEL_SHIFT 14 +#define PTO_SRC_SEL_MASK 0x1FF +#define PTO_DIV_SEL_MASK (3 << 23) +#define PTO_DIV_SEL_GATED (0 << 23) +#define PTO_DIV_SEL_DIV1 (1 << 23) +#define PTO_DIV_SEL_DIV2_RISING (2 << 23) #define PTO_DIV_SEL_DIV2_FALLING (3 << 23) -#define PTO_DIV_SEL_CPU_EARLY (0 << 23) -#define PTO_DIV_SEL_CPU_LATE (1 << 23) +#define PTO_DIV_SEL_CPU_EARLY (0 << 23) +#define PTO_DIV_SEL_CPU_LATE (1 << 23) -#define PTO_CLK_CNT_BUSY BIT(31) -#define PTO_CLK_CNT 0xFFFFFF -#define CLK_PTO_CCLK_G_DIV2 0x13 -#define CLK_PTO_EMC 0x24 +#define PTO_CLK_CNT_BUSY BIT(31) +#define PTO_CLK_CNT 0xFFFFFF +#define CLK_PTO_CCLK_G_DIV2 0x13 +#define CLK_PTO_EMC 0x24 #define CLOCK(x) (*(volatile u32 *)(g_clk_base + (x))) /* Actmon Global registers */ -#define ACTMON_GLB_STATUS 0x0 -#define ACTMON_MCCPU_MON_ACT BIT(8) -#define ACTMON_MCALL_MON_ACT BIT(9) -#define ACTMON_CPU_FREQ_MON_ACT BIT(10) -#define ACTMON_BPMP_MON_ACT BIT(14) -#define ACTMON_CPU_MON_ACT BIT(15) +#define ACTMON_GLB_STATUS 0x0 +#define ACTMON_MCCPU_MON_ACT BIT(8) +#define ACTMON_MCALL_MON_ACT BIT(9) +#define ACTMON_CPU_FREQ_MON_ACT BIT(10) +#define ACTMON_BPMP_MON_ACT BIT(14) +#define ACTMON_CPU_MON_ACT BIT(15) -#define ACTMON_GLB_PERIOD_CTRL 0x4 -#define ACTMON_GLB_PERIOD_USEC BIT(8) +#define ACTMON_GLB_PERIOD_CTRL 0x4 +#define ACTMON_GLB_PERIOD_USEC BIT(8) #define ACTMON_GLB_PERIOD_SAMPLE(n) (((n) - 1) & 0xFF) /* Actmon Device Registers */ -#define ACTMON_DEV_SIZE 0x40 +#define ACTMON_DEV_SIZE 0x40 /* Actmon CTRL */ -#define ACTMON_DEV_CTRL_K_VAL(k) (((k) & 7) << 10) -#define ACTMON_DEV_CTRL_ENB_PERIODIC BIT(18) -#define ACTMON_DEV_CTRL_ENB BIT(31) +#define ACTMON_DEV_CTRL_K_VAL(k) (((k) & 7) << 10) +#define ACTMON_DEV_CTRL_ENB_PERIODIC BIT(18) +#define ACTMON_DEV_CTRL_ENB BIT(31) #define ACTMON_PERIOD_MS 20 #define DEV_COUNT_WEIGHT 1024 -#define ACTMON_BASE (g_act_base + 0x800) +#define ACTMON_BASE (g_act_base + 0x800) #define ACTMON_DEV_BASE (ACTMON_BASE + 0x80) #define ACTMON(x) (*(volatile u32 *)(ACTMON_BASE + (x))) -typedef enum _actmon_dev_t -{ +typedef enum _actmon_dev_t { ACTMON_DEV_CPU, ACTMON_DEV_BPMP, ACTMON_DEV_AHB, @@ -93,8 +92,7 @@ typedef enum _actmon_dev_t ACTMON_DEV_NUM, } actmon_dev_t; -typedef struct _actmon_dev_reg_t -{ +typedef struct _actmon_dev_reg_t { vu32 ctrl; vu32 upper_wnark; vu32 lower_wmark; @@ -122,8 +120,7 @@ static u32 g_emc_bw_all = 0; static u32 g_emc_bw_cpu = 0; static u32 g_emc_bw_gpu = 0; -static u32 _clock_get_dev_freq(u32 id, u32 multiplier) -{ +static u32 _clock_get_dev_freq(u32 id, u32 multiplier) { const u32 pto_win = 16; const u32 pto_osc = 32768; @@ -142,7 +139,7 @@ static u32 _clock_get_dev_freq(u32 id, u32 multiplier) CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_EN; (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); - usleep((1000000ULL * pto_win / pto_osc) + 12 + 2); // 502 us. + usleep((1000000ULL * pto_win / pto_osc) + 12 + 2); // 502 us. while (CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT_BUSY) ; @@ -158,97 +155,81 @@ static u32 _clock_get_dev_freq(u32 id, u32 multiplier) return freq_khz; } -static void _actmon_dev_enable(actmon_dev_t dev, u32 freq, u32 weight) -{ +static void _actmon_dev_enable(actmon_dev_t dev, u32 freq, u32 weight) { actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); regs->init_avg = (u32)freq * ACTMON_PERIOD_MS / 2; regs->count_weight = weight; - regs->ctrl = ACTMON_DEV_CTRL_ENB | ACTMON_DEV_CTRL_ENB_PERIODIC | ACTMON_DEV_CTRL_K_VAL(3); // 8 samples average. + regs->ctrl = ACTMON_DEV_CTRL_ENB | ACTMON_DEV_CTRL_ENB_PERIODIC | ACTMON_DEV_CTRL_K_VAL(3); // 8 samples average. } -static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) -{ +static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) { actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); return regs->avg_count; } -static inline Result _svcQueryMemoryMappingFallback(u64* virtaddr, u64 physaddr, u64 size) -{ - if(hosversionAtLeast(10,0,0)) - { +static inline Result _svcQueryMemoryMappingFallback(u64 *virtaddr, u64 physaddr, u64 size) { + if (hosversionAtLeast(10, 0, 0)) { u64 out_size; return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); - } - else - { + } else { return svcLegacyQueryIoMapping(virtaddr, physaddr, size); } } -static void _clock_update_freqs(void) -{ +static void _clock_update_freqs(void) { u64 ticks = armGetSystemTick(); - if(armTicksToNs(ticks - g_update_ticks) <= WAIT_NS) - { + if (armTicksToNs(ticks - g_update_ticks) <= WAIT_NS) { return; } g_update_ticks = ticks; - if (!g_clk_base) - { + if (!g_clk_base) { _svcQueryMemoryMappingFallback(&g_clk_base, 0x60006000ul, 0x1000); } - if(!g_clk_base) - { + if (!g_clk_base) { return; } g_mem_freq = _clock_get_dev_freq(CLK_PTO_EMC, 1); g_cpu_freq = _clock_get_dev_freq(CLK_PTO_CCLK_G_DIV2, 2); - if (!g_gpu_base) - { + if (!g_gpu_base) { _svcQueryMemoryMappingFallback(&g_gpu_base, 0x57000000ul, 0x1000000); } - if (!g_gpu_base) - { + if (!g_gpu_base) { return; } bool gpu_enabled = (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_X) & BIT(24)) && !(CLOCK(CLK_RST_CONTROLLER_RST_DEVICES_X) & BIT(24)); - if(!gpu_enabled) - { + if (!gpu_enabled) { return; } - if (!g_act_base) - { + if (!g_act_base) { _svcQueryMemoryMappingFallback(&g_act_base, 0x6000C000ul, 0x1000); } - if(!g_act_base) - { + if (!g_act_base) { return; } - + const u32 osc = 38400000; u32 coeff = GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF); u32 divm = coeff & 0xFF; - u32 divn = (coeff >> 8) & 0xFF; + u32 divn = (coeff >> 8) & 0xFF; u32 divp = (coeff >> 16) & 0x3F; g_gpu_freq = osc * divn / (divm * divp) / 2; u32 emc_freq = g_mem_freq / 1000; // Check if actmon is disabled - if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCALL_MON_ACT)) - { + if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCALL_MON_ACT)) { ACTMON(ACTMON_GLB_PERIOD_CTRL) = ACTMON_GLB_PERIOD_SAMPLE(ACTMON_PERIOD_MS); _actmon_dev_enable(ACTMON_DEV_MC_ALL, emc_freq, 256 * 4); } @@ -270,57 +251,47 @@ static void _clock_update_freqs(void) g_emc_bw_gpu = g_emc_bw_all - g_emc_bw_cpu; } - -u32 t210ClkCpuFreq(void) -{ +u32 t210ClkCpuFreq(void) { _clock_update_freqs(); return g_cpu_freq; } -u32 t210ClkMemFreq(void) -{ +u32 t210ClkMemFreq(void) { _clock_update_freqs(); return g_mem_freq; } -u32 t210ClkGpuFreq(void) -{ +u32 t210ClkGpuFreq(void) { _clock_update_freqs(); return g_gpu_freq; } -u32 t210EmcLoadAll() -{ +u32 t210EmcLoadAll() { _clock_update_freqs(); return g_emc_lall; } -u32 t210EmcLoadCpu() -{ +u32 t210EmcLoadCpu() { _clock_update_freqs(); return g_emc_lcpu; } -u32 t210EmcBwAll() -{ +u32 t210EmcBwAll() { _clock_update_freqs(); return g_emc_bw_all; } -u32 t210EmcBwCpu() -{ +u32 t210EmcBwCpu() { _clock_update_freqs(); return g_emc_bw_cpu; } -u32 t210EmcBwGpu() -{ +u32 t210EmcBwGpu() { _clock_update_freqs(); return g_emc_bw_gpu; } -u32 t210EmcBwPeak() -{ +u32 t210EmcBwPeak() { _clock_update_freqs(); return ((u64)g_mem_freq * 16) / 1000000; } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.h b/Source/hoc-clk/sysmodule/src/soc/t210.h index 895ac01e..2ad618f6 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.h +++ b/Source/hoc-clk/sysmodule/src/soc/t210.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include diff --git a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp index 460ac88f..fbf03091 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp @@ -21,67 +21,67 @@ */ #include -#include "../mapping/mem_map.hpp" + #include "../file/file_utils.hpp" -#include "tsensor_common.hpp" +#include "../mapping/mem_map.hpp" #include "aotag.hpp" +#include "tsensor_common.hpp" + namespace tsensor { - #define PMC_BASE 0x7000E400 - #define TEGRA_FUSE_CP_REV_0_3 (3) - #define FUSE_CP_REV 0x190 +#define PMC_BASE 0x7000E400 +#define TEGRA_FUSE_CP_REV_0_3 (3) +#define FUSE_CP_REV 0x190 namespace { - u64 fuseVa = 0; + u64 fuseVa = 0; bool wasInit = false; - } + } // namespace - #define REG_SET(r, mask, value) \ - ((r & ~(mask##_MASK)) | ((value<<(mask##_POS_START)) & mask##_MASK)) +#define REG_SET(r, mask, value) ((r & ~(mask##_MASK)) | ((value << (mask##_POS_START)) & mask##_MASK)) - #define REG_GET(r, mask) \ - ((r & mask##_MASK) >> mask##_POS_START) +#define REG_GET(r, mask) ((r & mask##_MASK) >> mask##_POS_START) - #define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff +#define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff static const TSensorFuse tegra_aotag_fuse = { - .fuse_base_cp_mask = 0x3ff << 11, - .fuse_base_cp_shift = 11, - .fuse_base_ft_mask = (u32)0x7ff << 21, - .fuse_base_ft_shift = 21, - .fuse_shift_ft_mask = 0x1f << 6, - .fuse_shift_ft_shift = 6, + .fuse_base_cp_mask = 0x3ff << 11, + .fuse_base_cp_shift = 11, + .fuse_base_ft_mask = (u32)0x7ff << 21, + .fuse_base_ft_shift = 21, + .fuse_shift_ft_mask = 0x1f << 6, + .fuse_shift_ft_shift = 6, .fuse_spare_realignment = 0, }; static TSensorConfig tegra_aotag_config = { - .tall = 76, - .tiddq_en = 1, - .ten_count = 16, - .pdiv = 8, - .pdiv_ate = 8, - .tsample = 9, + .tall = 76, + .tiddq_en = 1, + .ten_count = 16, + .pdiv = 8, + .pdiv_ate = 8, + .tsample = 9, .tsample_ate = 39, }; static TSensorConfig tegra210b01_aotag_config = { - .tall = 76, - .tiddq_en = 1, - .ten_count = 16, - .pdiv = 12, - .pdiv_ate = 6, - .tsample = 19, + .tall = 76, + .tiddq_en = 1, + .ten_count = 16, + .pdiv = 12, + .pdiv_ate = 6, + .tsample = 19, .tsample_ate = 39, }; static const FuseCorrCoeff tegra_aotag_coeff = { .alpha = 1063200, - .beta = -6749000, + .beta = -6749000, }; static const FuseCorrCoeff tegra210b01_aotag_coeff = { .alpha = 991100, - .beta = 1096200, + .beta = 1096200, }; struct aotag_sensor_info_t { @@ -99,32 +99,32 @@ namespace tsensor { static aotag_platform_data tegra210_plat_data = { .config = &tegra_aotag_config, - .coeff = &tegra_aotag_coeff, + .coeff = &tegra_aotag_coeff, }; static aotag_platform_data tegra210b01_plat_data = { .config = &tegra210b01_aotag_config, - .coeff = &tegra210b01_aotag_coeff, + .coeff = &tegra210b01_aotag_coeff, }; aotag_sensor_info_t aotag_sensor_info = { - .config = NULL, - .fuse = NULL, - .coeff = NULL, + .config = NULL, + .fuse = NULL, + .coeff = NULL, .therm_a = 0, .therm_b = 0, }; - aotag_sensor_info_t *info = &aotag_sensor_info; + aotag_sensor_info_t *info = &aotag_sensor_info; aotag_platform_data *pdata = NULL; u32 ReadPmcReg(unsigned long offset) { SecmonArgs args = {}; - args.X[0] = 0xF0000002; - args.X[1] = PMC_BASE + offset; + args.X[0] = 0xF0000002; + args.X[1] = PMC_BASE + offset; svcCallSecureMonitor(&args); - if (args.X[1] == (PMC_BASE + offset)) { // if param 1 is identical read failed + if (args.X[1] == (PMC_BASE + offset)) { // if param 1 is identical read failed return 0; } @@ -133,21 +133,21 @@ namespace tsensor { void WritePmcReg(u32 value, unsigned long offset) { SecmonArgs args = {}; - args.X[0] = 0xF0000002; - args.X[1] = PMC_BASE + offset; - args.X[2] = 0xFFFFFFFF; - args.X[3] = (value); + args.X[0] = 0xF0000002; + args.X[1] = PMC_BASE + offset; + args.X[2] = 0xFFFFFFFF; + args.X[3] = (value); svcCallSecureMonitor(&args); } static inline void SetBit(unsigned long nr, volatile void *addr) { - int *m = ((int *) addr) + (nr >> 5); - *m |= 1 << (nr & 31); + int *m = ((int *)addr) + (nr >> 5); + *m |= 1 << (nr & 31); } static inline void ClearBit(unsigned long nr, volatile void *addr) { - int *m = ((int *) addr) + (nr >> 5); - *m &= ~(1 << (nr & 31)); + int *m = ((int *)addr) + (nr >> 5); + *m &= ~(1 << (nr & 31)); } void InitializeAotag(bool isMariko) { @@ -156,7 +156,7 @@ namespace tsensor { if (isMariko) { // u32 major, minor, rev; - pdata = &tegra210b01_plat_data; + pdata = &tegra210b01_plat_data; info->config = &tegra210b01_aotag_config; // tegra_fuse_readl(FUSE_CP_REV, &rev); // minor = rev & 0x1f; @@ -166,10 +166,10 @@ namespace tsensor { // } } else { info->config = &tegra_aotag_config; - pdata = &tegra210_plat_data; + pdata = &tegra210_plat_data; } - info->fuse = &tegra_aotag_fuse; + info->fuse = &tegra_aotag_fuse; info->coeff = pdata->coeff; aotag_sensor_info_t *ps_info = &aotag_sensor_info; @@ -215,18 +215,18 @@ namespace tsensor { } u32 regval = 0, abs = 0, fraction = 0, valid = 0, sign = 0; - s32 temp = 0; - regval = ReadPmcReg(PMC_TSENSOR_STATUS1); - valid = REG_GET(regval, STATUS1_TEMP_VALID); + s32 temp = 0; + regval = ReadPmcReg(PMC_TSENSOR_STATUS1); + valid = REG_GET(regval, STATUS1_TEMP_VALID); if (!valid) { return -125; } - abs = REG_GET(regval, STATUS1_TEMP_ABS); + abs = REG_GET(regval, STATUS1_TEMP_ABS); fraction = REG_GET(regval, STATUS1_TEMP_FRAC); - sign = REG_GET(regval, STATUS1_TEMP_SIGN); - temp = (abs * 1000) + (fraction * 500); + sign = REG_GET(regval, STATUS1_TEMP_SIGN); + temp = (abs * 1000) + (fraction * 500); if (sign) { temp = (-1) * (temp); } @@ -238,4 +238,4 @@ namespace tsensor { return wasInit; } -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp b/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp index 6c9eff38..f2a2c0eb 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp @@ -21,136 +21,118 @@ namespace tsensor { - #define MASK(start, end) \ - (((0xFFFFFFFF)< + +#include "../board/board.hpp" #include "../i2c/i2cDrv.h" + namespace bq24193 { - #define BQ24193_I2C_ADDR 0x6B +#define BQ24193_I2C_ADDR 0x6B - // REG 0 masks. - #define BQ24193_INCONFIG_INLIMIT_MASK (7<<0) - #define BQ24193_INCONFIG_VINDPM_MASK 0x78 - #define BQ24193_INCONFIG_HIZ_EN_MASK (1<<7) +// REG 0 masks. +#define BQ24193_INCONFIG_INLIMIT_MASK (7 << 0) +#define BQ24193_INCONFIG_VINDPM_MASK 0x78 +#define BQ24193_INCONFIG_HIZ_EN_MASK (1 << 7) - // REG 1 masks. - #define BQ24193_PORCONFIG_BOOST_MASK (1<<0) - #define BQ24193_PORCONFIG_SYSMIN_MASK (7<<1) // 3000uV HOS default. - #define BQ24193_PORCONFIG_CHGCONFIG_MASK (3<<4) - #define BQ24193_PORCONFIG_CHGCONFIG_CHARGER_EN (1<<4) - #define BQ24193_PORCONFIG_I2CWATCHDOG_MASK (1<<6) - #define BQ24193_PORCONFIG_RESET_MASK (1<<7) +// REG 1 masks. +#define BQ24193_PORCONFIG_BOOST_MASK (1 << 0) +#define BQ24193_PORCONFIG_SYSMIN_MASK (7 << 1) // 3000uV HOS default. +#define BQ24193_PORCONFIG_CHGCONFIG_MASK (3 << 4) +#define BQ24193_PORCONFIG_CHGCONFIG_CHARGER_EN (1 << 4) +#define BQ24193_PORCONFIG_I2CWATCHDOG_MASK (1 << 6) +#define BQ24193_PORCONFIG_RESET_MASK (1 << 7) - // REG 2 masks. - #define BQ24193_CHRGCURR_20PCT_MASK (1<<0) - #define BQ24193_CHRGCURR_ICHG_MASK 0xFC +// REG 2 masks. +#define BQ24193_CHRGCURR_20PCT_MASK (1 << 0) +#define BQ24193_CHRGCURR_ICHG_MASK 0xFC - // REG 3 masks. - #define BQ24193_PRECHRG_ITERM 0x0F - #define BQ24193_PRECHRG_IPRECHG 0xF0 +// REG 3 masks. +#define BQ24193_PRECHRG_ITERM 0x0F +#define BQ24193_PRECHRG_IPRECHG 0xF0 - // REG 4 masks. - #define BQ24193_CHRGVOLT_VTHRES (1<<0) - #define BQ24193_CHRGVOLT_BATTLOW (1<<1) - #define BQ24193_CHRGVOLT_VREG 0xFC +// REG 4 masks. +#define BQ24193_CHRGVOLT_VTHRES (1 << 0) +#define BQ24193_CHRGVOLT_BATTLOW (1 << 1) +#define BQ24193_CHRGVOLT_VREG 0xFC - // REG 5 masks. - #define BQ24193_CHRGTERM_ISET_MASK (1<<0) - #define BQ24193_CHRGTERM_CHGTIMER_MASK (3<<1) - #define BQ24193_CHRGTERM_ENTIMER_MASK (1<<3) - #define BQ24193_CHRGTERM_WATCHDOG_MASK (3<<4) - #define BQ24193_CHRGTERM_TERM_ST_MASK (1<<6) - #define BQ24193_CHRGTERM_TERM_EN_MASK (1<<7) +// REG 5 masks. +#define BQ24193_CHRGTERM_ISET_MASK (1 << 0) +#define BQ24193_CHRGTERM_CHGTIMER_MASK (3 << 1) +#define BQ24193_CHRGTERM_ENTIMER_MASK (1 << 3) +#define BQ24193_CHRGTERM_WATCHDOG_MASK (3 << 4) +#define BQ24193_CHRGTERM_TERM_ST_MASK (1 << 6) +#define BQ24193_CHRGTERM_TERM_EN_MASK (1 << 7) - // REG 6 masks. - #define BQ24193_IRTHERMAL_THERM_MASK (3<<0) - #define BQ24193_IRTHERMAL_VCLAMP_MASK (7<<2) - #define BQ24193_IRTHERMAL_BATTCOMP_MASK (7<<5) +// REG 6 masks. +#define BQ24193_IRTHERMAL_THERM_MASK (3 << 0) +#define BQ24193_IRTHERMAL_VCLAMP_MASK (7 << 2) +#define BQ24193_IRTHERMAL_BATTCOMP_MASK (7 << 5) - // REG 7 masks. - #define BQ24193_MISC_INT_MASK (3<<0) - #define BQ24193_MISC_VSET_MASK (1<<4) - #define BQ24193_MISC_BATFET_DI_MASK (1<<5) - #define BQ24193_MISC_TMR2X_EN_MASK (1<<6) - #define BQ24193_MISC_DPDM_EN_MASK (1<<7) +// REG 7 masks. +#define BQ24193_MISC_INT_MASK (3 << 0) +#define BQ24193_MISC_VSET_MASK (1 << 4) +#define BQ24193_MISC_BATFET_DI_MASK (1 << 5) +#define BQ24193_MISC_TMR2X_EN_MASK (1 << 6) +#define BQ24193_MISC_DPDM_EN_MASK (1 << 7) - // REG 8 masks. - #define BQ24193_STATUS_VSYS_MASK (1<<0) - #define BQ24193_STATUS_THERM_MASK (1<<1) - #define BQ24193_STATUS_PG_MASK (1<<2) - #define BQ24193_STATUS_DPM_MASK (1<<3) - #define BQ24193_STATUS_CHRG_MASK (3<<4) - #define BQ24193_STATUS_VBUS_MASK (3<<6) +// REG 8 masks. +#define BQ24193_STATUS_VSYS_MASK (1 << 0) +#define BQ24193_STATUS_THERM_MASK (1 << 1) +#define BQ24193_STATUS_PG_MASK (1 << 2) +#define BQ24193_STATUS_DPM_MASK (1 << 3) +#define BQ24193_STATUS_CHRG_MASK (3 << 4) +#define BQ24193_STATUS_VBUS_MASK (3 << 6) - // REG 9 masks. - #define BQ24193_FAULT_THERM_MASK (7<<0) - #define BQ24193_FAULT_BATT_OVP_MASK (1<<3) - #define BQ24193_FAULT_CHARGE_MASK (3<<4) - #define BQ24193_FAULT_BOOST_MASK (1<<6) - #define BQ24193_FAULT_WATCHDOG_MASK (1<<7) +// REG 9 masks. +#define BQ24193_FAULT_THERM_MASK (7 << 0) +#define BQ24193_FAULT_BATT_OVP_MASK (1 << 3) +#define BQ24193_FAULT_CHARGE_MASK (3 << 4) +#define BQ24193_FAULT_BOOST_MASK (1 << 6) +#define BQ24193_FAULT_WATCHDOG_MASK (1 << 7) - // REG A masks. - #define BQ24193_VENDORPART_DEV_MASK (3<<0) - #define BQ24193_VENDORPART_PN_MASK (7<<3) +// REG A masks. +#define BQ24193_VENDORPART_DEV_MASK (3 << 0) +#define BQ24193_VENDORPART_PN_MASK (7 << 3) enum BQ24193_reg { - BQ24193_InputSource = 0x00, - BQ24193_PORConfig = 0x01, - BQ24193_ChrgCurr = 0x02, - BQ24193_PreChrgTerm = 0x03, - BQ24193_ChrgVolt = 0x04, - BQ24193_ChrgTermTimer = 0x05, - BQ24193_IRCompThermal = 0x06, - BQ24193_Misc = 0x07, - BQ24193_Status = 0x08, - BQ24193_FaultReg = 0x09, - BQ24193_VendorPart = 0x0A, + BQ24193_InputSource = 0x00, + BQ24193_PORConfig = 0x01, + BQ24193_ChrgCurr = 0x02, + BQ24193_PreChrgTerm = 0x03, + BQ24193_ChrgVolt = 0x04, + BQ24193_ChrgTermTimer = 0x05, + BQ24193_IRCompThermal = 0x06, + BQ24193_Misc = 0x07, + BQ24193_Status = 0x08, + BQ24193_FaultReg = 0x09, + BQ24193_VendorPart = 0x0A, }; enum BQ24193_reg_prop { - BQ24193_InputVoltageLimit, // REG 0. - BQ24193_InputCurrentLimit, // REG 0. - BQ24193_SystemMinimumVoltage, // REG 1. - BQ24193_FastChargeCurrentLimit, // REG 2. - BQ24193_ChargeVoltageLimit, // REG 4. - BQ24193_RechargeThreshold, // REG 4. - BQ24193_ThermalRegulation, // REG 6. - BQ24193_ChargeStatus, // REG 8. - BQ24193_TempStatus, // REG 9. - BQ24193_DevID, // REG A. - BQ24193_ProductNumber, // REG A. + BQ24193_InputVoltageLimit, // REG 0. + BQ24193_InputCurrentLimit, // REG 0. + BQ24193_SystemMinimumVoltage, // REG 1. + BQ24193_FastChargeCurrentLimit, // REG 2. + BQ24193_ChargeVoltageLimit, // REG 4. + BQ24193_RechargeThreshold, // REG 4. + BQ24193_ThermalRegulation, // REG 6. + BQ24193_ChargeStatus, // REG 8. + BQ24193_TempStatus, // REG 9. + BQ24193_DevID, // REG A. + BQ24193_ProductNumber, // REG A. }; - // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot. + // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot. enum BQ24193_Temp { BQ24193_Temp_Normal = 0, BQ24193_Temp_Warm = 2, @@ -125,5 +127,4 @@ namespace bq24193 { BQ24193_Temp_Hot = 6, }; u8 getBQTemp(); -} - +} // namespace bq24193 diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index 29353733..6a053f46 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -20,169 +20,171 @@ * */ -#include #include +#include + #include "../board/board.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "soctherm.hpp" #include "tsensor_common.hpp" + namespace tsensor { namespace { - #define CAR_CLK_SOURCE_TSENSOR 0x3B8 - #define CAR_CLK_OUT_ENB_V 0x360 +#define CAR_CLK_SOURCE_TSENSOR 0x3B8 +#define CAR_CLK_OUT_ENB_V 0x360 - #define CLK_RST_CONTROLLER_RST_DEVICES 0xC - #define SWR_SOC_THERM_RST 1 << 14 +#define CLK_RST_CONTROLLER_RST_DEVICES 0xC +#define SWR_SOC_THERM_RST 1 << 14 - #define CLK_RST_CONTROLLER_CLK_OUT_ENB 0x18 - #define CLK_ENB_SOC_THERM 1 << 14 +#define CLK_RST_CONTROLLER_CLK_OUT_ENB 0x18 +#define CLK_ENB_SOC_THERM 1 << 14 - #define CAR_CLK_SOURCE_TSENSOR_VAL 0x8000005E +#define CAR_CLK_SOURCE_TSENSOR_VAL 0x8000005E - #define THERMCTL_LEVEL0_GROUP_CPU 0x0 - #define THERMCTL_LEVEL0_GROUP_GPU 0x4 - #define THERMCTL_LEVEL0_GROUP_MEM 0x8 - #define THERMCTL_LEVEL0_GROUP_TSENSE 0xc +#define THERMCTL_LEVEL0_GROUP_CPU 0x0 +#define THERMCTL_LEVEL0_GROUP_GPU 0x4 +#define THERMCTL_LEVEL0_GROUP_MEM 0x8 +#define THERMCTL_LEVEL0_GROUP_TSENSE 0xc - #define TEGRA124_SOCTHERM_SENSOR_CPU 0 - #define TEGRA124_SOCTHERM_SENSOR_MEM 1 - #define TEGRA124_SOCTHERM_SENSOR_GPU 2 - #define TEGRA124_SOCTHERM_SENSOR_PLLX 3 - #define TEGRA124_SOCTHERM_SENSOR_NUM 4 +#define TEGRA124_SOCTHERM_SENSOR_CPU 0 +#define TEGRA124_SOCTHERM_SENSOR_MEM 1 +#define TEGRA124_SOCTHERM_SENSOR_GPU 2 +#define TEGRA124_SOCTHERM_SENSOR_PLLX 3 +#define TEGRA124_SOCTHERM_SENSOR_NUM 4 - #define TEGRA_SOCTHERM_THROT_LEVEL_NONE 0 - #define TEGRA_SOCTHERM_THROT_LEVEL_LOW 1 - #define TEGRA_SOCTHERM_THROT_LEVEL_MED 2 - #define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 3 +#define TEGRA_SOCTHERM_THROT_LEVEL_NONE 0 +#define TEGRA_SOCTHERM_THROT_LEVEL_LOW 1 +#define TEGRA_SOCTHERM_THROT_LEVEL_MED 2 +#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 3 - #define SENSOR_CONFIG2 8 - #define SENSOR_CONFIG2_THERMA_MASK (0xffffu << 16) - #define SENSOR_CONFIG2_THERMB_MASK 0xffff +#define SENSOR_CONFIG2 8 +#define SENSOR_CONFIG2_THERMA_MASK (0xffffu << 16) +#define SENSOR_CONFIG2_THERMB_MASK 0xffff - #define THERMCTL_THERMTRIP_CTL 0x80 +#define THERMCTL_THERMTRIP_CTL 0x80 - #define SENSOR_PDIV 0x1c0 - #define SENSOR_PDIV_CPU_MASK (0xf << 12) - #define SENSOR_PDIV_GPU_MASK (0xf << 8) - #define SENSOR_PDIV_MEM_MASK (0xf << 4) - #define SENSOR_PDIV_PLLX_MASK (0xf << 0) +#define SENSOR_PDIV 0x1c0 +#define SENSOR_PDIV_CPU_MASK (0xf << 12) +#define SENSOR_PDIV_GPU_MASK (0xf << 8) +#define SENSOR_PDIV_MEM_MASK (0xf << 4) +#define SENSOR_PDIV_PLLX_MASK (0xf << 0) - #define SENSOR_HOTSPOT_OFF 0x1c4 - #define SENSOR_HOTSPOT_CPU_MASK (0xff << 16) - #define SENSOR_HOTSPOT_GPU_MASK (0xff << 8) - #define SENSOR_HOTSPOT_MEM_MASK (0xff << 0) +#define SENSOR_HOTSPOT_OFF 0x1c4 +#define SENSOR_HOTSPOT_CPU_MASK (0xff << 16) +#define SENSOR_HOTSPOT_GPU_MASK (0xff << 8) +#define SENSOR_HOTSPOT_MEM_MASK (0xff << 0) - #define SENSOR_HW_PLLX_OFFSET_EN 0x1e4 - #define SENSOR_HW_PLLX_OFFSET_MEM_EN_MASK BIT(2) - #define SENSOR_HW_PLLX_OFFSET_CPU_EN_MASK BIT(1) - #define SENSOR_HW_PLLX_OFFSET_GPU_EN_MASK BIT(0) +#define SENSOR_HW_PLLX_OFFSET_EN 0x1e4 +#define SENSOR_HW_PLLX_OFFSET_MEM_EN_MASK BIT(2) +#define SENSOR_HW_PLLX_OFFSET_CPU_EN_MASK BIT(1) +#define SENSOR_HW_PLLX_OFFSET_GPU_EN_MASK BIT(0) - #define SENSOR_HW_PLLX_OFFSET_MIN 0x1e8 - #define SENSOR_HW_PLLX_OFFSET_MAX 0x1ec - #define SENSOR_HW_PLLX_OFFSET_MEM_MASK (0xff << 16) - #define SENSOR_HW_PLLX_OFFSET_GPU_MASK (0xff << 8) - #define SENSOR_HW_PLLX_OFFSET_CPU_MASK (0xff << 0) +#define SENSOR_HW_PLLX_OFFSET_MIN 0x1e8 +#define SENSOR_HW_PLLX_OFFSET_MAX 0x1ec +#define SENSOR_HW_PLLX_OFFSET_MEM_MASK (0xff << 16) +#define SENSOR_HW_PLLX_OFFSET_GPU_MASK (0xff << 8) +#define SENSOR_HW_PLLX_OFFSET_CPU_MASK (0xff << 0) - #define SENSOR_TEMP1 0x1c8 - #define SENSOR_TEMP1_CPU_TEMP_MASK (0xffffu << 16) - #define SENSOR_TEMP1_GPU_TEMP_MASK 0xffff - #define SENSOR_TEMP2 0x1cc - #define SENSOR_TEMP2_MEM_TEMP_MASK (0xffffu << 16) - #define SENSOR_TEMP2_PLLX_TEMP_MASK 0xffff +#define SENSOR_TEMP1 0x1c8 +#define SENSOR_TEMP1_CPU_TEMP_MASK (0xffffu << 16) +#define SENSOR_TEMP1_GPU_TEMP_MASK 0xffff +#define SENSOR_TEMP2 0x1cc +#define SENSOR_TEMP2_MEM_TEMP_MASK (0xffffu << 16) +#define SENSOR_TEMP2_PLLX_TEMP_MASK 0xffff - #define SENSOR_VALID 0x1e0 - #define SENSOR_GPU_VALID_MASK BIT(9) - #define SENSOR_CPU_VALID_MASK 0xf - #define SENSOR_MEM_VALID_MASK (0x3 << 10) +#define SENSOR_VALID 0x1e0 +#define SENSOR_GPU_VALID_MASK BIT(9) +#define SENSOR_CPU_VALID_MASK 0xf +#define SENSOR_MEM_VALID_MASK (0x3 << 10) - #define TEGRA210_THERMTRIP_ANY_EN_MASK (0x1u << 31) - #define TEGRA210_THERMTRIP_MEM_EN_MASK (0x1 << 30) - #define TEGRA210_THERMTRIP_GPU_EN_MASK (0x1 << 29) - #define TEGRA210_THERMTRIP_CPU_EN_MASK (0x1 << 28) - #define TEGRA210_THERMTRIP_TSENSE_EN_MASK (0x1 << 27) - #define TEGRA210_THERMTRIP_GPUMEM_THRESH_MASK (0x1ff << 18) - #define TEGRA210_THERMTRIP_CPU_THRESH_MASK (0x1ff << 9) - #define TEGRA210_THERMTRIP_TSENSE_THRESH_MASK 0x1ff +#define TEGRA210_THERMTRIP_ANY_EN_MASK (0x1u << 31) +#define TEGRA210_THERMTRIP_MEM_EN_MASK (0x1 << 30) +#define TEGRA210_THERMTRIP_GPU_EN_MASK (0x1 << 29) +#define TEGRA210_THERMTRIP_CPU_EN_MASK (0x1 << 28) +#define TEGRA210_THERMTRIP_TSENSE_EN_MASK (0x1 << 27) +#define TEGRA210_THERMTRIP_GPUMEM_THRESH_MASK (0x1ff << 18) +#define TEGRA210_THERMTRIP_CPU_THRESH_MASK (0x1ff << 9) +#define TEGRA210_THERMTRIP_TSENSE_THRESH_MASK 0x1ff - #define TEGRA210_THERM_IRQ_MEM_MASK (0x3 << 24) - #define TEGRA210_THERM_IRQ_GPU_MASK (0x3 << 16) - #define TEGRA210_THERM_IRQ_CPU_MASK (0x3 << 8) - #define TEGRA210_THERM_IRQ_TSENSE_MASK (0x3 << 0) +#define TEGRA210_THERM_IRQ_MEM_MASK (0x3 << 24) +#define TEGRA210_THERM_IRQ_GPU_MASK (0x3 << 16) +#define TEGRA210_THERM_IRQ_CPU_MASK (0x3 << 8) +#define TEGRA210_THERM_IRQ_TSENSE_MASK (0x3 << 0) - #define TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK (0x1ff << 18) - #define TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK (0x1ff << 9) +#define TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK (0x1ff << 18) +#define TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK (0x1ff << 9) - #define TEGRA210_THRESH_GRAIN 500 - #define TEGRA210_BPTT 9 +#define TEGRA210_THRESH_GRAIN 500 +#define TEGRA210_BPTT 9 - #define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff +#define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff - #define SENSOR_CONFIG0 0 - #define SENSOR_CONFIG0_STOP BIT(0) - #define SENSOR_CONFIG0_CPTR_OVER BIT(2) - #define SENSOR_CONFIG0_OVER BIT(3) - #define SENSOR_CONFIG0_TCALC_OVER BIT(4) - #define SENSOR_CONFIG0_TALL_MASK (0xfffff << 8) - #define SENSOR_CONFIG0_TALL_SHIFT 8 +#define SENSOR_CONFIG0 0 +#define SENSOR_CONFIG0_STOP BIT(0) +#define SENSOR_CONFIG0_CPTR_OVER BIT(2) +#define SENSOR_CONFIG0_OVER BIT(3) +#define SENSOR_CONFIG0_TCALC_OVER BIT(4) +#define SENSOR_CONFIG0_TALL_MASK (0xfffff << 8) +#define SENSOR_CONFIG0_TALL_SHIFT 8 - #define PDIV_RATE_T210B0 0xCC0C - #define PDIV_RATE_T210 0x8888 - #define HOTSPOT_VAL 0xA0500 +#define PDIV_RATE_T210B0 0xCC0C +#define PDIV_RATE_T210 0x8888 +#define HOTSPOT_VAL 0xA0500 - #define SENSOR_CONFIG1 4 - #define SENSOR_CONFIG1_TSAMPLE_MASK 0x3ff - #define SENSOR_CONFIG1_TSAMPLE_SHIFT 0 - #define SENSOR_CONFIG1_TIDDQ_EN_MASK (0x3f << 15) - #define SENSOR_CONFIG1_TIDDQ_EN_SHIFT 15 - #define SENSOR_CONFIG1_TEN_COUNT_MASK (0x3f << 24) - #define SENSOR_CONFIG1_TEN_COUNT_SHIFT 24 - #define SENSOR_CONFIG1_TEMP_ENABLE BIT(31) +#define SENSOR_CONFIG1 4 +#define SENSOR_CONFIG1_TSAMPLE_MASK 0x3ff +#define SENSOR_CONFIG1_TSAMPLE_SHIFT 0 +#define SENSOR_CONFIG1_TIDDQ_EN_MASK (0x3f << 15) +#define SENSOR_CONFIG1_TIDDQ_EN_SHIFT 15 +#define SENSOR_CONFIG1_TEN_COUNT_MASK (0x3f << 24) +#define SENSOR_CONFIG1_TEN_COUNT_SHIFT 24 +#define SENSOR_CONFIG1_TEMP_ENABLE BIT(31) - #define READBACK_VALUE_MASK 0xff00 - #define READBACK_VALUE_SHIFT 8 - #define READBACK_ADD_HALF BIT(7) - #define READBACK_NEGATE BIT(0) +#define READBACK_VALUE_MASK 0xff00 +#define READBACK_VALUE_SHIFT 8 +#define READBACK_ADD_HALF BIT(7) +#define READBACK_NEGATE BIT(0) - #define PDIV_MASK_T210B0 0xFFFF00F0 - #define HOTSPOT_MASK_T210B0 0xFF0000FF +#define PDIV_MASK_T210B0 0xFFFF00F0 +#define HOTSPOT_MASK_T210B0 0xFF0000FF - #define PDIV_MASK_T210 0xFFFF0000 - #define HOTSPOT_MASK_T210 0xFF000000 +#define PDIV_MASK_T210 0xFFFF0000 +#define HOTSPOT_MASK_T210 0xFF000000 - #define TSENSOR_TSENSOR_CLKEN 0x1DC - #define TSENSOR_TSENSOR_ENABLE 225 +#define TSENSOR_TSENSOR_CLKEN 0x1DC +#define TSENSOR_TSENSOR_ENABLE 225 const TSensorFuse tfuse = { - .fuse_base_cp_mask = 0x3ff << 11, - .fuse_base_cp_shift = 11, - .fuse_base_ft_mask = 0x7ffu << 21, - .fuse_base_ft_shift = 21, - .fuse_shift_ft_mask = 0x1f << 6, - .fuse_shift_ft_shift = 6, + .fuse_base_cp_mask = 0x3ff << 11, + .fuse_base_cp_shift = 11, + .fuse_base_ft_mask = 0x7ffu << 21, + .fuse_base_ft_shift = 21, + .fuse_shift_ft_mask = 0x1f << 6, + .fuse_shift_ft_shift = 6, .fuse_spare_realignment = 0, }; const TSensorConfig eristaConf = { - .tall = 16300, - .tiddq_en = 1, - .ten_count = 1, - .pdiv = 8, - .pdiv_ate = 8, - .tsample = 120, + .tall = 16300, + .tiddq_en = 1, + .ten_count = 1, + .pdiv = 8, + .pdiv_ate = 8, + .tsample = 120, .tsample_ate = 480, }; const TSensorConfig marikoConf = { - .tall = 16300, - .tiddq_en = 1, - .ten_count = 1, - .pdiv = 12, - .pdiv_ate = 6, - .tsample = 240, + .tall = 16300, + .tiddq_en = 1, + .ten_count = 1, + .pdiv = 12, + .pdiv_ate = 6, + .tsample = 240, .tsample_ate = 480, }; @@ -409,10 +411,11 @@ namespace tsensor { u32 calib[SocthermTSensor_EnumMax] = {}; u64 socthermVa, carVa, fuseVa; bool isMariko; - } + } // namespace bool IsDisabledThroughSleep() { - return (ReadReg(carVa, CLK_RST_CONTROLLER_RST_DEVICES) & SWR_SOC_THERM_RST) || !(ReadReg(carVa, CLK_RST_CONTROLLER_CLK_OUT_ENB) & CLK_ENB_SOC_THERM); + return (ReadReg(carVa, CLK_RST_CONTROLLER_RST_DEVICES) & SWR_SOC_THERM_RST) || + !(ReadReg(carVa, CLK_RST_CONTROLLER_CLK_OUT_ENB) & CLK_ENB_SOC_THERM); } bool IsSensorEnabled() { @@ -454,14 +457,14 @@ namespace tsensor { EnableSensor(&marikoTSensors[i], i); } - pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210B0) | PDIV_RATE_T210B0; + pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210B0) | PDIV_RATE_T210B0; hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210B0) | HOTSPOT_VAL; } else { for (u32 i = 0; i < std::size(eristaTSensors); ++i) { EnableSensor(&eristaTSensors[i], i); } - pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210) | PDIV_RATE_T210; + pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210) | PDIV_RATE_T210; hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210) | HOTSPOT_VAL; } @@ -479,8 +482,8 @@ namespace tsensor { StartSensors(); } - temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); - temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); + temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); + temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); temps.pllx = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) & SENSOR_TEMP2_PLLX_TEMP_MASK); if (board::GetSocType() == HocClkSocType_Erista) { @@ -495,8 +498,8 @@ namespace tsensor { constexpr u64 SocthermPa = 0x700E2000, FusePa = 0x7000F000, CarPa = 0x60006000; R_UNLESS(MapAddress(socthermVa, SocthermPa, "soctherm")); - R_UNLESS(MapAddress( fuseVa, FusePa, "fuse")); - R_UNLESS(MapAddress( carVa, CarPa, "car")); + R_UNLESS(MapAddress(fuseVa, FusePa, "fuse")); + R_UNLESS(MapAddress(carVa, CarPa, "car")); WriteReg(carVa, CAR_CLK_SOURCE_TSENSOR, CAR_CLK_SOURCE_TSENSOR_VAL); SetBits(carVa, CAR_CLK_OUT_ENB_V, 0x10); @@ -507,11 +510,13 @@ namespace tsensor { if (isMariko) { for (u32 i = 0; i < std::size(marikoTSensors); ++i) { - CalcTSensorCalib(marikoTSensors[i].config, &sharedCal, &marikoTSensors[i].fuse_corr, &calib[i], marikoTSensors[i].calib_fuse_offset, fuseVa); + CalcTSensorCalib(marikoTSensors[i].config, &sharedCal, &marikoTSensors[i].fuse_corr, &calib[i], marikoTSensors[i].calib_fuse_offset, + fuseVa); } } else { for (u32 i = 0; i < std::size(eristaTSensors); ++i) { - CalcTSensorCalib(eristaTSensors[i].config, &sharedCal, &eristaTSensors[i].fuse_corr, &calib[i], eristaTSensors[i].calib_fuse_offset, fuseVa); + CalcTSensorCalib(eristaTSensors[i].config, &sharedCal, &eristaTSensors[i].fuse_corr, &calib[i], eristaTSensors[i].calib_fuse_offset, + fuseVa); } } @@ -520,4 +525,4 @@ namespace tsensor { fileUtils::LogLine("[Soctherm] Finished init."); } -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp index 02a292c9..df7a6f66 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp @@ -22,20 +22,21 @@ #pragma once -#include #include +#include + namespace tsensor { enum SocthermTSensor : u32 { - SocthermTSensor_CPU0 = 0, - SocthermTSensor_CPU1 = 1, - SocthermTSensor_CPU2 = 2, - SocthermTSensor_CPU3 = 3, - SocthermTSensor_GPU = 4, - SocthermTSensor_PLLX = 5, - SocthermTSensor_MEM0 = 6, - SocthermTSensor_MEM1 = 7, + SocthermTSensor_CPU0 = 0, + SocthermTSensor_CPU1 = 1, + SocthermTSensor_CPU2 = 2, + SocthermTSensor_CPU3 = 3, + SocthermTSensor_GPU = 4, + SocthermTSensor_PLLX = 5, + SocthermTSensor_MEM0 = 6, + SocthermTSensor_MEM1 = 7, SocthermTSensor_EnumMax = 8, }; @@ -49,4 +50,4 @@ namespace tsensor { void InitializeSoctherm(); void ReadTSensors(TSensorTemps &temps); -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp index 38bcb33b..85c43bdd 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp @@ -23,8 +23,10 @@ */ #include + #include "tsensor_common.hpp" + namespace tsensor { static s64 div64_s64(s64 dividend, s64 divisor) { @@ -42,7 +44,7 @@ namespace tsensor { static s32 sign_extend32(u32 value, int index) { u8 shift = 31 - index; - return (s32) (value << shift) >> shift; + return (s32)(value << shift) >> shift; } void CalcSharedCal(const TSensorFuse *tfuse, TSensorSharedCalib *shared, u64 fuseVa) { @@ -70,11 +72,11 @@ namespace tsensor { } void CalcTSensorCalib(const TSensorConfig *cfg, TSensorSharedCalib *shared, const FuseCorrCoeff *corr, u32 *calibration, u32 offset, u64 fuseVa) { - #define FUSE_TSENSOR_CALIB_FT_TS_BASE_SHIFT 13 - #define FUSE_TSENSOR_CALIB_FT_TS_BASE_MASK (0x1fff << 13) - #define CALIB_COEFFICIENT 1000000LL - #define SENSOR_CONFIG2_THERMA_SHIFT 16 - #define SENSOR_CONFIG2_THERMB_SHIFT 0 +#define FUSE_TSENSOR_CALIB_FT_TS_BASE_SHIFT 13 +#define FUSE_TSENSOR_CALIB_FT_TS_BASE_MASK (0x1fff << 13) +#define CALIB_COEFFICIENT 1000000LL +#define SENSOR_CONFIG2_THERMA_SHIFT 16 +#define SENSOR_CONFIG2_THERMB_SHIFT 0 u32 val, calib; s32 actual_tsensor_ft, actual_tsensor_cp; @@ -112,4 +114,4 @@ namespace tsensor { *calibration = calib; } -} \ No newline at end of file +} // namespace tsensor \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp index f219d761..a9bc8b99 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp @@ -26,8 +26,8 @@ namespace tsensor { - #define FUSE_TSENSOR_COMMON 0xA80 - #define FUSE_OFFSET 0x800 +#define FUSE_TSENSOR_COMMON 0xA80 +#define FUSE_OFFSET 0x800 struct TSensorConfig { u32 tall; @@ -96,27 +96,23 @@ namespace tsensor { u32 actual_temp_ft; }; - template - static inline T ReadReg(u64 base, u32 offset) { - return *reinterpret_cast(base + offset); + template static inline T ReadReg(u64 base, u32 offset) { + return *reinterpret_cast(base + offset); } - template - static inline void WriteReg(u64 base, u32 offset, T value) { - *reinterpret_cast(base + offset) = value; + template static inline void WriteReg(u64 base, u32 offset, T value) { + *reinterpret_cast(base + offset) = value; } - template - static inline void SetBits(u64 base, u32 offset, T mask) { + template static inline void SetBits(u64 base, u32 offset, T mask) { WriteReg(base, offset, ReadReg(base, offset) | mask); } - template - static inline void ClearBits(u64 base, u32 offset, T mask) { + template static inline void ClearBits(u64 base, u32 offset, T mask) { WriteReg(base, offset, ReadReg(base, offset) & ~mask); } void CalcSharedCal(const TSensorFuse *tfuse, TSensorSharedCalib *shared, u64 fuseVa); void CalcTSensorCalib(const TSensorConfig *cfg, TSensorSharedCalib *shared, const FuseCorrCoeff *corr, u32 *calibration, u32 offset, u64 fuseVa); -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/util/crc32.cpp b/Source/hoc-clk/sysmodule/src/util/crc32.cpp index 608817d8..7588192f 100644 --- a/Source/hoc-clk/sysmodule/src/util/crc32.cpp +++ b/Source/hoc-clk/sysmodule/src/util/crc32.cpp @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include @@ -20,7 +20,7 @@ namespace crc32 { uint32_t crc32(const uint8_t *data, size_t length) { uint32_t crc = 0xFFFFFFFF; - + for (size_t i = 0; i < length; i++) { crc ^= data[i]; for (int j = 0; j < 8; j++) { @@ -36,11 +36,11 @@ namespace crc32 { perror("[crc32] Error opening file"); return 0; } - + uint8_t buffer[1024]; uint32_t crc = 0xFFFFFFFF; size_t bytes_read; - + while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) > 0) { for (size_t i = 0; i < bytes_read; i++) { crc ^= buffer[i]; @@ -49,8 +49,8 @@ namespace crc32 { } } } - + fclose(file); return ~crc; } -} +} // namespace crc32 diff --git a/Source/hoc-clk/sysmodule/src/util/crc32.h b/Source/hoc-clk/sysmodule/src/util/crc32.h index f4c5e2f5..05e1bc70 100644 --- a/Source/hoc-clk/sysmodule/src/util/crc32.h +++ b/Source/hoc-clk/sysmodule/src/util/crc32.h @@ -12,13 +12,13 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once -#include #include +#include namespace crc32 { uint32_t crc32(const uint8_t *data, size_t length); uint32_t checksum_file(const char *filename); -} +} // namespace crc32 diff --git a/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h b/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h index f2c9f60a..70045d0c 100644 --- a/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h +++ b/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,57 +24,49 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -#include -#include + #include + #include -class LockableMutex -{ -public: - LockableMutex() - { +class LockableMutex { + public: + LockableMutex() { mutexInit(&this->m); } - virtual ~LockableMutex() {} + virtual ~LockableMutex() { + } - void Lock() - { + void Lock() { mutexLock(&this->m); } - bool TryLock() - { + bool TryLock() { return mutexTryLock(&this->m); } - - void Unlock() - { + + void Unlock() { mutexUnlock(&this->m); } // snake_case aliases in order to implement Lockable - void lock() - { + void lock() { this->Lock(); } - bool try_lock() - { + bool try_lock() { return this->TryLock(); } - void unlock() - { + void unlock() { this->Unlock(); } -private: + private: Mutex m; }; diff --git a/Source/hoc-clk/sysmodule/src/util/memmem.c b/Source/hoc-clk/sysmodule/src/util/memmem.c index 33ff7e06..d62cf56b 100644 --- a/Source/hoc-clk/sysmodule/src/util/memmem.c +++ b/Source/hoc-clk/sysmodule/src/util/memmem.c @@ -24,60 +24,48 @@ #include "memmem.h" -void *memmem_impl(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) -{ - const unsigned char *cmpp; - const unsigned char *p; - const unsigned char *endp; - const unsigned char *q; - const unsigned char *endq; - unsigned char found; +void *memmem_impl(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { + const unsigned char *cmpp; + const unsigned char *p; + const unsigned char *endp; + const unsigned char *q; + const unsigned char *endq; + unsigned char found; - if(haystack == NULL) - { - return NULL; - } - if(needle == NULL) - { - return (void*)haystack; - } - if(haystacklen == 0) - { - return NULL; - } - if(needlelen == 0) - { - return (void*)haystack; - } + if (haystack == NULL) { + return NULL; + } + if (needle == NULL) { + return (void *)haystack; + } + if (haystacklen == 0) { + return NULL; + } + if (needlelen == 0) { + return (void *)haystack; + } - if(needlelen > haystacklen) - { - return NULL; - } + if (needlelen > haystacklen) { + return NULL; + } - endp = haystack + haystacklen - needlelen; - endq = needle + needlelen; - for(p = haystack; p <= endp; p++) - { - found = 1; - cmpp = p; - for(q = needle; q < endq; q++) - { - if(*cmpp != *q) - { - found = 0; - break; - } - else - { - cmpp++; - } - } - if(found) - { - return (void*)p; - } - } + endp = haystack + haystacklen - needlelen; + endq = needle + needlelen; + for (p = haystack; p <= endp; p++) { + found = 1; + cmpp = p; + for (q = needle; q < endq; q++) { + if (*cmpp != *q) { + found = 0; + break; + } else { + cmpp++; + } + } + if (found) { + return (void *)p; + } + } - return NULL; + return NULL; } diff --git a/Source/hoc-clk/sysmodule/src/util/memmem.h b/Source/hoc-clk/sysmodule/src/util/memmem.h index 0f791c1b..9beb9cdc 100644 --- a/Source/hoc-clk/sysmodule/src/util/memmem.h +++ b/Source/hoc-clk/sysmodule/src/util/memmem.h @@ -31,8 +31,7 @@ extern "C" { #endif -void *memmem_impl(const void *haystack, size_t haystacklen, - const void *needle, size_t needlelen); +void *memmem_impl(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); #ifdef __cplusplus } diff --git a/Source/hoc-clk/sysmodule/src/util/service_guard.h b/Source/hoc-clk/sysmodule/src/util/service_guard.h index 96a348a5..d80a6638 100644 --- a/Source/hoc-clk/sysmodule/src/util/service_guard.h +++ b/Source/hoc-clk/sysmodule/src/util/service_guard.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -21,25 +21,23 @@ extern "C" { #endif -#include -#include #include -#include +#include #include +#include +#include typedef struct ServiceGuard { Mutex mutex; u32 refCount; } ServiceGuard; -NX_INLINE bool serviceGuardBeginInit(ServiceGuard* g) -{ +NX_INLINE bool serviceGuardBeginInit(ServiceGuard *g) { mutexLock(&g->mutex); return (g->refCount++) == 0; } -NX_INLINE Result serviceGuardEndInit(ServiceGuard* g, Result rc, void (*cleanupFunc)(void)) -{ +NX_INLINE Result serviceGuardEndInit(ServiceGuard *g, Result rc, void (*cleanupFunc)(void)) { if (R_FAILED(rc)) { cleanupFunc(); --g->refCount; @@ -48,32 +46,29 @@ NX_INLINE Result serviceGuardEndInit(ServiceGuard* g, Result rc, void (*cleanupF return rc; } -NX_INLINE void serviceGuardExit(ServiceGuard* g, void (*cleanupFunc)(void)) -{ +NX_INLINE void serviceGuardExit(ServiceGuard *g, void (*cleanupFunc)(void)) { mutexLock(&g->mutex); if (g->refCount && (--g->refCount) == 0) cleanupFunc(); mutexUnlock(&g->mutex); } -#define NX_GENERATE_SERVICE_GUARD_PARAMS(name, _paramdecl, _parampass) \ -\ -static ServiceGuard g_##name##Guard; \ -NX_INLINE Result _##name##Initialize _paramdecl; \ -static void _##name##Cleanup(void); \ -\ -Result name##Initialize _paramdecl \ -{ \ - Result rc = 0; \ - if (serviceGuardBeginInit(&g_##name##Guard)) \ - rc = _##name##Initialize _parampass; \ - return serviceGuardEndInit(&g_##name##Guard, rc, _##name##Cleanup); \ -} \ -\ -void name##Exit(void) \ -{ \ - serviceGuardExit(&g_##name##Guard, _##name##Cleanup); \ -} +#define NX_GENERATE_SERVICE_GUARD_PARAMS(name, _paramdecl, _parampass) \ + \ + static ServiceGuard g_##name##Guard; \ + NX_INLINE Result _##name##Initialize _paramdecl; \ + static void _##name##Cleanup(void); \ + \ + Result name##Initialize _paramdecl { \ + Result rc = 0; \ + if (serviceGuardBeginInit(&g_##name##Guard)) \ + rc = _##name##Initialize _parampass; \ + return serviceGuardEndInit(&g_##name##Guard, rc, _##name##Cleanup); \ + } \ + \ + void name##Exit(void) { \ + serviceGuardExit(&g_##name##Guard, _##name##Cleanup); \ + } #define NX_GENERATE_SERVICE_GUARD(name) NX_GENERATE_SERVICE_GUARD_PARAMS(name, (void), ()) diff --git a/dist/README.md b/dist/README.md deleted file mode 100644 index ff3e6be6..00000000 --- a/dist/README.md +++ /dev/null @@ -1,214 +0,0 @@ - -
- -logo - ---- - -![License: GPL-2.0](https://img.shields.io/badge/GPL--2.0-red?style=for-the-badge) -![Nintendo Switch](https://img.shields.io/badge/Nintendo_Switch-E60012?style=for-the-badge\&logo=nintendo-switch\&logoColor=white) -[![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge\&logo=discord\&logoColor=white)](https://dsc.gg/horizonoc) -![VSCode](https://img.shields.io/badge/VSCode-0078D4?style=for-the-badge\&logo=visual%20studio%20code\&logoColor=white) -![Made with Notepad++](assets/np++.png?raw=true) -![C++](https://img.shields.io/badge/C%2B%2B-00599C?style=for-the-badge\&logo=c%2B%2B\&logoColor=white) -![Downloads](https://img.shields.io/github/downloads/Horizon-OC/Horizon-OC/total.svg?style=for-the-badge) - ---- - -
- -## ⚠️ Disclaimer - -> **THIS TOOL CAN BE DANGEROUS IF MISUSED. PROCEED WITH CAUTION.** -> Due to the design of Horizon OS, **overclocking RAM can cause NAND OR SD CORRUPTION.** -> Ensure you have a **full NAND, PROINFO, EMUMMC and SD backup** before proceeding. - ---- - -## About - -**Horizon OC** is an open-source overclocking tool for Nintendo Switch consoles running **Atmosphere custom firmware**. -It enables advanced CPU, GPU, and RAM tuning with user-friendly configuration tools. - ---- - -## Default clocks - -* **CPU:** Up to 1963MHz (Mariko) / 1785MHz (Erista) -* **GPU:** Up to 1075MHz (Mariko) / 921MHz (Erista) -* **RAM:** Up to 1866/2133MHz (Mariko) / 1600MHz (Erista) -* Over/undervolting support -* Built-in configurator -* Compatible with most homebrew - -> It is recommended to read the [guide](https://rentry.co/howtoget60fps) before proceeding, as this can help you get a *significant* performance boost over the default settings, often times with less power draw and heat output - ---- - -## Installation - -1. Ensure you have the latest versions of - - * [Atmosphere](https://github.com/Atmosphere-NX/Atmosphere) - * [Ultrahand Overlay](https://github.com/ppkantorski/Ultrahand-Overlay) -2. Download and extract the **Horizon OC Package** to the root of your SD card. -3. If using **Hekate**, edit `hekate_ipl.ini` to include: - - ``` - kip1=atmosphere/kips/hoc.kip - ``` - - *(No changes needed if using fusee.)* - ---- - -## Configuration - -1. Open the Horizon OC Overlay -2. Open the settings menu -3. Adjust your overclocking settings as desired. A helpful guide can be found [here.](https://rentry.co/mariko#oc-settings-for-horizon-oc) -4. Click **Save KIP Settings** to apply your configuration. - ---- - -## Building from Source - -Refer to COMPILATION.md - ---- -## Clock table - -### MEM clocks (mhz) - -* 3200 → max on mariko, JEDEC. -* 3166 -* 3133 -* 3100 -* 3066 -* 3033 -* 3000 -* 2966 -* 2933 → JEDEC. -* 2900 -* 2866 -* 2833 -* 2800 -* 2766 -* 2733 -* 2700 -* 2666 → JEDEC. -* 2633 -* 2600 -* 2566 -* 2533 -* 2500 -* 2466 -* 2433 -* 2400 → max on erista, JEDEC. -* 2366 -* 2333 -* 2300 -* 2266 -* 2233 -* 2200 -* 2166 -* 2133 → Mariko JEDEC standard max (4266 Modules) -* 2100 -* 2066 -* 2033 -* 2000 -* 1996 → JEDEC standard -* 1966 -* 1933 -* 1900 -* 1866 → Mariko JEDEC standard max (3733 Modules) -* 1833 -* 1800 -* 1766 -* 1733 -* 1700 -* 1666 -* 1633 -* 1600 → official docked, boost mode, Erista JEDEC standard max (3200 Modules), JEDEC. -* 1331 → official handheld, JEDEC. -* 1065 -* 800 -* 665 - -### CPU clocks (mhz) -* 2703 → mariko absolute max, dangerous -* 2601 → unsafe -* 2499 -* 2397 → mariko safe max with UV (low speedo) -* 2295 -* 2193 -* 2091 -* 1963 → mariko no UV max clock -* 1887 -* 1785 → erista no UV max clock, boost mode -* 1683 -* 1581 -* 1428 -* 1326 -* 1224 → sdev oc -* 1122 -* 1020 → official docked & handheld -* 918 -* 816 -* 714 -* 612 → sleep mode - -### GPU clocks (mhz) -* 1536 → absolute max clock on mariko. very dangerous -* 1459 -* 1382 -* 1305 -* 1267 → NVIDIA T214(mariko) rating -* 1228 → mariko High UV safe clock -* 1152 → mariko hiOpt-15mV max clock -* 1075 → mariko hiOpt max clock. absolute max clock on erista. very dangerous -* 998 → NVIDIA T210 (erista) rating -* 960 (erista only) → erista high uv/hiOpt-15mV safe max clock -* 921 → erista no UV max clock -* 844 -* 768 → official docked -* 691 -* 614 -* 537 -* 460 → max handheld -* 384 → official handheld -* 307 → official handheld -* 230 -* 153 -* 76 → boost mode - -**Notes:** -1. On Erista, CPU in handheld is capped to 1581MHz -2. GPU overclock is capped at 460MHz on erista in handheld -3. On Mariko, cap with hiOpt is 614MHz, with hiOpt-15mV it is 691MHz and with High UV it's 768MHz -4. Clocks higher than 768MHz on erista need the official charger is plugged in. - ---- - -## Credits -* **Lightos's Cat** - Cat -* **Souldbminer** - hoc-clk and loader development -* **Lightos** - Loader patches development, hoc-clk development, guides -* **TDRR** - HOC Logo Design -* **tetetete-ctrl** - Website design -* **SciresM** - Atmosphere CFW -* **CTCaer** - L4T, Hekate, proper RAM timings -* **KazushiMe** - Switch OC Suite -* **Hanai3bi (Meha)** - Switch OC Suite, EOS, sys-clk-eos -* **NaGaa95** - L4T-OC kernel, Status Monitor fork -* **B3711 (halop)** - EOS, contributions -* **sys-clk team (m4xw, p-sam, natinusala)** - sys-clk -* **Dominatorul** - Soctherm driver, guides, general help -* **ppkantorski** - Ultrahand sys-clk & Status Monitor fork -* **MasaGratoR and ZachyCatGames** - General help -* **MasaGratoR** - Status Monitor & Display Refresh Rate driver -* **Dominatorul, Samybigio, Arcdelta, Miki, Happy, Winnerboi77, Blaise, Alvise, agjeococh, frost, letum00, and Xenshen** - Testing -* **Samybigio2011, Miki** - Italian translations -* **angelblaster** - Korean translations -* **q1332348216-glitch** - Chinese translations -* **Nvidia** - [Tegra X1 Technical Reference Manual](https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual), soctherm driver, L4T diff --git a/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp b/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp index a11a38a4..c623b636 100644 Binary files a/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp and b/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp differ diff --git a/dist/atmosphere/exosphere.bin b/dist/atmosphere/exosphere.bin index 147372e1..9315328e 100644 Binary files a/dist/atmosphere/exosphere.bin and b/dist/atmosphere/exosphere.bin differ diff --git a/dist/atmosphere/kips/hoc.kip b/dist/atmosphere/kips/hoc.kip index 1bd13fc8..f0f19150 100644 Binary files a/dist/atmosphere/kips/hoc.kip and b/dist/atmosphere/kips/hoc.kip differ diff --git a/dist/config/horizon-oc/lang/es.json b/dist/config/horizon-oc/lang/es.json index 546b4429..a938c1e3 100644 --- a/dist/config/horizon-oc/lang/es.json +++ b/dist/config/horizon-oc/lang/es.json @@ -2,140 +2,140 @@ "Information": "Información", "IDDQ:": "IDDQ:", "Module: ": "Módulo:", - "sys-dock status:": "estado del sys-dock:", + "sys-dock status:": "Estado de sys-dock:", "SaltyNX status:": "Estado de SaltyNX:", - "RR Display status:": "Estado de visualización RR:", - "Wafer Position:": "Posición de la oblea:", + "RR Display status:": "Estado de pantalla RR:", + "Wafer Position:": "Posición del wafer:", "Credits": "Créditos", "Developers": "Desarrolladores", "Contributors": "Colaboradores", - "Testers": "Probadores", - "Special Thanks": "agradecimiento especial", + "Testers": "Testers", + "Special Thanks": "Agradecimientos especiales", "Unknown": "Desconocido", "Installed": "Instalado", "Not Installed": "No instalado", "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LA LICENCIA DE CERVEZA", + "THE BEER-WARE LICENSE": "LICENCIA BEER-WARE", "Default": "Predeterminado", - "Do Not Override": "No anular", - "Disabled": "Discapacitado", - "Enabled": "Habilitado", + "Do Not Override": "No sobrescribir", + "Disabled": "Desactivado", + "Enabled": "Activado", " \\ue0e3 Reset": "\\ue0e3 Restablecer", "Display": "Pantalla", - "Application changed\\n\\n": "Aplicación modificada\\n\\n", - "The running application changed\\n\\n": "La aplicación en ejecución cambió\\n\\n", - "while editing was going on.": "mientras se realizaba la edición.", - "Board": "tablero", + "Application changed\\n\\n": "Aplicación cambiada\\n\\n", + "The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n", + "while editing was going on.": "mientras se estaba editando.", + "Board": "Placa", "%u.%u%u mV": "%u.%u%u mV", - "Could not connect to hoc-clk sysmodule.\\n\\n": "No se pudo conectar al módulo del sistema hoc-clk.\\n\\n", - "Please make sure everything is\\n\\n": "Por favor asegúrese de que todo esté\\n\\n", - "correctly installed and enabled.": "correctamente instalado y habilitado.", - "Fatal error": "error fatal", - "Temporary Overrides ": "Anulaciones temporales", - "Sleep Mode": "Modo de suspensión", - "Stock": "Valores", - "Dev OC": "Desarrollador OC", - "Boost Mode": "Modo de impulso", + "Could not connect to hoc-clk sysmodule.\\n\\n": "No se pudo conectar al sysmodule hoc-clk.\\n\\n", + "Please make sure everything is\\n\\n": "Asegúrate de que todo esté\\n\\n", + "correctly installed and enabled.": "correctamente instalado y activado.", + "Fatal error": "Error fatal", + "Temporary Overrides ": "Ajustes temporales", + "Sleep Mode": "Modo reposo", + "Stock": "Valores de fábrica", + "Dev OC": "OC de desarrollo", + "Boost Mode": "Modo boost", "Safe Max": "Máximo seguro", - "Unsafe Max": "Máximo inseguro", + "Unsafe Max": "Máximo no seguro", "Absolute Max": "Máximo absoluto", - "Handheld Safe Max": "Caja fuerte de mano máx.", - "Enable": "Habilitar", + "Handheld Safe Max": "Máximo seguro en portátil", + "Enable": "Activar", "Edit App Profile": "Editar perfil de aplicación", "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Anulaciones temporales", + "Temporary Overrides": "Ajustes temporales", "Settings": "Configuración", "About": "Acerca de", - "Compiling with minimal features": "Compilando con características mínimas", - "General Settings": "Configuraciones generales", - "Governor Settings": "Configuración del gobernador", - "Safety Settings": "Configuraciones de seguridad", - "Save KIP Settings": "Guardar configuración de KIP", + "Compiling with minimal features": "Compilado con funciones mínimas", + "General Settings": "Configuración general", + "Governor Settings": "Configuración del governor", + "Safety Settings": "Configuración de seguridad", + "Save KIP Settings": "Guardar configuración KIP", "RAM Settings": "Configuración de RAM", - "CPU Settings": "Configuración de la CPU", + "CPU Settings": "Configuración de CPU", "GPU Settings": "Configuración de GPU", "Display Settings": "Configuración de pantalla", "Experimental": "Experimental", - "GPU Scheduling Override Method": "Método de anulación de programación de GPU", - "can be dangerous and may cause": "puede ser peligroso y puede causar", - "damage to your battery or charger!": "¡Daños a su batería o cargador!", - "Charge Current Override": "Anulación de corriente de carga", + "GPU Scheduling Override Method": "Método de sobrescritura del scheduling de GPU", + "can be dangerous and may cause": "puede ser peligroso y causar", + "damage to your battery or charger!": "daños a la batería o al cargador.", + "Charge Current Override": "Sobrescritura de corriente de carga", "RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM", "Polling Interval": "Intervalo de sondeo", - "CPU Governor Minimum Frequency": "Frecuencia mínima del gobernador de CPU", - "refresh rates may cause stress": "Las frecuencias de actualización pueden causar estrés.", - "or damage to your display! ": "o daños a su pantalla!", - "Proceed at your own risk!": "¡Continúe bajo su propio riesgo!", - "Max Handheld Display": "Pantalla portátil máxima", - "Display Clock": "Reloj de pantalla", - "Official Rating": "Calificación oficial", + "CPU Governor Minimum Frequency": "Frecuencia mínima del governor de CPU", + "refresh rates may cause stress": "las tasas de refresco pueden causar estrés", + "or damage to your display! ": "o dañar la pantalla.", + "Proceed at your own risk!": "¡Úsalo bajo tu propio riesgo!", + "Max Handheld Display": "Frecuencia máxima de pantalla en portátil", + "Display Clock": "Frecuencia de pantalla", + "Official Rating": "Valor oficial", "TDP Threshold": "Umbral de TDP", - "Power": "poder", - "Thermal Throttle Limit": "Límite del acelerador térmico", - "HP Mode": "Modo HP", + "Power": "Potencia", + "Thermal Throttle Limit": "Límite de thermal throttling", + "HP Mode": "Modo alto rendimiento", "Default (Mariko)": "Predeterminado (Mariko)", "Default (Erista)": "Predeterminado (Erista)", - "Rating": "Calificación", - "Safe Max (Mariko)": "Max seguro (Mariko)", - "Safe Max (Erista)": "Safe Max (Erista)", - "RAM VDD2 Voltage": "Voltaje RAM VDD2", - "Voltage": "voltaje", - "RAM VDDQ Voltage": "Voltaje RAM VDDQ", - "RAM Frequency Editor": "Editor de frecuencia RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "¡Se necesita alta velocidad!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (Necesita Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (Necesita Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (Necesita Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (Necesita Speedo/PLL ridículo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (Necesita Speedo/PLL ridículo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (Necesita Speedo/PLL ridículo)", - "Ram Max Clock": "Ram Max Reloj", - "RAM Latency Editor": "Editor de latencia de RAM", - "RAM Timing Reductions": "Reducciones de tiempo de RAM", - "Memory Timings": "Tiempos de memoria", + "Rating": "Valor", + "Safe Max (Mariko)": "Máximo seguro (Mariko)", + "Safe Max (Erista)": "Máximo seguro (Erista)", + "RAM VDD2 Voltage": "Voltaje VDD2 de RAM", + "Voltage": "Voltaje", + "RAM VDDQ Voltage": "Voltaje VDDQ de RAM", + "RAM Frequency Editor": "Editor de frecuencia de RAM", + "JEDEC.": "JEDEC", + "High speedo needed!": "¡Se necesita alto speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)", + "Ram Max Clock": "Frecuencia máxima de RAM", + "RAM Latency Editor": "Editor de latencias de RAM", + "RAM Timing Reductions": "Reducción de timings de RAM", + "Memory Timings": "Timings de memoria", "Advanced": "Avanzado", - "t6 tRTW Fine Tune": "t6 tRTW Ajuste fino", + "t6 tRTW Fine Tune": "Ajuste fino t6 tRTW", "tRTW Fine Tune": "Ajuste fino tRTW", - "t7 tWTR Fine Tune": "t7 tWTR Ajuste fino", - "tWTR Fine Tune": "Ajuste fino de tWTR", - "Memory Latencies": "Latencias de la memoria", - "Read Latency": "Leer latencia", + "t7 tWTR Fine Tune": "Ajuste fino t7 tWTR", + "tWTR Fine Tune": "Ajuste fino tWTR", + "Memory Latencies": "Latencias de memoria", + "Read Latency": "Latencia de lectura", "Write Latency": "Latencia de escritura", - "CPU Boost Clock": "Reloj de aumento de CPU", - "CPU UV": "procesador ultravioleta", + "CPU Boost Clock": "Frecuencia boost de CPU", + "CPU UV": "Undervolt de CPU", "CPU Unlock": "Desbloqueo de CPU", - "CPU VMIN": "CPU VMIN", - "CPU Max Voltage": "Voltaje máximo de la CPU", - "CPU Max Clock": "Reloj máximo de CPU", - "Extreme UV Table": "Mesa UV extrema", - "CPU UV Table": "Tabla UV de CPU", - "CPU Low UV": "CPU baja radiación ultravioleta", - "CPU High UV": "CPU alta UV", + "CPU VMIN": "VMIN de CPU", + "CPU Max Voltage": "Voltaje máximo de CPU", + "CPU Max Clock": "Frecuencia máxima de CPU", + "Extreme UV Table": "Tabla de undervolt extrema", + "CPU UV Table": "Tabla de undervolt de CPU", + "CPU Low UV": "Undervolt bajo de CPU", + "CPU High UV": "Undervolt alto de CPU", "CPU Low VMIN": "VMIN bajo de CPU", "CPU High VMIN": "VMIN alto de CPU", - "No Undervolt": "Sin subvoltaje", - "SLT Table": "Mesa TR", + "No Undervolt": "Sin undervolt", + "SLT Table": "Tabla SLT", "HiOPT Table": "Tabla HiOPT", - "GPU Undervolt Table": "Tabla de subvoltaje de GPU", + "GPU Undervolt Table": "Tabla de undervolt de GPU", "GPU Minimum Voltage": "Voltaje mínimo de GPU", - "Calculate GPU Vmin": "Calcular GPU Vmin", - "GPU VMIN": "GPU VMIN", + "Calculate GPU Vmin": "Calcular Vmin de GPU", + "GPU VMIN": "VMIN de GPU", "GPU Maximum Voltage": "Voltaje máximo de GPU", - "GPU Voltage Offset": "Compensación de voltaje de GPU", - "Do not override": "no anular", - "Enabled (Default)": "Habilitado (predeterminado)", - "96.6% limit": "límite del 96,6%", - "99.7% limit": "límite del 99,7%", - "GPU Scheduling Override": "Anulación de programación de GPU", - "Official Service": "Servicio Oficial", - "GPU DVFS Mode": "Modo GPU DVFS", - "GPU DVFS Offset": "Compensación DVFS de GPU", + "GPU Voltage Offset": "Offset de voltaje de GPU", + "Do not override": "No sobrescribir", + "Enabled (Default)": "Activado (predeterminado)", + "96.6% limit": "Límite 96,6%", + "99.7% limit": "Límite 99,7%", + "GPU Scheduling Override": "Sobrescritura de scheduling de GPU", + "Official Service": "Servicio oficial", + "GPU DVFS Mode": "Modo DVFS de GPU", + "GPU DVFS Offset": "Offset DVFS de GPU", "GPU Voltage Table": "Tabla de voltaje de GPU", "GPU Custom Table (mV)": "Tabla personalizada de GPU (mV)", - "1075MHz without UV, 1152MHz on SLT": "1075MHz sin UV, 1152MHz en SLT", - "or 1228MHz on HiOPT can cause ": "o 1228MHz en HiOPT pueden causar", - "permanent damage to your Switch!": "¡Daño permanente a tu Switch!", - "921MHz without UV and 960MHz on": "921MHz sin UV y 960MHz encendido", - "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar" -} + "1075MHz without UV, 1152MHz on SLT": "1075MHz sin undervolt, 1152MHz en SLT", + "or 1228MHz on HiOPT can cause ": "o 1228MHz en HiOPT pueden causar ", + "permanent damage to your Switch!": "¡daño permanente a tu Switch!", + "921MHz without UV and 960MHz on": "921MHz sin undervolt y 960MHz en", + "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar " +} \ No newline at end of file diff --git a/dist/config/horizon-oc/lang/fr.json b/dist/config/horizon-oc/lang/fr.json index 2494473a..e4e41177 100644 --- a/dist/config/horizon-oc/lang/fr.json +++ b/dist/config/horizon-oc/lang/fr.json @@ -1,11 +1,11 @@ { "Information": "Informations", - "IDDQ:": "IDDQ :", - "Module: ": "Module :", - "sys-dock status:": "état du dock système :", - "SaltyNX status:": "Statut SaltyNX :", - "RR Display status:": "Etat d'affichage RR :", - "Wafer Position:": "Position de la plaquette :", + "IDDQ:": "IDDQ :", + "Module: ": "Module :", + "sys-dock status:": "Statut de sys-dock :", + "SaltyNX status:": "Statut de SaltyNX :", + "RR Display status:": "Statut de l'affichage RR :", + "Wafer Position:": "Position du wafer :", "Credits": "Crédits", "Developers": "Développeurs", "Contributors": "Contributeurs", @@ -15,127 +15,127 @@ "Installed": "Installé", "Not Installed": "Non installé", "X: %u Y: %u": "X : %u Y : %u", - "THE BEER-WARE LICENSE": "LA LICENCE DE LA BIÈRE", + "THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE", "Default": "Par défaut", "Do Not Override": "Ne pas remplacer", "Disabled": "Désactivé", "Enabled": "Activé", " \\ue0e3 Reset": "\\ue0e3 Réinitialiser", - "Display": "Affichage", + "Display": "Écran", "Application changed\\n\\n": "Application modifiée\\n\\n", "The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n", - "while editing was going on.": "pendant le montage.", - "Board": "Conseil", + "while editing was going on.": "pendant la modification.", + "Board": "Carte", "%u.%u%u mV": "%u.%u%u mV", - "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossible de se connecter au module système hoc-clk.\\n\\n", + "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossible de se connecter au sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Veuillez vous assurer que tout est\\n\\n", "correctly installed and enabled.": "correctement installé et activé.", "Fatal error": "Erreur fatale", - "Temporary Overrides ": "Remplacements temporaires", + "Temporary Overrides ": "Forçages temporaires ", "Sleep Mode": "Mode veille", - "Stock": "Actions", - "Dev OC": "Développeur OC", + "Stock": "D'origine", + "Dev OC": "OC Développeur", "Boost Mode": "Mode Boost", - "Safe Max": "Coffre-fort maximum", - "Unsafe Max": "Dangereux Max", + "Safe Max": "Max sûr", + "Unsafe Max": "Max non sûr", "Absolute Max": "Max absolu", - "Handheld Safe Max": "Coffre-fort portatif Max", + "Handheld Safe Max": "Max sûr (mode portable)", "Enable": "Activer", - "Edit App Profile": "Modifier le profil de l'application", + "Edit App Profile": "Modifier le profil de l'app", "Edit Global Profile": "Modifier le profil global", - "Temporary Overrides": "Remplacements temporaires", + "Temporary Overrides": "Forçages temporaires", "Settings": "Paramètres", "About": "À propos", - "Compiling with minimal features": "Compilation avec des fonctionnalités minimales", + "Compiling with minimal features": "Compilation avec fonctionnalités minimales", "General Settings": "Paramètres généraux", "Governor Settings": "Paramètres du gouverneur", "Safety Settings": "Paramètres de sécurité", "Save KIP Settings": "Enregistrer les paramètres KIP", - "RAM Settings": "Paramètres de la RAM", - "CPU Settings": "Paramètres du processeur", - "GPU Settings": "Paramètres du processeur graphique", + "RAM Settings": "Paramètres RAM", + "CPU Settings": "Paramètres CPU", + "GPU Settings": "Paramètres GPU", "Display Settings": "Paramètres d'affichage", "Experimental": "Expérimental", - "GPU Scheduling Override Method": "Méthode de remplacement de la planification GPU", - "can be dangerous and may cause": "peut être dangereux et provoquer", - "damage to your battery or charger!": "dommages à votre batterie ou à votre chargeur !", - "Charge Current Override": "Remplacement du courant de charge", - "RAM Voltage Display Mode": "Mode d'affichage de la tension de la RAM", + "GPU Scheduling Override Method": "Méthode de Forçage de l'ordonnancement GPU", + "can be dangerous and may cause": "peut être dangereux et causer des", + "damage to your battery or charger!": "dommages à votre batterie ou chargeur !", + "Charge Current Override": "Forçage du courant de charge", + "RAM Voltage Display Mode": "Mode d'affichage de la tension RAM", "Polling Interval": "Intervalle d'interrogation", - "CPU Governor Minimum Frequency": "Fréquence minimale du gouverneur du processeur", - "refresh rates may cause stress": "les taux de rafraîchissement peuvent causer du stress", - "or damage to your display! ": "ou endommager votre écran !", - "Proceed at your own risk!": "Procédez à vos propres risques !", - "Max Handheld Display": "Affichage portable maximum", - "Display Clock": "Affichage de l'horloge", + "CPU Governor Minimum Frequency": "Fréquence minimale du gouverneur CPU", + "refresh rates may cause stress": "les taux de rafraîchissement peuvent stresser", + "or damage to your display! ": "ou endommager votre écran !", + "Proceed at your own risk!": "À utiliser à vos propres risques !", + "Max Handheld Display": "Affichage portable max", + "Display Clock": "Fréquence d'affichage", "Official Rating": "Classement officiel", "TDP Threshold": "Seuil TDP", - "Power": "Puissance", - "Thermal Throttle Limit": "Limite d'accélérateur thermique", + "Power": "Alimentation", + "Thermal Throttle Limit": "Limite d'étranglement thermique", "HP Mode": "Mode HP", "Default (Mariko)": "Par défaut (Mariko)", "Default (Erista)": "Par défaut (Erista)", - "Rating": "Note", - "Safe Max (Mariko)": "Coffre-fort Max (Mariko)", - "Safe Max (Erista)": "Coffre-fort Max (Erista)", - "RAM VDD2 Voltage": "Tension de la RAM VDD2", + "Rating": "Évaluation", + "Safe Max (Mariko)": "Max sûr (Mariko)", + "Safe Max (Erista)": "Max sûr (Erista)", + "RAM VDD2 Voltage": "Tension RAM VDD2", "Voltage": "Tension", - "RAM VDDQ Voltage": "Tension VDDQ de la RAM", + "RAM VDDQ Voltage": "Tension RAM VDDQ", "RAM Frequency Editor": "Éditeur de fréquence RAM", "JEDEC.": "JEDEC.", - "High speedo needed!": "Besoin d'un speedo haut !", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite un Speedo/PLL extrême)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite un Speedo/PLL extrême)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite un Speedo/PLL extrême)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite un Speedo/PLL ridicule)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite un Speedo/PLL ridicule)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite un Speedo/PLL ridicule)", - "Ram Max Clock": "Ram Max Horloge", + "High speedo needed!": "Speedo élevé requis !", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)", + "Ram Max Clock": "Fréquence RAM max", "RAM Latency Editor": "Éditeur de latence RAM", - "RAM Timing Reductions": "Réductions de synchronisation de la RAM", - "Memory Timings": "Horaires de mémoire", + "RAM Timing Reductions": "Réductions des timings RAM", + "Memory Timings": "Timings mémoire", "Advanced": "Avancé", - "t6 tRTW Fine Tune": "t6 tRTW réglage fin", - "tRTW Fine Tune": "tRTW Réglage fin", - "t7 tWTR Fine Tune": "t7 tWTR réglage fin", - "tWTR Fine Tune": "Réglage fin du tWTR", - "Memory Latencies": "Latences de mémoire", + "t6 tRTW Fine Tune": "Ajustement précis t6 tRTW", + "tRTW Fine Tune": "Ajustement précis tRTW", + "t7 tWTR Fine Tune": "Ajustement précis t7 tWTR", + "tWTR Fine Tune": "Ajustement précis tWTR", + "Memory Latencies": "Latences mémoire", "Read Latency": "Latence de lecture", "Write Latency": "Latence d'écriture", - "CPU Boost Clock": "Horloge d'augmentation du processeur", - "CPU UV": "UV du processeur", - "CPU Unlock": "Déverrouillage du processeur", + "CPU Boost Clock": "Fréquence Boost CPU", + "CPU UV": "UV CPU", + "CPU Unlock": "Déverrouillage CPU", "CPU VMIN": "CPU VMIN", - "CPU Max Voltage": "Tension maximale du processeur", - "CPU Max Clock": "Horloge maximale du processeur", - "Extreme UV Table": "Table UV Extrême", - "CPU UV Table": "Tableau UV du processeur", - "CPU Low UV": "CPU faible UV", - "CPU High UV": "CPU UV élevé", - "CPU Low VMIN": "CPU faible VMIN", - "CPU High VMIN": "Processeur VMIN élevé", - "No Undervolt": "Pas de sous-tension", - "SLT Table": "Tableau SLT", - "HiOPT Table": "Tableau HiOPT", - "GPU Undervolt Table": "Tableau de sous-tension GPU", - "GPU Minimum Voltage": "Tension minimale du GPU", - "Calculate GPU Vmin": "Calculer la Vmin du GPU", + "CPU Max Voltage": "Tension CPU max", + "CPU Max Clock": "Fréquence CPU max", + "Extreme UV Table": "Table d'UV extrême", + "CPU UV Table": "Table d'UV CPU", + "CPU Low UV": "UV CPU faible", + "CPU High UV": "UV CPU élevé", + "CPU Low VMIN": "VMIN CPU faible", + "CPU High VMIN": "VMIN CPU élevé", + "No Undervolt": "Aucun Undervolt", + "SLT Table": "Table SLT", + "HiOPT Table": "Table HiOPT", + "GPU Undervolt Table": "Table d'undervolt GPU", + "GPU Minimum Voltage": "Tension GPU minimale", + "Calculate GPU Vmin": "Calculer Vmin GPU", "GPU VMIN": "GPU VMIN", - "GPU Maximum Voltage": "Tension maximale du GPU", - "GPU Voltage Offset": "Décalage de tension du GPU", - "Do not override": "Ne remplacez pas", + "GPU Maximum Voltage": "Tension GPU maximale", + "GPU Voltage Offset": "Offset de tension GPU", + "Do not override": "Ne pas remplacer", "Enabled (Default)": "Activé (par défaut)", - "96.6% limit": "Limite de 96,6 %", - "99.7% limit": "Limite de 99,7 %", - "GPU Scheduling Override": "Remplacement de la planification GPU", + "96.6% limit": "Limite de 96,6 %", + "99.7% limit": "Limite de 99,7 %", + "GPU Scheduling Override": "Forçage de l'ordonnancement GPU", "Official Service": "Service officiel", "GPU DVFS Mode": "Mode GPU DVFS", - "GPU DVFS Offset": "Décalage GPU DVFS", - "GPU Voltage Table": "Tableau de tension du GPU", - "GPU Custom Table (mV)": "Tableau personnalisé GPU (mV)", + "GPU DVFS Offset": "Offset GPU DVFS", + "GPU Voltage Table": "Table de tension GPU", + "GPU Custom Table (mV)": "Table de GPU personnalisée (mV)", "1075MHz without UV, 1152MHz on SLT": "1075 MHz sans UV, 1152 MHz sur SLT", - "or 1228MHz on HiOPT can cause ": "ou 1228 MHz sur HiOPT peut provoquer", - "permanent damage to your Switch!": "dommages permanents à votre Switch !", - "921MHz without UV and 960MHz on": "921 MHz sans UV et 960 MHz activé", - "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent provoquer" + "or 1228MHz on HiOPT can cause ": "ou 1228 MHz sur HiOPT peut causer des", + "permanent damage to your Switch!": "dommages permanents à votre Switch !", + "921MHz without UV and 960MHz on": "921 MHz sans UV et 960 MHz sur", + "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des" } diff --git a/dist/config/horizon-oc/lang/it.json b/dist/config/horizon-oc/lang/it.json index d7056f36..5e65fdae 100644 --- a/dist/config/horizon-oc/lang/it.json +++ b/dist/config/horizon-oc/lang/it.json @@ -2,140 +2,140 @@ "Information": "Informazioni", "IDDQ:": "IDDQ:", "Module: ": "Modulo:", - "sys-dock status:": "stato del dock di sistema:", + "sys-dock status:": "stato di sys-dock", "SaltyNX status:": "Stato di SaltyNX:", - "RR Display status:": "Stato di visualizzazione RR:", - "Wafer Position:": "Posizione del wafer:", + "RR Display status:": "Stato del RR:", + "Wafer Position:": "Posizione nel Wafer:", "Credits": "Crediti", "Developers": "Sviluppatori", "Contributors": "Collaboratori", "Testers": "Tester", - "Special Thanks": "Un ringraziamento speciale", + "Special Thanks": "Un Ringraziamento Speciale", "Unknown": "Sconosciuto", "Installed": "Installato", "Not Installed": "Non installato", "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LA LICENZA PER GLI ARTICOLI DI BIRRA", + "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE", "Default": "Predefinito", - "Do Not Override": "Non sovrascrivere", + "Do Not Override": "Non Sovrascrivere", "Disabled": "Disabilitato", "Enabled": "Abilitato", " \\ue0e3 Reset": "\\ue0e3 Ripristina", - "Display": "Visualizzazione", + "Display": "Schermo", "Application changed\\n\\n": "Applicazione modificata\\n\\n", "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", "while editing was going on.": "mentre era in corso la modifica.", - "Board": "Consiglio", + "Board": "Scheda", "%u.%u%u mV": "%u.%u%u mV", - "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossibile connettersi al modulo di sistema hoc-clk.\\n\\n", + "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossibile connettersi al sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Assicurati che tutto sia\\n\\n", "correctly installed and enabled.": "correttamente installato e abilitato.", "Fatal error": "Errore fatale", - "Temporary Overrides ": "Sostituzioni temporanee", - "Sleep Mode": "Modalità di sospensione", - "Stock": "Magazzino", - "Dev OC": "OC di sviluppo", - "Boost Mode": "Modalità potenziamento", - "Safe Max": "Sicuro massimo", - "Unsafe Max": "Non sicuro Max", - "Absolute Max": "Massimo assoluto", - "Handheld Safe Max": "Cassaforte portatile max", + "Temporary Overrides ": "Sostituzioni Temporanee", + "Sleep Mode": "Modalità di Sospensione", + "Stock": "Originale", + "Dev OC": "OC dev", + "Boost Mode": "Modalità Boost", + "Safe Max": "Massimo Sicuro", + "Unsafe Max": "Massimo Non Sicuro", + "Absolute Max": "Massimo Assoluto", + "Handheld Safe Max": "Massimo Sicuro Modalità Portatile", "Enable": "Abilita", - "Edit App Profile": "Modifica profilo dell'app", - "Edit Global Profile": "Modifica profilo globale", - "Temporary Overrides": "Sostituzioni temporanee", + "Edit App Profile": "Modifica Profilo Dell'App", + "Edit Global Profile": "Modifica Profilo Globale", + "Temporary Overrides": "Sostituzioni Temporanee", "Settings": "Impostazioni", - "About": "Circa", + "About": "A Riguardo Di", "Compiling with minimal features": "Compilazione con funzionalità minime", - "General Settings": "Impostazioni generali", - "Governor Settings": "Impostazioni del governatore", - "Safety Settings": "Impostazioni di sicurezza", - "Save KIP Settings": "Salva le impostazioni KIP", + "General Settings": "Impostazioni Generali", + "Governor Settings": "Impostazioni Del Governor", + "Safety Settings": "Impostazioni Di Sicurezza", + "Save KIP Settings": "Salva le impostazioni del KIP", "RAM Settings": "Impostazioni della RAM", "CPU Settings": "Impostazioni della CPU", "GPU Settings": "Impostazioni della GPU", - "Display Settings": "Impostazioni di visualizzazione", + "Display Settings": "Impostazioni dello Schermo", "Experimental": "Sperimentale", - "GPU Scheduling Override Method": "Metodo di override della pianificazione GPU", + "GPU Scheduling Override Method": "Metodo di override dello scheduling GPU", "can be dangerous and may cause": "può essere pericoloso e può causare", "damage to your battery or charger!": "danni alla batteria o al caricabatterie!", - "Charge Current Override": "Override della corrente di carica", - "RAM Voltage Display Mode": "Modalità di visualizzazione della tensione RAM", + "Charge Current Override": "Override della Corrente di Carica", + "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM", "Polling Interval": "Intervallo di polling", - "CPU Governor Minimum Frequency": "Frequenza minima del governatore della CPU", + "CPU Governor Minimum Frequency": "Frequenza minima del Governor della CPU", "refresh rates may cause stress": "le frequenze di aggiornamento possono causare stress", "or damage to your display! ": "o danni al display!", "Proceed at your own risk!": "Procedi a tuo rischio e pericolo!", - "Max Handheld Display": "Display portatile massimo", - "Display Clock": "Visualizza orologio", - "Official Rating": "Valutazione ufficiale", + "Max Handheld Display": "Display Massimo in Modalità Portatile", + "Display Clock": "Frequenza del Display", + "Official Rating": "Rating Ufficiale", "TDP Threshold": "Soglia TDP", "Power": "Potenza", - "Thermal Throttle Limit": "Limite della valvola termica", + "Thermal Throttle Limit": "Limite Termico", "HP Mode": "Modalità HP", "Default (Mariko)": "Predefinito (Mariko)", "Default (Erista)": "Predefinito (Erista)", "Rating": "Valutazione", - "Safe Max (Mariko)": "Safe Max (Mariko)", - "Safe Max (Erista)": "Safe Max (Erista)", + "Safe Max (Mariko)": "Massimo Sicuro (Mariko)", + "Safe Max (Erista)": "Massimo Sicuro (Erista)", "RAM VDD2 Voltage": "Tensione RAM VDD2", "Voltage": "Voltaggio", "RAM VDDQ Voltage": "Voltaggio VDDQ della RAM", "RAM Frequency Editor": "Editor della frequenza RAM", "JEDEC.": "JEDEC.", - "High speedo needed!": "È necessaria l'alta velocità!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL estremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL estremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL estremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (è necessario un ridicolo Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (è necessario un ridicolo Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (è necessario un ridicolo Speedo/PLL)", - "Ram Max Clock": "Orologio Ram Max", - "RAM Latency Editor": "Editor della latenza RAM", - "RAM Timing Reductions": "Riduzioni della temporizzazione della RAM", - "Memory Timings": "Tempi di memoria", + "High speedo needed!": "Alto Valore Speedo Necessario!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)", + "Ram Max Clock": "Frequenza Massima Ram", + "RAM Latency Editor": "Editor della Latenza RAM", + "RAM Timing Reductions": "Riduzioni dei Timing della RAM", + "Memory Timings": "Timing di Memoria", "Advanced": "Avanzato", - "t6 tRTW Fine Tune": "t6 tRTW Sintonia fine", - "tRTW Fine Tune": "tRTW Sintonia fine", - "t7 tWTR Fine Tune": "t7 tWTR Sintonia fine", - "tWTR Fine Tune": "tWTR Sintonia fine", - "Memory Latencies": "Latenza della memoria", - "Read Latency": "Leggi latenza", - "Write Latency": "Scrivi latenza", - "CPU Boost Clock": "Orologio di potenziamento della CPU", - "CPU UV": "UV della CPU", + "t6 tRTW Fine Tune": "Regolazione Fine t6 tRTW", + "tRTW Fine Tune": "Regolazione Fine tRTW", + "t7 tWTR Fine Tune": "Regolazione Fine t7 tWTR", + "tWTR Fine Tune": "Regolazione Fine tWTR", + "Memory Latencies": "Latenza della Memoria", + "Read Latency": "Latenza di Lettura", + "Write Latency": "Latenza di Scrittura", + "CPU Boost Clock": "Frequenza CPU in Boost", + "CPU UV": "Undervolt CPU", "CPU Unlock": "Sblocco della CPU", - "CPU VMIN": "CPUVMIN", + "CPU VMIN": "CPU VMIN", "CPU Max Voltage": "Voltaggio massimo della CPU", - "CPU Max Clock": "Orologio massimo della CPU", - "Extreme UV Table": "Tavolo UV estremo", + "CPU Max Clock": "Frequenza massima della CPU", + "Extreme UV Table": "Tabella UV estremo", "CPU UV Table": "Tabella UV della CPU", - "CPU Low UV": "CPU con raggi UV bassi", - "CPU High UV": "UV elevato della CPU", - "CPU Low VMIN": "VMIN CPU basso", - "CPU High VMIN": "CPU alta VMIN", - "No Undervolt": "Nessuna sottotensione", + "CPU Low UV": "CPU UV Bassa Frequenza", + "CPU High UV": "CPU UV Alta Frequenza", + "CPU Low VMIN": "CPU VMIN Bassa Frequenza", + "CPU High VMIN": "CPU VMIN Alta Frequenza", + "No Undervolt": "Nessun Undervolt", "SLT Table": "Tabella SLT", "HiOPT Table": "Tabella HiOPT", - "GPU Undervolt Table": "Tabella di sottotensione GPU", - "GPU Minimum Voltage": "Voltaggio minimo della GPU", + "GPU Undervolt Table": "Tabella di Undervolt GPU", + "GPU Minimum Voltage": "Voltaggio Minimo della GPU", "Calculate GPU Vmin": "Calcola GPU Vmin", - "GPU VMIN": "GPUVMIN", + "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Voltaggio massimo della GPU", - "GPU Voltage Offset": "Offset di tensione della GPU", + "GPU Voltage Offset": "Offset di Voltaggio della GPU", "Do not override": "Non sovrascrivere", "Enabled (Default)": "Abilitato (impostazione predefinita)", "96.6% limit": "Limite del 96,6%.", "99.7% limit": "Limite del 99,7%.", - "GPU Scheduling Override": "Override della pianificazione GPU", + "GPU Scheduling Override": "Override dello Scheduling GPU", "Official Service": "Servizio ufficiale", "GPU DVFS Mode": "Modalità DVFS GPU", "GPU DVFS Offset": "Offset DVFS della GPU", - "GPU Voltage Table": "Tabella delle tensioni della GPU", - "GPU Custom Table (mV)": "Tabella personalizzata GPU (mV)", + "GPU Voltage Table": "Tabella delle Tensioni della GPU", + "GPU Custom Table (mV)": "Tabella GPU Personalizzata (mV)", "1075MHz without UV, 1152MHz on SLT": "1075 MHz senza UV, 1152 MHz su SLT", "or 1228MHz on HiOPT can cause ": "o 1228 MHz su HiOPT possono causare", - "permanent damage to your Switch!": "danni permanenti al tuo Switch!", - "921MHz without UV and 960MHz on": "921 MHz senza UV e 960 MHz attivi", + "permanent damage to your Switch!": "danni permanenti alla tua Switch!", + "921MHz without UV and 960MHz on": "921 MHz senza UV e 960 MHz su", "SLT or HiOPT can cause ": "SLT o HiOPT possono causare" } diff --git a/dist/config/horizon-oc/lang/lang/de.json b/dist/config/horizon-oc/lang/lang/de.json index d2eedf0b..00e05a56 100644 --- a/dist/config/horizon-oc/lang/lang/de.json +++ b/dist/config/horizon-oc/lang/lang/de.json @@ -1,37 +1,33 @@ { "Information": "Informationen", - "IDDQ:": "IDDQ:", - "Module: ": "Modul:", - "sys-dock status:": "Sys-Dock-Status:", - "SaltyNX status:": "SaltyNX-Status:", - "RR Display status:": "RR Anzeigestatus:", - "Wafer Position:": "Waferposition:", - "Credits": "Credits", - "Developers": "Entwickler", - "Contributors": "Mitwirkende", - "Testers": "Tester", - "Special Thanks": "Besonderer Dank", "Unknown": "Unbekannt", "Installed": "Installiert", "Not Installed": "Nicht installiert", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ", "Default": "Standard", "Do Not Override": "Nicht überschreiben", + "Do not override": "Nicht überschreiben", "Disabled": "Deaktiviert", "Enabled": "Aktiviert", - " \\ue0e3 Reset": "\\ue0e3 Zurücksetzen", - "Display": "Anzeige", - "Application changed\\n\\n": "Anwendung geändert\\n\\n", - "The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n", - "while editing was going on.": "während die Bearbeitung im Gange war.", - "Board": "Vorstand", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Aktiviert (Standard)", + "Enable": "Aktivieren", + "Fatal error": "Fataler Fehler", "Could not connect to hoc-clk sysmodule.\\n\\n": "Es konnte keine Verbindung zum hoc-clk-Systemmodul hergestellt werden.\\n\\n", "Please make sure everything is\\n\\n": "Bitte stellen Sie sicher, dass alles in Ordnung ist\\n\\n", "correctly installed and enabled.": "korrekt installiert und aktiviert.", - "Fatal error": "Fataler Fehler", + + "Edit App Profile": "App-Profil bearbeiten", + "Edit Global Profile": "Globales Profil bearbeiten", + "Temporary Overrides": "Temporäre Überschreibungen", "Temporary Overrides ": "Temporäre Überschreibungen", + "  Reset": " Zurücksetzen", + "Settings": "Einstellungen", + "About": "Über", + "Credits": "Credits", + + "Application changed\\n\\n": "Anwendung geändert\\n\\n", + "The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n", + "while editing was going on.": "während die Bearbeitung im Gange war.", + "Sleep Mode": "Schlafmodus", "Stock": "Lager", "Dev OC": "Entwickler OC", @@ -40,57 +36,74 @@ "Unsafe Max": "Unsicher max", "Absolute Max": "Absolutes Maximum", "Handheld Safe Max": "Handsafe max", - "Enable": "Aktivieren", - "Edit App Profile": "App-Profil bearbeiten", - "Edit Global Profile": "Globales Profil bearbeiten", - "Temporary Overrides": "Temporäre Überschreibungen", - "Settings": "Einstellungen", - "About": "Über", - "Compiling with minimal features": "Kompilieren mit minimalen Funktionen", + "General Settings": "Allgemeine Einstellungen", - "Governor Settings": "Gouverneurseinstellungen", + "Governor Settings": "Regler-Einstellungen", "Safety Settings": "Sicherheitseinstellungen", - "Save KIP Settings": "Speichern Sie die KIP-Einstellungen", + "Save KIP Settings": "KIP-Einstellungen speichern", "RAM Settings": "RAM-Einstellungen", "CPU Settings": "CPU-Einstellungen", "GPU Settings": "GPU-Einstellungen", "Display Settings": "Anzeigeeinstellungen", + "Experimental Settings": "Experimentelle Einstellungen", "Experimental": "Experimentell", + + " Settings marked in blue": "Blau markierte Einstellungen", + "don't require a reboot to apply!": "erfordern keinen Neustart zum Aktivieren!", + "You can also press  to show": "Drücken Sie auch  zum Anzeigen", + "information about each setting.": "von Informationen zu jeder Einstellung.", + + " Experimental Settings are incomplete ": "Experimentelle Einstellungen unvollständig", + "and may not work correctly or at all!": "und funktionieren möglicherweise gar nicht!", + "Here be dragons!": "Hier gibt es Drachen!", + + "RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus", + "RAM Display Unit": "RAM-Anzeigeeinheit", + "Polling Interval": "Abfrageintervall", + "GPU Scheduling Override Method": "GPU-Planungsüberschreibungsmethode", + "GPU Scheduling Override": "GPU-Planungsüberschreibung", + "GPU Boot Volt": "GPU Boot-Spannung", + "GPU Boot Voltage": "GPU Boot-Spannung", + "Memory Frequency Measurement Mode": "RAM-Frequenz-Messmodus", + " Overriding the charge current": "Überschreiben des Ladestroms", "can be dangerous and may cause": "kann gefährlich sein und verursachen", "damage to your battery or charger!": "Schäden an Ihrem Akku oder Ladegerät!", "Charge Current Override": "Ladestrom-Überbrückung", - "RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus", - "Polling Interval": "Abfrageintervall", + "Display Color Preset": "Farbprofil", + "Basic": "Standard", + "Saturated": "Gesättigt", + "Washed": "Verblasst", + "Natural": "Natürlich", + "Vivid": "Lebendig", + "CPU Governor Minimum Frequency": "Mindestfrequenz des CPU-Reglers", + " Usage of unsafe display": "Verwendung unsicherer Bildschirmfrequenzen", "refresh rates may cause stress": "Bildwiederholraten können Stress verursachen", "or damage to your display! ": "oder Schäden an Ihrem Display!", "Proceed at your own risk!": "Das Vorgehen erfolgt auf eigene Gefahr!", "Max Handheld Display": "Max Handheld-Display", + "Max Handheld Display Hz": "Max. Handheld-Hz", "Display Clock": "Uhr anzeigen", + " Adjust the display voltage": "Display-Spannung anpassen", + "with caution to avoid damage": "mit Vorsicht, um Schäden zu vermeiden", + "to your display panel! ": "am Display-Panel!", + "Display Voltage": "Display-Spannung", + + "Thermal Throttle Limit": "Thermische Drosselgrenze", "Official Rating": "Offizielle Bewertung", "TDP Threshold": "TDP-Schwellenwert", "Power": "Macht", - "Thermal Throttle Limit": "Thermische Drosselgrenze", "HP Mode": "HP-Modus", - "Default (Mariko)": "Standard (Mariko)", - "Default (Erista)": "Standard (Erista)", - "Rating": "Bewertung", - "Safe Max (Mariko)": "Safe Max (Mariko)", - "Safe Max (Erista)": "Safe Max (Erista)", + + "DVB Shift": "DVB-Versatz", + "SoC Max Volt": "SoC Max-Spannung", + "Step Mode": "Schritt-Modus", "RAM VDD2 Voltage": "RAM VDD2 Spannung", - "Voltage": "Spannung", "RAM VDDQ Voltage": "RAM-VDDQ-Spannung", + "Voltage": "Spannung", "RAM Frequency Editor": "RAM-Frequenzeditor", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Hoher Tacho erforderlich!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Tacho/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Tacho/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Tacho/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Tacho/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Tacho/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Tacho/PLL)", - "Ram Max Clock": "Ram Max Uhr", + "Ram Max Clock": "Ram Max Takt", "RAM Latency Editor": "RAM-Latenz-Editor", "RAM Timing Reductions": "Reduzierung des RAM-Timings", "Memory Timings": "Speicherzeiten", @@ -102,6 +115,15 @@ "Memory Latencies": "Speicherlatenzen", "Read Latency": "Leselatenz", "Write Latency": "Schreiblatenz", + "High speedo needed!": "Hoher Speedo-Wert erforderlich!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU-Boost-Takt", "CPU UV": "CPU-UV", "CPU Unlock": "CPU-Entsperrung", @@ -110,32 +132,84 @@ "CPU Max Clock": "Maximaler CPU-Takt", "Extreme UV Table": "Extremer UV-Tisch", "CPU UV Table": "CPU-UV-Tisch", - "CPU Low UV": "CPU-niedrige UV-Strahlung", - "CPU High UV": "CPU Hohe UV-Strahlung", + "CPU Low UV": "CPU niedrige UV", + "CPU High UV": "CPU hohe UV", "CPU Low VMIN": "CPU niedrig VMIN", "CPU High VMIN": "CPU hoch VMIN", + "No Undervolt": "Kein Undervolt", - "SLT Table": "SLT-Tisch", + "SLT Table": "SLT-Tabelle", "HiOPT Table": "HiOPT-Tabelle", "GPU Undervolt Table": "GPU-Unterspannungstabelle", "GPU Minimum Voltage": "GPU-Mindestspannung", - "Calculate GPU Vmin": "Berechnen Sie die GPU-Vmin", + "Calculate GPU Vmin": "GPU-Vmin berechnen", "GPU VMIN": "GPU-VMIN", "GPU Maximum Voltage": "Maximale GPU-Spannung", "GPU Voltage Offset": "GPU-Spannungsoffset", - "Do not override": "Nicht überschreiben", - "Enabled (Default)": "Aktiviert (Standard)", - "96.6% limit": "96,6 %-Grenze", - "99.7% limit": "99,7 %-Grenze", - "GPU Scheduling Override": "GPU-Planungsüberschreibung", - "Official Service": "Offizieller Dienst", "GPU DVFS Mode": "GPU-DVFS-Modus", "GPU DVFS Offset": "GPU-DVFS-Offset", "GPU Voltage Table": "GPU-Spannungstabelle", "GPU Custom Table (mV)": "Benutzerdefinierte GPU-Tabelle (mV)", + "Official Service": "Offizieller Dienst", + "96.6% limit": "96,6 %-Grenze", + "99.7% limit": "99,7 %-Grenze", + " Setting GPU Clocks past": "GPU-Takt überschreiten", + "1228MHz without a proper undervolt": "1228 MHz ohne korrekten Undervolt", + "can cause degradation or damage": "kann Degradierung oder Schäden verursachen", + "to your console!": "an Ihrer Konsole!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz ohne UV, 1152 MHz auf SLT", "or 1228MHz on HiOPT can cause ": "oder 1228 MHz auf HiOPT kann dazu führen", - "permanent damage to your Switch!": "Dauerhafter Schaden an Ihrem Switch!", + "permanent damage to your Switch!": "dauerhafter Schaden an Ihrem Switch!", "921MHz without UV and 960MHz on": "921 MHz ohne UV und 960 MHz eingeschaltet", - "SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen" + "SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen", + + "Default (Mariko)": "Standard (Mariko)", + "Default (Erista)": "Standard (Erista)", + "Rating": "Bewertung", + "Safe Max (Mariko)": "Safe Max (Mariko)", + "Safe Max (Erista)": "Safe Max (Erista)", + + "Voltages": "Spannungen", + "RAM Voltage:": "RAM-Spannung:", + "Display Voltage:": "Display-Spannung:", + "Temperatures": "Temperaturen", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Warm", + "Hot": "Heiß", + "Overheat": "Überhitzung", + "Not Patched": "Nicht gepatcht", + "Invalid": "Ungültig", + "RAM Bandwidth": "RAM-Bandbreite", + "RAM BW (Peak):": "RAM-BW (Max.):", + "RAM BW (All):": "RAM-BW (Ges.):", + "RAM BW (CPU):": "RAM-BW (CPU):", + "RAM BW (GPU):": "RAM-BW (GPU):", + "Hardware Info": "Hardware-Info", + "Console Type:": "Konsolentyp:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM-Modul: ", + "Software Info": "Software-Info", + "KIP version:": "KIP-Version:", + "sys-dock status:": "Sys-Dock-Status:", + "SaltyNX status:": "SaltyNX-Status:", + "RR Display status:": "RR Anzeigestatus:", + "Wafer Position:": "Waferposition:", + "IDDQ:": "IDDQ:", + "Module: ": "Modul:", + "Board": "Vorstand", + "Display": "Anzeige", + + "Developers": "Entwickler", + "Contributors": "Mitwirkende", + "Testers": "Tester", + "Translators": "Übersetzer", + "Special Thanks": "Besonderer Dank", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Kompilieren mit minimalen Funktionen", + "THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ" } diff --git a/dist/config/horizon-oc/lang/lang/es.json b/dist/config/horizon-oc/lang/lang/es.json index a938c1e3..7743bef3 100644 --- a/dist/config/horizon-oc/lang/lang/es.json +++ b/dist/config/horizon-oc/lang/lang/es.json @@ -1,37 +1,33 @@ { "Information": "Información", - "IDDQ:": "IDDQ:", - "Module: ": "Módulo:", - "sys-dock status:": "Estado de sys-dock:", - "SaltyNX status:": "Estado de SaltyNX:", - "RR Display status:": "Estado de pantalla RR:", - "Wafer Position:": "Posición del wafer:", - "Credits": "Créditos", - "Developers": "Desarrolladores", - "Contributors": "Colaboradores", - "Testers": "Testers", - "Special Thanks": "Agradecimientos especiales", "Unknown": "Desconocido", "Installed": "Instalado", "Not Installed": "No instalado", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LICENCIA BEER-WARE", "Default": "Predeterminado", "Do Not Override": "No sobrescribir", + "Do not override": "No sobrescribir", "Disabled": "Desactivado", "Enabled": "Activado", - " \\ue0e3 Reset": "\\ue0e3 Restablecer", - "Display": "Pantalla", - "Application changed\\n\\n": "Aplicación cambiada\\n\\n", - "The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n", - "while editing was going on.": "mientras se estaba editando.", - "Board": "Placa", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Activado (predeterminado)", + "Enable": "Activar", + "Fatal error": "Error fatal", "Could not connect to hoc-clk sysmodule.\\n\\n": "No se pudo conectar al sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Asegúrate de que todo esté\\n\\n", "correctly installed and enabled.": "correctamente instalado y activado.", - "Fatal error": "Error fatal", + + "Edit App Profile": "Editar perfil de aplicación", + "Edit Global Profile": "Editar perfil global", + "Temporary Overrides": "Ajustes temporales", "Temporary Overrides ": "Ajustes temporales", + "  Reset": " Restablecer", + "Settings": "Configuración", + "About": "Acerca de", + "Credits": "Créditos", + + "Application changed\\n\\n": "Aplicación cambiada\\n\\n", + "The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n", + "while editing was going on.": "mientras se estaba editando.", + "Sleep Mode": "Modo reposo", "Stock": "Valores de fábrica", "Dev OC": "OC de desarrollo", @@ -40,13 +36,7 @@ "Unsafe Max": "Máximo no seguro", "Absolute Max": "Máximo absoluto", "Handheld Safe Max": "Máximo seguro en portátil", - "Enable": "Activar", - "Edit App Profile": "Editar perfil de aplicación", - "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Ajustes temporales", - "Settings": "Configuración", - "About": "Acerca de", - "Compiling with minimal features": "Compilado con funciones mínimas", + "General Settings": "Configuración general", "Governor Settings": "Configuración del governor", "Safety Settings": "Configuración de seguridad", @@ -55,41 +45,64 @@ "CPU Settings": "Configuración de CPU", "GPU Settings": "Configuración de GPU", "Display Settings": "Configuración de pantalla", + "Experimental Settings": "Configuración experimental", "Experimental": "Experimental", + + " Settings marked in blue": "La configuración en azul", + "don't require a reboot to apply!": "no requiere reinicio para aplicarse.", + "You can also press  to show": "Pulsa  para mostrar", + "information about each setting.": "información sobre cada ajuste.", + + " Experimental Settings are incomplete ": "La configuración experimental está incompleta", + "and may not work correctly or at all!": "y puede que no funcione correctamente.", + "Here be dragons!": "¡Aquí hay dragones!", + + "RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM", + "RAM Display Unit": "Unidad de visualización RAM", + "Polling Interval": "Intervalo de sondeo", + "GPU Scheduling Override Method": "Método de sobrescritura del scheduling de GPU", + "GPU Scheduling Override": "Sobrescritura de scheduling de GPU", + "GPU Boot Volt": "Voltaje de arranque GPU", + "GPU Boot Voltage": "Voltaje de arranque GPU", + "Memory Frequency Measurement Mode": "Modo de medición de frecuencia de memoria", + " Overriding the charge current": "Sobrescribir la corriente de carga", "can be dangerous and may cause": "puede ser peligroso y causar", "damage to your battery or charger!": "daños a la batería o al cargador.", "Charge Current Override": "Sobrescritura de corriente de carga", - "RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM", - "Polling Interval": "Intervalo de sondeo", + "Display Color Preset": "Preajuste de color", + "Basic": "Básico", + "Saturated": "Saturado", + "Washed": "Lavado", + "Natural": "Natural", + "Vivid": "Vívido", + "CPU Governor Minimum Frequency": "Frecuencia mínima del governor de CPU", + " Usage of unsafe display": "El uso de frecuencias de pantalla", "refresh rates may cause stress": "las tasas de refresco pueden causar estrés", "or damage to your display! ": "o dañar la pantalla.", "Proceed at your own risk!": "¡Úsalo bajo tu propio riesgo!", "Max Handheld Display": "Frecuencia máxima de pantalla en portátil", + "Max Handheld Display Hz": "Hz máximo en modo portátil", "Display Clock": "Frecuencia de pantalla", + " Adjust the display voltage": "Ajusta el voltaje de pantalla", + "with caution to avoid damage": "con cuidado para evitar daños", + "to your display panel! ": "al panel de pantalla.", + "Display Voltage": "Voltaje de pantalla", + + "Thermal Throttle Limit": "Límite de thermal throttling", "Official Rating": "Valor oficial", "TDP Threshold": "Umbral de TDP", "Power": "Potencia", - "Thermal Throttle Limit": "Límite de thermal throttling", "HP Mode": "Modo alto rendimiento", - "Default (Mariko)": "Predeterminado (Mariko)", - "Default (Erista)": "Predeterminado (Erista)", - "Rating": "Valor", - "Safe Max (Mariko)": "Máximo seguro (Mariko)", - "Safe Max (Erista)": "Máximo seguro (Erista)", + + "DVB Shift": "Desplazamiento DVB", + "SoC Max Volt": "Voltaje máximo del SoC", + "Step Mode": "Modo de paso", "RAM VDD2 Voltage": "Voltaje VDD2 de RAM", - "Voltage": "Voltaje", "RAM VDDQ Voltage": "Voltaje VDDQ de RAM", + "Voltage": "Voltaje", "RAM Frequency Editor": "Editor de frecuencia de RAM", - "JEDEC.": "JEDEC", - "High speedo needed!": "¡Se necesita alto speedo!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)", "Ram Max Clock": "Frecuencia máxima de RAM", "RAM Latency Editor": "Editor de latencias de RAM", "RAM Timing Reductions": "Reducción de timings de RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latencias de memoria", "Read Latency": "Latencia de lectura", "Write Latency": "Latencia de escritura", + "High speedo needed!": "¡Se necesita alto speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)", + "JEDEC.": "JEDEC", + "CPU Boost Clock": "Frecuencia boost de CPU", "CPU UV": "Undervolt de CPU", "CPU Unlock": "Desbloqueo de CPU", @@ -114,6 +136,7 @@ "CPU High UV": "Undervolt alto de CPU", "CPU Low VMIN": "VMIN bajo de CPU", "CPU High VMIN": "VMIN alto de CPU", + "No Undervolt": "Sin undervolt", "SLT Table": "Tabla SLT", "HiOPT Table": "Tabla HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "VMIN de GPU", "GPU Maximum Voltage": "Voltaje máximo de GPU", "GPU Voltage Offset": "Offset de voltaje de GPU", - "Do not override": "No sobrescribir", - "Enabled (Default)": "Activado (predeterminado)", - "96.6% limit": "Límite 96,6%", - "99.7% limit": "Límite 99,7%", - "GPU Scheduling Override": "Sobrescritura de scheduling de GPU", - "Official Service": "Servicio oficial", "GPU DVFS Mode": "Modo DVFS de GPU", "GPU DVFS Offset": "Offset DVFS de GPU", "GPU Voltage Table": "Tabla de voltaje de GPU", "GPU Custom Table (mV)": "Tabla personalizada de GPU (mV)", + "Official Service": "Servicio oficial", + "96.6% limit": "Límite 96,6%", + "99.7% limit": "Límite 99,7%", + " Setting GPU Clocks past": "Ajustar frecuencias de GPU más allá", + "1228MHz without a proper undervolt": "1228MHz sin undervolt adecuado", + "can cause degradation or damage": "puede causar degradación o daños", + "to your console!": "a tu consola.", "1075MHz without UV, 1152MHz on SLT": "1075MHz sin undervolt, 1152MHz en SLT", "or 1228MHz on HiOPT can cause ": "o 1228MHz en HiOPT pueden causar ", "permanent damage to your Switch!": "¡daño permanente a tu Switch!", "921MHz without UV and 960MHz on": "921MHz sin undervolt y 960MHz en", - "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar " -} \ No newline at end of file + "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar ", + + "Default (Mariko)": "Predeterminado (Mariko)", + "Default (Erista)": "Predeterminado (Erista)", + "Rating": "Valor", + "Safe Max (Mariko)": "Máximo seguro (Mariko)", + "Safe Max (Erista)": "Máximo seguro (Erista)", + + "Voltages": "Voltajes", + "RAM Voltage:": "Voltaje RAM:", + "Display Voltage:": "Voltaje de pantalla:", + "Temperatures": "Temperaturas", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Cálido", + "Hot": "Caliente", + "Overheat": "Sobrecalentamiento", + "Not Patched": "Sin parche", + "Invalid": "Inválido", + "RAM Bandwidth": "Ancho de banda RAM", + "RAM BW (Peak):": "BW RAM (Pico):", + "RAM BW (All):": "BW RAM (Todo):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info de hardware", + "Console Type:": "Tipo de consola:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Módulo DRAM: ", + "Software Info": "Info de software", + "KIP version:": "Versión KIP:", + "sys-dock status:": "Estado de sys-dock:", + "SaltyNX status:": "Estado de SaltyNX:", + "RR Display status:": "Estado de pantalla RR:", + "Wafer Position:": "Posición del wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Módulo:", + "Board": "Placa", + "Display": "Pantalla", + + "Developers": "Desarrolladores", + "Contributors": "Colaboradores", + "Testers": "Testers", + "Translators": "Traductores", + "Special Thanks": "Agradecimientos especiales", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilado con funciones mínimas", + "THE BEER-WARE LICENSE": "LICENCIA BEER-WARE" +} diff --git a/dist/config/horizon-oc/lang/lang/fr.json b/dist/config/horizon-oc/lang/lang/fr.json index e4e41177..c8f94ed2 100644 --- a/dist/config/horizon-oc/lang/lang/fr.json +++ b/dist/config/horizon-oc/lang/lang/fr.json @@ -1,37 +1,33 @@ { "Information": "Informations", - "IDDQ:": "IDDQ :", - "Module: ": "Module :", - "sys-dock status:": "Statut de sys-dock :", - "SaltyNX status:": "Statut de SaltyNX :", - "RR Display status:": "Statut de l'affichage RR :", - "Wafer Position:": "Position du wafer :", - "Credits": "Crédits", - "Developers": "Développeurs", - "Contributors": "Contributeurs", - "Testers": "Testeurs", - "Special Thanks": "Remerciements spéciaux", "Unknown": "Inconnu", "Installed": "Installé", "Not Installed": "Non installé", - "X: %u Y: %u": "X : %u Y : %u", - "THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE", "Default": "Par défaut", "Do Not Override": "Ne pas remplacer", + "Do not override": "Ne pas remplacer", "Disabled": "Désactivé", "Enabled": "Activé", - " \\ue0e3 Reset": "\\ue0e3 Réinitialiser", - "Display": "Écran", - "Application changed\\n\\n": "Application modifiée\\n\\n", - "The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n", - "while editing was going on.": "pendant la modification.", - "Board": "Carte", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Activé (par défaut)", + "Enable": "Activer", + "Fatal error": "Erreur fatale", "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossible de se connecter au sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Veuillez vous assurer que tout est\\n\\n", "correctly installed and enabled.": "correctement installé et activé.", - "Fatal error": "Erreur fatale", + + "Edit App Profile": "Modifier le profil de l'app", + "Edit Global Profile": "Modifier le profil global", + "Temporary Overrides": "Forçages temporaires", "Temporary Overrides ": "Forçages temporaires ", + "  Reset": " Réinitialiser", + "Settings": "Paramètres", + "About": "À propos", + "Credits": "Crédits", + + "Application changed\\n\\n": "Application modifiée\\n\\n", + "The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n", + "while editing was going on.": "pendant la modification.", + "Sleep Mode": "Mode veille", "Stock": "D'origine", "Dev OC": "OC Développeur", @@ -40,13 +36,7 @@ "Unsafe Max": "Max non sûr", "Absolute Max": "Max absolu", "Handheld Safe Max": "Max sûr (mode portable)", - "Enable": "Activer", - "Edit App Profile": "Modifier le profil de l'app", - "Edit Global Profile": "Modifier le profil global", - "Temporary Overrides": "Forçages temporaires", - "Settings": "Paramètres", - "About": "À propos", - "Compiling with minimal features": "Compilation avec fonctionnalités minimales", + "General Settings": "Paramètres généraux", "Governor Settings": "Paramètres du gouverneur", "Safety Settings": "Paramètres de sécurité", @@ -55,41 +45,64 @@ "CPU Settings": "Paramètres CPU", "GPU Settings": "Paramètres GPU", "Display Settings": "Paramètres d'affichage", + "Experimental Settings": "Paramètres expérimentaux", "Experimental": "Expérimental", + + " Settings marked in blue": "Les paramètres en bleu", + "don't require a reboot to apply!": "ne nécessitent pas de redémarrage !", + "You can also press  to show": "Appuyez aussi sur  pour afficher", + "information about each setting.": "les informations sur chaque paramètre.", + + " Experimental Settings are incomplete ": "Les paramètres expérimentaux sont incomplets", + "and may not work correctly or at all!": "et peuvent ne pas fonctionner du tout !", + "Here be dragons!": "Ici, il y a des dragons !", + + "RAM Voltage Display Mode": "Mode d'affichage de la tension RAM", + "RAM Display Unit": "Unité d'affichage RAM", + "Polling Interval": "Intervalle d'interrogation", + "GPU Scheduling Override Method": "Méthode de Forçage de l'ordonnancement GPU", + "GPU Scheduling Override": "Forçage de l'ordonnancement GPU", + "GPU Boot Volt": "Tension d'amorçage GPU", + "GPU Boot Voltage": "Tension d'amorçage GPU", + "Memory Frequency Measurement Mode": "Mode de mesure de fréquence mémoire", + " Overriding the charge current": "Le forçage du courant de charge", "can be dangerous and may cause": "peut être dangereux et causer des", "damage to your battery or charger!": "dommages à votre batterie ou chargeur !", "Charge Current Override": "Forçage du courant de charge", - "RAM Voltage Display Mode": "Mode d'affichage de la tension RAM", - "Polling Interval": "Intervalle d'interrogation", + "Display Color Preset": "Préréglage de couleur", + "Basic": "Basique", + "Saturated": "Saturé", + "Washed": "Délavé", + "Natural": "Naturel", + "Vivid": "Vif", + "CPU Governor Minimum Frequency": "Fréquence minimale du gouverneur CPU", + " Usage of unsafe display": "L'utilisation de taux de rafraîchissement", "refresh rates may cause stress": "les taux de rafraîchissement peuvent stresser", "or damage to your display! ": "ou endommager votre écran !", "Proceed at your own risk!": "À utiliser à vos propres risques !", "Max Handheld Display": "Affichage portable max", + "Max Handheld Display Hz": "Hz max en mode portable", "Display Clock": "Fréquence d'affichage", + " Adjust the display voltage": "Réglez la tension d'affichage", + "with caution to avoid damage": "avec précaution pour éviter des dommages", + "to your display panel! ": "à votre dalle d'affichage !", + "Display Voltage": "Tension d'affichage", + + "Thermal Throttle Limit": "Limite d'étranglement thermique", "Official Rating": "Classement officiel", "TDP Threshold": "Seuil TDP", "Power": "Alimentation", - "Thermal Throttle Limit": "Limite d'étranglement thermique", "HP Mode": "Mode HP", - "Default (Mariko)": "Par défaut (Mariko)", - "Default (Erista)": "Par défaut (Erista)", - "Rating": "Évaluation", - "Safe Max (Mariko)": "Max sûr (Mariko)", - "Safe Max (Erista)": "Max sûr (Erista)", + + "DVB Shift": "Décalage DVB", + "SoC Max Volt": "Tension max SoC", + "Step Mode": "Mode pas à pas", "RAM VDD2 Voltage": "Tension RAM VDD2", - "Voltage": "Tension", "RAM VDDQ Voltage": "Tension RAM VDDQ", + "Voltage": "Tension", "RAM Frequency Editor": "Éditeur de fréquence RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Speedo élevé requis !", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)", "Ram Max Clock": "Fréquence RAM max", "RAM Latency Editor": "Éditeur de latence RAM", "RAM Timing Reductions": "Réductions des timings RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latences mémoire", "Read Latency": "Latence de lecture", "Write Latency": "Latence d'écriture", + "High speedo needed!": "Speedo élevé requis !", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Fréquence Boost CPU", "CPU UV": "UV CPU", "CPU Unlock": "Déverrouillage CPU", @@ -114,6 +136,7 @@ "CPU High UV": "UV CPU élevé", "CPU Low VMIN": "VMIN CPU faible", "CPU High VMIN": "VMIN CPU élevé", + "No Undervolt": "Aucun Undervolt", "SLT Table": "Table SLT", "HiOPT Table": "Table HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Tension GPU maximale", "GPU Voltage Offset": "Offset de tension GPU", - "Do not override": "Ne pas remplacer", - "Enabled (Default)": "Activé (par défaut)", - "96.6% limit": "Limite de 96,6 %", - "99.7% limit": "Limite de 99,7 %", - "GPU Scheduling Override": "Forçage de l'ordonnancement GPU", - "Official Service": "Service officiel", "GPU DVFS Mode": "Mode GPU DVFS", "GPU DVFS Offset": "Offset GPU DVFS", "GPU Voltage Table": "Table de tension GPU", "GPU Custom Table (mV)": "Table de GPU personnalisée (mV)", + "Official Service": "Service officiel", + "96.6% limit": "Limite de 96,6 %", + "99.7% limit": "Limite de 99,7 %", + " Setting GPU Clocks past": "Régler les fréquences GPU au-delà", + "1228MHz without a proper undervolt": "1228 MHz sans undervolt approprié", + "can cause degradation or damage": "peut causer une dégradation ou des dommages", + "to your console!": "à votre console !", "1075MHz without UV, 1152MHz on SLT": "1075 MHz sans UV, 1152 MHz sur SLT", "or 1228MHz on HiOPT can cause ": "ou 1228 MHz sur HiOPT peut causer des", "permanent damage to your Switch!": "dommages permanents à votre Switch !", "921MHz without UV and 960MHz on": "921 MHz sans UV et 960 MHz sur", - "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des" + "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des", + + "Default (Mariko)": "Par défaut (Mariko)", + "Default (Erista)": "Par défaut (Erista)", + "Rating": "Évaluation", + "Safe Max (Mariko)": "Max sûr (Mariko)", + "Safe Max (Erista)": "Max sûr (Erista)", + + "Voltages": "Tensions", + "RAM Voltage:": "Tension RAM :", + "Display Voltage:": "Tension d'affichage :", + "Temperatures": "Températures", + "PLLX Temp:": "PLLX Temp :", + "AOTAG Temp:": "AOTAG Temp :", + "BQ24193 Temp:": "BQ24193 Temp :", + "Normal": "Normal", + "Warm": "Chaud", + "Hot": "Très chaud", + "Overheat": "Surchauffe", + "Not Patched": "Non patché", + "Invalid": "Invalide", + "RAM Bandwidth": "Bande passante RAM", + "RAM BW (Peak):": "BW RAM (Pic) :", + "RAM BW (All):": "BW RAM (Tout) :", + "RAM BW (CPU):": "BW RAM (CPU) :", + "RAM BW (GPU):": "BW RAM (GPU) :", + "Hardware Info": "Infos matériel", + "Console Type:": "Type de console :", + "Speedo:": "Speedo :", + "DRAM Module: ": "Module DRAM : ", + "Software Info": "Infos logiciel", + "KIP version:": "Version KIP :", + "sys-dock status:": "Statut de sys-dock :", + "SaltyNX status:": "Statut de SaltyNX :", + "RR Display status:": "Statut de l'affichage RR :", + "Wafer Position:": "Position du wafer :", + "IDDQ:": "IDDQ :", + "Module: ": "Module :", + "Board": "Carte", + "Display": "Écran", + + "Developers": "Développeurs", + "Contributors": "Contributeurs", + "Testers": "Testeurs", + "Translators": "Traducteurs", + "Special Thanks": "Remerciements spéciaux", + + "X: %u Y: %u": "X : %u Y : %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilation avec fonctionnalités minimales", + "THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE" } diff --git a/dist/config/horizon-oc/lang/lang/it.json b/dist/config/horizon-oc/lang/lang/it.json index 5e65fdae..9706a9b2 100644 --- a/dist/config/horizon-oc/lang/lang/it.json +++ b/dist/config/horizon-oc/lang/lang/it.json @@ -1,37 +1,33 @@ { "Information": "Informazioni", - "IDDQ:": "IDDQ:", - "Module: ": "Modulo:", - "sys-dock status:": "stato di sys-dock", - "SaltyNX status:": "Stato di SaltyNX:", - "RR Display status:": "Stato del RR:", - "Wafer Position:": "Posizione nel Wafer:", - "Credits": "Crediti", - "Developers": "Sviluppatori", - "Contributors": "Collaboratori", - "Testers": "Tester", - "Special Thanks": "Un Ringraziamento Speciale", "Unknown": "Sconosciuto", "Installed": "Installato", "Not Installed": "Non installato", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE", "Default": "Predefinito", "Do Not Override": "Non Sovrascrivere", + "Do not override": "Non sovrascrivere", "Disabled": "Disabilitato", "Enabled": "Abilitato", - " \\ue0e3 Reset": "\\ue0e3 Ripristina", - "Display": "Schermo", - "Application changed\\n\\n": "Applicazione modificata\\n\\n", - "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", - "while editing was going on.": "mentre era in corso la modifica.", - "Board": "Scheda", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Abilitato (impostazione predefinita)", + "Enable": "Abilita", + "Fatal error": "Errore fatale", "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossibile connettersi al sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Assicurati che tutto sia\\n\\n", "correctly installed and enabled.": "correttamente installato e abilitato.", - "Fatal error": "Errore fatale", + + "Edit App Profile": "Modifica Profilo Dell'App", + "Edit Global Profile": "Modifica Profilo Globale", + "Temporary Overrides": "Sostituzioni Temporanee", "Temporary Overrides ": "Sostituzioni Temporanee", + "  Reset": " Ripristina", + "Settings": "Impostazioni", + "About": "A Riguardo Di", + "Credits": "Crediti", + + "Application changed\\n\\n": "Applicazione modificata\\n\\n", + "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", + "while editing was going on.": "mentre era in corso la modifica.", + "Sleep Mode": "Modalità di Sospensione", "Stock": "Originale", "Dev OC": "OC dev", @@ -40,13 +36,7 @@ "Unsafe Max": "Massimo Non Sicuro", "Absolute Max": "Massimo Assoluto", "Handheld Safe Max": "Massimo Sicuro Modalità Portatile", - "Enable": "Abilita", - "Edit App Profile": "Modifica Profilo Dell'App", - "Edit Global Profile": "Modifica Profilo Globale", - "Temporary Overrides": "Sostituzioni Temporanee", - "Settings": "Impostazioni", - "About": "A Riguardo Di", - "Compiling with minimal features": "Compilazione con funzionalità minime", + "General Settings": "Impostazioni Generali", "Governor Settings": "Impostazioni Del Governor", "Safety Settings": "Impostazioni Di Sicurezza", @@ -55,41 +45,64 @@ "CPU Settings": "Impostazioni della CPU", "GPU Settings": "Impostazioni della GPU", "Display Settings": "Impostazioni dello Schermo", + "Experimental Settings": "Impostazioni sperimentali", "Experimental": "Sperimentale", + + " Settings marked in blue": "Le impostazioni in blu", + "don't require a reboot to apply!": "non richiedono un riavvio per applicarsi!", + "You can also press  to show": "Premi anche  per mostrare", + "information about each setting.": "informazioni su ogni impostazione.", + + " Experimental Settings are incomplete ": "Le impostazioni sperimentali sono incomplete", + "and may not work correctly or at all!": "e potrebbero non funzionare correttamente!", + "Here be dragons!": "Qui ci sono draghi!", + + "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM", + "RAM Display Unit": "Unità di visualizzazione RAM", + "Polling Interval": "Intervallo di polling", + "GPU Scheduling Override Method": "Metodo di override dello scheduling GPU", + "GPU Scheduling Override": "Override dello Scheduling GPU", + "GPU Boot Volt": "Tensione di avvio GPU", + "GPU Boot Voltage": "Tensione di avvio GPU", + "Memory Frequency Measurement Mode": "Modalità di misurazione della frequenza della memoria", + " Overriding the charge current": "L'override della corrente di carica", "can be dangerous and may cause": "può essere pericoloso e può causare", "damage to your battery or charger!": "danni alla batteria o al caricabatterie!", "Charge Current Override": "Override della Corrente di Carica", - "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM", - "Polling Interval": "Intervallo di polling", + "Display Color Preset": "Preimpostazione colore", + "Basic": "Base", + "Saturated": "Saturo", + "Washed": "Sbiadito", + "Natural": "Naturale", + "Vivid": "Vivace", + "CPU Governor Minimum Frequency": "Frequenza minima del Governor della CPU", + " Usage of unsafe display": "L'uso di frequenze di aggiornamento", "refresh rates may cause stress": "le frequenze di aggiornamento possono causare stress", "or damage to your display! ": "o danni al display!", "Proceed at your own risk!": "Procedi a tuo rischio e pericolo!", "Max Handheld Display": "Display Massimo in Modalità Portatile", + "Max Handheld Display Hz": "Hz max in modalità portatile", "Display Clock": "Frequenza del Display", + " Adjust the display voltage": "Regola la tensione del display", + "with caution to avoid damage": "con cautela per evitare danni", + "to your display panel! ": "al pannello del display!", + "Display Voltage": "Tensione display", + + "Thermal Throttle Limit": "Limite Termico", "Official Rating": "Rating Ufficiale", "TDP Threshold": "Soglia TDP", "Power": "Potenza", - "Thermal Throttle Limit": "Limite Termico", "HP Mode": "Modalità HP", - "Default (Mariko)": "Predefinito (Mariko)", - "Default (Erista)": "Predefinito (Erista)", - "Rating": "Valutazione", - "Safe Max (Mariko)": "Massimo Sicuro (Mariko)", - "Safe Max (Erista)": "Massimo Sicuro (Erista)", + + "DVB Shift": "Offset DVB", + "SoC Max Volt": "Tensione massima SoC", + "Step Mode": "Modalità passo", "RAM VDD2 Voltage": "Tensione RAM VDD2", - "Voltage": "Voltaggio", "RAM VDDQ Voltage": "Voltaggio VDDQ della RAM", + "Voltage": "Voltaggio", "RAM Frequency Editor": "Editor della frequenza RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Alto Valore Speedo Necessario!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)", "Ram Max Clock": "Frequenza Massima Ram", "RAM Latency Editor": "Editor della Latenza RAM", "RAM Timing Reductions": "Riduzioni dei Timing della RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latenza della Memoria", "Read Latency": "Latenza di Lettura", "Write Latency": "Latenza di Scrittura", + "High speedo needed!": "Alto Valore Speedo Necessario!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Frequenza CPU in Boost", "CPU UV": "Undervolt CPU", "CPU Unlock": "Sblocco della CPU", @@ -114,6 +136,7 @@ "CPU High UV": "CPU UV Alta Frequenza", "CPU Low VMIN": "CPU VMIN Bassa Frequenza", "CPU High VMIN": "CPU VMIN Alta Frequenza", + "No Undervolt": "Nessun Undervolt", "SLT Table": "Tabella SLT", "HiOPT Table": "Tabella HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Voltaggio massimo della GPU", "GPU Voltage Offset": "Offset di Voltaggio della GPU", - "Do not override": "Non sovrascrivere", - "Enabled (Default)": "Abilitato (impostazione predefinita)", - "96.6% limit": "Limite del 96,6%.", - "99.7% limit": "Limite del 99,7%.", - "GPU Scheduling Override": "Override dello Scheduling GPU", - "Official Service": "Servizio ufficiale", "GPU DVFS Mode": "Modalità DVFS GPU", "GPU DVFS Offset": "Offset DVFS della GPU", "GPU Voltage Table": "Tabella delle Tensioni della GPU", "GPU Custom Table (mV)": "Tabella GPU Personalizzata (mV)", + "Official Service": "Servizio ufficiale", + "96.6% limit": "Limite del 96,6%", + "99.7% limit": "Limite del 99,7%", + " Setting GPU Clocks past": "Impostare le frequenze GPU oltre", + "1228MHz without a proper undervolt": "1228 MHz senza undervolt appropriato", + "can cause degradation or damage": "può causare degrado o danni", + "to your console!": "alla tua console!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz senza UV, 1152 MHz su SLT", "or 1228MHz on HiOPT can cause ": "o 1228 MHz su HiOPT possono causare", "permanent damage to your Switch!": "danni permanenti alla tua Switch!", "921MHz without UV and 960MHz on": "921 MHz senza UV e 960 MHz su", - "SLT or HiOPT can cause ": "SLT o HiOPT possono causare" + "SLT or HiOPT can cause ": "SLT o HiOPT possono causare", + + "Default (Mariko)": "Predefinito (Mariko)", + "Default (Erista)": "Predefinito (Erista)", + "Rating": "Valutazione", + "Safe Max (Mariko)": "Massimo Sicuro (Mariko)", + "Safe Max (Erista)": "Massimo Sicuro (Erista)", + + "Voltages": "Tensioni", + "RAM Voltage:": "Tensione RAM:", + "Display Voltage:": "Tensione display:", + "Temperatures": "Temperature", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normale", + "Warm": "Caldo", + "Hot": "Molto caldo", + "Overheat": "Surriscaldamento", + "Not Patched": "Non patchato", + "Invalid": "Non valido", + "RAM Bandwidth": "Banda RAM", + "RAM BW (Peak):": "BW RAM (Picco):", + "RAM BW (All):": "BW RAM (Tutto):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info hardware", + "Console Type:": "Tipo di console:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Modulo DRAM: ", + "Software Info": "Info software", + "KIP version:": "Versione KIP:", + "sys-dock status:": "stato di sys-dock", + "SaltyNX status:": "Stato di SaltyNX:", + "RR Display status:": "Stato del RR:", + "Wafer Position:": "Posizione nel Wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Modulo:", + "Board": "Scheda", + "Display": "Schermo", + + "Developers": "Sviluppatori", + "Contributors": "Collaboratori", + "Testers": "Tester", + "Translators": "Traduttori", + "Special Thanks": "Un Ringraziamento Speciale", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilazione con funzionalità minime", + "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE" } diff --git a/dist/config/horizon-oc/lang/lang/ja.json b/dist/config/horizon-oc/lang/lang/ja.json index fe415367..8dd8a981 100644 --- a/dist/config/horizon-oc/lang/lang/ja.json +++ b/dist/config/horizon-oc/lang/lang/ja.json @@ -1,52 +1,42 @@ { "Information": "情報", - "IDDQ:": "IDQ:", - "Module: ": "モジュール:", - "sys-dock status:": "システムドックのステータス:", - "SaltyNX status:": "SaltyNX ステータス:", - "RR Display status:": "RR 表示ステータス:", - "Wafer Position:": "ウェーハの位置:", - "Credits": "クレジット", - "Developers": "開発者", - "Contributors": "貢献者", - "Testers": "テスター", - "Special Thanks": "特別な感謝の気持ち", "Unknown": "不明", "Installed": "インストール済み", "Not Installed": "インストールされていません", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "ビール製品ライセンス", "Default": "デフォルト", "Do Not Override": "上書きしないでください", - "Disabled": "障害者", + "Do not override": "上書きしないでください", + "Disabled": "無効", "Enabled": "有効", - " \\ue0e3 Reset": "\\ue0e3 リセット", - "Display": "ディスプレイ", - "Application changed\\n\\n": "アプリケーションが変更されました\\n\\n", - "The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n", - "while editing was going on.": "編集を進めている最中でした。", - "Board": "理事会", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "有効 (デフォルト)", + "Enable": "有効にする", + "Fatal error": "致命的なエラー", "Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk sysmodule に接続できませんでした。\\n\\n", "Please make sure everything is\\n\\n": "すべてが正しいことを確認してください\\n\\n", "correctly installed and enabled.": "正しくインストールされ、有効になっています。", - "Fatal error": "致命的なエラー", + + "Edit App Profile": "アプリプロファイルの編集", + "Edit Global Profile": "グローバルプロファイルの編集", + "Temporary Overrides": "一時的なオーバーライド", "Temporary Overrides ": "一時的なオーバーライド", + "  Reset": " リセット", + "Settings": "設定", + "About": "について", + "Credits": "クレジット", + + "Application changed\\n\\n": "アプリケーションが変更されました\\n\\n", + "The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n", + "while editing was going on.": "編集を進めている最中でした。", + "Sleep Mode": "スリープモード", - "Stock": "在庫", + "Stock": "標準", "Dev OC": "開発OC", "Boost Mode": "ブーストモード", "Safe Max": "セーフマックス", "Unsafe Max": "危険なマックス", "Absolute Max": "絶対最大値", - "Handheld Safe Max": "手持ち金庫マックス", - "Enable": "有効にする", - "Edit App Profile": "アプリプロファイルの編集", - "Edit Global Profile": "グローバルプロファイルの編集", - "Temporary Overrides": "一時的なオーバーライド", - "Settings": "設定", - "About": "について", - "Compiling with minimal features": "最小限の機能でコンパイルする", + "Handheld Safe Max": "手持ち安全マックス", + "General Settings": "一般設定", "Governor Settings": "ガバナーの設定", "Safety Settings": "安全設定", @@ -55,41 +45,64 @@ "CPU Settings": "CPUの設定", "GPU Settings": "GPU設定", "Display Settings": "表示設定", + "Experimental Settings": "実験的設定", "Experimental": "実験的", + + " Settings marked in blue": "青色でマークされた設定", + "don't require a reboot to apply!": "再起動なしで適用できます!", + "You can also press  to show": " を押して表示することもできます", + "information about each setting.": "各設定の情報を。", + + " Experimental Settings are incomplete ": "実験的設定は未完成です", + "and may not work correctly or at all!": "正しく動作しない場合があります!", + "Here be dragons!": "ここにドラゴンあり!", + + "RAM Voltage Display Mode": "RAM電圧表示モード", + "RAM Display Unit": "RAM表示単位", + "Polling Interval": "ポーリング間隔", + "GPU Scheduling Override Method": "GPU スケジューリング オーバーライド メソッド", + "GPU Scheduling Override": "GPU スケジュールのオーバーライド", + "GPU Boot Volt": "GPU起動電圧", + "GPU Boot Voltage": "GPU起動電圧", + "Memory Frequency Measurement Mode": "メモリ周波数測定モード", + " Overriding the charge current": "充電電流のオーバーライド", "can be dangerous and may cause": "危険であり、原因となる可能性があります", "damage to your battery or charger!": "バッテリーまたは充電器が損傷します。", "Charge Current Override": "充電電流オーバーライド", - "RAM Voltage Display Mode": "RAM電圧表示モード", - "Polling Interval": "ポーリング間隔", + "Display Color Preset": "ディスプレイカラープリセット", + "Basic": "ベーシック", + "Saturated": "鮮やか", + "Washed": "色あせ", + "Natural": "ナチュラル", + "Vivid": "ビビッド", + "CPU Governor Minimum Frequency": "CPU ガバナの最小周波数", + " Usage of unsafe display": "危険なリフレッシュレートの使用", "refresh rates may cause stress": "リフレッシュレートがストレスを引き起こす可能性がある", "or damage to your display! ": "ディスプレイに損傷を与えてしまいます。", "Proceed at your own risk!": "自己責任で進めてください!", "Max Handheld Display": "最大ハンドヘルドディスプレイ", + "Max Handheld Display Hz": "最大ハンドヘルドHz", "Display Clock": "時計の表示", + " Adjust the display voltage": "ディスプレイ電圧を調整", + "with caution to avoid damage": "損傷を避けるため注意して", + "to your display panel! ": "ディスプレイパネルに!", + "Display Voltage": "ディスプレイ電圧", + + "Thermal Throttle Limit": "サーマルスロットル制限", "Official Rating": "公式評価", "TDP Threshold": "TDP しきい値", "Power": "パワー", - "Thermal Throttle Limit": "サーマルスロットル制限", "HP Mode": "HPモード", - "Default (Mariko)": "デフォルト(マリコ)", - "Default (Erista)": "デフォルト(エリスタ)", - "Rating": "評価", - "Safe Max (Mariko)": "セーフマックス(マリコ)", - "Safe Max (Erista)": "セーフマックス(エリスタ)", + + "DVB Shift": "DVBシフト", + "SoC Max Volt": "SoC最大電圧", + "Step Mode": "ステップモード", "RAM VDD2 Voltage": "RAM VDD2 電圧", - "Voltage": "電圧", "RAM VDDQ Voltage": "RAM VDDQ 電圧", + "Voltage": "電圧", "RAM Frequency Editor": "RAM周波数エディター", - "JEDEC.": "JEDEC。", - "High speedo needed!": "ハイスピードが必要です!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)", "Ram Max Clock": "ラムマックスクロック", "RAM Latency Editor": "RAM レイテンシ エディター", "RAM Timing Reductions": "RAM タイミングの削減", @@ -102,6 +115,15 @@ "Memory Latencies": "メモリレイテンシ", "Read Latency": "読み取りレイテンシー", "Write Latency": "書き込みレイテンシ", + "High speedo needed!": "ハイスピードが必要です!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)", + "JEDEC.": "JEDEC。", + "CPU Boost Clock": "CPUブーストクロック", "CPU UV": "CPU UV", "CPU Unlock": "CPUロック解除", @@ -111,10 +133,11 @@ "Extreme UV Table": "エクストリーム UV テーブル", "CPU UV Table": "CPU UV テーブル", "CPU Low UV": "CPU 低 UV", - "CPU High UV": "CPU 高紫外線", + "CPU High UV": "CPU 高 UV", "CPU Low VMIN": "CPU 低 VMIN", - "CPU High VMIN": "CPU の高い VMIN", - "No Undervolt": "不足電圧なし", + "CPU High VMIN": "CPU 高 VMIN", + + "No Undervolt": "アンダーボルトなし", "SLT Table": "SLTテーブル", "HiOPT Table": "HiOPT テーブル", "GPU Undervolt Table": "GPUアンダーボルトテーブル", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU最大電圧", "GPU Voltage Offset": "GPU電圧オフセット", - "Do not override": "上書きしないでください", - "Enabled (Default)": "有効 (デフォルト)", - "96.6% limit": "96.6%制限", - "99.7% limit": "99.7%制限", - "GPU Scheduling Override": "GPU スケジュールのオーバーライド", - "Official Service": "正式サービス", "GPU DVFS Mode": "GPU DVFS モード", "GPU DVFS Offset": "GPU DVFS オフセット", "GPU Voltage Table": "GPU電圧テーブル", "GPU Custom Table (mV)": "GPUカスタムテーブル(mV)", + "Official Service": "正式サービス", + "96.6% limit": "96.6%制限", + "99.7% limit": "99.7%制限", + " Setting GPU Clocks past": "GPUクロックを超えて設定", + "1228MHz without a proper undervolt": "適切なアンダーボルトなしで1228MHz", + "can cause degradation or damage": "劣化や損傷を引き起こす可能性があります", + "to your console!": "あなたのコンソールに!", "1075MHz without UV, 1152MHz on SLT": "UVなしで1075MHz、SLTで1152MHz", - "or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると、次のような問題が発生する可能性があります。", + "or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると問題が発生する可能性があります。", "permanent damage to your Switch!": "Switch に永久的なダメージを与えます!", "921MHz without UV and 960MHz on": "921MHz(UVなし)、960MHz(UVあり)", - "SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります" + "SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります", + + "Default (Mariko)": "デフォルト(マリコ)", + "Default (Erista)": "デフォルト(エリスタ)", + "Rating": "評価", + "Safe Max (Mariko)": "セーフマックス(マリコ)", + "Safe Max (Erista)": "セーフマックス(エリスタ)", + + "Voltages": "電圧", + "RAM Voltage:": "RAM電圧:", + "Display Voltage:": "ディスプレイ電圧:", + "Temperatures": "温度", + "PLLX Temp:": "PLLX 温度:", + "AOTAG Temp:": "AOTAG 温度:", + "BQ24193 Temp:": "BQ24193 温度:", + "Normal": "正常", + "Warm": "温かい", + "Hot": "熱い", + "Overheat": "過熱", + "Not Patched": "パッチなし", + "Invalid": "無効", + "RAM Bandwidth": "RAM帯域幅", + "RAM BW (Peak):": "RAM帯域(最大):", + "RAM BW (All):": "RAM帯域(全):", + "RAM BW (CPU):": "RAM帯域(CPU):", + "RAM BW (GPU):": "RAM帯域(GPU):", + "Hardware Info": "ハードウェア情報", + "Console Type:": "コンソールタイプ:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAMモジュール: ", + "Software Info": "ソフトウェア情報", + "KIP version:": "KIPバージョン:", + "sys-dock status:": "システムドックのステータス:", + "SaltyNX status:": "SaltyNX ステータス:", + "RR Display status:": "RR 表示ステータス:", + "Wafer Position:": "ウェーハの位置:", + "IDDQ:": "IDQ:", + "Module: ": "モジュール:", + "Board": "理事会", + "Display": "ディスプレイ", + + "Developers": "開発者", + "Contributors": "貢献者", + "Testers": "テスター", + "Translators": "翻訳者", + "Special Thanks": "特別な感謝の気持ち", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "最小限の機能でコンパイルする", + "THE BEER-WARE LICENSE": "ビール製品ライセンス" } diff --git a/dist/config/horizon-oc/lang/lang/ko.json b/dist/config/horizon-oc/lang/lang/ko.json index 09e73e66..8865d37f 100644 --- a/dist/config/horizon-oc/lang/lang/ko.json +++ b/dist/config/horizon-oc/lang/lang/ko.json @@ -1,52 +1,42 @@ { "Information": "정보", - "IDDQ:": "IDDQ:", - "Module: ": "모듈:", - "sys-dock status:": "sys-dock 상태:", - "SaltyNX status:": "SaltyNX 상태:", - "RR Display status:": "RR 표시 상태:", - "Wafer Position:": "웨이퍼 위치:", - "Credits": "크레딧", - "Developers": "개발자", - "Contributors": "기여자", - "Testers": "테스터", - "Special Thanks": "특별한 분", "Unknown": "알 수 없음", "Installed": "설치됨", "Not Installed": "설치되지 않음", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "맥주 제품 라이센스", "Default": "기본값", "Do Not Override": "재정의하지 마십시오", + "Do not override": "재정의하지 않음", "Disabled": "비활성화", "Enabled": "활성화됨", - " \\ue0e3 Reset": "\\ue0e3 재설정", - "Display": "디스플레이", - "Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n", - "The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n", - "while editing was going on.": "편집이 진행되는 동안.", - "Board": "보드", - "%u.%u%u mV": "%u.%u%umV", + "Enabled (Default)": "활성화됨(기본값)", + "Enable": "활성화", + "Fatal error": "치명적인 오류", "Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk 시스템 모듈에 연결할 수 없습니다.\\n\\n", "Please make sure everything is\\n\\n": "모든 것이 올바른지 확인하십시오.\\n\\n", "correctly installed and enabled.": "올바르게 설치되고 활성화되었습니다.", - "Fatal error": "치명적인 오류", + + "Edit App Profile": "앱 프로필 편집", + "Edit Global Profile": "글로벌 프로필 편집", + "Temporary Overrides": "임시 재정의", "Temporary Overrides ": "임시 재정의", + "  Reset": " 재설정", + "Settings": "설정", + "About": "소개", + "Credits": "크레딧", + + "Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n", + "The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n", + "while editing was going on.": "편집이 진행되는 동안.", + "Sleep Mode": "절전 모드", - "Stock": "주식", + "Stock": "기본 설정", "Dev OC": "개발 OC", - "Overwrite Boost Mode": "부스트 모드 덮어쓰기", + "Boost Mode": "부스트 모드", "Safe Max": "안전함 최대값", "Unsafe Max": "불안정 최대값", "Absolute Max": "절대 최대값", "Handheld Safe Max": "휴대모드 안전함 최대값", - "Enable": "활성화", - "Edit App Profile": "앱 프로필 편집", - "Edit Global Profile": "글로벌 프로필 편집", - "Temporary Overrides": "임시 재정의", - "Settings": "설정", - "About": "소개", - "Compiling with minimal features": "최소한의 기능으로 컴파일하기", + "General Settings": "일반 설정", "Governor Settings": "거버너 설정", "Safety Settings": "안전 설정", @@ -55,41 +45,64 @@ "CPU Settings": "CPU 설정", "GPU Settings": "GPU 설정", "Display Settings": "디스플레이 설정", + "Experimental Settings": "실험적 설정", "Experimental": "실험적", + + " Settings marked in blue": "파란색으로 표시된 설정은", + "don't require a reboot to apply!": "재부팅 없이 적용됩니다!", + "You can also press  to show": "을 눌러 표시할 수도 있습니다", + "information about each setting.": "각 설정에 대한 정보를.", + + " Experimental Settings are incomplete ": "실험적 설정은 미완성입니다", + "and may not work correctly or at all!": "올바르게 작동하지 않을 수 있습니다!", + "Here be dragons!": "여기에 드래곤이 있습니다!", + + "RAM Voltage Display Mode": "RAM 전압 표시 모드", + "RAM Display Unit": "RAM 표시 단위", + "Polling Interval": "폴링 간격", + "GPU Scheduling Override Method": "GPU 스케줄링 재정의 방법", + "GPU Scheduling Override": "GPU 스케줄링 재정의", + "GPU Boot Volt": "GPU 부팅 전압", + "GPU Boot Voltage": "GPU 부팅 전압", + "Memory Frequency Measurement Mode": "메모리 주파수 측정 모드", + " Overriding the charge current": "충전 전류 오버라이드", "can be dangerous and may cause": "위험할 수 있고 원인이 될 수 있습니다.", "damage to your battery or charger!": "배터리나 충전기가 손상되었습니다!", "Charge Current Override": "충전 전류 오버라이드", - "RAM Voltage Display Mode": "RAM 전압 표시 모드", - "Polling Interval": "폴링 간격", + "Display Color Preset": "디스플레이 색상 프리셋", + "Basic": "기본", + "Saturated": "채도 높음", + "Washed": "연한색", + "Natural": "자연스러움", + "Vivid": "선명함", + "CPU Governor Minimum Frequency": "CPU 거버너 최소 주파수", + " Usage of unsafe display": "안전하지 않은 주사율 사용", "refresh rates may cause stress": "디스플레이 주사율 빈도 변경은", "or damage to your display! ": "기기에 손상이 발생될 수 있습니다!", "Proceed at your own risk!": "책임하에 주의해서 사용하십시오!", "Max Handheld Display": "최대 휴대용 디스플레이", + "Max Handheld Display Hz": "최대 휴대용 Hz", "Display Clock": "디스플레이 클럭", + " Adjust the display voltage": "디스플레이 전압 조정", + "with caution to avoid damage": "손상을 피하기 위해 주의하여", + "to your display panel! ": "디스플레이 패널에!", + "Display Voltage": "디스플레이 전압", + + "Thermal Throttle Limit": "열 스로틀 한계", "Official Rating": "공식 등급", "TDP Threshold": "TDP 임계값", "Power": "힘", - "Thermal Throttle Limit": "열 스로틀 한계", "HP Mode": "HP 모드", - "Default (Mariko)": "기본값(마리코)", - "Default (Erista)": "기본값(에리스타)", - "Rating": "표준값", - "Safe Max (Mariko)": "안전함 최대치(마리코)", - "Safe Max (Erista)": "안전함 최대치(에리스타)", + + "DVB Shift": "DVB 시프트", + "SoC Max Volt": "SoC 최대 전압", + "Step Mode": "스텝 모드", "RAM VDD2 Voltage": "RAM VDD2 전압", - "Voltage": "전압", "RAM VDDQ Voltage": "RAM VDDQ 전압", + "Voltage": "전압", "RAM Frequency Editor": "RAM 주파수 편집기", - "JEDEC.": "JEDEC.", - "High speedo needed!": "높은 스피도값이 필요합니다!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (말도 안 되는 Speedo/PLL 필요)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)", "Ram Max Clock": "RAM 최대 클럭", "RAM Latency Editor": "RAM 지연 시간 편집기", "RAM Timing Reductions": "RAM 타이밍 편집기", @@ -102,6 +115,15 @@ "Memory Latencies": "메모리 지연 시간", "Read Latency": "읽기 지연 시간", "Write Latency": "쓰기 지연 시간", + "High speedo needed!": "높은 스피도값이 필요합니다!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(터무니없는 Speedo/PLL 필요)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU 부스트 클럭", "CPU UV": "CPU 언더볼트", "CPU Unlock": "CPU 잠금 해제", @@ -114,6 +136,7 @@ "CPU High UV": "CPU 고주파 언더볼트", "CPU Low VMIN": "CPU 저주파 최소 전압", "CPU High VMIN": "CPU 고주파 최소 전압", + "No Undervolt": "언더볼트 없음", "SLT Table": "SLT 테이블", "HiOPT Table": "HiOPT 테이블", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU 최대 전압", "GPU Voltage Offset": "GPU 전압 오프셋", - "Do not override": "재정의하지 않음", - "Enabled (Default)": "활성화됨(기본값)", - "96.6% limit": "96.6% 한도", - "99.7% limit": "99.7% 한도", - "GPU Scheduling Override": "GPU 스케줄링 재정의", - "Official Service": "공식 서비스", "GPU DVFS Mode": "GPU DVFS 모드", "GPU DVFS Offset": "GPU DVFS 오프셋", "GPU Voltage Table": "GPU 전압 테이블", "GPU Custom Table (mV)": "GPU 사용자 정의 테이블(mV)", + "Official Service": "공식 서비스", + "96.6% limit": "96.6% 한도", + "99.7% limit": "99.7% 한도", + " Setting GPU Clocks past": "GPU 클럭을 초과 설정", + "1228MHz without a proper undervolt": "적절한 언더볼트 없이 1228MHz", + "can cause degradation or damage": "열화 또는 손상을 유발할 수 있습니다", + "to your console!": "콘솔에!", "1075MHz without UV, 1152MHz on SLT": "UV 없이 1075MHz, SLT에서 1152MHz", "or 1228MHz on HiOPT can cause ": "또는 HiOPT에서 1228MHz를 사용하면", "permanent damage to your Switch!": "스위치가 영구적으로 손상될 수 있습니다!", "921MHz without UV and 960MHz on": "UV가 없는 경우 921MHz, 켜진 경우에는 960MHz", - "SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다." + "SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다.", + + "Default (Mariko)": "기본값(마리코)", + "Default (Erista)": "기본값(에리스타)", + "Rating": "표준값", + "Safe Max (Mariko)": "안전함 최대치(마리코)", + "Safe Max (Erista)": "안전함 최대치(에리스타)", + + "Voltages": "전압", + "RAM Voltage:": "RAM 전압:", + "Display Voltage:": "디스플레이 전압:", + "Temperatures": "온도", + "PLLX Temp:": "PLLX 온도:", + "AOTAG Temp:": "AOTAG 온도:", + "BQ24193 Temp:": "BQ24193 온도:", + "Normal": "정상", + "Warm": "따뜻함", + "Hot": "뜨거움", + "Overheat": "과열", + "Not Patched": "패치 안 됨", + "Invalid": "유효하지 않음", + "RAM Bandwidth": "RAM 대역폭", + "RAM BW (Peak):": "RAM 대역폭 (최대):", + "RAM BW (All):": "RAM 대역폭 (전체):", + "RAM BW (CPU):": "RAM 대역폭 (CPU):", + "RAM BW (GPU):": "RAM 대역폭 (GPU):", + "Hardware Info": "하드웨어 정보", + "Console Type:": "콘솔 유형:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 모듈: ", + "Software Info": "소프트웨어 정보", + "KIP version:": "KIP 버전:", + "sys-dock status:": "sys-dock 상태:", + "SaltyNX status:": "SaltyNX 상태:", + "RR Display status:": "RR 표시 상태:", + "Wafer Position:": "웨이퍼 위치:", + "IDDQ:": "IDDQ:", + "Module: ": "모듈:", + "Board": "보드", + "Display": "디스플레이", + + "Developers": "개발자", + "Contributors": "기여자", + "Testers": "테스터", + "Translators": "번역자", + "Special Thanks": "특별한 분", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%umV", + "Compiling with minimal features": "최소한의 기능으로 컴파일하기", + "THE BEER-WARE LICENSE": "맥주 제품 라이센스" } diff --git a/dist/config/horizon-oc/lang/lang/nl.json b/dist/config/horizon-oc/lang/lang/nl.json index 1005d3c2..5095d2be 100644 --- a/dist/config/horizon-oc/lang/lang/nl.json +++ b/dist/config/horizon-oc/lang/lang/nl.json @@ -1,52 +1,42 @@ { "Information": "Informatie", - "IDDQ:": "IDDQ:", - "Module: ": "module:", - "sys-dock status:": "sys-dock-status:", - "SaltyNX status:": "SaltyNX-status:", - "RR Display status:": "RR Weergavestatus:", - "Wafer Position:": "Waferpositie:", - "Credits": "Kredieten", - "Developers": "Ontwikkelaars", - "Contributors": "Bijdragers", - "Testers": "Testers", - "Special Thanks": "Speciale dank", "Unknown": "Onbekend", "Installed": "Geïnstalleerd", "Not Installed": "Niet geïnstalleerd", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN", "Default": "Standaard", "Do Not Override": "Niet overschrijven", + "Do not override": "Niet overschrijven", "Disabled": "Uitgeschakeld", "Enabled": "Ingeschakeld", - " \\ue0e3 Reset": "\\ue0e3 Opnieuw instellen", - "Display": "Weergave", - "Application changed\\n\\n": "Applicatie gewijzigd\\n\\n", - "The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n", - "while editing was going on.": "terwijl er werd bewerkt.", - "Board": "Bord", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Ingeschakeld (standaard)", + "Enable": "Inschakelen", + "Fatal error": "Fatale fout", "Could not connect to hoc-clk sysmodule.\\n\\n": "Kan geen verbinding maken met hoc-clk sysmodule.\\n\\n", "Please make sure everything is\\n\\n": "Zorg ervoor dat alles in orde is\\n\\n", "correctly installed and enabled.": "correct geïnstalleerd en ingeschakeld.", - "Fatal error": "Fatale fout", + + "Edit App Profile": "App-profiel bewerken", + "Edit Global Profile": "Globaal profiel bewerken", + "Temporary Overrides": "Tijdelijke overschrijvingen", "Temporary Overrides ": "Tijdelijke overschrijvingen", + "  Reset": " Opnieuw instellen", + "Settings": "Instellingen", + "About": "Over", + "Credits": "Kredieten", + + "Application changed\\n\\n": "Applicatie gewijzigd\\n\\n", + "The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n", + "while editing was going on.": "terwijl er werd bewerkt.", + "Sleep Mode": "Slaapmodus", "Stock": "Voorraad", "Dev OC": "Ontwikkelaar OC", "Boost Mode": "Boost-modus", "Safe Max": "Veilig Max", - "Unsafe Max": "OnveiligMax", + "Unsafe Max": "Onveilig Max", "Absolute Max": "Absoluut Max", - "Handheld Safe Max": "Handkluis Max", - "Enable": "Inschakelen", - "Edit App Profile": "App-profiel bewerken", - "Edit Global Profile": "Globaal profiel bewerken", - "Temporary Overrides": "Tijdelijke overschrijvingen", - "Settings": "Instellingen", - "About": "Over", - "Compiling with minimal features": "Compileren met minimale functies", + "Handheld Safe Max": "Handheld Veilig Max", + "General Settings": "Algemene instellingen", "Governor Settings": "Gouverneur instellingen", "Safety Settings": "Veiligheidsinstellingen", @@ -55,41 +45,64 @@ "CPU Settings": "CPU-instellingen", "GPU Settings": "GPU-instellingen", "Display Settings": "Weergave-instellingen", + "Experimental Settings": "Experimentele instellingen", "Experimental": "Experimenteel", + + " Settings marked in blue": "In blauw gemarkeerde instellingen", + "don't require a reboot to apply!": "vereisen geen herstart om toe te passen!", + "You can also press  to show": "Druk ook op  om te tonen", + "information about each setting.": "informatie over elke instelling.", + + " Experimental Settings are incomplete ": "Experimentele instellingen zijn onvolledig", + "and may not work correctly or at all!": "en werken mogelijk helemaal niet!", + "Here be dragons!": "Hier zijn draken!", + + "RAM Voltage Display Mode": "Weergavemodus RAM-spanning", + "RAM Display Unit": "RAM-weergave-eenheid", + "Polling Interval": "Polling-interval", + "GPU Scheduling Override Method": "Methode voor het overschrijven van GPU-planning", + "GPU Scheduling Override": "GPU-planning negeren", + "GPU Boot Volt": "GPU opstartspanning", + "GPU Boot Voltage": "GPU opstartspanning", + "Memory Frequency Measurement Mode": "Geheugenfrequentie-meetmodus", + " Overriding the charge current": "Het overschrijven van de laadstroom", "can be dangerous and may cause": "kan gevaarlijk zijn en kan veroorzaken", "damage to your battery or charger!": "schade aan uw accu of lader!", "Charge Current Override": "Laadstroom overschrijven", - "RAM Voltage Display Mode": "Weergavemodus RAM-spanning", - "Polling Interval": "Polling-interval", + "Display Color Preset": "Kleurvoorinstelling", + "Basic": "Basis", + "Saturated": "Verzadigd", + "Washed": "Uitgewassen", + "Natural": "Natuurlijk", + "Vivid": "Levendig", + "CPU Governor Minimum Frequency": "Minimale frequentie CPU-regelaar", + " Usage of unsafe display": "Het gebruik van onveilige schermfrequenties", "refresh rates may cause stress": "vernieuwingsfrequenties kunnen stress veroorzaken", "or damage to your display! ": "of schade aan uw display!", "Proceed at your own risk!": "Ga verder op eigen risico!", "Max Handheld Display": "Maximaal handheld-display", + "Max Handheld Display Hz": "Max handheld Hz", "Display Clock": "Klok weergeven", + " Adjust the display voltage": "Pas de displayspanning aan", + "with caution to avoid damage": "met voorzichtigheid om schade te vermijden", + "to your display panel! ": "van uw beeldschermpaneel!", + "Display Voltage": "Displayspanning", + + "Thermal Throttle Limit": "Thermische gaslimiet", "Official Rating": "Officiële beoordeling", "TDP Threshold": "TDP-drempel", "Power": "Macht", - "Thermal Throttle Limit": "Thermische gaslimiet", "HP Mode": "HP-modus", - "Default (Mariko)": "Standaard (Mariko)", - "Default (Erista)": "Standaard (Erista)", - "Rating": "Beoordeling", - "Safe Max (Mariko)": "Veilig Max (Mariko)", - "Safe Max (Erista)": "Veilige Max (Erista)", + + "DVB Shift": "DVB-verschuiving", + "SoC Max Volt": "SoC max spanning", + "Step Mode": "Stappmodus", "RAM VDD2 Voltage": "RAM VDD2-spanning", - "Voltage": "Spanning", "RAM VDDQ Voltage": "RAM VDDQ-spanning", + "Voltage": "Spanning", "RAM Frequency Editor": "RAM-frequentie-editor", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Hoge snelheid nodig!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme snelheidsmeter/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme snelheidsmeter/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme snelheidsmeter/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", "Ram Max Clock": "Ram Max-klok", "RAM Latency Editor": "RAM-latentie-editor", "RAM Timing Reductions": "RAM-timingreducties", @@ -102,6 +115,15 @@ "Memory Latencies": "Geheugenlatenties", "Read Latency": "Lees Latentie", "Write Latency": "Schrijf latentie", + "High speedo needed!": "Hoge Speedo-waarde nodig!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke Speedo/PLL nodig)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke Speedo/PLL nodig)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke Speedo/PLL nodig)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU-boostklok", "CPU UV": "CPU-UV", "CPU Unlock": "CPU-ontgrendeling", @@ -114,6 +136,7 @@ "CPU High UV": "CPU Hoge UV", "CPU Low VMIN": "CPU Lage VMIN", "CPU High VMIN": "CPU Hoge VMIN", + "No Undervolt": "Geen ondervolt", "SLT Table": "SLT-tabel", "HiOPT Table": "HiOPT-tabel", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU-VMIN", "GPU Maximum Voltage": "GPU maximale spanning", "GPU Voltage Offset": "GPU-spanningsoffset", - "Do not override": "Niet overschrijven", - "Enabled (Default)": "Ingeschakeld (standaard)", - "96.6% limit": "96,6% limiet", - "99.7% limit": "99,7% limiet", - "GPU Scheduling Override": "GPU-planning negeren", - "Official Service": "Officiële dienst", "GPU DVFS Mode": "GPU DVFS-modus", "GPU DVFS Offset": "GPU DVFS-offset", "GPU Voltage Table": "GPU-spanningstabel", "GPU Custom Table (mV)": "Aangepaste GPU-tabel (mV)", + "Official Service": "Officiële dienst", + "96.6% limit": "96,6% limiet", + "99.7% limit": "99,7% limiet", + " Setting GPU Clocks past": "GPU-klokken instellen voorbij", + "1228MHz without a proper undervolt": "1228MHz zonder goede onderspanning", + "can cause degradation or damage": "kan degradatie of schade veroorzaken", + "to your console!": "aan uw console!", "1075MHz without UV, 1152MHz on SLT": "1075MHz zonder UV, 1152MHz op SLT", "or 1228MHz on HiOPT can cause ": "of 1228MHz op HiOPT kan dit veroorzaken", "permanent damage to your Switch!": "blijvende schade aan uw Switch!", "921MHz without UV and 960MHz on": "921MHz zonder UV en 960MHz aan", - "SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken" + "SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken", + + "Default (Mariko)": "Standaard (Mariko)", + "Default (Erista)": "Standaard (Erista)", + "Rating": "Beoordeling", + "Safe Max (Mariko)": "Veilig Max (Mariko)", + "Safe Max (Erista)": "Veilige Max (Erista)", + + "Voltages": "Spanningen", + "RAM Voltage:": "RAM-spanning:", + "Display Voltage:": "Displayspanning:", + "Temperatures": "Temperaturen", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normaal", + "Warm": "Warm", + "Hot": "Heet", + "Overheat": "Oververhitting", + "Not Patched": "Niet gepatcht", + "Invalid": "Ongeldig", + "RAM Bandwidth": "RAM-bandbreedte", + "RAM BW (Peak):": "RAM-BW (Piek):", + "RAM BW (All):": "RAM-BW (Alle):", + "RAM BW (CPU):": "RAM-BW (CPU):", + "RAM BW (GPU):": "RAM-BW (GPU):", + "Hardware Info": "Hardware-info", + "Console Type:": "Consoletype:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM-module: ", + "Software Info": "Software-info", + "KIP version:": "KIP-versie:", + "sys-dock status:": "sys-dock-status:", + "SaltyNX status:": "SaltyNX-status:", + "RR Display status:": "RR Weergavestatus:", + "Wafer Position:": "Waferpositie:", + "IDDQ:": "IDDQ:", + "Module: ": "module:", + "Board": "Bord", + "Display": "Weergave", + + "Developers": "Ontwikkelaars", + "Contributors": "Bijdragers", + "Testers": "Testers", + "Translators": "Vertalers", + "Special Thanks": "Speciale dank", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compileren met minimale functies", + "THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN" } diff --git a/dist/config/horizon-oc/lang/lang/pl.json b/dist/config/horizon-oc/lang/lang/pl.json index 1233aa93..eecc5071 100644 --- a/dist/config/horizon-oc/lang/lang/pl.json +++ b/dist/config/horizon-oc/lang/lang/pl.json @@ -1,37 +1,33 @@ { "Information": "Informacje", - "IDDQ:": "IDDQ:", - "Module: ": "Moduł:", - "sys-dock status:": "stan sys-dock:", - "SaltyNX status:": "Stan SaltyNX:", - "RR Display status:": "Stan wyświetlacza:", - "Wafer Position:": "Pozycja wafla:", - "Credits": "Kredyty", - "Developers": "Deweloperzy", - "Contributors": "Współautorzy", - "Testers": "Testery", - "Special Thanks": "Specjalne podziękowania", "Unknown": "Nieznany", "Installed": "Zainstalowany", "Not Installed": "Nie zainstalowano", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE", "Default": "Domyślne", "Do Not Override": "Nie zastępuj", - "Disabled": "Niepełnosprawny", + "Do not override": "Nie zastępuj", + "Disabled": "Wyłączony", "Enabled": "Włączone", - " \\ue0e3 Reset": "\\ue0e3 Zresetuj", - "Display": "Wyświetlacz", - "Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n", - "The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n", - "while editing was going on.": "podczas gdy edycja była w toku.", - "Board": "Deska", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Włączone (domyślnie)", + "Enable": "Włącz", + "Fatal error": "Fatalny błąd", "Could not connect to hoc-clk sysmodule.\\n\\n": "Nie można połączyć się z modułem sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Upewnij się, że wszystko jest\\n\\n", "correctly installed and enabled.": "poprawnie zainstalowany i włączony.", - "Fatal error": "Fatalny błąd", + + "Edit App Profile": "Edytuj profil aplikacji", + "Edit Global Profile": "Edytuj profil globalny", + "Temporary Overrides": "Tymczasowe nadpisania", "Temporary Overrides ": "Tymczasowe nadpisania", + "  Reset": " Zresetuj", + "Settings": "Ustawienia", + "About": "O", + "Credits": "Kredyty", + + "Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n", + "The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n", + "while editing was going on.": "podczas gdy edycja była w toku.", + "Sleep Mode": "Tryb uśpienia", "Stock": "Zapas", "Dev OC": "Dev OC", @@ -39,14 +35,8 @@ "Safe Max": "Bezpieczny maks", "Unsafe Max": "Niebezpieczny maks", "Absolute Max": "Absolutny maks", - "Handheld Safe Max": "Sejf ręczny Max", - "Enable": "Włącz", - "Edit App Profile": "Edytuj profil aplikacji", - "Edit Global Profile": "Edytuj profil globalny", - "Temporary Overrides": "Tymczasowe nadpisania", - "Settings": "Ustawienia", - "About": "O", - "Compiling with minimal features": "Kompilacja z minimalnymi funkcjami", + "Handheld Safe Max": "Przenośny bezpieczny maks", + "General Settings": "Ustawienia ogólne", "Governor Settings": "Ustawienia gubernatora", "Safety Settings": "Ustawienia bezpieczeństwa", @@ -55,41 +45,64 @@ "CPU Settings": "Ustawienia procesora", "GPU Settings": "Ustawienia GPU", "Display Settings": "Ustawienia wyświetlania", + "Experimental Settings": "Ustawienia eksperymentalne", "Experimental": "Eksperymentalny", + + " Settings marked in blue": "Ustawienia zaznaczone na niebiesko", + "don't require a reboot to apply!": "nie wymagają ponownego uruchomienia!", + "You can also press  to show": "Możesz też wcisnąć  aby wyświetlić", + "information about each setting.": "informacje o każdym ustawieniu.", + + " Experimental Settings are incomplete ": "Ustawienia eksperymentalne są niekompletne", + "and may not work correctly or at all!": "i mogą w ogóle nie działać!", + "Here be dragons!": "Tu są smoki!", + + "RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM", + "RAM Display Unit": "Jednostka wyświetlania RAM", + "Polling Interval": "Interwał odpytywania", + "GPU Scheduling Override Method": "Metoda obejścia harmonogramu GPU", + "GPU Scheduling Override": "Zastąpienie harmonogramu GPU", + "GPU Boot Volt": "Napięcie startowe GPU", + "GPU Boot Voltage": "Napięcie startowe GPU", + "Memory Frequency Measurement Mode": "Tryb pomiaru częstotliwości pamięci", + " Overriding the charge current": "Nadpisanie prądu ładowania", "can be dangerous and may cause": "może być niebezpieczne i powodować", "damage to your battery or charger!": "uszkodzenie akumulatora lub ładowarki!", "Charge Current Override": "Obejście prądu ładowania", - "RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM", - "Polling Interval": "Interwał odpytywania", + "Display Color Preset": "Preset koloru", + "Basic": "Podstawowy", + "Saturated": "Nasycony", + "Washed": "Wyblakły", + "Natural": "Naturalny", + "Vivid": "Żywy", + "CPU Governor Minimum Frequency": "Minimalna częstotliwość regulatora procesora", + " Usage of unsafe display": "Użycie niebezpiecznych częstotliwości", "refresh rates may cause stress": "częstotliwości odświeżania mogą powodować stres", "or damage to your display! ": "lub uszkodzenie wyświetlacza!", "Proceed at your own risk!": "Postępuj na własne ryzyko!", "Max Handheld Display": "Maksymalny wyświetlacz ręczny", + "Max Handheld Display Hz": "Maks. Hz w trybie przenośnym", "Display Clock": "Wyświetl zegar", + " Adjust the display voltage": "Dostosuj napięcie wyświetlacza", + "with caution to avoid damage": "ostrożnie, aby uniknąć uszkodzeń", + "to your display panel! ": "panelu wyświetlacza!", + "Display Voltage": "Napięcie wyświetlacza", + + "Thermal Throttle Limit": "Limit przepustnicy termicznej", "Official Rating": "Oficjalna ocena", "TDP Threshold": "Próg TDP", "Power": "Moc", - "Thermal Throttle Limit": "Limit przepustnicy termicznej", "HP Mode": "Tryb HP", - "Default (Mariko)": "Domyślny (Mariko)", - "Default (Erista)": "Domyślny (Erista)", - "Rating": "Ocena", - "Safe Max (Mariko)": "Bezpieczny Max (Mariko)", - "Safe Max (Erista)": "Bezpieczny Max (Erista)", + + "DVB Shift": "Przesunięcie DVB", + "SoC Max Volt": "Maks. napięcie SoC", + "Step Mode": "Tryb krokowy", "RAM VDD2 Voltage": "Napięcie pamięci RAM VDD2", - "Voltage": "Napięcie", "RAM VDDQ Voltage": "Napięcie RAM VDDQ", + "Voltage": "Napięcie", "RAM Frequency Editor": "Edytor częstotliwości RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Potrzebna duża prędkość!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)", "Ram Max Clock": "Zegar Ram Max", "RAM Latency Editor": "Edytor opóźnień pamięci RAM", "RAM Timing Reductions": "Zmniejszenie taktowania pamięci RAM", @@ -100,8 +113,17 @@ "t7 tWTR Fine Tune": "t7 tWTR Dostosuj", "tWTR Fine Tune": "tWTR Dostosuj", "Memory Latencies": "Opóźnienia pamięci", - "Read Latency": "Przeczytaj Opóźnienie", + "Read Latency": "Opóźnienie odczytu", "Write Latency": "Opóźnienie zapisu", + "High speedo needed!": "Potrzebna duża wartość Speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Zegar wzmocnienia procesora", "CPU UV": "Procesor UV", "CPU Unlock": "Odblokowanie procesora", @@ -114,6 +136,7 @@ "CPU High UV": "Wysokie promieniowanie UV procesora", "CPU Low VMIN": "Niski poziom VMIN procesora", "CPU High VMIN": "Wysoki poziom VMIN procesora", + "No Undervolt": "Brak Undervolta", "SLT Table": "Stół SLT", "HiOPT Table": "Stół HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "VMIN GPU", "GPU Maximum Voltage": "Maksymalne napięcie procesora graficznego", "GPU Voltage Offset": "Przesunięcie napięcia GPU", - "Do not override": "Nie zastępuj", - "Enabled (Default)": "Włączone (domyślnie)", - "96.6% limit": "Limit 96,6%.", - "99.7% limit": "Limit 99,7%.", - "GPU Scheduling Override": "Zastąpienie harmonogramu GPU", - "Official Service": "Oficjalny serwis", "GPU DVFS Mode": "Tryb DVFS procesora graficznego", "GPU DVFS Offset": "Przesunięcie DVFS GPU", "GPU Voltage Table": "Tabela napięć GPU", "GPU Custom Table (mV)": "Tabela niestandardowa GPU (mV)", + "Official Service": "Oficjalny serwis", + "96.6% limit": "Limit 96,6%", + "99.7% limit": "Limit 99,7%", + " Setting GPU Clocks past": "Ustawianie zegarów GPU powyżej", + "1228MHz without a proper undervolt": "1228 MHz bez odpowiedniego undervolta", + "can cause degradation or damage": "może powodować degradację lub uszkodzenia", + "to your console!": "Twoją konsolę!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz bez UV, 1152 MHz na SLT", "or 1228MHz on HiOPT can cause ": "lub 1228 MHz na HiOPT może powodować", "permanent damage to your Switch!": "trwałe uszkodzenie Switcha!", "921MHz without UV and 960MHz on": "921 MHz bez UV i 960 MHz włączone", - "SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT" + "SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT", + + "Default (Mariko)": "Domyślny (Mariko)", + "Default (Erista)": "Domyślny (Erista)", + "Rating": "Ocena", + "Safe Max (Mariko)": "Bezpieczny Max (Mariko)", + "Safe Max (Erista)": "Bezpieczny Max (Erista)", + + "Voltages": "Napięcia", + "RAM Voltage:": "Napięcie RAM:", + "Display Voltage:": "Napięcie wyświetlacza:", + "Temperatures": "Temperatury", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normalny", + "Warm": "Ciepły", + "Hot": "Gorący", + "Overheat": "Przegrzanie", + "Not Patched": "Bez patcha", + "Invalid": "Nieprawidłowy", + "RAM Bandwidth": "Przepustowość RAM", + "RAM BW (Peak):": "BW RAM (Maks.):", + "RAM BW (All):": "BW RAM (Wszys.):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info o sprzęcie", + "Console Type:": "Typ konsoli:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Moduł DRAM: ", + "Software Info": "Info o oprogramowaniu", + "KIP version:": "Wersja KIP:", + "sys-dock status:": "stan sys-dock:", + "SaltyNX status:": "Stan SaltyNX:", + "RR Display status:": "Stan wyświetlacza:", + "Wafer Position:": "Pozycja wafla:", + "IDDQ:": "IDDQ:", + "Module: ": "Moduł:", + "Board": "Deska", + "Display": "Wyświetlacz", + + "Developers": "Deweloperzy", + "Contributors": "Współautorzy", + "Testers": "Testery", + "Translators": "Tłumacze", + "Special Thanks": "Specjalne podziękowania", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Kompilacja z minimalnymi funkcjami", + "THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE" } diff --git a/dist/config/horizon-oc/lang/lang/pt.json b/dist/config/horizon-oc/lang/lang/pt.json index fbddab17..906bab87 100644 --- a/dist/config/horizon-oc/lang/lang/pt.json +++ b/dist/config/horizon-oc/lang/lang/pt.json @@ -1,52 +1,42 @@ { "Information": "Informação", - "IDDQ:": "IDDQ:", - "Module: ": "Módulo:", - "sys-dock status:": "status do dock do sistema:", - "SaltyNX status:": "Status do SaltyNX:", - "RR Display status:": "Status de exibição do RR:", - "Wafer Position:": "Posição da bolacha:", - "Credits": "Créditos", - "Developers": "Desenvolvedores", - "Contributors": "Colaboradores", - "Testers": "Testadores", - "Special Thanks": "Agradecimentos especiais", "Unknown": "Desconhecido", "Installed": "Instalado", "Not Installed": "Não instalado", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA", "Default": "Padrão", "Do Not Override": "Não substituir", + "Do not override": "Não substitua", "Disabled": "Desativado", "Enabled": "Habilitado", - " \\ue0e3 Reset": "\\ue0e3 Redefinir", - "Display": "Exibição", - "Application changed\\n\\n": "Aplicativo alterado\\n\\n", - "The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n", - "while editing was going on.": "enquanto a edição estava acontecendo.", - "Board": "Conselho", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Habilitado (padrão)", + "Enable": "Habilitar", + "Fatal error": "Erro fatal", "Could not connect to hoc-clk sysmodule.\\n\\n": "Não foi possível conectar-se ao sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Verifique se tudo está\\n\\n", "correctly installed and enabled.": "corretamente instalado e ativado.", - "Fatal error": "Erro fatal", + + "Edit App Profile": "Editar perfil do aplicativo", + "Edit Global Profile": "Editar perfil global", + "Temporary Overrides": "Substituições temporárias", "Temporary Overrides ": "Substituições temporárias", + "  Reset": " Redefinir", + "Settings": "Configurações", + "About": "Sobre", + "Credits": "Créditos", + + "Application changed\\n\\n": "Aplicativo alterado\\n\\n", + "The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n", + "while editing was going on.": "enquanto a edição estava acontecendo.", + "Sleep Mode": "Modo de suspensão", - "Stock": "Estoque", + "Stock": "Padrão de fábrica", "Dev OC": "Desenvolvedor OC", "Boost Mode": "Modo de reforço", "Safe Max": "Máx. Seguro", "Unsafe Max": "Máximo inseguro", "Absolute Max": "Máximo absoluto", "Handheld Safe Max": "Portátil Seguro Máx.", - "Enable": "Habilitar", - "Edit App Profile": "Editar perfil do aplicativo", - "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Substituições temporárias", - "Settings": "Configurações", - "About": "Sobre", - "Compiling with minimal features": "Compilando com recursos mínimos", + "General Settings": "Configurações Gerais", "Governor Settings": "Configurações do Governador", "Safety Settings": "Configurações de segurança", @@ -55,42 +45,65 @@ "CPU Settings": "Configurações de CPU", "GPU Settings": "Configurações de GPU", "Display Settings": "Configurações de exibição", + "Experimental Settings": "Configurações experimentais", "Experimental": "Experimental", + + " Settings marked in blue": "Configurações marcadas em azul", + "don't require a reboot to apply!": "não requerem reinicialização para aplicar!", + "You can also press  to show": "Pressione também  para mostrar", + "information about each setting.": "informações sobre cada configuração.", + + " Experimental Settings are incomplete ": "Configurações experimentais incompletas", + "and may not work correctly or at all!": "e podem não funcionar corretamente!", + "Here be dragons!": "Aqui há dragões!", + + "RAM Voltage Display Mode": "Modo de exibição de tensão RAM", + "RAM Display Unit": "Unidade de exibição de RAM", + "Polling Interval": "Intervalo de sondagem", + "GPU Scheduling Override Method": "Método de substituição de agendamento de GPU", + "GPU Scheduling Override": "Substituição de agendamento de GPU", + "GPU Boot Volt": "Tensão de inicialização da GPU", + "GPU Boot Voltage": "Tensão de inicialização da GPU", + "Memory Frequency Measurement Mode": "Modo de medição de frequência de memória", + " Overriding the charge current": "Substituir a corrente de carga", "can be dangerous and may cause": "pode ser perigoso e causar", "damage to your battery or charger!": "danos à sua bateria ou carregador!", "Charge Current Override": "Substituição de corrente de carga", - "RAM Voltage Display Mode": "Modo de exibição de tensão RAM", - "Polling Interval": "Intervalo de votação", + "Display Color Preset": "Predefinição de cor", + "Basic": "Básico", + "Saturated": "Saturado", + "Washed": "Desbotado", + "Natural": "Natural", + "Vivid": "Vívido", + "CPU Governor Minimum Frequency": "Frequência Mínima do Governador da CPU", + " Usage of unsafe display": "O uso de frequências de tela", "refresh rates may cause stress": "taxas de atualização podem causar estresse", "or damage to your display! ": "ou danos ao seu monitor!", "Proceed at your own risk!": "Prossiga por sua conta e risco!", "Max Handheld Display": "Visor portátil máximo", + "Max Handheld Display Hz": "Hz máximo em modo portátil", "Display Clock": "Exibir relógio", + " Adjust the display voltage": "Ajuste a tensão do display", + "with caution to avoid damage": "com cuidado para evitar danos", + "to your display panel! ": "ao painel do display!", + "Display Voltage": "Tensão do display", + + "Thermal Throttle Limit": "Limite de aceleração térmica", "Official Rating": "Classificação Oficial", "TDP Threshold": "Limite de TDP", - "Power": "Poder", - "Thermal Throttle Limit": "Limite de aceleração térmica", + "Power": "Potência", "HP Mode": "Modo HP", - "Default (Mariko)": "Padrão (Mariko)", - "Default (Erista)": "Padrão (Erista)", - "Rating": "Avaliação", - "Safe Max (Mariko)": "Máximo Seguro (Mariko)", - "Safe Max (Erista)": "Seguro Max (Erista)", + + "DVB Shift": "Deslocamento DVB", + "SoC Max Volt": "Tensão máxima do SoC", + "Step Mode": "Modo passo", "RAM VDD2 Voltage": "Tensão RAM VDD2", - "Voltage": "Tensão", "RAM VDDQ Voltage": "Tensão RAM VDDQ", + "Voltage": "Tensão", "RAM Frequency Editor": "Editor de frequência RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Alta velocidade necessária!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)", - "Ram Max Clock": "Relógio máximo de Ram", + "Ram Max Clock": "Frequência máxima de Ram", "RAM Latency Editor": "Editor de latência de RAM", "RAM Timing Reductions": "Reduções de tempo de RAM", "Memory Timings": "Tempos de memória", @@ -102,6 +115,15 @@ "Memory Latencies": "Latências de memória", "Read Latency": "Latência de leitura", "Write Latency": "Latência de gravação", + "High speedo needed!": "Alto valor de Speedo necessário!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Relógio de aumento da CPU", "CPU UV": "UV da CPU", "CPU Unlock": "Desbloqueio da CPU", @@ -114,6 +136,7 @@ "CPU High UV": "CPU alta UV", "CPU Low VMIN": "CPU baixa VMIN", "CPU High VMIN": "VMIN alto da CPU", + "No Undervolt": "Sem subtensão", "SLT Table": "Tabela SLT", "HiOPT Table": "Tabela HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Tensão máxima da GPU", "GPU Voltage Offset": "Compensação de tensão da GPU", - "Do not override": "Não substitua", - "Enabled (Default)": "Habilitado (padrão)", - "96.6% limit": "Limite de 96,6%", - "99.7% limit": "Limite de 99,7%", - "GPU Scheduling Override": "Substituição de agendamento de GPU", - "Official Service": "Serviço Oficial", "GPU DVFS Mode": "Modo GPU DVFS", "GPU DVFS Offset": "Deslocamento DVFS da GPU", "GPU Voltage Table": "Tabela de tensão da GPU", "GPU Custom Table (mV)": "Tabela personalizada de GPU (mV)", + "Official Service": "Serviço Oficial", + "96.6% limit": "Limite de 96,6%", + "99.7% limit": "Limite de 99,7%", + " Setting GPU Clocks past": "Definir clocks de GPU além de", + "1228MHz without a proper undervolt": "1228MHz sem undervolt adequado", + "can cause degradation or damage": "pode causar degradação ou danos", + "to your console!": "ao seu console!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz sem UV, 1152 MHz em SLT", "or 1228MHz on HiOPT can cause ": "ou 1228 MHz em HiOPT pode causar", "permanent damage to your Switch!": "danos permanentes ao seu Switch!", "921MHz without UV and 960MHz on": "921 MHz sem UV e 960 MHz ativado", - "SLT or HiOPT can cause ": "SLT ou HiOPT podem causar" + "SLT or HiOPT can cause ": "SLT ou HiOPT podem causar", + + "Default (Mariko)": "Padrão (Mariko)", + "Default (Erista)": "Padrão (Erista)", + "Rating": "Avaliação", + "Safe Max (Mariko)": "Máximo Seguro (Mariko)", + "Safe Max (Erista)": "Seguro Max (Erista)", + + "Voltages": "Tensões", + "RAM Voltage:": "Tensão RAM:", + "Display Voltage:": "Tensão do display:", + "Temperatures": "Temperaturas", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Morno", + "Hot": "Quente", + "Overheat": "Superaquecimento", + "Not Patched": "Não corrigido", + "Invalid": "Inválido", + "RAM Bandwidth": "Largura de banda RAM", + "RAM BW (Peak):": "BW RAM (Pico):", + "RAM BW (All):": "BW RAM (Total):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info de hardware", + "Console Type:": "Tipo de console:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Módulo DRAM: ", + "Software Info": "Info de software", + "KIP version:": "Versão KIP:", + "sys-dock status:": "status do dock do sistema:", + "SaltyNX status:": "Status do SaltyNX:", + "RR Display status:": "Status de exibição do RR:", + "Wafer Position:": "Posição do wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Módulo:", + "Board": "Placa", + "Display": "Exibição", + + "Developers": "Desenvolvedores", + "Contributors": "Colaboradores", + "Testers": "Testadores", + "Translators": "Tradutores", + "Special Thanks": "Agradecimentos especiais", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilando com recursos mínimos", + "THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA" } diff --git a/dist/config/horizon-oc/lang/lang/ru.json b/dist/config/horizon-oc/lang/lang/ru.json index 7edb4408..3a428087 100644 --- a/dist/config/horizon-oc/lang/lang/ru.json +++ b/dist/config/horizon-oc/lang/lang/ru.json @@ -1,38 +1,33 @@ { "Information": "Информация", - "IDDQ:": "IDDQ:", - "Module: ": "Module:", - "sys-dock status:": "Статус sys-dock:", - "SaltyNX status:": "Статус SaltyNX:", - "RR Display status:": "Статус RR Display:", - "Wafer Position:": "Wafer Position:", - "Credits": "Благодарности", - "Developers": "Разработчики", - "Contributors": "Внесли вклад", - "Testers": "Тестеры", - "Special Thanks": "Особая благодарность", "Unknown": "Неизвестно", "Installed": "Установлено", "Not Installed": "Не установлено", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", "Default": "По умолчанию", "Do Not Override": "Не менять", + "Do not override": "Не менять", "Disabled": "Отключено", "Enabled": "Включено", - "Auto": "Авто", - " \\ue0e3 Reset": "\\ue0e3 Сброс", - "Display": "Дисплей", - "Application changed\\n\\n": "Приложение изменено\\n\\n", - "The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n", - "while editing was going on.": "пока шло редактирование.", - "Board": "Board", - "%u.%u%u mV": "%u.%u%u мВ", + "Enabled (Default)": "Включено (По умолчанию)", + "Enable": "Включено", + "Fatal error": "Фатальная ошибка", "Could not connect to hoc-clk sysmodule.\\n\\n": "Не удалось подключиться к сис-модулю hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Пожалуйста, убедитесь, что все\\n\\n", "correctly installed and enabled.": "правильно установлено и включено.", - "Fatal error": "Фатальная ошибка", + + "Edit App Profile": "Профиль приложения", + "Edit Global Profile": "Глобальный профиль", + "Temporary Overrides": "Временный профиль", "Temporary Overrides ": "Временный профиль", + "  Reset": " Сброс", + "Settings": "Настройки", + "About": "Сведения", + "Credits": "Благодарности", + + "Application changed\\n\\n": "Приложение изменено\\n\\n", + "The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n", + "while editing was going on.": "пока шло редактирование.", + "Sleep Mode": "Спящий режим", "Stock": "Стандарт", "Dev OC": "Разгон dev-кита", @@ -41,15 +36,7 @@ "Unsafe Max": "Опасный макс.", "Absolute Max": "Абсолютный макс.", "Handheld Safe Max": "Портативный безопасный макс.", - "Enable": "Включено", - "Edit App Profile": "Профиль приложения", - "Edit Global Profile": "Глобальный профиль", - "Temporary Overrides": "Временный профиль", - "Settings": "Настройки", - "About": "Сведения", - "Compiling with minimal features": "Собрано с урезанием функций", - "\uE150 Settings marked in blue": "Настройки помеченные синим", - "don't require a reboot to apply!": "Синие настройки применяются сразу!", + "General Settings": "Основные настройки", "Governor Settings": "Настройки говернора", "Safety Settings": "Настройки безопасности", @@ -58,45 +45,76 @@ "CPU Settings": "Настройки CPU", "GPU Settings": "Настройки GPU", "Display Settings": "Настройки дисплея", - "Experimental": "Экспериментальный", - "Enable Experimental Settings": "Экспериментальные настройки", - "\uE150 Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", - "and may not work correctly or at all!": "Экспериментальные настройки не", - "Here be dragons!": "закончены и могут не работать!", "Experimental Settings": "Экспериментальные", - "Live CPU Undervolt": "Мгновенный андервольт CPU", - "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", - "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", - "\uE150 Overriding the charge current": "Перезапись зарядного тока может", - "can be dangerous and may cause": "Перезапись зарядного тока может", - "damage to your battery or charger!": "повреждить аккумулятор или зарядку!", - "Charge Current Override": "Перезапись зарядного тока", + "Experimental": "Экспериментальный", + + " Settings marked in blue": "Настройки помеченные синим", + "don't require a reboot to apply!": "Синие настройки применяются сразу!", + "You can also press  to show": "Нажмите  для просмотра", + "information about each setting.": "информацию о каждом параметре.", + + " Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", + "and may not work correctly or at all!": "Экспериментальные настройки могут не работать!", + "Here be dragons!": "Здесь будут драконы!", + "RAM Voltage Display Mode": "Показ вольтажа RAM", "RAM Display Unit": "Показ единицы измерения RAM", "Polling Interval": "Интервал опроса", + + "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", + "GPU Scheduling Override": "Перезапись планировщика", + "GPU Boot Volt": "Напряжение загрузки GPU", + "GPU Boot Voltage": "Напряжение загрузки GPU", + "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", + " Overriding the charge current": "Перезапись зарядного тока может", + "can be dangerous and may cause": "Перезапись зарядного тока может", + "damage to your battery or charger!": "повреждить аккумулятор или зарядку!", + "Charge Current Override": "Перезапись зарядного тока", + "Display Color Preset": "Цветовой пресет", + "Basic": "Базовый", + "Saturated": "Насыщенный", + "Washed": "Бледный", + "Natural": "Натуральный", + "Vivid": "Яркий", + "CPU Governor Minimum Frequency": "Минимальная частота говернора CPU", - "\uE150 Usage of unsafe display": "\uE150 Использование не безопасной", + " Usage of unsafe display": "Использование не безопасной", "refresh rates may cause stress": "Не безопасная частота", "or damage to your display! ": "может повредить ваш экран", "Proceed at your own risk!": "Действуйте на свой страх и риск!", + "Max Handheld Display": "Макс. дисплей портатива", "Max Handheld Display Hz": "Макс. в портативе", "Display Clock": "Частота экрана", + " Adjust the display voltage": "Настройте напряжение экрана", + "with caution to avoid damage": "с осторожностью во избежание повреждений", + "to your display panel! ": "повреждений экрана!", + "Display Voltage": "Напряжение экрана", + + "Thermal Throttle Limit": "Предел троттлинга", "Official Rating": "Официальный рейтинг", "TDP Threshold": "Порог TDP", "Power": "Мощность", - "Thermal Throttle Limit": "Предел троттлинга", "HP Mode": "Режим HP", - "Default (Mariko)": "По умолчанию (M)", - "Default (Erista)": "По умолчанию (E)", - "Rating": "Рейтинг", - "Safe Max (Mariko)": "Сейф Макс (M)", - "Safe Max (Erista)": "Сейф Макс (E)", - "RAM VDD2 Voltage": "Вольтаж VDD2", - "Voltage": "Вольтаж", - "RAM VDDQ Voltage": "Вольтаж VDDQ", + + "DVB Shift": "DVB сдвиг", + "SoC Max Volt": "Макс. вольт SoC", "Step Mode": "Частотный шаг", + "RAM VDD2 Voltage": "Вольтаж VDD2", + "RAM VDDQ Voltage": "Вольтаж VDDQ", + "Voltage": "Вольтаж", "RAM Frequency Editor": "Редактор частоты", - "JEDEC.": "JEDEC.", + "Ram Max Clock": "Макс. частота", + "RAM Latency Editor": "Редактор задержек", + "RAM Timing Reductions": "Настройка таймингов", + "Memory Timings": "Тайминги RAM", + "Advanced": "Расширенные", + "t6 tRTW Fine Tune": "Точная настройка t6 tRTW", + "tRTW Fine Tune": "Точная настройка tRTW", + "t7 tWTR Fine Tune": "Точная настройка t7 tWTR", + "tWTR Fine Tune": "Точная настройка tWTR", + "Memory Latencies": "Задержки памяти", + "Read Latency": "Задержка чтения", + "Write Latency": "Задержка записи", "High speedo needed!": "Для высоких speedo", "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (нужны невероятные speedo/PLL)", "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (нужны невероятные speedo/PLL)", @@ -104,43 +122,8 @@ "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (нужны безумные speedo/PLL)", "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (нужны безумные speedo/PLL)", "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (нужны безумные speedo/PLL)", - "Ram Max Clock": "Макс. частота", - "RAM Latency Editor": "Редактор задержек", - "1333 Latency Max": "1333 задержка", - "1600 Latency Max": "1600 задержка", - "1866 Latency Max": "1866 задержка", - "2133 Latency Max": "2133 задержка", - "RAM Timing Reductions": "Настройка таймингов", - "Memory Timings": "Тайминги RAM", - "RAM-Timing tBreak": "Разбитие таблицы таймингов", - "Memory": "RAM", - "mem": "RAM", - "MEM": "RAM", - "Profile": "Профиль", - "Governor": "Говернор", - "Advanced": "Расширенные", - "Docked": "В доке", - "Handheld": "Портатив", - "Charging": "На зарядке", - "USB Charger": "USB Зарядка", - "PD Charger": "PD Зарядка", - "Handheld TDP": "TPD в портативе", - "Thermal Throttle": "Троттлинг", - "Uncapped Clocks": "Максимальные частоты", - "SoC DVB Shift": "SoC DVB сдвиг", - "SoC Max Volt": "Макс. вольт SoC", - "Overwrite Boost Mode": "Перезапись буста", - "Display Refresh Rate Changing": "Изменение частоты экрана", - "Low t6 tRTW": "Нижний t6 tRTW", - "Low t7 tWTR": "Нижний t7 tWTR", - "1333WL t2 RP Cap": "Предел 1333WL t2 RP", - "t6 tRTW Fine Tune": " Точная настройка t6 tRTW", - "tRTW Fine Tune": " Точная настройка tRTW", - "t7 tWTR Fine Tune": " Точная настройка t7 tWTR", - "tWTR Fine Tune": " Точная настройка tWTR", - "Memory Latencies": "Задержки памяти", - "Read Latency": "Задержка чтения", - "Write Latency": "Задержка записи", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Частота буста", "CPU UV": "Андервольт CPU", "CPU Unlock": "Разблокировка CPU", @@ -153,6 +136,7 @@ "CPU High UV": "Андервольт верхних частот", "CPU Low VMIN": "Мин. вольт. нижних частот", "CPU High VMIN": "Мин. вольт. верхних частот", + "No Undervolt": "Без андервольта", "SLT Table": "Таблица SLT", "HiOPT Table": "Таблица HiOPT", @@ -162,18 +146,71 @@ "GPU VMIN": "Мин. вольтаж", "GPU Maximum Voltage": "Макс. вольтаж", "GPU Voltage Offset": "Смещение вольтажа", - "Do not override": "Не менять", - "Enabled (Default)": "Включено (По умолчанию)", - "96.6% limit": "≤96,6%", - "99.7% limit": "≤99,7%", - "GPU Scheduling Override": "Перезапись планировщика", - "Official Service": "Официальная служба", "GPU DVFS Mode": "Режим DVFS", "GPU DVFS Offset": "Смещение DVFS", "GPU Voltage Table": "Таблица вольтажей", "GPU Custom Table (mV)": "Ручная таблица (мВ)", - "\uE150 Setting GPU Clocks past": "\uE150 Установка частот GPU выше", - "1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц", + "Official Service": "Официальная служба", + "96.6% limit": "≤96,6%", + "99.7% limit": "≤99,7%", + " Setting GPU Clocks past": "Установка частот GPU выше", + "1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц", "can cause degradation or damage": "без хорошего андервольта может", - "to your console!": "повредить вашу консоль!" + "to your console!": "повредить вашу консоль!", + "1075MHz without UV, 1152MHz on SLT": "1075 МГц без UV, 1152 МГц на SLT", + "or 1228MHz on HiOPT can cause ": "или 1228 МГц на HiOPT может привести к", + "permanent damage to your Switch!": "постоянному повреждению вашей Switch!", + "921MHz without UV and 960MHz on": "921 МГц без UV и 960 МГц на", + "SLT or HiOPT can cause ": "SLT или HiOPT могут привести к", + + "Default (Mariko)": "По умолчанию (M)", + "Default (Erista)": "По умолчанию (E)", + "Rating": "Рейтинг", + "Safe Max (Mariko)": "Сейф Макс (M)", + "Safe Max (Erista)": "Сейф Макс (E)", + + "Voltages": "Напряжения", + "RAM Voltage:": "Напряжение RAM:", + "Display Voltage:": "Напряжение дисплея:", + "Temperatures": "Температуры", + "PLLX Temp:": "PLLX Темп.:", + "AOTAG Temp:": "AOTAG Темп.:", + "BQ24193 Temp:": "BQ24193 Темп.:", + "Normal": "Нормальная", + "Warm": "Тёплая", + "Hot": "Горячая", + "Overheat": "Перегрев", + "Not Patched": "Не пропатчено", + "Invalid": "Недействительно", + "RAM Bandwidth": "Пропускная способность RAM", + "RAM BW (Peak):": "Полоса RAM (Макс.):", + "RAM BW (All):": "Полоса RAM (Всего):", + "RAM BW (CPU):": "Полоса RAM (CPU):", + "RAM BW (GPU):": "Полоса RAM (GPU):", + "Hardware Info": "Информация об оборудовании", + "Console Type:": "Тип консоли:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Модуль DRAM: ", + "Software Info": "Информация о программе", + "KIP version:": "Версия KIP:", + "sys-dock status:": "Статус sys-dock:", + "SaltyNX status:": "Статус SaltyNX:", + "RR Display status:": "Статус RR Display:", + "Wafer Position:": "Wafer Position:", + "IDDQ:": "IDDQ:", + "Module: ": "Module:", + "Board": "Board", + "Display": "Дисплей", + + "Developers": "Разработчики", + "Contributors": "Внесли вклад", + "Testers": "Тестеры", + "Translators": "Переводчики", + "Special Thanks": "Особая благодарность", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u мВ", + "Compiling with minimal features": "Собрано с урезанием функций", + "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", + "Auto": "Авто" } diff --git a/dist/config/horizon-oc/lang/lang/template.json b/dist/config/horizon-oc/lang/lang/template.json new file mode 100644 index 00000000..51c51c1a --- /dev/null +++ b/dist/config/horizon-oc/lang/lang/template.json @@ -0,0 +1,214 @@ +{ + "Information": "", + "Unknown": "", + "Installed": "", + "Not Installed": "", + "Default": "", + "Do Not Override": "", + "Do not override": "", + "Disabled": "", + "Enabled": "", + "Enabled (Default)": "", + "Enable": "", + "Fatal error": "", + "Could not connect to hoc-clk sysmodule.\\n\\n": "", + "Please make sure everything is\\n\\n": "", + "correctly installed and enabled.": "", + + "Edit App Profile": "", + "Edit Global Profile": "", + "Temporary Overrides": "", + "Temporary Overrides ": "", + "  Reset": "", + "Settings": "", + "About": "", + "Credits": "", + + "Application changed\\n\\n": "", + "The running application changed\\n\\n": "", + "while editing was going on.": "", + + "Sleep Mode": "", + "Stock": "", + "Dev OC": "", + "Boost Mode": "", + "Safe Max": "", + "Unsafe Max": "", + "Absolute Max": "", + "Handheld Safe Max": "", + + "General Settings": "", + "Governor Settings": "", + "Safety Settings": "", + "Save KIP Settings": "", + "RAM Settings": "", + "CPU Settings": "", + "GPU Settings": "", + "Display Settings": "", + "Experimental Settings": "", + "Experimental": "", + + " Settings marked in blue": "", + "don't require a reboot to apply!": "", + "You can also press  to show": "", + "information about each setting.": "", + + " Experimental Settings are incomplete ": "", + "and may not work correctly or at all!": "", + "Here be dragons!": "", + + "RAM Voltage Display Mode": "", + "RAM Display Unit": "", + "Polling Interval": "", + + "GPU Scheduling Override Method": "", + "GPU Scheduling Override": "", + "GPU Boot Volt": "", + "GPU Boot Voltage": "", + "Memory Frequency Measurement Mode": "", + " Overriding the charge current": "", + "can be dangerous and may cause": "", + "damage to your battery or charger!": "", + "Charge Current Override": "", + "Display Color Preset": "", + "Basic": "", + "Saturated": "", + "Washed": "", + "Natural": "", + "Vivid": "", + + "CPU Governor Minimum Frequency": "", + " Usage of unsafe display": "", + "refresh rates may cause stress": "", + "or damage to your display! ": "", + "Proceed at your own risk!": "", + "Max Handheld Display": "", + "Max Handheld Display Hz": "", + "Display Clock": "", + " Adjust the display voltage": "", + "with caution to avoid damage": "", + "to your display panel! ": "", + "Display Voltage": "", + + "Thermal Throttle Limit": "", + "Official Rating": "", + "TDP Threshold": "", + "Power": "", + "HP Mode": "", + + "DVB Shift": "", + "SoC Max Volt": "", + "Step Mode": "", + "RAM VDD2 Voltage": "", + "RAM VDDQ Voltage": "", + "Voltage": "", + "RAM Frequency Editor": "", + "Ram Max Clock": "", + "RAM Latency Editor": "", + "RAM Timing Reductions": "", + "Memory Timings": "", + "Advanced": "", + "t6 tRTW Fine Tune": "", + "tRTW Fine Tune": "", + "t7 tWTR Fine Tune": "", + "tWTR Fine Tune": "", + "Memory Latencies": "", + "Read Latency": "", + "Write Latency": "", + "High speedo needed!": "", + "3333MHz (Needs extreme Speedo/PLL)": "", + "3366MHz (Needs extreme Speedo/PLL)": "", + "3400MHz (Needs extreme Speedo/PLL)": "", + "3433MHz (Needs ridiculous Speedo/PLL)": "", + "3466MHz (Needs ridiculous Speedo/PLL)": "", + "3500MHz (Needs ridiculous Speedo/PLL)": "", + "JEDEC.": "", + + "CPU Boost Clock": "", + "CPU UV": "", + "CPU Unlock": "", + "CPU VMIN": "", + "CPU Max Voltage": "", + "CPU Max Clock": "", + "Extreme UV Table": "", + "CPU UV Table": "", + "CPU Low UV": "", + "CPU High UV": "", + "CPU Low VMIN": "", + "CPU High VMIN": "", + + "No Undervolt": "", + "SLT Table": "", + "HiOPT Table": "", + "GPU Undervolt Table": "", + "GPU Minimum Voltage": "", + "Calculate GPU Vmin": "", + "GPU VMIN": "", + "GPU Maximum Voltage": "", + "GPU Voltage Offset": "", + "GPU DVFS Mode": "", + "GPU DVFS Offset": "", + "GPU Voltage Table": "", + "GPU Custom Table (mV)": "", + "Official Service": "", + "96.6% limit": "", + "99.7% limit": "", + " Setting GPU Clocks past": "", + "1228MHz without a proper undervolt": "", + "can cause degradation or damage": "", + "to your console!": "", + "1075MHz without UV, 1152MHz on SLT": "", + "or 1228MHz on HiOPT can cause ": "", + "permanent damage to your Switch!": "", + "921MHz without UV and 960MHz on": "", + "SLT or HiOPT can cause ": "", + + "Default (Mariko)": "", + "Default (Erista)": "", + "Rating": "", + "Safe Max (Mariko)": "", + "Safe Max (Erista)": "", + + "Voltages": "", + "RAM Voltage:": "", + "Display Voltage:": "", + "Temperatures": "", + "PLLX Temp:": "", + "AOTAG Temp:": "", + "BQ24193 Temp:": "", + "Normal": "", + "Warm": "", + "Hot": "", + "Overheat": "", + "Not Patched": "", + "Invalid": "", + "RAM Bandwidth": "", + "RAM BW (Peak):": "", + "RAM BW (All):": "", + "RAM BW (CPU):": "", + "RAM BW (GPU):": "", + "Hardware Info": "", + "Console Type:": "", + "Speedo:": "", + "DRAM Module: ": "", + "Software Info": "", + "KIP version:": "", + "sys-dock status:": "", + "SaltyNX status:": "", + "RR Display status:": "", + "Wafer Position:": "", + "IDDQ:": "", + "Module: ": "", + "Board": "", + "Display": "", + + "Developers": "", + "Contributors": "", + "Testers": "", + "Translators": "", + "Special Thanks": "", + + "X: %u Y: %u": "", + "%u.%u%u mV": "", + "Compiling with minimal features": "", +} diff --git a/dist/config/horizon-oc/lang/lang/uk.json b/dist/config/horizon-oc/lang/lang/uk.json index c0239f8a..7af7040a 100644 --- a/dist/config/horizon-oc/lang/lang/uk.json +++ b/dist/config/horizon-oc/lang/lang/uk.json @@ -1,52 +1,42 @@ { "Information": "Інформація", - "IDDQ:": "IDDQ:", - "Module: ": "Модуль:", - "sys-dock status:": "стан sys-dock:", - "SaltyNX status:": "Статус SaltyNX:", - "RR Display status:": "Статус дисплея RR:", - "Wafer Position:": "Позиція пластини:", - "Credits": "Кредити", - "Developers": "Розробники", - "Contributors": "Дописувачі", - "Testers": "Тестери", - "Special Thanks": "Особлива подяка", "Unknown": "Невідомий", "Installed": "встановлено", "Not Installed": "Не встановлено", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД", "Default": "За замовчуванням", "Do Not Override": "Не перевизначати", + "Do not override": "Не перевизначати", "Disabled": "Вимкнено", "Enabled": "Увімкнено", - " \\ue0e3 Reset": "\\ue0e3 Скидання", - "Display": "Дисплей", - "Application changed\\n\\n": "Додаток змінено\\n\\n", - "The running application changed\\n\\n": "Запущена програма змінена\\n\\n", - "while editing was going on.": "поки йшло редагування.", - "Board": "дошка", - "%u.%u%u mV": "%u.%u%u мВ", + "Enabled (Default)": "Увімкнено (за замовчуванням)", + "Enable": "Увімкнути", + "Fatal error": "Фатальна помилка", "Could not connect to hoc-clk sysmodule.\\n\\n": "Не вдалося підключитися до системного модуля hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Переконайтеся, що все\\n\\n", "correctly installed and enabled.": "правильно встановлено та включено.", - "Fatal error": "Фатальна помилка", + + "Edit App Profile": "Редагувати профіль програми", + "Edit Global Profile": "Редагувати глобальний профіль", + "Temporary Overrides": "Тимчасові перевизначення", "Temporary Overrides ": "Тимчасові перевизначення", + "  Reset": " Скидання", + "Settings": "Налаштування", + "About": "про", + "Credits": "Кредити", + + "Application changed\\n\\n": "Додаток змінено\\n\\n", + "The running application changed\\n\\n": "Запущена програма змінена\\n\\n", + "while editing was going on.": "поки йшло редагування.", + "Sleep Mode": "Режим сну", - "Stock": "Запас", + "Stock": "Стандарт", "Dev OC": "Розробник OC", "Boost Mode": "Режим посилення", "Safe Max": "Безпечний макс", "Unsafe Max": "Небезпечний макс", "Absolute Max": "Абсолютний макс", - "Handheld Safe Max": "Портативний сейф Макс", - "Enable": "Увімкнути", - "Edit App Profile": "Редагувати профіль програми", - "Edit Global Profile": "Редагувати глобальний профіль", - "Temporary Overrides": "Тимчасові перевизначення", - "Settings": "Налаштування", - "About": "про", - "Compiling with minimal features": "Компіляція з мінімальними можливостями", + "Handheld Safe Max": "Портативний безпечний макс", + "General Settings": "Загальні налаштування", "Governor Settings": "Налаштування губернатора", "Safety Settings": "Налаштування безпеки", @@ -55,41 +45,64 @@ "CPU Settings": "Налаштування ЦП", "GPU Settings": "Налаштування GPU", "Display Settings": "Налаштування дисплея", + "Experimental Settings": "Експериментальні налаштування", "Experimental": "Експериментальний", + + " Settings marked in blue": "Налаштування, позначені синім", + "don't require a reboot to apply!": "не потребують перезавантаження!", + "You can also press  to show": "Також натисніть  для показу", + "information about each setting.": "інформацію про кожне налаштування.", + + " Experimental Settings are incomplete ": "Експериментальні налаштування неповні", + "and may not work correctly or at all!": "і можуть взагалі не працювати!", + "Here be dragons!": "Тут є дракони!", + + "RAM Voltage Display Mode": "Режим відображення напруги RAM", + "RAM Display Unit": "Одиниця відображення RAM", + "Polling Interval": "Інтервал опитування", + "GPU Scheduling Override Method": "Метод перевизначення планування GPU", + "GPU Scheduling Override": "Перевизначення планування GPU", + "GPU Boot Volt": "Напруга завантаження GPU", + "GPU Boot Voltage": "Напруга завантаження GPU", + "Memory Frequency Measurement Mode": "Режим вимірювання частоти пам'яті", + " Overriding the charge current": "Перевизначення струму заряду", "can be dangerous and may cause": "може бути небезпечним і може спричинити", "damage to your battery or charger!": "пошкодження акумулятора або зарядного пристрою!", "Charge Current Override": "Перевизначення струму заряду", - "RAM Voltage Display Mode": "Режим відображення напруги RAM", - "Polling Interval": "Інтервал опитування", + "Display Color Preset": "Кольоровий пресет дисплея", + "Basic": "Базовий", + "Saturated": "Насичений", + "Washed": "Блідий", + "Natural": "Природний", + "Vivid": "Яскравий", + "CPU Governor Minimum Frequency": "Мінімальна частота регулятора ЦП", + " Usage of unsafe display": "Використання небезпечних частот екрана", "refresh rates may cause stress": "частоти оновлення можуть викликати стрес", "or damage to your display! ": "або пошкодження дисплея!", "Proceed at your own risk!": "Продовжуйте на свій страх і ризик!", "Max Handheld Display": "Максимальний портативний дисплей", + "Max Handheld Display Hz": "Макс. Гц в портативному режимі", "Display Clock": "Відображення годинника", + " Adjust the display voltage": "Налаштуйте напругу дисплея", + "with caution to avoid damage": "обережно, щоб уникнути пошкоджень", + "to your display panel! ": "до панелі дисплея!", + "Display Voltage": "Напруга дисплея", + + "Thermal Throttle Limit": "Термічний дросельний ліміт", "Official Rating": "Офіційний рейтинг", "TDP Threshold": "Поріг TDP", "Power": "потужність", - "Thermal Throttle Limit": "Термічний дросельний ліміт", "HP Mode": "Режим HP", - "Default (Mariko)": "За замовчуванням (Маріко)", - "Default (Erista)": "За замовчуванням (Erista)", - "Rating": "Рейтинг", - "Safe Max (Mariko)": "Сейф Макс (Маріко)", - "Safe Max (Erista)": "Сейф Макс (Еріста)", + + "DVB Shift": "DVB зсув", + "SoC Max Volt": "Макс. напруга SoC", + "Step Mode": "Покроковий режим", "RAM VDD2 Voltage": "Напруга RAM VDD2", - "Voltage": "Напруга", "RAM VDDQ Voltage": "Напруга RAM VDDQ", + "Voltage": "Напруга", "RAM Frequency Editor": "Редактор частоти оперативної пам'яті", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Потрібна висока швидкість!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)", "Ram Max Clock": "Годинник Ram Max", "RAM Latency Editor": "Редактор затримки оперативної пам'яті", "RAM Timing Reductions": "Скорочення оперативної пам'яті", @@ -100,20 +113,30 @@ "t7 tWTR Fine Tune": "t7 tWTR Точне налаштування", "tWTR Fine Tune": "Точна настройка tWTR", "Memory Latencies": "Затримки пам'яті", - "Read Latency": "Прочитати затримку", + "Read Latency": "Затримка читання", "Write Latency": "Затримка запису", + "High speedo needed!": "Потрібна висока швидкість Speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU Boost Clock", "CPU UV": "CPU UV", "CPU Unlock": "Розблокування ЦП", "CPU VMIN": "CPU VMIN", "CPU Max Voltage": "Максимальна напруга ЦП", "CPU Max Clock": "Максимальна частота ЦП", - "Extreme UV Table": "Екстремальний ультрафіолетовий стіл", + "Extreme UV Table": "Екстремальна UV таблиця", "CPU UV Table": "CPU UV Таблиця", "CPU Low UV": "CPU Low UV", "CPU High UV": "CPU High UV", "CPU Low VMIN": "CPU Low VMIN", "CPU High VMIN": "CPU High VMIN", + "No Undervolt": "Без андервольта", "SLT Table": "Таблиця SLT", "HiOPT Table": "Таблиця HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Максимальна напруга GPU", "GPU Voltage Offset": "Зсув напруги GPU", - "Do not override": "Не перевизначати", - "Enabled (Default)": "Увімкнено (за замовчуванням)", - "96.6% limit": "96,6% обмеження", - "99.7% limit": "Обмеження 99,7%.", - "GPU Scheduling Override": "Перевизначення планування GPU", - "Official Service": "Офіційний сервіс", "GPU DVFS Mode": "Режим GPU DVFS", "GPU DVFS Offset": "GPU DVFS Offset", "GPU Voltage Table": "Таблиця напруги GPU", "GPU Custom Table (mV)": "Спеціальна таблиця GPU (мВ)", + "Official Service": "Офіційний сервіс", + "96.6% limit": "96,6% обмеження", + "99.7% limit": "99,7% обмеження", + " Setting GPU Clocks past": "Встановлення тактових частот GPU вище", + "1228MHz without a proper undervolt": "1228 МГц без належного підвольту", + "can cause degradation or damage": "може спричинити деградацію або пошкодження", + "to your console!": "вашій консолі!", "1075MHz without UV, 1152MHz on SLT": "1075 МГц без УФ, 1152 МГц на SLT", "or 1228MHz on HiOPT can cause ": "або 1228 МГц на HiOPT може спричинити", - "permanent damage to your Switch!": "незворотне пошкодження вашого комутатора!", + "permanent damage to your Switch!": "незворотне пошкодження вашого Switch!", "921MHz without UV and 960MHz on": "921 МГц без УФ і 960 МГц увімкнено", - "SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити" + "SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити", + + "Default (Mariko)": "За замовчуванням (Маріко)", + "Default (Erista)": "За замовчуванням (Erista)", + "Rating": "Рейтинг", + "Safe Max (Mariko)": "Сейф Макс (Маріко)", + "Safe Max (Erista)": "Сейф Макс (Еріста)", + + "Voltages": "Напруги", + "RAM Voltage:": "Напруга RAM:", + "Display Voltage:": "Напруга дисплея:", + "Temperatures": "Температури", + "PLLX Temp:": "PLLX Темп.:", + "AOTAG Temp:": "AOTAG Темп.:", + "BQ24193 Temp:": "BQ24193 Темп.:", + "Normal": "Нормально", + "Warm": "Тепло", + "Hot": "Гаряче", + "Overheat": "Перегрів", + "Not Patched": "Не виправлено", + "Invalid": "Недійсний", + "RAM Bandwidth": "Пропускна здатність RAM", + "RAM BW (Peak):": "BW RAM (Пік):", + "RAM BW (All):": "BW RAM (Усі):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Інфо про апаратне забезпечення", + "Console Type:": "Тип консолі:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Модуль DRAM: ", + "Software Info": "Інфо про програмне забезпечення", + "KIP version:": "Версія KIP:", + "sys-dock status:": "стан sys-dock:", + "SaltyNX status:": "Статус SaltyNX:", + "RR Display status:": "Статус дисплея RR:", + "Wafer Position:": "Позиція пластини:", + "IDDQ:": "IDDQ:", + "Module: ": "Модуль:", + "Board": "дошка", + "Display": "Дисплей", + + "Developers": "Розробники", + "Contributors": "Дописувачі", + "Testers": "Тестери", + "Translators": "Перекладачі", + "Special Thanks": "Особлива подяка", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u мВ", + "Compiling with minimal features": "Компіляція з мінімальними можливостями", + "THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД" } diff --git a/dist/config/horizon-oc/lang/lang/zh-cn.json b/dist/config/horizon-oc/lang/lang/zh-cn.json index 53989929..a49c4d7a 100644 --- a/dist/config/horizon-oc/lang/lang/zh-cn.json +++ b/dist/config/horizon-oc/lang/lang/zh-cn.json @@ -1,37 +1,33 @@ { "Information": "信息", - "IDDQ:": "IDDQ:", - "Module: ": "模块: ", - "sys-dock status:": "sys-dock 状态:", - "SaltyNX status:": "SaltyNX 状态:", - "RR Display status:": "RR 显示状态:", - "Wafer Position:": "晶圆位置:", - "Credits": "致谢", - "Developers": "开发者", - "Contributors": "贡献者", - "Testers": "测试者", - "Special Thanks": "特别感谢", "Unknown": "未知", "Installed": "已安装", "Not Installed": "未安装", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "啤酒软件许可协议", "Default": "默认", "Do Not Override": "不修改", + "Do not override": "不修改", "Disabled": "已禁用", "Enabled": "已启用", - " \\ue0e3 Reset": " \\ue0e3 重置", - "Display": "显示", - "Application changed\\n\\n": "应用已变更\\n\\n", - "The running application changed\\n\\n": "正在运行的应用已变更\\n\\n", - "while editing was going on.": "编辑过程中发生变更。", - "Board": "主板", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "已启用 (默认)", + "Enable": "启用", + "Fatal error": "致命错误", "Could not connect to hoc-clk sysmodule.\\n\\n": "无法连接到 hoc-clk 系统模块。\\n\\n", "Please make sure everything is\\n\\n": "请确保所有内容均已\\n\\n", "correctly installed and enabled.": "正确安装并启用。", - "Fatal error": "致命错误", + + "Edit App Profile": "编辑应用配置", + "Edit Global Profile": "编辑全局配置", + "Temporary Overrides": "临时配置", "Temporary Overrides ": "临时配置 ", + "  Reset": " 重置", + "Settings": "设置", + "About": "关于", + "Credits": "致谢", + + "Application changed\\n\\n": "应用已变更\\n\\n", + "The running application changed\\n\\n": "正在运行的应用已变更\\n\\n", + "while editing was going on.": "编辑过程中发生变更。", + "Sleep Mode": "睡眠模式", "Stock": "原厂默认", "Dev OC": "开发者超频", @@ -40,13 +36,7 @@ "Unsafe Max": "危险最大值", "Absolute Max": "绝对最大值", "Handheld Safe Max": "掌机模式安全最大值", - "Enable": "启用", - "Edit App Profile": "编辑应用配置", - "Edit Global Profile": "编辑全局配置", - "Temporary Overrides": "临时配置", - "Settings": "设置", - "About": "关于", - "Compiling with minimal features": "以最小功能编译", + "General Settings": "通用设置", "Governor Settings": "调频器设置", "Safety Settings": "安全设置", @@ -55,61 +45,69 @@ "CPU Settings": "CPU 设置", "GPU Settings": "GPU 设置", "Display Settings": "显示设置", + "Experimental Settings": "实验性设置", "Experimental": "实验性功能", + + " Settings marked in blue": "蓝色标注的设置", + "don't require a reboot to apply!": "无需重启即可应用!", + "You can also press  to show": "也可按  查看", + "information about each setting.": "每项设置的说明。", + + " Experimental Settings are incomplete ": "实验性设置尚未完成", + "and may not work correctly or at all!": "且可能无法正常工作!", + "Here be dragons!": "此处有险!", + + "RAM Voltage Display Mode": "内存电压显示模式", + "RAM Display Unit": "内存显示单位", + "Polling Interval": "刷新间隔", + "GPU Scheduling Override Method": "GPU 调度覆盖方式", + "GPU Scheduling Override": "GPU 调度修改", + "GPU Boot Volt": "GPU 启动电压", + "GPU Boot Voltage": "GPU 启动电压", + "Memory Frequency Measurement Mode": "内存频率测量模式", + " Overriding the charge current": "修改充电电流", "can be dangerous and may cause": "存在风险,可能导致", "damage to your battery or charger!": "电池或充电器损坏!", "Charge Current Override": "充电电流修改", - "RAM Voltage Display Mode": "内存电压显示模式", - "Polling Interval": "刷新间隔", + "Display Color Preset": "显示颜色预设", + "Basic": "基础", + "Saturated": "饱和", + "Washed": "淡色", + "Natural": "自然", + "Vivid": "鲜艳", + "CPU Governor Minimum Frequency": "CPU 调频器最低频率", - "\uE150 Usage of unsafe display": "\uE150 不安全的显示屏", + " Usage of unsafe display": "不安全的显示屏", "refresh rates may cause stress": "刷新率可能会对", "or damage to your display! ": "显示屏造成压力或损坏! ", "Proceed at your own risk!": "操作风险自负!", "Max Handheld Display": "掌机模式最大显示率", + "Max Handheld Display Hz": "掌机最大显示率 Hz", "Display Clock": "显示时钟", + " Adjust the display voltage": "调整显示电压", + "with caution to avoid damage": "请谨慎以避免损坏", + "to your display panel! ": "显示屏面板!", + "Display Voltage": "显示电压", + + "Thermal Throttle Limit": "温控设置", "Official Rating": "官方额定值", "TDP Threshold": "TDP 阈值", "Power": "电源", - "Thermal Throttle Limit": "温控设置", "HP Mode": "高性能模式", - "Default (Mariko)": "默认 (Mariko)", - "Default (Erista)": "默认 (Erista)", - "Rating": "额定值", - "Safe Max (Mariko)": "安全最大值 (Mariko)", - "Safe Max (Erista)": "安全最大值 (Erista)", + + "DVB Shift": "DVB 偏移", + "SoC Max Volt": "SoC 最大电压", + "Step Mode": "步进模式", "RAM VDD2 Voltage": "内存 VDD2 电压", - "Voltage": "电压", "RAM VDDQ Voltage": "内存 VDDQ 电压", + "Voltage": "电压", "RAM Frequency Editor": "内存频率编辑器", - "JEDEC.": "JEDEC 标准。", - "High speedo needed!": "需要高 Speedo 配置!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)", "Ram Max Clock": "内存最大频率", "RAM Latency Editor": "内存延迟编辑器", "RAM Timing Reductions": "内存时序优化", "Memory Timings": "内存时序", - "Memory": "内存", - "mem": "内存", - "Governor": "调频器", "Advanced": "高级", - "Docked": "底座模式", - "Handheld": "掌机模式", - "Charging": "充电中", - "USB Charger": "USB 充电器", - "PD Charger": "PD 充电器", - "Handheld TDP": "掌机模式功耗限制", - "Thermal Throttle": "温度控制", - "Uncapped Clocks": "解除频率上限", - "Soc DVB Shift": "SoC DVB偏移", - "Overwrite Boost Mode": "接管官方CPU调度", - "Display Refresh Rate Changing": "显示刷新率变更", "t6 tRTW Fine Tune": "t6 tRTW 微调", "tRTW Fine Tune": "tRTW 微调", "t7 tWTR Fine Tune": "t7 tWTR 微调", @@ -117,6 +115,15 @@ "Memory Latencies": "内存延迟", "Read Latency": "读取延迟", "Write Latency": "写入延迟", + "High speedo needed!": "需要高 Speedo 配置!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)", + "JEDEC.": "JEDEC 标准。", + "CPU Boost Clock": "CPU 超频频率", "CPU UV": "CPU 降压", "CPU Unlock": "CPU 解锁", @@ -129,6 +136,7 @@ "CPU High UV": "CPU 高压降压", "CPU Low VMIN": "CPU 低压最低电压", "CPU High VMIN": "CPU 高压最低电压", + "No Undervolt": "不降压", "SLT Table": "SLT 表", "HiOPT Table": "HiOPT 表", @@ -138,20 +146,70 @@ "GPU VMIN": "GPU 最低电压", "GPU Maximum Voltage": "GPU 最大电压", "GPU Voltage Offset": "GPU 电压偏移", - "Do not override": "不修改", - "Enabled (Default)": "已启用 (默认)", - "96.6% limit": "96.6% 限制", - "99.7% limit": "99.7% 限制", - "GPU Scheduling Override": "GPU 调度修改", - "Official Service": "官方服务", "GPU DVFS Mode": "GPU DVFS 模式", "GPU DVFS Offset": "GPU DVFS 偏移", "GPU Voltage Table": "GPU 电压表", "GPU Custom Table (mV)": "GPU 自定义表 (mV)", - "\uE150 Setting GPU Clocks past": "\uE150 将 GPU 频率设置超过", + "Official Service": "官方服务", + "96.6% limit": "96.6% 限制", + "99.7% limit": "99.7% 限制", + " Setting GPU Clocks past": " 将 GPU 频率设置超过", + "1228MHz without a proper undervolt": "没有适当降压的 1228MHz", + "can cause degradation or damage": "可能导致损耗或损坏", + "to your console!": "您的主机!", "1075MHz without UV, 1152MHz on SLT": "1075MHz 无降压,SLT 表下 1152MHz", "or 1228MHz on HiOPT can cause ": "或 HiOPT 表下 1228MHz 可能导致 ", "permanent damage to your Switch!": "Switch 永久损坏!", "921MHz without UV and 960MHz on": "921MHz 无降压,SLT/HiOPT 表下 960MHz", - "SLT or HiOPT can cause ": "可能导致 " + "SLT or HiOPT can cause ": "可能导致 ", + + "Default (Mariko)": "默认 (Mariko)", + "Default (Erista)": "默认 (Erista)", + "Rating": "额定值", + "Safe Max (Mariko)": "安全最大值 (Mariko)", + "Safe Max (Erista)": "安全最大值 (Erista)", + + "Voltages": "电压", + "RAM Voltage:": "内存电压:", + "Display Voltage:": "显示电压:", + "Temperatures": "温度", + "PLLX Temp:": "PLLX 温度:", + "AOTAG Temp:": "AOTAG 温度:", + "BQ24193 Temp:": "BQ24193 温度:", + "Normal": "正常", + "Warm": "温热", + "Hot": "过热", + "Overheat": "严重过热", + "Not Patched": "未修补", + "Invalid": "无效", + "RAM Bandwidth": "内存带宽", + "RAM BW (Peak):": "RAM带宽(峰值):", + "RAM BW (All):": "RAM带宽(全部):", + "RAM BW (CPU):": "RAM带宽(CPU):", + "RAM BW (GPU):": "RAM带宽(GPU):", + "Hardware Info": "硬件信息", + "Console Type:": "主机类型:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 模块: ", + "Software Info": "软件信息", + "KIP version:": "KIP 版本:", + "sys-dock status:": "sys-dock 状态:", + "SaltyNX status:": "SaltyNX 状态:", + "RR Display status:": "RR 显示状态:", + "Wafer Position:": "晶圆位置:", + "IDDQ:": "IDDQ:", + "Module: ": "模块: ", + "Board": "主板", + "Display": "显示", + + "Developers": "开发者", + "Contributors": "贡献者", + "Testers": "测试者", + "Translators": "翻译", + "Special Thanks": "特别感谢", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "以最小功能编译", + "THE BEER-WARE LICENSE": "啤酒软件许可协议" } diff --git a/dist/config/horizon-oc/lang/lang/zh-tw.json b/dist/config/horizon-oc/lang/lang/zh-tw.json index 5a8a5dfa..75765af9 100644 --- a/dist/config/horizon-oc/lang/lang/zh-tw.json +++ b/dist/config/horizon-oc/lang/lang/zh-tw.json @@ -1,52 +1,42 @@ { "Information": "資訊", - "IDDQ:": "國際電話號碼:", - "Module: ": "模組:", - "sys-dock status:": "系統塢站狀態:", - "SaltyNX status:": "SaltyNX 狀態:", - "RR Display status:": "RR 顯示狀態:", - "Wafer Position:": "晶圓位置:", - "Credits": "製作人員", - "Developers": "開發商", - "Contributors": "貢獻者", - "Testers": "測試人員", - "Special Thanks": "特別感謝", "Unknown": "未知", "Installed": "已安裝", "Not Installed": "未安裝", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "啤酒製品許可證", "Default": "預設", "Do Not Override": "不要覆蓋", - "Disabled": "殘障人士", - "Enabled": "啟用", - " \\ue0e3 Reset": "\\ue0e3 重設", - "Display": "顯示", + "Do not override": "不要覆蓋", + "Disabled": "已停用", + "Enabled": "已啟用", + "Enabled (Default)": "已啟用(預設)", + "Enable": "啟用", + "Fatal error": "致命錯誤", + "Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。\\n\\n", + "Please make sure everything is\\n\\n": "請確保一切正常\\n\\n", + "correctly installed and enabled.": "正確安裝並啟用。", + + "Edit App Profile": "編輯應用程式設定檔", + "Edit Global Profile": "編輯全域設定檔", + "Temporary Overrides": "臨時覆蓋", + "Temporary Overrides ": "臨時覆蓋", + "  Reset": " 重設", + "Settings": "設定", + "About": "關於", + "Credits": "製作人員", + "Application changed\\n\\n": "應用程式已更改\\n\\n", "The running application changed\\n\\n": "正在運行的應用程式已更改\\n\\n", "while editing was going on.": "當編輯正在進行時。", - "Board": "董事會", - "%u.%u%u mV": "%u.%u%u mV", - "Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。 \\n\\n", - "Please make sure everything is\\n\\n": "請確保一切正常\\n\\n", - "correctly installed and enabled.": "正確安裝並啟用。", - "Fatal error": "致命錯誤", - "Temporary Overrides ": "臨時覆蓋", + "Sleep Mode": "睡眠模式", - "Stock": "庫存", + "Stock": "原廠預設", "Dev OC": "開發OC", "Boost Mode": "升壓模式", "Safe Max": "安全最大值", "Unsafe Max": "不安全最大值", "Absolute Max": "絕對最大值", - "Handheld Safe Max": "手持式安全最大", - "Enable": "啟用", - "Edit App Profile": "編輯應用程式設定檔", - "Edit Global Profile": "編輯全域設定檔", - "Temporary Overrides": "臨時覆蓋", - "Settings": "設定", - "About": "關於", - "Compiling with minimal features": "使用最少的功能進行編譯", + "Handheld Safe Max": "手持式安全最大值", + "General Settings": "常規設定", "Governor Settings": "調速器設定", "Safety Settings": "安全設定", @@ -55,42 +45,65 @@ "CPU Settings": "中央處理器設定", "GPU Settings": "GPU設定", "Display Settings": "顯示設定", + "Experimental Settings": "實驗性設定", "Experimental": "實驗性的", + + " Settings marked in blue": "藍色標示的設定", + "don't require a reboot to apply!": "無需重開機即可套用!", + "You can also press  to show": "也可按  顯示", + "information about each setting.": "每項設定的說明。", + + " Experimental Settings are incomplete ": "實驗性設定尚未完成", + "and may not work correctly or at all!": "且可能無法正常運作!", + "Here be dragons!": "此處有危險!", + + "RAM Voltage Display Mode": "RAM電壓顯示模式", + "RAM Display Unit": "記憶體顯示單位", + "Polling Interval": "輪詢間隔", + "GPU Scheduling Override Method": "GPU調度覆蓋方法", + "GPU Scheduling Override": "GPU 調度覆蓋", + "GPU Boot Volt": "GPU 啟動電壓", + "GPU Boot Voltage": "GPU 啟動電壓", + "Memory Frequency Measurement Mode": "記憶體頻率測量模式", + " Overriding the charge current": "覆蓋充電電流", "can be dangerous and may cause": "可能很危險並可能導致", "damage to your battery or charger!": "損壞電池或充電器!", "Charge Current Override": "充電電流覆蓋", - "RAM Voltage Display Mode": "RAM電壓顯示模式", - "Polling Interval": "輪詢間隔", + "Display Color Preset": "顯示顏色預設", + "Basic": "基本", + "Saturated": "飽和", + "Washed": "淡色", + "Natural": "自然", + "Vivid": "鮮艷", + "CPU Governor Minimum Frequency": "CPU調速器最低頻率", + " Usage of unsafe display": "不安全的顯示率", "refresh rates may cause stress": "刷新率可能會造成壓力", "or damage to your display! ": "或損壞您的顯示器!", "Proceed at your own risk!": "請自行承擔風險!", "Max Handheld Display": "最大手持顯示器", + "Max Handheld Display Hz": "最大手持顯示率 Hz", "Display Clock": "顯示時鐘", + " Adjust the display voltage": "調整顯示電壓", + "with caution to avoid damage": "請謹慎操作以避免損壞", + "to your display panel! ": "顯示面板!", + "Display Voltage": "顯示電壓", + + "Thermal Throttle Limit": "熱油門限制", "Official Rating": "官方評級", "TDP Threshold": "TDP閾值", "Power": "電源", - "Thermal Throttle Limit": "熱油門限制", - "HP Mode": "惠普模式", - "Default (Mariko)": "預設(真理子)", - "Default (Erista)": "預設(埃里斯塔)", - "Rating": "評級", - "Safe Max (Mariko)": "安全最大(真理子)", - "Safe Max (Erista)": "安全最大(埃里斯塔)", + "HP Mode": "高效能模式", + + "DVB Shift": "DVB 偏移", + "SoC Max Volt": "SoC 最大電壓", + "Step Mode": "步進模式", "RAM VDD2 Voltage": "RAM VDD2 電壓", - "Voltage": "電壓", "RAM VDDQ Voltage": "RAM VDDQ 電壓", + "Voltage": "電壓", "RAM Frequency Editor": "RAM頻率編輯器", - "JEDEC.": "JEDEC。", - "High speedo needed!": "需要高速!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)", - "Ram Max Clock": "記憶體最大時鐘", + "Ram Max Clock": "記憶體最大時脈", "RAM Latency Editor": "RAM 延遲編輯器", "RAM Timing Reductions": "RAM 時序減少", "Memory Timings": "記憶體時序", @@ -102,18 +115,28 @@ "Memory Latencies": "記憶體延遲", "Read Latency": "讀取延遲", "Write Latency": "寫入延遲", - "CPU Boost Clock": "CPU 升壓時鐘", - "CPU UV": "中央處理器紫外線", + "High speedo needed!": "需要高 Speedo 值!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)", + "JEDEC.": "JEDEC。", + + "CPU Boost Clock": "CPU 升壓時脈", + "CPU UV": "CPU 降壓", "CPU Unlock": "CPU解鎖", - "CPU VMIN": "CPU最低電壓", + "CPU VMIN": "CPU 最低電壓", "CPU Max Voltage": "CPU最大電壓", "CPU Max Clock": "CPU 最大時脈", - "Extreme UV Table": "極端紫外線表", - "CPU UV Table": "CPU UV表", - "CPU Low UV": "CPU低紫外線", - "CPU High UV": "CPU高紫外線", + "Extreme UV Table": "極限降壓表", + "CPU UV Table": "CPU 降壓表", + "CPU Low UV": "CPU 低壓降壓", + "CPU High UV": "CPU 高壓降壓", "CPU Low VMIN": "CPU 低 VMIN", "CPU High VMIN": "CPU 高 VMIN", + "No Undervolt": "無欠壓", "SLT Table": "SLT表", "HiOPT Table": "HiOPT表", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU最大電壓", "GPU Voltage Offset": "GPU電壓偏移", - "Do not override": "不要覆蓋", - "Enabled (Default)": "啟用(預設)", - "96.6% limit": "96.6%限制", - "99.7% limit": "99.7%限制", - "GPU Scheduling Override": "GPU 調度覆蓋", - "Official Service": "官方服務", "GPU DVFS Mode": "GPU DVFS 模式", "GPU DVFS Offset": "GPU DVFS 偏移", "GPU Voltage Table": "GPU電壓表", "GPU Custom Table (mV)": "GPU 自訂表 (mV)", + "Official Service": "官方服務", + "96.6% limit": "96.6%限制", + "99.7% limit": "99.7%限制", + " Setting GPU Clocks past": "將 GPU 頻率設定超過", + "1228MHz without a proper undervolt": "1228MHz 未適當降壓", + "can cause degradation or damage": "可能導致劣化或損壞", + "to your console!": "您的主機!", "1075MHz without UV, 1152MHz on SLT": "無 UV 時為 1075MHz,SLT 時為 1152MHz", "or 1228MHz on HiOPT can cause ": "或 HiOPT 上的 1228MHz 可能會導致", "permanent damage to your Switch!": "對您的 Switch 造成永久性損壞!", "921MHz without UV and 960MHz on": "無 UV 時為 921MHz,開啟時為 960MHz", - "SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致" + "SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致", + + "Default (Mariko)": "預設 (Mariko)", + "Default (Erista)": "預設 (Erista)", + "Rating": "評級", + "Safe Max (Mariko)": "安全最大值 (Mariko)", + "Safe Max (Erista)": "安全最大值 (Erista)", + + "Voltages": "電壓", + "RAM Voltage:": "記憶體電壓:", + "Display Voltage:": "顯示電壓:", + "Temperatures": "溫度", + "PLLX Temp:": "PLLX 溫度:", + "AOTAG Temp:": "AOTAG 溫度:", + "BQ24193 Temp:": "BQ24193 溫度:", + "Normal": "正常", + "Warm": "溫熱", + "Hot": "過熱", + "Overheat": "嚴重過熱", + "Not Patched": "未修補", + "Invalid": "無效", + "RAM Bandwidth": "記憶體頻寬", + "RAM BW (Peak):": "RAM頻寬(峰值):", + "RAM BW (All):": "RAM頻寬(全部):", + "RAM BW (CPU):": "RAM頻寬(CPU):", + "RAM BW (GPU):": "RAM頻寬(GPU):", + "Hardware Info": "硬體資訊", + "Console Type:": "主機類型:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 模組:", + "Software Info": "軟體資訊", + "KIP version:": "KIP 版本:", + "sys-dock status:": "系統塢站狀態:", + "SaltyNX status:": "SaltyNX 狀態:", + "RR Display status:": "RR 顯示狀態:", + "Wafer Position:": "晶圓位置:", + "IDDQ:": "IDDQ:", + "Module: ": "模組:", + "Board": "主板", + "Display": "顯示", + + "Developers": "開發商", + "Contributors": "貢獻者", + "Testers": "測試人員", + "Translators": "翻譯", + "Special Thanks": "特別感謝", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "使用最少的功能進行編譯", + "THE BEER-WARE LICENSE": "啤酒製品許可證" } diff --git a/dist/config/horizon-oc/lang/ru.json b/dist/config/horizon-oc/lang/ru.json index 4cfdb1bd..7edb4408 100644 --- a/dist/config/horizon-oc/lang/ru.json +++ b/dist/config/horizon-oc/lang/ru.json @@ -1,141 +1,179 @@ { "Information": "Информация", - "IDDQ:": "ИДДК:", - "Module: ": "Модуль:", - "sys-dock status:": "Статус системной док-станции:", + "IDDQ:": "IDDQ:", + "Module: ": "Module:", + "sys-dock status:": "Статус sys-dock:", "SaltyNX status:": "Статус SaltyNX:", - "RR Display status:": "Статус отображения RR:", - "Wafer Position:": "Позиция вафли:", - "Credits": "Кредиты", + "RR Display status:": "Статус RR Display:", + "Wafer Position:": "Wafer Position:", + "Credits": "Благодарности", "Developers": "Разработчики", - "Contributors": "Авторы", + "Contributors": "Внесли вклад", "Testers": "Тестеры", "Special Thanks": "Особая благодарность", "Unknown": "Неизвестно", "Installed": "Установлено", "Not Installed": "Не установлено", "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "ЛИЦЕНЗИЯ НА ПРОДАЖУ ПИВА", + "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", "Default": "По умолчанию", - "Do Not Override": "Не переопределять", + "Do Not Override": "Не менять", "Disabled": "Отключено", "Enabled": "Включено", + "Auto": "Авто", " \\ue0e3 Reset": "\\ue0e3 Сброс", "Display": "Дисплей", "Application changed\\n\\n": "Приложение изменено\\n\\n", "The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n", "while editing was going on.": "пока шло редактирование.", - "Board": "Совет", + "Board": "Board", "%u.%u%u mV": "%u.%u%u мВ", - "Could not connect to hoc-clk sysmodule.\\n\\n": "Не удалось подключиться к системному модулю hoc-clk.\\n\\n", - "Please make sure everything is\\n\\n": "Пожалуйста, убедитесь, что все в порядке\\n\\n", - "correctly installed and enabled.": "правильно установлен и включен.", - "Fatal error": "Неустранимая ошибка", - "Temporary Overrides ": "Временные переопределения", + "Could not connect to hoc-clk sysmodule.\\n\\n": "Не удалось подключиться к сис-модулю hoc-clk.\\n\\n", + "Please make sure everything is\\n\\n": "Пожалуйста, убедитесь, что все\\n\\n", + "correctly installed and enabled.": "правильно установлено и включено.", + "Fatal error": "Фатальная ошибка", + "Temporary Overrides ": "Временный профиль", "Sleep Mode": "Спящий режим", - "Stock": "Акции", - "Dev OC": "Разработчик OC", - "Boost Mode": "Режим повышения", - "Safe Max": "Сейф Макс", - "Unsafe Max": "Небезопасный Макс", - "Absolute Max": "Абсолютный Макс", - "Handheld Safe Max": "Ручной сейф Макс", - "Enable": "Включить", - "Edit App Profile": "Редактировать профиль приложения", - "Edit Global Profile": "Редактировать глобальный профиль", - "Temporary Overrides": "Временные переопределения", + "Stock": "Стандарт", + "Dev OC": "Разгон dev-кита", + "Boost Mode": "Режим буста", + "Safe Max": "Безопасный макс.", + "Unsafe Max": "Опасный макс.", + "Absolute Max": "Абсолютный макс.", + "Handheld Safe Max": "Портативный безопасный макс.", + "Enable": "Включено", + "Edit App Profile": "Профиль приложения", + "Edit Global Profile": "Глобальный профиль", + "Temporary Overrides": "Временный профиль", "Settings": "Настройки", - "About": "О", - "Compiling with minimal features": "Компиляция с минимальными возможностями", - "General Settings": "Общие настройки", - "Governor Settings": "Настройки губернатора", + "About": "Сведения", + "Compiling with minimal features": "Собрано с урезанием функций", + "\uE150 Settings marked in blue": "Настройки помеченные синим", + "don't require a reboot to apply!": "Синие настройки применяются сразу!", + "General Settings": "Основные настройки", + "Governor Settings": "Настройки говернора", "Safety Settings": "Настройки безопасности", - "Save KIP Settings": "Сохранить настройки КИП", - "RAM Settings": "Настройки ОЗУ", - "CPU Settings": "Настройки процессора", - "GPU Settings": "Настройки графического процессора", + "Save KIP Settings": "Сохранить настройки KIP", + "RAM Settings": "Настройки RAM", + "CPU Settings": "Настройки CPU", + "GPU Settings": "Настройки GPU", "Display Settings": "Настройки дисплея", "Experimental": "Экспериментальный", - "GPU Scheduling Override Method": "Метод переопределения планирования графического процессора", - "can be dangerous and may cause": "может быть опасным и может вызвать", - "damage to your battery or charger!": "повреждение аккумулятора или зарядного устройства!", - "Charge Current Override": "Блокировка зарядного тока", - "RAM Voltage Display Mode": "Режим отображения напряжения ОЗУ", + "Enable Experimental Settings": "Экспериментальные настройки", + "\uE150 Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", + "and may not work correctly or at all!": "Экспериментальные настройки не", + "Here be dragons!": "закончены и могут не работать!", + "Experimental Settings": "Экспериментальные", + "Live CPU Undervolt": "Мгновенный андервольт CPU", + "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", + "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", + "\uE150 Overriding the charge current": "Перезапись зарядного тока может", + "can be dangerous and may cause": "Перезапись зарядного тока может", + "damage to your battery or charger!": "повреждить аккумулятор или зарядку!", + "Charge Current Override": "Перезапись зарядного тока", + "RAM Voltage Display Mode": "Показ вольтажа RAM", + "RAM Display Unit": "Показ единицы измерения RAM", "Polling Interval": "Интервал опроса", - "CPU Governor Minimum Frequency": "Минимальная частота регулятора ЦП", - "refresh rates may cause stress": "частота обновления может вызвать стресс", - "or damage to your display! ": "или повреждение дисплея!", + "CPU Governor Minimum Frequency": "Минимальная частота говернора CPU", + "\uE150 Usage of unsafe display": "\uE150 Использование не безопасной", + "refresh rates may cause stress": "Не безопасная частота", + "or damage to your display! ": "может повредить ваш экран", "Proceed at your own risk!": "Действуйте на свой страх и риск!", - "Max Handheld Display": "Макс. портативный дисплей", - "Display Clock": "Дисплей Часы", + "Max Handheld Display Hz": "Макс. в портативе", + "Display Clock": "Частота экрана", "Official Rating": "Официальный рейтинг", "TDP Threshold": "Порог TDP", "Power": "Мощность", - "Thermal Throttle Limit": "Температурный предел дроссельной заслонки", + "Thermal Throttle Limit": "Предел троттлинга", "HP Mode": "Режим HP", - "Default (Mariko)": "По умолчанию (Марико)", - "Default (Erista)": "По умолчанию (Эриста)", + "Default (Mariko)": "По умолчанию (M)", + "Default (Erista)": "По умолчанию (E)", "Rating": "Рейтинг", - "Safe Max (Mariko)": "Сейф Макс (Марико)", - "Safe Max (Erista)": "Сейф Макс (Эриста)", - "RAM VDD2 Voltage": "Напряжение ОЗУ VDD2", - "Voltage": "Напряжение", - "RAM VDDQ Voltage": "Напряжение ОЗУ VDDQ", - "RAM Frequency Editor": "Редактор частоты оперативной памяти", - "JEDEC.": "ДЖЕДЕК.", - "High speedo needed!": "Нужен высокий спидометр!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (требуется экстремальный спидометр/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (требуется экстремальный спидометр/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (требуется экстремальный спидометр/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (нужен нелепый спидометр/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (нужен нелепый спидометр/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (нужен нелепый спидометр/PLL)", - "Ram Max Clock": "Рам Макс Часы", - "RAM Latency Editor": "Редактор задержки оперативной памяти", - "RAM Timing Reductions": "Сокращение таймингов ОЗУ", - "Memory Timings": "Тайминги памяти", - "Advanced": "Расширенный", - "t6 tRTW Fine Tune": "t6 tRTW Точная настройка", - "tRTW Fine Tune": "tRTW Точная настройка", - "t7 tWTR Fine Tune": "t7 tWTR Тонкая настройка", - "tWTR Fine Tune": "tWTR Тонкая настройка", + "Safe Max (Mariko)": "Сейф Макс (M)", + "Safe Max (Erista)": "Сейф Макс (E)", + "RAM VDD2 Voltage": "Вольтаж VDD2", + "Voltage": "Вольтаж", + "RAM VDDQ Voltage": "Вольтаж VDDQ", + "Step Mode": "Частотный шаг", + "RAM Frequency Editor": "Редактор частоты", + "JEDEC.": "JEDEC.", + "High speedo needed!": "Для высоких speedo", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (нужны невероятные speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (нужны невероятные speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (нужны невероятные speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (нужны безумные speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (нужны безумные speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (нужны безумные speedo/PLL)", + "Ram Max Clock": "Макс. частота", + "RAM Latency Editor": "Редактор задержек", + "1333 Latency Max": "1333 задержка", + "1600 Latency Max": "1600 задержка", + "1866 Latency Max": "1866 задержка", + "2133 Latency Max": "2133 задержка", + "RAM Timing Reductions": "Настройка таймингов", + "Memory Timings": "Тайминги RAM", + "RAM-Timing tBreak": "Разбитие таблицы таймингов", + "Memory": "RAM", + "mem": "RAM", + "MEM": "RAM", + "Profile": "Профиль", + "Governor": "Говернор", + "Advanced": "Расширенные", + "Docked": "В доке", + "Handheld": "Портатив", + "Charging": "На зарядке", + "USB Charger": "USB Зарядка", + "PD Charger": "PD Зарядка", + "Handheld TDP": "TPD в портативе", + "Thermal Throttle": "Троттлинг", + "Uncapped Clocks": "Максимальные частоты", + "SoC DVB Shift": "SoC DVB сдвиг", + "SoC Max Volt": "Макс. вольт SoC", + "Overwrite Boost Mode": "Перезапись буста", + "Display Refresh Rate Changing": "Изменение частоты экрана", + "Low t6 tRTW": "Нижний t6 tRTW", + "Low t7 tWTR": "Нижний t7 tWTR", + "1333WL t2 RP Cap": "Предел 1333WL t2 RP", + "t6 tRTW Fine Tune": " Точная настройка t6 tRTW", + "tRTW Fine Tune": " Точная настройка tRTW", + "t7 tWTR Fine Tune": " Точная настройка t7 tWTR", + "tWTR Fine Tune": " Точная настройка tWTR", "Memory Latencies": "Задержки памяти", "Read Latency": "Задержка чтения", "Write Latency": "Задержка записи", - "CPU Boost Clock": "Тактовая частота процессора", - "CPU UV": "УФ процессора", - "CPU Unlock": "Разблокировка процессора", - "CPU VMIN": "ЦП VMIN", - "CPU Max Voltage": "Максимальное напряжение процессора", - "CPU Max Clock": "Максимальная частота процессора", - "Extreme UV Table": "Стол для экстремального УФ-излучения", - "CPU UV Table": "UV-таблица процессора", - "CPU Low UV": "ЦП с низким УФ-излучением", - "CPU High UV": "Процессор с высоким УФ", - "CPU Low VMIN": "Низкий VMIN процессора", - "CPU High VMIN": "Высокий VMIN процессора", - "No Undervolt": "Нет Андервольта", - "SLT Table": "Таблица ТА", + "CPU Boost Clock": "Частота буста", + "CPU UV": "Андервольт CPU", + "CPU Unlock": "Разблокировка CPU", + "CPU VMIN": "Мин. вольтаж", + "CPU Max Voltage": "Макс. вольтаж", + "CPU Max Clock": "Макс. частота", + "Extreme UV Table": "Экстримальная", + "CPU UV Table": "Таблица андервольта", + "CPU Low UV": "Андервольт нижних частот", + "CPU High UV": "Андервольт верхних частот", + "CPU Low VMIN": "Мин. вольт. нижних частот", + "CPU High VMIN": "Мин. вольт. верхних частот", + "No Undervolt": "Без андервольта", + "SLT Table": "Таблица SLT", "HiOPT Table": "Таблица HiOPT", - "GPU Undervolt Table": "Таблица пониженного напряжения графического процессора", - "GPU Minimum Voltage": "Минимальное напряжение графического процессора", - "Calculate GPU Vmin": "Рассчитать Vmin графического процессора", - "GPU VMIN": "Вмин графического процессора", - "GPU Maximum Voltage": "Максимальное напряжение графического процессора", - "GPU Voltage Offset": "Смещение напряжения графического процессора", - "Do not override": "Не переопределять", - "Enabled (Default)": "Включено (по умолчанию)", - "96.6% limit": "Предел 96,6%", - "99.7% limit": "лимит 99,7%", - "GPU Scheduling Override": "Переопределение планирования графического процессора", + "GPU Undervolt Table": "Таблица андервольта", + "GPU Minimum Voltage": "Мин. вольтаж", + "Calculate GPU Vmin": "Вычисление мин. вольтаж", + "GPU VMIN": "Мин. вольтаж", + "GPU Maximum Voltage": "Макс. вольтаж", + "GPU Voltage Offset": "Смещение вольтажа", + "Do not override": "Не менять", + "Enabled (Default)": "Включено (По умолчанию)", + "96.6% limit": "≤96,6%", + "99.7% limit": "≤99,7%", + "GPU Scheduling Override": "Перезапись планировщика", "Official Service": "Официальная служба", - "GPU DVFS Mode": "Режим графического процессора DVFS", - "GPU DVFS Offset": "Смещение DVFS графического процессора", - "GPU Voltage Table": "Таблица напряжений графического процессора", - "GPU Custom Table (mV)": "Пользовательская таблица графического процессора (мВ)", - "1075MHz without UV, 1152MHz on SLT": "1075 МГц без УФ, 1152 МГц на SLT", - "or 1228MHz on HiOPT can cause ": "или 1228 МГц на HiOPT может привести к", - "permanent damage to your Switch!": "необратимое повреждение вашего коммутатора!", - "921MHz without UV and 960MHz on": "921 МГц без УФ и 960 МГц с включенным", - "SLT or HiOPT can cause ": "SLT или HiOPT могут вызвать" + "GPU DVFS Mode": "Режим DVFS", + "GPU DVFS Offset": "Смещение DVFS", + "GPU Voltage Table": "Таблица вольтажей", + "GPU Custom Table (mV)": "Ручная таблица (мВ)", + "\uE150 Setting GPU Clocks past": "\uE150 Установка частот GPU выше", + "1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц", + "can cause degradation or damage": "без хорошего андервольта может", + "to your console!": "повредить вашу консоль!" } diff --git a/dist/dist.zip b/dist/dist.zip new file mode 100644 index 00000000..11ee11d2 Binary files /dev/null and b/dist/dist.zip differ diff --git a/dist/switch/.overlays/Horizon-OC-Monitor.ovl b/dist/switch/.overlays/Horizon-OC-Monitor.ovl index 2beae2a8..a755580e 100644 Binary files a/dist/switch/.overlays/Horizon-OC-Monitor.ovl and b/dist/switch/.overlays/Horizon-OC-Monitor.ovl differ diff --git a/dist/switch/.overlays/horizon-oc-overlay.ovl b/dist/switch/.overlays/horizon-oc-overlay.ovl index d239b2b6..a3c7f5f9 100644 Binary files a/dist/switch/.overlays/horizon-oc-overlay.ovl and b/dist/switch/.overlays/horizon-oc-overlay.ovl differ