diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1189f77 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +obj/ +src/gfx/*.c +src/gfx/*.h +.DS_Store +convimg.out +autotest.json +desktop.ini +.vscode \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..31e7148 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.12) + +set(TOOLCHAIN_PATH "/c/msys64/mingw64") +set(BIN_PATH "${TOOLCHAIN_PATH}/bin") +set(INCLUDE_PATH "${TOOLCHAIN_PATH}/include") +set(LIB_PATH "${TOOLCHAIN_PATH}/lib") + +set(SRC_DIR "./src") + +set(PROJECT_NAME "Super-Sweeper-Windows") +project(${PROJECT_NAME}) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "./bin") + +# Compiler +set(CMAKE_C_COMPILER "gcc") +set(CMAKE_CXX_COMPILER "g++") + +# Set C and C++ standards +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) + +# Packages +find_package(SDL2 REQUIRED) + +file(GLOB SRC_FILES "${SRC_DIR}/*.c") +# Create an executable +add_executable(${PROJECT_NAME} ${SRC_FILES}) + +# Compiler Flags Debug(-g -O0) Release(-O3) +set(OPT_FLAG -O3) +target_compile_options(${PROJECT_NAME} PUBLIC ${OPT_FLAG} -Wall) +target_link_libraries(${PROJECT_NAME} PUBLIC SDL2 SDL2main) diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..4c10766 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 ZERICO2005 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..80a5ac7 --- /dev/null +++ b/README.txt @@ -0,0 +1,27 @@ +Super-Sweeper Windows Edition v0.77.1 +zerico2005 | 2023/12/01 + +Super-Sweeper Windows Edition is a port of Super-Sweeper for the Ti84CE. + +Controls: + Arrows: Move + WASD: Move + Enter: Enter + E: Search Tile/Enter + Q: Flag Tile + Z: Mark Tile + X: Menu + C: Auto Solver (Must be enabled in the menu) + P: Exit Application + +Super-Sweeper v0.77.0 was ported to Windows on June 3rd 2023. Super-Sweeper v0.77.1 has most of the source code unchanged apart from some formating and a minor bug fix. The source code is not too great because I coded Super Sweeper before I knew how to have multiple C files in a program. Otherwise the source code is under an MIT license. + +Also included are the programs I used to generate the menus and videos. + +Attributions: +- The 6x8 pixel font used in the program is a slightly modified version of the "even" font created by Christian Munk (CMunk), which can be found at https://fontstruct.com/fontstructions/show/275268/even_2. The "even" font is lincesed under Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0). Original License URL: https://creativecommons.org/licenses/by-sa/3.0/ + +Compiliation Setup used: + - Windows 10 64bit x86 + - MSYS2 MinGW64 + - GCC CMake Ninja \ No newline at end of file diff --git a/Video 126p/README.txt b/Video 126p/README.txt new file mode 100644 index 0000000..27f5d8e --- /dev/null +++ b/Video 126p/README.txt @@ -0,0 +1 @@ +The video player in Super-Sweeper has not been ported to windows yet. The binary files are uncompressed, and hold 6 168x126 4 bit frames each. \ No newline at end of file diff --git a/Video 126p/palette.txt b/Video 126p/palette.txt new file mode 100644 index 0000000..d1f45bb --- /dev/null +++ b/Video 126p/palette.txt @@ -0,0 +1 @@ +unsigned short palette[1260] = {/*0*/3171,12684,12687,15855,18927,25266,31608,3,22098,25269,25368,25371,28440,31509,31512/*1*/,3171,12684,12687,15855,18927,25266,31608,3,22095,22098,25269,25368,25371,28440,31509/*2*/,3171,12684,12687,15855,18927,25266,31608,3,22095,22098,25269,25368,25371,28440,31509/*3*/,3171,12684,12687,15855,18927,25266,28437,3,31608,25368,25371,28440,31509,28536,31512/*4*/,3171,12684,12687,15855,18927,25266,28437,3,31608,25368,25371,28440,31509,28539,31512/*5*/,3171,12684,12687,15855,18927,25266,28437,3,31608,22200,25371,28440,31509,28539,31512/*6*/,3171,12684,12687,15855,18927,25266,28437,3,31608,25269,25368,25371,28440,31509,28539/*7*/,3171,12684,12687,15756,15855,25266,28437,3,22098,31608,25368,25467,28440,28539,31509/*8*/,3171,12684,12687,15756,15855,25266,28437,3,22098,25269,31608,25467,28539,31509,31512/*9*/,3171,12684,12687,15756,15855,25266,28437,3,31608,25368,22200,28539,31509,31512,31611/*10*/,3171,12684,12687,15756,15855,25266,31608,3,25269,28539,25368,25371,25467,31509,31512/*11*/,3171,12684,12687,15756,15855,25266,31608,3,28539,22095,22200,25368,25371,25467,31611/*12*/,3171,12684,15855,12687,31608,28437,28539,3,19029,22200,25368,31611,25467,28440,31512/*13*/,3171,12684,15855,12585,12687,31608,28539,3,15759,25368,25269,31509,31611,25371,28440/*14*/,3171,12684,6342,15756,15855,28539,31608,3,25269,19029,25368,22200,31509,31611,25170/*15*/,3171,3174,6342,12684,15756,15855,15858,3,28437,31608,31611,22200,31509,28542,31707/*16*/,3171,3174,12684,9513,15855,15858,28437,3,31608,28539,31611,28338,31707,25371,28341/*17*/,3171,3174,12684,15756,15855,15858,28437,3,31608,28539,31611,31509,28341,31707,31512/*18*/,3171,3174,12684,15756,15855,15858,31608,3,28539,22200,25368,31611,31509,31707,28341/*19*/,3171,3174,15855,15756,15858,18927,28437,3,31608,31707,28539,31611,31509,31710,31605/*20*/,3171,3174,15855,15858,12786,18927,28437,3,31707,31608,31611,31509,28638,31710,31212/*21*/,3171,3174,15756,15855,15858,18927,31707,3,28542,31608,31611,28440,28638,31509,31710/*22*/,3171,3174,15855,15858,18927,31707,31608,3,25266,25368,31611,28638,31710,31605,28515/*23*/,3171,3174,15858,15756,18927,28437,31707,31710,25368,25371,28440,28539,28638,31611,31605/*24*/,3171,3174,15858,18927,15855,28437,31608,31707,31710,25368,28638,28440,28539,31611,31614/*25*/,3171,3174,12786,15858,18927,28437,28542,31608,31707,31710,28638,31611,22299,29568,28672/*26*/,3171,12786,15855,15858,18927,28437,28542,31608,31707,31710,31611,22095,28341,29568,28672/*27*/,12786,15858,18927,28437,28542,31608,31707,31710,22299,25368,31611,31680,31509,29568,28672/*28*/,12786,15855,15858,18927,28437,28542,31608,31707,31710,25269,28638,31680,31614,29568,28672/*29*/,12786,15855,15858,18927,28437,28542,31608,31707,31710,25269,28638,30720,31680,29568,28672/*30*/,12786,15756,15855,15858,18927,28437,28542,31608,31707,31710,28638,31680,31512,29568,28672/*31*/,12786,15756,15858,18927,28437,28542,31608,31707,31611,31710,31512,28638,31680,29568,28672/*32*/,12786,15858,15855,18927,28437,28542,31608,31707,28539,31710,31512,31680,31509,29568,28672/*33*/,12786,15858,15855,18927,28437,28542,31608,28440,31707,31710,28638,31680,31512,29568,28672/*34*/,12786,15858,15855,28542,19128,31710,31707,31611,25368,25371,25470,28638,31512,29568,28672/*35*/,12786,15858,15855,18927,28437,28542,31710,31611,31707,28638,30720,31512,31680,29568,28672/*36*/,12786,15858,18927,19128,28437,28542,31710,31611,31707,28638,31512,31680,31017,29568,28672/*37*/,12786,15855,15858,19128,28437,28542,31608,31710,25470,28638,31509,31680,25272,29568,28672/*38*/,12786,15855,19128,28437,18927,28542,31608,28539,31710,31611,31509,30720,31680,29568,28672/*39*/,12786,15858,19128,28437,28542,31608,25266,25371,31707,31710,31509,31680,28341,29568,28672/*40*/,9615,12786,15858,28437,28542,31608,31707,28440,28539,31710,31611,31680,28434,29568,28672/*41*/,9615,12786,15855,28437,28542,31608,28539,31707,31710,31680,28638,31509,28341,29568,28672/*42*/,9615,12786,15855,28437,28542,31608,25371,28539,31611,31710,31509,25263,28341,29568,28672/*43*/,9615,15855,15756,28437,28542,31608,25371,28539,31710,31707,28536,31509,28638,29568,28672/*44*/,9615,15855,28437,31608,28539,28542,19029,25371,31707,31710,28440,30720,31680,29568,28672/*45*/,9615,15855,28437,31608,28539,28542,28338,31611,28434,31710,28440,31707,31680,29568,28672/*46*/,15855,15756,28437,31608,28539,28542,28338,25371,28434,31611,31707,31680,31710,29568,28672/*47*/,15855,15756,28437,25266,31608,22200,28542,19128,25368,25371,31611,30720,31680,29568,28672/*48*/,15855,9615,15756,12687,28437,28539,31608,28542,25371,28434,31611,31707,28440,29568,28672/*49*/,15756,15855,12585,12687,28437,25266,31608,28539,28542,31611,31707,31680,31605,29568,28672/*50*/,15756,15855,12684,28437,18927,25266,31608,28539,28542,31611,31707,25269,31605,29568,28672/*51*/,15756,9615,15855,12687,28437,28338,31608,28542,31611,30720,31707,31605,25263,29568,28672/*52*/,15756,9615,15855,12687,28437,25266,28539,31608,28434,28542,31611,31680,31707,29568,28672/*53*/,3171,15756,15855,12684,28437,28539,18927,25266,31608,28434,31611,31680,31707,29568,28672/*54*/,3171,15756,15855,12585,12684,28437,18927,28539,22200,25368,31608,28434,31611,29568,28672/*55*/,3171,15756,15855,12684,28437,15759,28539,25266,25368,31608,31611,31680,31707,29568,28672/*56*/,3171,15756,15855,12684,28437,28539,25266,25368,31608,31611,30720,31680,31707,29568,28672/*57*/,15756,12585,15855,28437,28338,28539,31608,25368,25371,28542,31611,31509,31707,29568,28672/*58*/,15756,15855,12684,28437,31608,22200,28539,25371,28542,31707,31680,31605,31611,29568,28672/*59*/,15756,15855,28338,28437,31608,25266,28539,28542,31707,31509,31680,31710,31704,29568,28672/*60*/,15756,12585,15855,22200,28437,31608,28542,31611,30720,31509,31680,31707,31710,29568,28672/*61*/,9615,15756,15855,28437,18927,28338,28542,31608,28440,31611,31707,28434,31710,29568,28672/*62*/,9615,12585,15756,15855,15858,28437,28338,28542,31608,28440,31707,31509,31710,31689,31017/*63*/,9615,15855,15756,28437,28338,25266,19128,28542,31608,31611,31707,31710,31605,25467,31614/*64*/,9615,15855,15756,28437,15858,28338,25266,28542,31608,31707,31710,31509,31605,31614,31512/*65*/,9615,15756,15855,28437,15858,22200,28338,28539,31608,31611,31710,28524,31707,31605,25467/*66*/,9615,12585,15756,15855,28437,22200,28338,28539,31608,25371,31611,31710,31707,31605,28443/*67*/,9615,12687,15756,15855,19029,28437,28338,28539,31608,31611,31710,25365,28341,31509,31707/*68*/,9615,12687,15855,19029,28338,28437,28539,31608,31611,28440,31710,25167,28434,25365,31707/*69*/,9615,12687,15855,19029,28338,28437,28539,31608,31611,31710,25272,28434,31707,31509,31605/*70*/,9615,12687,15855,22200,28338,28539,31608,31611,31710,25269,28434,31707,31605,25467,31614/*71*/,9615,12687,15855,22200,28338,28539,31608,28542,31611,31710,25269,31605,31509,31707,31614/*72*/,9615,12687,15855,19029,22200,28338,28539,31608,31611,31710,31605,28341,28536,31707,25365/*73*/,9615,12687,15855,19029,22200,28338,28437,28539,31608,31611,31710,31605,31707,31614,28536/*74*/,9615,12687,15855,22200,28338,28437,28539,31608,31611,25167,25269,31710,28440,31509,31605/*75*/,9615,12687,15756,15855,22200,28338,28437,28539,31608,31611,28341,31710,31605,28443,28536/*76*/,9615,12687,15756,15855,22200,28338,28437,28539,31608,31611,28341,28440,31509,31710,28335/*77*/,9615,12687,15756,15855,22200,28338,28437,28539,31608,31611,28341,28440,31509,28434,31710/*78*/,15756,12585,12687,15855,28338,28437,28539,31608,31611,28341,28440,31509,28434,31605,31710/*79*/,12687,9615,15756,25266,28437,25167,25371,28440,31608,25263,28338,28536,28341,28434,28539/*80*/,12684,22095,9513,25266,19029,22197,15954,22200,28437,25365,25272,18930,25170,25263,28341/*81*/,9513,9516,18924,19026,22095,22098,22194,3,22197,25266,21996,18828,21999,18921,25170/*82*/,6342,6345,9414,15753,15855,18927,15852,3,12585,12783,15858,19023,19026,32768,32768/*83*/,3171,3174,6243,6342,9513,12585,12681,12684,9612,32768,32768,32768,32768,32768,32768} \ No newline at end of file diff --git a/Video 126p/video-00.bin b/Video 126p/video-00.bin new file mode 100644 index 0000000..540a3ea --- /dev/null +++ b/Video 126p/video-00.bin @@ -0,0 +1 @@ +̻IDDDDDDDDDDDDDDDD333333333333333333333333333333333̼DDDDDDDDD43333333333333333333333333333̼IDDDDDDDDDD3333333333333333333333333333̼DDDDDDDDDDD3333333333333333333333333333̼IDDDDDDDDDDDD333333333333333333333333333̻DDDDDDDDDDDD333333333333333333333333333̼DDDDDDDDDDDDDD33333333333333333333333333˼IDDDDDDDDDDDDDD3333333333333333333333333̻IDDDDDDDDDDDDDD3333333333333333333333333̼IDDDDDDDDDDDDDD4333333333333333333333333̼IDDDDDDDDDDDDDD433333333333333333333333̻IDDDDDDDDDDDDDD433333333333333333333333̻DDDDDDDDDDDDDDDD3333333333333333333333̻DDDDDDDDDDDDDDDD333333333333333333333̻IDDDDDDDDDDDDDDD433333333333333333333̻DDDDDDDDDDDDDDD433333333333333333333̻DDDDDDDDDDDDDD433333333333333333333̻DDDDDDDDDDDDD433333333333333333333̻DDDDDDDDDDDDDDD333333333333333333̻DDDDDDDDDDDDD43333333333333333www̻IDDDDDDDDDDDDDDDDD33333333333|wwwwww̼DDDDDDDDDDDDDDDDD33333333333wwwwwww̼DDDDDDDDDDDDDDDDD33333333333wwwwwwwww̼DDDDDDDDDDDDDDDDD33333DDD333wwwwwwwwwww̻EDDDDDDDDDDDDDDDD3333CDDD333wwwwwwwwwwwݽYUUUUDDDDDDDDDDDD3333DDDD333wwwwwwwwwwwwwݻUUDDDDDDDDDDD333CDDDD333wwwwwwwwwwwwwwwݻYUDDDDDDDDDDDDD3CDDDD433wwwwwwwwwwwwwwwwݽYUUDDDDDDDDDDDDDDCDDDD333wwwwwwwwwwwwwwwwwwݻUUUUUUEDDDDDDDDDDDDDD3CD33333wwwwwwwwwwwwwwwwwwwwwwݻjUUUUUUUEDDDDDDDDDDDDDDDD33333333wwwwwwwwwwwwwwwwwwwwwwwݻ۽jYUUUUUUEDDDDDDDDDDDDDDDDDDD33333333wwwwwwwwwwwwwwwwwwwwwwwݫjUUUUUUDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwwݪjYUUUEDDDDDDDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwwwwwwwwwݭjUUUDDDDDDDDDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwwwwwwwwݭjYUUEDDDDDDDDDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwwwwwwwwݪjUUUEDDDDDDDDDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwwwwwwwwݭjUUUEDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwݭjfUUUEDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwݭffUUUEDDDDDUDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwݭjffffUUUEDDDDTUUEDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwݪfffffUUEDDDDDTUUEDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwݭffffUUEDDDDDUUUUDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwݭffffUUEDDDDUUUUUDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwݭfffYUUUUUUUUUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwݪjffffffYUUUUUUUUUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwݭjffffffYUUUUUUUUUUUUDDDDDDDDDDD33333333333333wwwwwwwwwݪjffffffYUUUUUUUUUUUUDDDDDDDDDD433333333333333wwwwwwwwwwݭjffffffUUUUUUUUEDDDDDDDDDD433333333333333wwwwwwwwwwwݪjffffffYUUUUUUUUEDDDDDDDDDD433333333333333wwwwwwwwwwwffffffffYUUUUUUUUDDDDDDDDDDD433333333333333wwwwwwwwwwwfffffffffffUUUUUUUUEDDDDDDDDDDD433333333333333wwwwwwwwwwwjffffffffffffUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwwwwwwwwfffffffffffffffffYUUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwwwwwwwwjffffffffffffffffUUUUUUUUUUDDDDDDDDDDDDDD33333333333333wwwwwwwwwwwjffffffffffffffffUUUUUUUUUUDDDDDDDDDDDDDD33333333333333wwwwwwwwwwnjffffffffffffffUUUUUUUUUUEDDDDDDDDDDDDD4333333333333"wwwwwwwwwnfffffffffffffffYUUUUUUUUUUEDDDDDDDDDDDDDD333#2333333""wwwwwfffffffffffffUUUUUUUUUUDDDDDDDDDDDDDDD333""333#""""wwwffffffffffffYUUUUUUUUUUEDDDDDDDDDDDDDDD3#"#"333"""""wwwffffffffffffYUUUUUUUUUUUUDDDDDDDDDDDD"$3"3"2333#""""""wwfffffffffffYUUUUUUUUUUUUDDDDDDDDDDDD$""3"""233#"""""""wwfffffffffffYUUUUUUUUUUUUEDDDDDDDDDDD$""""""""33#"""""""wffffffffffYUUUUUUUUUUUDDDDDDDDDDDDD$"""""""""33""""""""fffffffffffYUUUUUUUUUUEDDDDDDDDDDDD$"""""""""""""""""""""nffffffffffffUUUUUUUUUUUUUUDDDDDDDDDDDD$""""""""""""""""""""""jfffffffffffffffYUUUUUUUUUUUUUEDDDDDDDDDDDD""""""""""""""""""""""""fffffffffffffffffUUUUUUUUUUUUUDDDDDDDDDDDDD$"""""""""""""""""""""""""jffffffffffffffffYUUUUUUUUUUUEDUDDDDDDDDD"""""""""""""""""""""""""""""""jffffffffffffffffYUUUUUUUUUUUUUEDDDDDDDD""""""""""""""""""""""""""""""""""fffffffffffffffYUUUUUUUUUUUUUDDDDDDDD$"""""""""""""""""""""""""""""""""""YUUUUUUUUUUEDDDDDD$$"""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUEDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUUUDDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUUEDDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUDDDDDD"""""""""""""""""""""""""""""""""UUUUUUUUUUUEDDDDDD"""""""""""""""""""""""""""""""""UUUUUUDDTUEDDDDDD$""""""""""""""""""""""""""""""!"UUUUUEDDDDDD$BDD""""""""""""""""""""""""""""""UUUEDDDDDDDDD$DD""""""""""""""""""""""""""""""UUUDDDDDDDDD"""""""""""""""""""""""""""""""""""!""UUUDDDDDDDDD""""D$""""""""""""""""""""""""""""!"UUEDDDDDDDDD$""B$"""""""""""""""""""""""""""""UUDDUDTEDDDD"""""""""""""""""""""""""""""EDTDDDDDD$BD$""""""""""""""""""""""""""""""""DTUE$DDDD"""""""""""""""""""""""""""""""!""DD""DDDD""DDD""""""""""""""""""""""""""UEDDTD"BDD"""""""""""""""""""""""""!"""DD"DDDDDDD""""""""""""""""""""""""""!!"""DDDD$BDDD$""""""""""""""""""""""""""""""DDDD$"BDDD$""""""""""""""""""""""""""""""DDDDDDDDDD$"""B""$"""""""""""""""""""""""""""DDDDDDDDD""D"D"""""""""""""""""""""""""""""B$"B"DD$"""BDD""""""""""""""""""""""""""D$"DD$"""BDDD$""""""""""""""""""""""""""""BDDDD""DDDDD$""""""""""""""""""""""""""""""DDUUUEDDDDDDD$""""""""""""""""""""""""""""""D$""$"BDDD"DD$""""""""""""""""""""""""""DDD$"""""""""""""""""""""""""!"""""""!"UD$"B""""""""""""""""""""""""""DDDDD$"""""""""""""""""""""""""DDDD$"""""""""""""""""""""""""""""""""""""""B"""""""""""""""""""""!""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""DDDD""""""""""""""""""""""""""""DDD$BD$"""""""""""""""""""""""""""""B"""""$""""""""""""""""""""""$""""""""""""""""""""!""""$"""""""""""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""̼DDDDDDDDDDDDDDDDD433333333333333333333333333333333̻DDDDDDDDD43333333333333333333333333333̼DDDDDDDDDD4333333333333333333333333333̼DDDDDDDDDDDD333333333333333333333333333̻DDDDDDDDDDDD333333333333333333333333333̻DDDDDDDDDDDD333333333333333333333333333̻DDDDDDDDDDDDDD33333333333333333333333333̼JDDDDDDDDDDDDDD3333333333333333333333333̻JDDDDDDDDDDDDDD3333333333333333333333333̼JDDDDDDDDDDDDDD4333333333333333333333333̻JDDDDDDDDDDDDDD433333333333333333333333̼JDDDDDDDDDDDDDDD33333333333333333333333̼DDDDDDDDDDDDDDDD3333333333333333333333̼DDDDDDDDDDDDDDDD333333333333333333333̼DDDDDDDDDDDDDDD433333333333333333333̼DDDDDDDDDDDDDDD433333333333333333333̼DDDDDDDDDDDDDD433333333333333333333̻DDDDDDDDDDDDD433333333333333333333̼DDDDDDDDDDDDDDD433333333333333333̼DDDDDDDDDDDDDD4333333333333333ww}̻JDDDDDDDDDDDDDDDDD33333333333}wwwwww̻DDDDDDDDDDDDDDDDD33333333333wwwwwww̻DDDDDDDDDDDDDDDDD33333333333wwwwwwwww̼JDDDDDDDDDDDDDDDD33333DDD333wwwwwwwwwww̼JDDDDDDDDDDDDDDDD3333CDDD333wwwwwwwwwww̻̻UUUUDDDDDDDDDDDD3333DDDD333wwwwwwwwwwwww̻UUDDDDDDDDDDDD33CDDDD433wwwwwwwwwwwwwww̻ZUDDDDDDDDDDDDD3CDDDD433wwwwwwwwwwwwwwww̻ZUUDDDDDDDDDDDDDDCDDDD333wwwwwwwwwwwwwwwwww̼UUUUUEDDDDDDDDDDDDDD3CD33333wwwwwwwwwwwwwwwwwwwwww̼kUUUUUUUEDDDDDDDDDDDDDDDD33333333wwwwwwwwwwwwwwwwwwwwwww̻kUUUUUUEDDDDDDDDDDDDDDDDDDD33333333wwwwwwwwwwwwwwwwwwwwwwwkUUUUUUDDDDDDDDDDDDDDDDDD43333333333wwwwwwwwwwwwwwwwwwwwwwwkUUUEDDDDDDDDDDDDDDDDDDD433333333333wwwwwwwwwwwwwwwwwwwwwwwkUUUDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwwkZUUUDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwwkUUUUDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwwkUUUEDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwkUUUEDDDDDDDDDDDDDDDDDDDDD433333333333wwwwwwwwwwwwwwwwwwwwwkfUUUEDDDDDUEDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwffffUUUEDDDDTUUEDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwfffffUUEDDDDDTUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwffffUUEDDDDDUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwffffUUEDDDDUUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwffffZUUUUUUUUUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwkffffffUUUUUUUUUUUUUDDDDDDDDDDDD3333333333333wwwwwwwwwwkffffffZUUUUUUUUUUUUDDDDDDDDDDD33333333333333wwwwwwwwwwwwkffffffUUUUUUUUUEDDDDDDDDDD433333333333333wwwwwwwwwwwkffffffUUUUUUUUEDDDDDDDDDD433333333333333wwwwwwwwwwwwfffffffZUUUUUUUUEDDDDDDDDDD433333333333333wwwwwwwwwwwffffffffZUUUUUUUUDDDDDDDDDDD433333333333333wwwwwwwwwwwfffffffffffUUUUUUUUEDDDDDDDDDDD433333333333333wwwwwwwwwwwkffffffffffUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwwwwwwwwfffffkffffffffffUUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwwwwwwwwkffffffffffffffffUUUUUUUUUUDDDDDDDDDDDDDD33333333333333wwwwwwwwwwwkffffffffffffffffUUUUUUUUUUDDDDDDDDDDDDDD33333333333333wwwwwwwwwwkffffffffffffffUUUUUUUUUUEDDDDDDDDDDDDD43333333333333wwwwwwwwkffffffffffffffUUUUUUUUUUEDDDDDDDDDDDDDD333#2333333#"wwwwwkffffffffffffUUUUUUUUUUDDDDDDDDDDDDDDD333"23333""""wwwkfffffffffffYUUUUUUUUUEDDDDDDDDDDDDDDD3#"#2333"""""wwwfffffffffffYUUUUUUUUUUDDDDDDDDDDDD"$3"3""333#""""""wwofffffffffYUUUUUUUUUUDDDDDDDDDDDD$""3""""33#"""""""wwffffffffffUUUUUUUUUUEDDDDDDDDDDD$""""""""33#"""""""wffffffffffUUUUUUUUUUDDDDDDDDDDDDD$"""""""""3#""""""""ffffffffffffUUUUUUUUUUEDDDDDDDDDDDD$"""""""""""""""""""""ffffffffffffUUUUUUUUUUUUUUDDDDDDDDDDDD$""""""""""""""""""""""kffffffffffffffffYUUUUUUUUUUUUUEDDDDDDDDDDDD""""""""""""""""""""""""fffffffffffffffYUUUUUUUUUUUUDDDDDDDDDDD""""""""""""""""""""""""""""kffffffffffffffffUUUUUUUUUUUDUDDDDDDDD$"""""""""""""""""""""""""""""""kffffffffffffffffUUUUUUUUUUUDDDDDDDDD""""""""""""""""""""""""""""""""""kfffffffffffffffUUUUUUUUUUUUUDDDDDDDD""""""""""""""""""""""""""""""""""""ffYUUUUUDDDDD$"""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUUUEDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUUEDDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUEDDDDD$"""""""""""""""""""""""""""""""""UUUUUUUUUUUEDDDDDD"""""""""""""""""""""""""""""""""UUUUUUEDDUEDDDDDDD"""""""""""""""""""""""""""""""UUUUUEDDDDDDDBDD""""""""""""""""""""""""""""""UUUUEDDDDDDDDDDD""""""""""""""""""""""""""""""UUUEDDDDDDDD"""""""""""""""""""""""""""""""""""""""UUUEDDDDDDDD""""BD""""""""""""""""""""""""""""UUUDDDDDDDDD$"""D"""""""""""""""""""""""""""""UUEDUDDDDDDD$""""""""""""""""""""""""""""""!UDTEDDDDD$"DD"""""""""""""""""""""""""""""""""DDTUDBTDD"""""""""""""""""""""""""""""""DD$"DDDD""DDD""B""""""""""""""""""""UUDDTE$"DD""""""""""""""""""""""""""!"""DD$BDDDDDD"""""""""""""""""""""""""""""""""DDDDD"BDDD$"""""""""""""""""""""""""""""DDDDDB"DDDD""""""""""""""""""""""""""""""DDDDDDDDDDD"""B$""""""""""""""""""""""""""""""BDDDDDDDD""DDD$""""""""""""""""""""""""""""!"B"BDBD$""""DD$"""""""""""""""""""""""!!""DD$"DD"""BDDDD""""""""""""""""""""""""""""""DDDDDBDDDDDD$""""""""""""""""""""""""""""""DDDUUUDDDDDDDD""""""""""""""""""""""""""""""DD$"B""DDD""DD""""""""""""""""""""""""""DDDD"""""""""""""""""""""""""!"!"""""UED"B$""""""""""""""""""""""""!DDDDD$""""""""""""""""""""""""""""DDDDD$"""""""""""""""""""""""""""""!""""""""""""B$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B$""""""""""""""""""""""""""""DDDD$"B""""""""""""""""""""""""""!"""DD""BD"""""""""""""""""""""""""""""""""""""""""""""""!""""D$""""""""""""""""""!""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""̻JDDDDDDDDDDDDDDDD433333333333333333333333333333333̻JDDDDDDDD433333333333333333333333333333̻JDDDDDDDDDD4333333333333333333333333333̻DDDDDDDDDDDD333333333333333333333333333̻DDDDDDDDDDDD333333333333333333333333333̻DDDDDDDDDDDD333333333333333333333333333̻DDDDDDDDDDDDDD33333333333333333333333333̼JDDDDDDDDDDDDDD3333333333333333333333333̼JDDDDDDDDDDDDDD3333333333333333333333333̼JDDDDDDDDDDDDDD4333333333333333333333333̼JDDDDDDDDDDDDDD433333333333333333333333̻JDDDDDDDDDDDDDDD33333333333333333333333̻DDDDDDDDDDDDDDDD3333333333333333333333̼DDDDDDDDDDDDDDDD333333333333333333333̼DDDDDDDDDDDDDDD433333333333333333333̼DDDDDDDDDDDDDDD433333333333333333333̼DDDDDDDDDDDDDDD33333333333333333333̻DDDDDDDDDDDD33333333333333333333̼JDDDDDDDDDDD433333333333333333̼JDDDDDDDDDDDD4333333333333333www̻DDDDDDDDDDDDDDDDD33333333333}wwwwww̻JDDDDDDDDDDDDDDDD33333333333wwwwwww̻JDDDDDDDDDDDDDDDD33333CDD433wwwwwwwww̼JDDDDDDDDDDDDDDDD33333DDD433wwwwwwwwwww̼˼ZDUUUDEDDDDDDDDDD3333CDDD433wwwwwwwwwww̻̼UEDDDDDDDDDD3333DDDD433wwwwwwwwwwwwww̻ZUEDDDDDDDDDDD33CDDDD333wwwwwwwwwwwwwwww̻ZUDDDDDDDDDDDDD3CDDDD333wwwwwwwwwwwwwwwww̼UUUDDDDDDDDDDDDDDCDDD4333wwwwwwwwwwwwwwwwwwww̼ZUUUUUUUUDDDDDDDDDDDDDDD3CD33333wwwwwwwwwwwwwwwwwwwwwww̼fUUUUUUUUEDDDDDDDDDDDDDDDDD33333333wwwwwwwwwwwwwwwwwwwwwwwkZUUUUUEDDDDDDDDDDDDDDDDDDDD33333333wwwwwwwwwwwwwwwwwwwwwwwkZUUUUEDDDDDDDDDDDDDDDDDDD43333333333wwwwwwwwwwwwwwwwwwwwwwwkUUUEDDDDDDDDDDDDDDDDDDDDD43333333333wwwwwwwwwwwwwwwwwwwwwwwkfZUUUDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwwkUUUUDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwwUUUEDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwUUUEDDDDDDDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwwfUUUEDDDDTEDDDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwwwkffUUUEDDDDTUUEDDDDDDDDDDDDD333333333333wwwwwwwwwwwwwwwwwwwkffffUUUDDDDDTUUEDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwkffffUUEDDDDDUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwffffUUEDDDDDUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwwffffUUUUUUUUUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwwwfkffffZUUUUUUUUUUUUDDDDDDDDDDDD4333333333333wwwwwwwwwwwwkffffffZUUUUUUUUUUUUDDDDDDDDDDDD3333333333333wwwwwwwwwwwwkffffffZUUUUUUUUUEDDDDDDDDDDD33333333333333wwwwwwwwwwwwkffffffUUUUUUUUEDDDDDDDDDDD33333333333333wwwwwwwwwwwwkffffffUUUUUUUUEDDDDDDDDDD433333333333333wwwwwwwwwwwwᄏkfffffffZUUUUUUUUEDDDDDDDDDD433333333333333wwwwwwwwwwwkfffffffffZUUUUUUUUDDDDDDDDDDDD33333333333333wwwwwwwwwwwfffffffffffZUUUUUUUUEDDDDDDDDDDDD33333333333333wwwwwwwwwwwkkffffffffffUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwwwwwwwwfffffffffffffffffZUUUUUUUUEDDDDDDDDDDDDD33333333333333wwwwwwwwwwwkffffffffffffffffZUUUUUUUUUEDDDDDDDDDDDDD33333333333333wwwwwwwwwwwfffffffffffffffffUUUUUUUUUUEDDDDDDDDDDDDD33333333333333wwwwwwwwwwkffffffffffffffUUUUUUUUUUUDDDDDDDDDDDDD43333333333333wwwwwwwkfffffffffffffUUUUUUUUUUEDDDDDDDDDDDDDD333#2333333#"wwwwkffffffffffffUUUUUUUUUEDDDDDDDDDDDDDDD33""23333""""wwwofffffffffffUUUUUUUUUUEDDDDDDDDDDDDDDD3#""2333"""""wwoffffffffffUUUUUUUUUUUDDDDDDDDDDDDD43"3""333#""""""wwofffffffffYUUUUUUUUUUDDDDDDDDDDDD$""3""""33#"""""""wofffffffffUUUUUUUUUUDDDDDDDDDDDD$""""""""33#"""""""woffffffffffYUUUUUUUUEDDDDDDDDDDDDD""""""""""3"""""""""offfffffffffUUUUUUUUUUEDDDDDDDDDDDD""""""""""""""""""""""fffffffffffffYUUUUUUUUUUUUUDDDDDDDDDDDDD"""""""""""""""""""""""fffffffffffffffffYUUUUUUUUUUUUEDDDDDDDDDDDD$""""""""""""""""""""""""ffffffffffffffffUUUUUUUUUUUUUEDDDDDDDDD"""""""""""""""""""""""""""""fffffffffffffffffUUUUUUUUUUUDUDDDDDDDD$"""""""""""""""""""""""""""""""fffffffffffffffYUUUUUUUUUUUEDDDDDDDD"""""""""""""""""""""""""""""""""""ffUUUUUUUUUDDDDDDD""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUDDDDDD""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUDDDDDD$"""""""""""""""""""""""""""""""UUUUUUUUUUUUUEDDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUEDDDDD$"""""""""""""""""""""""""""""""""UUUUUUUUUUUUDDDDDD""""""""""""""""""""""""""""""""""UUUUUUEDDUUEDDDDDD""""""""""""""""""""""""""""""!!"UUUUUUDDDDDDDDDD$""""""""""""""""""""""""""""""UUUUEDDDDDDDDDDD"""""""""""""""""""""""""""""""UUUUEDDDDDDDD""""""""""""""""""""""""""""""""""!"""UUUUEDDDDDDD$"""D$""""""""""""""""""""""""""""UUUUUDDDDDDDD"""D$""""""""""""""""""""""""""""UUUDUEDDDDDDD""""""""""""""""""""""""""""""!UUUUEDDDDD"BD"""""""""""""""""""""""""""""""""EDDTEDDED$""D"""""""""""""""""""""""""""ED$"BDDD$"DDD$"D"""""""""""""""""""""UUUDDUD"BD$"""""""""""""""""""""""""""""UED""BDDDD"""""""""""""""""""""""""""""""""DDDD""DDD$"""""""""""""""""""""""""""""""DDDDD$DDDDD"""""""""""""""""""""""""""""""DEDDDDDDDDD$""BD"""""""""""""""""""""""""""""BDDDDDDD$""DDDD""""""""""""""""""""""""""""!"""BDDDD""""BDD""""""""""""""""""""""""""""DDD"DD$""BDDDD$"""""""""""""""""""""""""""BDDDDED$"DDDDD$"""""""""""""""""""""""""""""DDDUUUDDDDD"DD$"""""""""""""""""""""""""""""DDD""$"DD$""""""""""""""""""""""""""""""""DTDD$""""""""""""""""""""""""!"""""DTDDDD""""""""""""""""""""""""DDDDDD""""""""""""""""""""""""""""""DDDDD$""""B$"""""""""""""""""""""""!"$""""""""BD"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""DDDDD""""""""""""""""""""""""""""""""DDDD"BD"""""""""""""""""""""""""BDD""""""""""""""""""""""""""""D$"""""""""""""""""""""""""$"""""""""""""""""""""""!""""""""!"""""""""""!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""!""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""fffffUUUUUUUDDDDDDDDDDDDDDDDDD433333333333333333333333333333333fUUUEDDDDDDDDDDDDDDD433333333333333333333333333333fVUUDDDDDDDDDDDDDDDDDD4333333333333333333333333333jfVUUDDDDDDDDDDDDDDDDDD333333333333333333333333333뾻ffUUDDDDDDDDDDDDDDDDDD333333333333333333333333333ffUUEDDDDDDDDDDDDDDDDD333333333333333333333333333fVUEDDDDDDDDDDDDDDDDDD33333333333333333333333333jfVUEDDDDDDDDDDDDDDDDDD3333333333333333333333333jfVUEDDDDDDDDDDDDDDDDDD3333333333333333333333333jfVUUDDDDDDDDDDDDDDDDDDD333333333333333333333333jfVUUDDDDDDDDDDDDDDDDDDD433333333333333333333333jfVUUUDDDDDDDDDDDDDDDDDD433333333333333333333333ffffUUUUEDDDDDDDDDDDDDDDDDD3333333333333333333333jffffUUUUEDDDDDDDDDDDDDDDDDD433333333333333333333ffffUUUEDDDDDDDDDDDDDDDDDD433333333333333333333fffVUUUUDDDDDDDDDDDDDDDDDD433333333333333333333fffffUUUUDDDDDDDDDDDDDDDDD433333333333333333333fffffUUUUEDEDDDDDDDDDDDDDDD43333333333333333333fffffUUUUUUUUUUUUDDDDDDDDDDDDD43333333333333333fffffffVUUUUeffUUUUUDDDDDDDDDDDDD433333333333333jfffffffffffffffffVUUEDDDDDDDDDDDDDDDD33333333333̻fffffffffffffffUUUEDDDDDDDDDDDDDDDD3333333D433̪jfffffffVUUUUUDDDDDDDDDDDDDDDD33333DDD433̪jjfffUUUUUUUUEDTEDTDDDDDDDDDD33333DDD433̬ffffVUUUUUUUUUUUUUUDDDDDDDDDD3333CDDD433̬jfffffVUUUUUUUUUUUUUEDDDDDDDDDD3333DDDD333̪fffffffffVUUUUUUUUUUUUUEDDDDDDDDDDDD33DDDD333̪ffffffffffUUUUUUUUUUUUUUDDDDDDDDDDDDD43DDDD333̪̬zfffffffffVUUUUUUUUUUUUUUDDDDDDDDDDDDDD4CDD3333̬̬jfffffffffUUUUUUUUUUUUUEDDDDDDDDDDDDDDD43333333zwwgffffffffVUUUUUUUUUDDDDDDDDDDDDDDDDDDDD43333333|wwwfffffffffVUUUUUUUEDDDDDDDDDDDDDDDDDDDD433333333wwwwffffffffVUUUUUUUEDDDDDDDDDDDDDDDDDDD43333333333|wwgffffffffUUUUUUEDDDDDDDDDDDDDDDDDDDD333333333333|wgffffffffUUUUUUDDDDDDDDDDDDDDDDDDDDD333333333333||wwfffffffffUUUUUUDDDDDDDDDDDDDDDDDDDDD333333333333|wwwwwwffffffffffUUUUUUDDDDDDDDDDDDDDDDDDDDD333333333333|wwwwwfffffffffffUUUUUUDDDDTEDDDDDDDDDDDDDDDD43333333333wwwwwwwwwwgffffffffffVUUUUUUDDDDUUUDDDDDDDDDDDDDD433333333333|wwwwwwwwwgfffffffffffVUUUUUUDDDDUUUEDDDDDDDDDDDDD333333333333}wwwwwwwwwwwwwffffffffffffVUUUUUDDDDDUUUUDDDDDDDDDDDDD333333333333}wwwwwwwwwwwwgffffffffffffffUUUUUEDDDDDUUUUDDDDDDDDDDDDD333333333333}wwwwwwwwwwwwffffffffffffffUUUUUUEDDDDDUUUUEDDDDDDDDDDDD333333333333wwwwwwwwwwwwgffffffffffffUUUUUUUUUUETUUUUUUEDDDDDDDDDDDD333333333333wwwwwwwwwwwwgffffffffffffUUUUUUUUUUUUUUUUUUEDDDDDDDDDDD4333333333333|wwwwwwwwwwwwfffffffffffffUUUUUUUUUUUUUUUUUUDDDDDDDDDDDD3333333333333|wwwwwwwwwwwgffffffffffffffUUUUUUUUUUUUUUUUEDDDDDDDDDDD43333333333333}wwwwwwwwwwwwffffffffffffffffUUUUUUUUUUUUUUUEDDDDDDDDDDD33333333333333}wwwwwwwwwwgfffffffffffffffffVUUUUUUUUUUUUUUEDDDDDDDDDDD33333333333333}wwwwwwwwwwffffffffffffffffffVUUUUUUUUUUUUUUEDDDDDDDDDDD33333333333333}wwwwwwwwwffffffffffffffffffVUUUUUUUUUUUUUUUDDDDDDDDDDDD33333333333333}wwwwwwwgfffffffffffffffffffUUUUUUUUUUUUUUUEDDDDDDDDDDDD33333333333333}wwwwwgffffffffffffffffffffVUUUUUUUUUUUUUUUEDDDDDDDDDDDD33333333333333}wwwwwfffffffffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwwffffffffffffffffffffVUUUUUUUUUUUUUUUUEDDDDDDDDDDDD33333333333333}wwwwfffffffffffffffffffffUUUUUUUUUUUUUUUUEDDDDDDDDDDDD33333333333333wwwwgffffffffffffffffffffUUUUUUUUUUUUUUUEDDDDDDDDDDDDD43333333333333}wwwffffffffffffffffffffVUUUUUUUUUUUUUUUDDDDDDDDDDDDDDD333#2333333#"}wwwfffffffffffffffffffVUUUUUUUUUUUUUUUEDDDDDDDDDDDDDDD33""23333#"""}wwwffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDDDD33#""2333"""""}wwwffffffffffffffffffVUUUUUUUUUUUUUUUEDDDDDDDDDDDDD$3"3""333#""""""}wwwffffffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDDD$"""""""33""""""""}wwwwwgffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDDD$""""""""33""""""""}wwwwwwwwwgffffffffffffffUUUUUUUUUUUUUUUUUDDDDDDDDDDDDD"""""""""""""""""""""}wwwwwwwwwwwwwwfffffffffffffVUUUUUUUUUUUUUUUUUEDDDDDDDDDDDDD""""""""""""""""""""""wwwwwwwwwwwwffffffffffffffffVUUUUUUUUUUUUUUUUUEDDDDDDDDDDDDD$"""""""""""""""""""""""wwwwwwwwfffffffffffffffffffVUUUUUUUUUUUUUUUUUUDDDDDDDDDDDD$"""""""""""""""""""""""""wwwwwwfffffffffffffffffffVUUUUUUUUUUUUUUUUUUEDDDDDDD$B""""""""""""""""""""""""""""""wwwwwfffffffffffffffffffVUUUUUUUUUUUUUUUUEDDDDDDDD""""""""""""""""""""""""""""""""""ffffffffffffUUUUUUUUUUUUUUUEDDDDDDDD$"""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUEDDDDD$"""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUDDDDDD$""""""""""""""""""""""""""""""UUUUUUUUUUUUUUDDDDDDD$""""""""""""""""""""""""""""""UUUUUUUUUUUUUEDDDDD"D"""""""""""""""""""""""""""""""UUUUUUUUUUUUUDDDDD$""""""""""""""""""""""""""""""""""UUUUUUUDDDUUEDDDDDD""""""""""""""""""""""""""""""UUUUUUUDDDDDD$DDD""""""""""""""""""""""""""""""UUUUUUDDDDDDDDDDD""""""""""""""""""""""""""""""UUUUUDDDDDDDDDD$B""""""""""""""""""""""""""""""!""UUUUUDDDDDDDD"""BD$""""""""""""""""""""""""""""!UUUUUEDDDDDDD$""BD$""""""""""""""""""""""""""""UUUEUUEDDD$DD$""""""""""""""""""""""""""""""UUUUUEDDDDD"DD""""""""""""""""""""""""""""!"UDDDTDDTED$"B$""""""""""""""""""""""""""UDD""DDDD"BDDD$DD"""""""""""""""""""""UUUE"TU$"BD""B$""""""""""""""""""""""!"""""UUE$""DDBDD""""""""""""""""""""""""""""""""EDD$"""DDD"""""""""""""""""""""""""""""""DDDDDDDDDD""""""""""""""""""""""""""""""""""ETETEDDDDDD$"""BD"D""""""""""""""""""""""""""!""DDDDDDDD$BDDDDD"""""""""""""""""""""""!!""""""DDDD"""BDDD""""""""""""""""""""""""""DDDDDDD"""BDDDD"""""""""""""""""""""""""""""$BDDDDDD$BDDDDD""""""""""""""""""""""""""""""DDTUUDDDDDD$""""""""""""""""""""!""""""""""DDTDDD""DD"""""""""""""""""""""!""""""""!"DTUDD"""""""""""""""""""""""""""""""DTUDDDD"""""""""""""""""""""""!!DDDDDDD""""""B""""""""""""""""""""!"""DDDDDD"""""D"""""""""""""""""""""""DD$""""""BD$""""""""""""""""""""""""""""D$""""""""""""""""""""""""""""""""""DDDD"""""""""""""""""""""""""""""DDDDDD"B"""""""""""""""""""""""""""BDDD"B$D""""""""""""""""""""""""$BD"""""""""""""""""""""""""""""DD"""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""fffffUUUUUUUDDDDDDDDDDDDDDDDDD433333333333333333333333333333333fUUUUEDDDDDDDDDDDDDD433333333333333333333333333333fVUUUDDDDDDDDDDDDDDDDD4333333333333333333333333333ffUUEDDDDDDDDDDDDDDDDD333333333333333333333333333jfVUUDDDDDDDDDDDDDDDDD433333333333333333333333333fVUUDDDDDDDDDDDDDDDDDDD4333333333333333333333333ffVUEDDDDDDDDDDDDDDDDDDD333333333333333333333333jfVUUEDDDDDDDDDDDDDDDDDDD33333333333333333333333jffUUUDDDDDDDDDDDDDDDDDDDDD433333333333333333333ffVUUUDDDDDDDDDDDDDDDDDDDDDD33333333333333333333ffVUUUEDDDDDDDDDDDDDDDDDDDDD33333333333333333333jffUUUUUUDDDDDDDDDDDDDDDDDDD33333333333333333333ffffUUUUUEDDDDDDDDDDDDDDDDDD33333333333333333333ffVUUUUEDDDDDDDDDDDDDDDDDD43333333333333333333ffVUUUUEDDDDDDDDDDDDDDDDDD43333333333333333333jfffUUUUUDDDDDDDDDDDDDDDDDDD3333333333333333333jfffVUUUUUEDDDDTUEDDDDDDDDDDD433333333333333333ffffVUUUUUUUUUUUEDDDDDDDDDDDDD3333333333333333jffffVUUUUUfffUUUEDDDDDDDDDDDDD44CD33333333333ffffffffffffffffVUUUDDDDDDDDDDDDDDDD43333333333jfffffffffjffffffVUUUDDDDDDDDDDDDDDDD433333DDD43̬fjfffffffVUUUUDDDDDDDDDDDDDDDD43333CDDD43̪ffffVUUUUUUETUUUEEDDDDDDDDD43333DDDD43̬jfffUUUUUUUUUUUUUUEDDDDDDDDD4333CDDDD33̪ffffffUUUUUUUUUUUUUUDDDDDDDDDD4333CDDD433̪ffffffffffUUUUUUUUUUUUUUDDDDDDDDDDDD33DDDD333̬jffffffffffUUUUUUUUUUUUUEDDDDDDDDDDDDD3DDDD333̬ffffffffffUUUUUUUUUUUUUUEDDDDDDDDDDDDDD3D43333̪̬jffffffffffUUUUUUUUUUUUUDDDDDDDDDDDDDDDD3433333̬gfffffffffVUUUUUUUUEDDDDDDDDDDDDDDDDDDDD3333333wwwgfffffffffUUUUUUUEDDDDDDDDDDDDDDDDDDDDD43333333|wwwfffffffffUUUUUUUUDDDDDDDDDDDDDDDDDDDD4333333333|wwwffffffffVUUUUUUUDDDDDDDDDDDDDDDDDDDD43333333333||wgffffffffVUUUUUEDDDDDDDDDDDDDDDDDDDD433333333333||wfffffffffVUUUUUEDDDDDDDDDDDDDDDDDDDD433333333333wwwwwgfffffffffUUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333wwwwwgffffffffffUUUUUUDDDDDDDDDDDDDDDDDDDDDDD3333333333|wwwwwwwfffffffffffUUUUUUDDDDTUEDDDDDDDDDDDDDDD43333333333|wwwwwwwwwwffffffffffffUUUUUUDDDDUUUEDDDDDDDDDDDDD433333333333wwwwwwwwwwwwgfffffffffffVUUUUUUDDDDUUUUEDDDDDDDDDDDD433333333333}wwwwwwwwwwwwwwwffffffffffffVUUUUUDDDDDUUUUEDDDDDDDDDDDD433333333333}wwwwwwwwwwwwgffffffffffffffUUUUUUDDDDDUUUUUDDDDDDDDDDDD433333333333wwwwwwwwwwwwwgffffffffffffVUUUUUUUDDDUUUUUUUDDDDDDDDDDDD433333333333wwwwwwwwwwwwgffffffffffffUUUUUUUUUUUUUUUUUUUDDDDDDDDDDDD333333333333|wwwwwwwwwwwwgfffffffffffVUUUUUUUUUUUUUUUUUUEDDDDDDDDDDDD333333333333|wwwwwwwwwwwwgffffffffffffVUUUUUUUUUUUUUUUUUDDDDDDDDDDDD3333333333333wwwwwwwwwwwfwffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDD43333333333333}wwwwwwwwwwfffffffffffffffffffVUUUUUUUUUUUUUEDDDDDDDDDDD43333333333333}wwwwwwwwwgfffffffffffffffffffVUUUUUUUUUUUUUEDDDDDDDDDDD43333333333333}wwwwwwwwwfffffffffffffffffffVUUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333}wwwwwwwwfffffffffffffffffffVUUUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333}wwwwwgfffffffffffffffffffffUUUUUUUUUUUUUUUEDDDDDDDDDDDD43333333333333}wwwwwfffffffffffffffffffffVUUUUUUUUUUUUUUUEDDDDDDDDDDDD43333333333333}wwwwgfffffffffffffffffffffUUUUUUUUUUUUUUUUUDDDDDDDDDDDD33333333333333wwwwwffffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwgffffffffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDDDD33333333333333}wwwffffffffffffffffffffUUUUUUUUUUUUUUUUEDDDDDDDDDDDDD4333333333333"}wwwffffffffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDDDDD3"3333333333#"}wwwffffffffffffffffffVUUUUUUUUUUUUUUUUEDDDDDDDDDDDDDD#""2333333#"""}wwwffffffffffffffffffUUUUUUUUUUUUUUUUUDDDDDDDDDDDDDD""""23333""""""}wwwffffffffffffffffffUUUUUUUUUUUUUUUUEDDDDDDDDDDDD"""""""233#""""""}wwwwwgfffffffffffffffVUUUUUUUUUUUUUUUUEDDDDDDDDDDDDD""""""""233"""""""}wwwwwwwwwwgffffffffffffffVUUUUUUUUUUUUUUUUEDDDDDDDDDDDD$""""""""""2#""""""""}}wwwwwwwwwwwwwwgffffffffffffffVUUUUUUUUUUUUUUUUEDDDDDDDDDDDD""""""""""""""""""""""}wwwwwwwwwwwgfffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDDD$""""""""""""""""""""""wwwwwwwwwfffffffffffffffffffUUUUUUUUUUUUUUUUUUEDDDDDDDDDDDD$""""""""""""""""""""""""wwwwwwwgffffffffffffffffffUUUUUUUUUUUUUUUUUUEDDDDDDDDDDD""""""""""""""""""""""""""""wwwwwwfffffffffffffffffffUUUUUUUUUUUUUUUUUUUDDDDDDDDD"""""""""""""""""""""""""""""""fffffffffffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUUDDD""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUEDD$"D"""""""""BDDDTUUUEDD""""""""""""""""UUUUUUUUUUUUUUUDDDDDD$""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUDDDDDDD$"""""""""""""""""""""""""""""""""UUUUUUUUUUUUUEDDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUUDDDDDD""""""""""""""""""""""""""""""""UUUUUUUEDTUUEDDDDDD""""""""""""""""""""""""""""""""UUUUUUUEDDDDDDDDD$$""""""""""""""""""""""""""""""!UUUUUUDDDDDDDDDDD""""""""""""""""""""""""""""""UUUUUDDDDDDDDDDDD""""""""""""""""""""""""""""""""UUUUUEDDDDDDD$D$BD"""""""""""""""""""""""""""""""UUUUUUUUEDDDD$"BDD"""""""""""""""""""""""""""""UUUUUUEDDDDDD$""""""""""""""""""""""""""""""UUUUUEDDDDDBDD""""""""""""""""""""""""""""""""UEDDDDDDDD""DD"""""""""""""""""""""""""""UED$"DDDD"BDDDDD$""""""""""""""""""""""UUUE$DDD"BD$"BD""""""""""""""""""""""!""""UUE$""BDDDD"""""""""""""""""""""""""""""""""UED$""DDDD""""""""""""""""""""""""""""""""DDDDDDDDDD"""""""BD$""""""""""""""""""""""""UUDDDDDDDD$""""DDDD"""""""""""""""""""""""""""DD"DDDDDDDBDDDDDD$""""""""""""""""""""""""!""""DDDDD"BDDDDD""""""""""""""""""""""""D$DDDDDD""BDDDD$"B""""""""""""!"""""""""""""$"DDDDDDDDDDD""""""""""""""""""""""""""""""""DDDUUEDDDDD"""""""""""""""""""""""""""""""DDTDD$""B""""""""""""""""""""""!""""""""""DDUDD""""""""""""""""""""""""""!""""""DDUDDDDDD""""""""""""""""""""""!""DDDDDDDD"""""B$"""""""""""""""""""!""""""DDDDDD"""""D$"""""""""""""""""!""""!DDD$""""""BD$""""""""""""""""""""!""""""""DDDD"""""D""""""""""""""""""""""""""DDDD$"""""""""""""""""""""""""""""!DDDDDDBD$"""""""""""""""""""""""""""BDDD$B$D""""""""""""""""""""""""$DD$"""""""""""""""""""""""""""""DD$"""""""""""""!""""!""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ZUDDDDDDDDDDDDDDDDDDD33333333333333333333333333333333DDDDDDDDDDDD433333333333333333333333333333JDDDDDDDDDDDD4333333333333333333333333333JDDDDDDDDDDDD333333333333333333333333333JDDDDDDDDDDDDD33333333333333333333333333JDDDDDDDDDDDDDD4333333333333333333333333DDDDDDDDDDDDDDD333333333333333333333333DDDDDDDDDDDDDDDD33333333333333333333333DDDDDDDDDDDDDDDDDD433333333333333333333JDDDDDDDDDDDDDDDDDD33333333333333333333JDDDDDDDDDDDDDDDDDD33333333333333333333DDDDDDDDDDDDDDDDDD33333333333333333333JDDDDDDDDDDDDDDDDDD33333333333333333333JDDDDDDDDDDDDDDDDDD43333333333333333333DDDDDDDDDDDDDDDDDD43333333333333333333JDDDDDDDDDDDDDDDDD3333333333333333333EDDUTUEDDDDDDDDDDD433333333333333333UUDDDDDDDDDDDDD3333333333333333ZUUDDDDDDDDDDDD4DDD43333333333UUDDDDDDDDDDDDDDDD43333333C33ZUUEDDDDDDDDDDDDDDD433333DDD43̻ZUUUUEDDDDDDDDDDDDDDD43333CDDD43̻jUUUUUUUUUUUUUEDDDDDDDDD43333DDDD43̼˻jUUUUUUUUUUUUUUEDDDDDDDDD43333DDDD33̻̬jffUUUUUUUUUUUUUUDDDDDDDDDD4333CDDD433̼̪ffffffffffUUUUUUUUUUUUUEDDDDDDDDDDDD33DDDD333|ffffffffffVUUUUUUUUUUUUEDDDDDDDDDDDDDD3CDD4333|ffffffffffUUUUUUUUUUUUEDDDDDDDDDDDDDDDD3DD3333gfffffffffVUUUUUUUUUUUDDDDDDDDDDDDDDDDDD3333333|wwffffffffffUUUUUUUUUDDDDDDDDDDDDDDDDDDDDD4333333|wwwffffffffffUUUUUUUEDDDDDDDDDDDDDDDDDDDDD43333333陙|wwwgfffffffffUUUUUUUEDDDDDDDDDDDDDDDDDDDD3333333333|wgffffffffVUUUUUEDDDDDDDDDDDDDDDDDDDD433333333333|wgffffffffVUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333ww|wgfffffffffVUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333wwwwwffffffffffVUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333|wwwwwgffffffffffUUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333wwwwwwwwwwwgfffffffffffUUUUUUDDDDTUEDDDDDDDDDDDDDD433333333333}wwwwwwwwwwwffffffffffffUUUUUUDDDDUUUUEDDDDDDDDDDDD433333333333wwwwwwwwwwwwwgfffffffffffVUUUUUUDDDDUUUUEDDDDDDDDDDDD433333333333}wwwwwwwwwwwwwwwffffffffffffUUUUUUDDDDDUUUUEDDDDDDDDDDDD433333333333}wwwwwwwwwwwwwffffffffffffffUUUUUUDDTEDUUUUUDDDDDDDDDDDD433333333333wwwwwwwwwwwwwgffffffffffffUUUUUUUUDTUUUUUUUUEDDDDDDDDDDD433333333333wwwwwwwwwwwwgfffffffffffVUUUUUUUUUUUUUUUUUUUDDDDDDDDDDDD333333333333|wwwwwwwwwwwwgfffffffffffVUUUUUUUUUUUUUUUUUUEDDDDDDDDDDDD333333333333|wwwwwwwwwwwwgfffffffffffffUUUUUUUUUUUUUUUUUDDDDDDDDDDDD3333333333333}wwwwwwwwwwgfwfffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDD43333333333333}wwwwwwwwwwfffffffffffffffffffVUUUUUUUUUUUUUEDDDDDDDDDDD43333333333333}wwwwwwwwwgffffffffffffffffffffUUUUUUUUUUUUUEDDDDDDDDDDD43333333333333}wwwwwwwwwffffffffffffffffffffVUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333}wwwwwwwgffffffffffffffffffffVUUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333}wwwwwgfffffffffffffffffffffVUUUUUUUUUUUUUUEDDDDDDDDDDDD43333333333333}wwwwwffffffffffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333}wwwwgffffffffffffffffffffVUUUUUUUUUUUUUUUUUDDDDDDDDDDDD33333333333333wwwwwffffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwgffffffffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDDDD33333333333333}wwwffffffffffffffffffffUUUUUUUUUUUUUUUUEDDDDDDDDDDDDD4333333333333"}wwwfffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDDD3"3333333333""}wwwfffffffffffffffffffUUUUUUUUUUUUUUUUEDDDDDDDDDDDDDD#""2333333#"""}wwwffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDDD""""23333""""""}wwwwwfffffffffffffffVUfUUUUUUUUUUUUUUUUEDDDDDDDDDDDD"""""""333"""""""wwwwwwwwgfffffffffffffVUUUUUUUUUUDDUUUUUEDDDDDDDDDDDD$"""""""""23#"""""""wwwwwwwwwwwgffffffffffffVUUUUUUUUUUU$""BUUEDDDDDDDDDDDDD"""""""""""""""""""""}wwwwwwwwwwwgffffffffffffffffVUUUUUUUUUUUE""""BDDDDDDDDDDDDDD""""""""""""""""""""""}wwwwwwwwwwwffffffffffffffffVUUUUUUUUUUeVU$"""""DDDDDDDDDDDDD$""""""""""""""""""""""wwwwwwwgfffffffffffffffffffUUUUUUUUUUUUfUE""""""BDDDDDDDDDD$""""""""""""""""""""""""wwwwwwwfffffffffffffffffffUUUUUUUUUUUUUVUE$""""""BDDDDDD$"""""""""""""""""""""""""""wwwwwgfffffffffffffffffffUUUUUUUUUUUUUUUUE$"""""""BDDD""""""""""""""""""""""""""""""fffffffffffVUUUUUUUUUUUUUUUTEUDDUUUUUUUUUUD"""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUEDDDDDDD""""""BDDUUUUUUUUDDDDDDD$"""""""""""""UUUUUUUUUUUUUED$"""""""B""""""BDDDDDDDD""""""""""""""""""""""""""UUUUUUUUUUUUUEDDD"""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUDDDDDDDD"""""""""""""""""""""""""""""""""UUUUUUUUUUUUUDDDDDDD$"""""""""""""""""""""""""""""""UUUUUUUEDDUUDDDDDDDD""""""""""""""""""""""""""""""""UUUUUUUDDDDDDDDDDD"""""""""""""""""""""""""""""""""""UUUUUEDDDDDDDDDDD"""""""""""""""""""""""""""""""!""UUUUUDDDDDDDDDDDD$""""""""""""""""""""""""""""""""UUUUUEDDDDDDDDDDDD"""""""""""""""""""""""""""""UUUUUUUUUDDDD$B$BD"""""""""""""""""""""""""""""UUUUUUEDDDDDD$""""""""""""""""""""""""""""""UUUUUUDDDDDDD$""""""""""""""""""""""""""""!"UEDDDDDDD$BDDD$B""""""""""""""""""""""""UUUDDDDDD"DDDDDDD""""""""""""""""""""UUU$"BDD"BDDDD$"""""""""""""""""""""""""""""""UUDD""BDDDD""""""""""""""""""""""""""""""""DDD$"DDDDD"""""""""""""""""""""""""""""""""DDDDDDDDDD$$"""""BD$"""""""""""""""""""""""""!TEDDDDDDDD$""""DDDD""""""""""""""""""""""""""DD""DD"DDDDDDDDDD$""""""""""""""""""""""!BD"DDDDDDDDDDDD$"""""""""""""""!"""""""""DDDDDDDDD$DDDD$""""""""""""""""""""""""""""""$BDDTEDDDDDD$"""""""""""""""""""""""""""""""DDDDDD$BDD""""""""""""""""""""""""""""""""$BDDD""""""""""""""""""""""""""!""""""""DTUDD""""""""""""""""""""""""""!"""""""BDTDDDDDD$""""""""""""""""""""""""!""""DDDDEDDDD""""B$""""""""""""""""""""!""""""DDDDDD"""""D$""""""""""""""""!""""""""DDDD"""""BDD$"""""""""""""""""""""""""!DDDD$D$"""""""""""""""""""""""""""DDDDD$"""""""""""""""""""""""""""""!"""DDDDBD$"""""""""""""""""""""""""""DDD$"""""""""""""""""""""""""""DDDD"""""""""""""""""""!"BDD""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""""""""""" \ No newline at end of file diff --git a/Video 126p/video-01.bin b/Video 126p/video-01.bin new file mode 100644 index 0000000..22bfe4a --- /dev/null +++ b/Video 126p/video-01.bin @@ -0,0 +1 @@ +̼UUUUUUDDDDDDDDDDDDDDDDDD433333333333333333333333333333333̼EDDDDDDDDDDDDDD433333333333333333333333333333̼EDDDDDDDDDDDDDDDD4333333333333333333333333333̻ZDDDDDDDDDDDDDDDDD333333333333333333333333333̻ZEDDDDDDDDDDDDDDDDD33333333333333333333333333̼UDDDDDDDDDDDDDDDDDD4333333333333333333333333̼̼ZDDDDDDDDDDDDDDDDDDD333333333333333333333333̼˻UDDDDDDDDDDDDDDDDDDD33333333333333333333333̼EDDDDDDDDDDDDDDDDDDDD433333333333333333333̼EDDDDDDDDDDDDDDDDDDDDD33333333333333333333̻UDDDDDDDDDDDDDDDDDDDDD33333333333333333333̻ZUUDDDDDDDDDDDDDDDDDDD33333333333333333333̻UUEDDDDDDDDDDDDDDDDDD33333333333333333333̻ZUUEDDDDDDDDDDDDDDDDDD43333333333333333333̻UUUEDDDDDDDDDDDDDDDDDD43333333333333333333̼ZUUUDDDDDDDUDDDDDDDDDDD3333333333333333333̼UUUUEDDDTUUEDDDDDDDDDDD433333333333333333̼UUUUUUUUUUDDDDDDDDDDDD43333333333333333̼ZUUDDDDDDDDDDDDD3DDD43333333333̼ZUUDDDDDDDDDDDDDDDD43333333C33߼UUUDDDDDDDDDDDDDDDD433333DDD43ݼZUUUUEDDDDDDDDDDDDDDD43333CDDD43ݻjVUUUUUUUUUUUUEDDDDDDDDD43333DDDD43ݽjUUUUUUUUUUUUUUEDDDDDDDDD43333DDDD33ݽjUUUUUUUUUUUUUUDDDDDDDDDDD333CDDD433ݻVUUUUUUUUUUUUUEDDDDDDDDDDDD33DDDD333ݻfVUUUUUUUUUUUUUDDDDDDDDDDDDD43CDDD333ݽݽjfUUUUUUUUUUUUEDDDDDDDDDDDDDDDC3D43333ݻfffjVUUUUUUUUUUEDDDDDDDDDDDDDDDDD33333333ݪjfffjUUUUUUUUUEDDDDDDDDDDDDDDDDDDD33333333}ffffVUUUUUUUEDDDDDDDDDDDDDDDDDDDD433333333}wwffffUUUUUUUUDDDDDDDDDDDDDDDDDDDD3333333333}fffVUUUUUEDDDDDDDDDDDDDDDDDDDDD43333333333}ݪfffUUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333}w}wfffUUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333}wwwwfffUUUUUUDDDDDDDDDDDDDDDDDDDDD433333333333}wwwwfffUUUUUUDDDDDDDDDDDDDDDDDDDDDDD3333333333wwwwwwwwwjfffffUUUUUUDDDDTUEDDDDDDDDDDDDDDDD3333333333~wwwwwwwwffffjffffVUUUUUUDDDDUUUUEDDDDDDDDDDDD433333333333wwwwwwwwwwwjfffffffffVUUUUUUDDDDUUUUEDDDDDDDDDDDD433333333333~wwwwwwwwwwwwjfffffffffUUUUUUDDDDDUUUUEDDDDDDDDDDDD433333333333wwwwwwwwwwwwwjfffffffffUUUUUUDDTEDUUUUUDDDDDDDDDDDD433333333333wwwwwwwwwwwwwjffffffeUUUUUUUUDTUUUUUUUUEDDDDDDDDDDD433333333333}wwwwwwwwwwwwjffffffffVUUUUUUUUUUUUUUUUUUUDDDDDDDDDDDD333333333333}wwwwwwwwfffffffffVUUUUUUUUUUUUUUUUUUEDDDDDDDDDDDD333333333333}wwwwwwwwfffffffffffUUUUUUUUUUUUUUUUUDDDDDDDDDDDD3333333333333wwwwwffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDD43333333333333~wwwwwfffffffffffffVUUUUUUUUUUUUUEDDDDDDDDDDD43333333333333~wwwwwwzffffffffffffffffUUUUUUUUUUUUUEDDDDDDDDDDD43333333333333~wwwwwwwfffffffffffffffffVUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333~wwwwwwffffffffffffffffVUUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333~wwwwwffffffffffffffffffVUUUUUUUUUUUUUUEDDDDDDDDDDDD43333333333333~wwwwffffffffffffffffffffffUUUUUUUUUUUUUUUUDDDDDDDDDDDD43333333333333~wwwwffffffffffffffffffffVUUUUUUUUUUUUUUUUUDDDDDDDDDDDD33333333333333wwwwwffffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDD33333333333333wwwwffffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDD33333333333333~wwwffffffffffffffffffffUUUUUUUUUUUUUUUUEDDDDDDDDDDDDD4333333333333"~wwwfffffffffffffffffffVUUUUUUUUUUUUUUUUDDDDDDDDDDDDDD3"333333333#""~wwwfffffffffffffffffffUUUU$""TUUUUUUUUEDDDDDDDDDDDDDD#""2333333#"""~wwwffffffffffffffffffVUUUU"""BTUUUUUUUDDDDDDDDDDDDDD""""23333""""""~wwwwwfffffffffffffffVUUUeUU$""""TUUUUUUEDDDDDDDDDDDD"""""""333"""""""~wwwwwwwwgfffffffffffffUUUUUUfVU"""""BUUUEDDDDDDDDDDDD$"""""""""23#"""""""wwwwwwwwwwwgffffffffffffUUUUUUUUfVE""""""DDDDDDDDDDDDDDD"""""""""""""""""""""~wwwwwwwwwwwgffffffffffffffffVUUUUUUUefU$""""""BDDDDDDDDDDDDD""""""""""""""""""""""~wwwwwwwwwwwffffffffffffffffUUUUUUUUUUffU$"""""""DDDDDDDDDDDD$""""""""""""""""""""""wwwwwwwwffffffffffffffffffVUUUUUUUUUUUfVU$"""""""BDDDDDDDDD$""""""""""""""""""""""""wwwwwwwjfffffffffffffffffVUUUUUUUUUUUUfUU$""""""""BDDDDD$"""""""""""""""""""""""""""wwwwwwfffffffffffffffffffUUUUUUUUUUUUUUUUD""""""""""""D"""""""""""""""""""""""""""""jfffffffffffffUUUUUUUUUUUUUUUUUUUUUUUEDDD#""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUDDDD$"""BDUUUUUUEDDDDDB4""""""""""""""""""""""UUUUUUUUUUUUEDDDBDDD$""DDD""DTEUUUUUUDDDD$$"""""""""""""""""""UUUUUUUUUUUUEDD"""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUEDDDDDDD$""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUDDDDD$""""""""""""""""""""""""""""""""""UUUUUUUEDDUUUUDDDD$"""""""""""""""""""""""""""""""""UUUUUUUEDDDDDDDDDD$"""""""""""""""""""""""""""""""""UUUUUEDDDDDDDDDD$""""""""""""""""""""""""""""!""""UUUUEDDDDDDDDDDD$"""""""""""""""""""""""""""""""UUUUEDDDDDDDDDDDD$"""""""""""""""""""""""""""""UUUUUUUEDDDDD"DDDD"""""""""""""""""""""""""""""UUUUUUEDDDDDD$""""""""""""""""""""""""""""""""UUUUUUUDDDDDD$"""""""""""""""""""""""""""""UEDDDD$"B""DD$""""""""""""""""""""""""""UEDDD""D$"BDDDDDDD""""""""""""""""""""UUU$"DDDBDDDD"""""""""""""""""""""""""""""UED""""DDDD$""""""""""""""""""""""""""""""""UUE$"BDDDD""""""""""""""""""""""""""""""""DUDDDDDDDDD$""""""""""""""""""""""""""""""""DDDDDDDDDDD""""""BD""""""""""""""""""""""""""D$"DDD"DDBDDDDD"BD$"""""""""""""""""""""!DDDDDDDDDDDDDD$""""""""""""""""""""""""DDDDDDDDDDDDDD$"""""""""""""""!"""""""""""""DBDDTDDDDDDD$"""""""""""""""""""""""""""""""""""BD$"DD$"""""""""""""""""""""!"""""""""""$""""""""""""""""""""""""""""!""""DDDDD""""""""""""""""""""""""""!"""""""DDEDDDDDD""""""""""""""""""""""""""""""""DDDDDDDDD$"""B""""""""""""""""""""""""""""""DDDDDD$"""""""""""""""""""""""""""""""""DDDD$"""DDD"""""""""""""""""""""""""""!DDDDDD$""B$""""""""""""""""""""""""DDDDDD$"""""""""""""""""""""""""""""""BDDDD""""""""""""""""""""""""""BD"BDDD$"""""""""""""""""""""""""DDDD"B""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""!""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""!""!"""""""""""""""""""""""""""""""""""""""""""""̼YUUUUUUUUUUUUUUUU5333333333333333333333333333333̼YUUUUUUUUU333333333333333333333333333μUUUUUUUUUU533333333333333333333333333̻UUUUUUUUUUU33333333333333333333333333UUUUUUUUUUUU3333333333333333333333333μUUUUUUUUUUUUU533333333333333333333333̼UUUUUUUUUUUUUU33333333333333333333333̼YUUUUUUUUUUUUUU3333333333333333333333̻YUUUUUUUUUUUUUUU533333333333333333333̻YUUUUUUUUUUUUUUUU33333333333333333333̻YUUUUUUUUUUUUUUUU33333333333333333333̻UUUUUUUUUUUUUUUU53333333333333333333̻UUUUUUUUUUUUUUUU53333333333333333333̻UUUUUUUUUUUUUUU53333333333333333333̼UUUUUUUUUUUUUUU3333333333333333333̻YUUYUUUUUUUUUU3333333333333333333̼UUUUUUUUUUUU33333333333333333̻UUUUUUUUUUUUU3333333333333333̻YUUUUUUUUUUUUUUSUUUU333333333̻YUUUUUUUUUUUUUUUUU5333333333̻UUUUUUUUUUUUUUUUU533333SU33ݻUUUUUUUUUUUUUUUUU5333SUUU33ݽUUUUUUYUUUUUUUUUU5333UUUU33ݽUYUUUUUUUUUUU33SUUUU33ݽfffUUUUUUUUUUUUU33SUUU533ݽffffYUUUUUUUUUUUUU53UUUU333ݻkffffUUUUUUUUUUUUUU53SUU5333ݽݻffffYUUUUUUUUUUUUUUUUSUUU3333ꪪݽݻffffUUUUUUUUUUUUUUUUUUU33U53333ݽ{ffffUUUUUUUUUUUUUUUUUUUU533333333wwwwffffUUUUUUUUUUUUUUUUUUUUUU533333333wwwwgffffYUUUUUUUUUUUUUUUUUUUUUUU5333333333ꪪ}w}}wwgffffYUUUUUUUUUUUUUUUUUUUUUU533333333333}w}wwgffffUUUUUUUUUUUUUUUUUUUUUUU533333333333}www}wwfffffYUUUUUUUUUUUUUUUUUUUUUUU533333333333}wwwwwwgffffffUUUUUUUUUUUUUUUUUUUUUUUU533333333333}}wwwwwwwfffffffYUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwfffffffUUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwgfffffffUUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwwwwffffffffUUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwwwffffffffUUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwwfffffffffYUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwwgffffffffYUUUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwwfffffffffYUUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwwfffffffffUUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwgfffffffffYUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwfgfffffffffUUUUUUUUUUUUUUUUUUU3333333333333wwwwwwwwwwgfffffffffffffUUUUUUUUUUUUUUUUUU53333333333333wwwwwwwwwwffffffffffffffUUUUUUUUUUUUUUUUUU53333333333333wwwwwwwwfffffffffffffffYUUUUUUUUUUUUUUUUUU53333333333333wwwwwwwgfffffffffffffffUUUUUUUUUUUUUUUUUUU53333333333333wwwwwwffffffffffffffffYUUUUUUUUUUUUUUUUUUU53333333333333wwwwwgffffffffffffffffUUUUYUUUUUUUUUUUUUUUUUUU53333333333333wwwwwfffffffffffffffYED"BUUUUUUUUUUUUUUUUUUUUU53333333333333wwwwgfffffffffffffYD"""TYUUUUUUUUUUUUUUUUUUUU53333333333333wwwwgfffffffffffffE$"""RYUUUUUUUUUUUUUUUUUUUUU53333333333333wwwwffffffffffffE"""""UUUUUUUUUUUUUUUUUUUUUUUED333333333333wwwgfffffffffffiYD"""""TUUUUUUUUUUUUUUUUUUUEDDDD3333333333#"wwwgffffffffffiY$"""""RUUUUUUUUUUUUUUUEDTUDDDDD$""""2333"""wwwwgffffffffffYE$""""""UUUUUUUUUUUUUUUDDTEDDDDD$""""23"""""wwwwwwwwgfffffffffifYE$""""""TUUUUUUUUUUUUUEDDDDDDDDD$""2""""""""wwwwwwwwwwgfffffffffifYD"""""""RUUUUUUUUUUUUUDDDDDDDDDD$""33"""""""wwwwwwwwwwwgffffffffffffYD""""""""UUUUUUUUUUUUDDDDDDDDDDD""""""""""""wwwwwwwwwwgfffffffffffffifYD""""""""RUUUUUUUUUUDDDDDDDD$"""""""""""""""wwwwwwwwwgffffffffffffffUfYD"""""""""UUUUUUUDDDDDD$""""""""""""""""""""wwwwwwwgffffffffffffffffUD"""""""""2UUUDDDDDDDD$"""""""""""""""""""""wwwwwwwffffffffffffffYE$"""""""""""BDDDDDD$"""""""""""""""""""""""wwwwwffffffffffffUUUUD$""""""""""DDDDD$""""""""""""""""""""""""YUUUUUUUUUUUUYUUUEDD$"""""""""""""""""""""""""""""""""""""""""YUUUUUUUUUUUUUUUEDDDDDDDUYUUUEDD$""""""""""""""""""""""""""""""""""""""""""YUUUUUUUUEDDDDDDDDDDDUUDUUUUUUUUUUEDDDDDDDD""""""""""""""""YUUUUUUUUUUDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUEDDDDDDD$""""""""""""""""""""""""""YUUUUUUUUUUUUUUEDDDDDDD""""""""""""""""""""""""""""YUUUUUUUUUUUUUUDDDDDDD$"""""""""""""""""""""""""""YUUUUUUUUUUTUUUEDDDDDD""""""""""""""""""""""!"""""UUUUUUUUUUUETUUEDDDDD$""""""""""""""""""""""!"UUUUUUUUUUUTUUEDD$""""""""""""""""""""""""""!"YUUUUUUUUUUDDUEDDD$"""""""""""""""""""""""""""""YUUUUUUUUUUEDDDDDD""""""""""""""""""""""""""""UUUUUUUUUTUUDD$"DD"""""""""""""""""""""""""""UUUUUUDUUDDUDDDD$""""$""""""""""""""""""""UUUE$""""DTUEDDDDDDD"""""""""""""""""""""UUUDUUDDDTEDDDDDDD""""""""""""""""""UU$""DDDUUUD$""""""""""""""""""""""""""""""UUEDDTEUUDD"""$"BDD$""""""""""""!""""""""""UUUUUUUUEDD$""D"""D$""""""""""""""""""""UUUUUUUUUDD$""D"BDD$""""""""""""""""""""""EDTUUDTDDDDDDDDDDDD""""""""""""""""""""""""DDDTUDTEDDUDUUDDDD$"""""""""""""""""""UUUUUUUEDTUUUU$"$"""""""""""""""""""""""EUUUUUUUTUUUED"""""""""""""""""""""""""""""""$DDTEDUDDDTD""""""""""""""""""""""""""""""""B$""""""""""""""""""""""""!""""DUED$""""""""""""""""""""""""""""""""""""UUUUUDDD""""D$"""""""""""""""""!"""""""UUUUUUUE"""DDD$"""""""""""""""""""""""""""UUUUUE$"B$""B$""""""""""""""""""""""""""""""UUUEDDDDDD"""""""""""""""""""""!"""""!"UUUEDDDDDDDD"$""""""""""""""""""""!EDD$DDD"""""""""""""""""""""""""""""BD""BDDD"""""""""""""""""""""""""DDDDDDDDD"""""""""""""""""""""""""DDDDDDDD$""""""""""""""!"""""""DDDDDD""""!"""""!""""BD""""""""""""""""""""""""""""D""B$""""""""""""""""""""""""""""""!""""""""""""""!"""""""""""!""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""̬YUUUUUUUUUUUUUUU3333333333333333333333333333333333̬̬YUUUUUUUUU33333333333333333333333333̬YUUUUUUUUUU3333333333333333333333333̬YUUUUUUUUUU3333333333333333333333333̪UUUUUUUUUUUU333333333333333333333333̪UUUUUUUUUUUUU33333333333333333333333̬YUUUUUUUUUUUUU53333333333333333333333̬UUUUUUUUUUUUUUU3333333333333333333333̬UUUUUUUUUUUUUUUU333333333333333333333̪YUUUUUUUUUUUUUUU533333333333333333333̪UUUUUUUUUUUUUUUU33333333333333333333̬UUUUUUUUUUUUUUUU33333333333333333333̬YUUUUUUUUUUUUUU33333333333333333333̬YYUUUUUUUUUUUUU53333333333333333333̬UUUUUUUUUU53333333333333333333̪UUUUUUUUUU53333333333333333333̬YUUUUUUUUUUUUU3333333333333333̬UUUUUUUUUUUUUU333333333333333̪UUUUUUUUUUUUUUUUUU3333333333̬YUUUUUUUUUUUUUUUUU3333333333̬YUUUUUUUUUUUUUUUUU33333SUU33̪UUUUUUUUUUUUUUUUU333SUUUU33̪YUUUUUUUUUU333UUUUU33̪zwUUUUUUUUUUUU333UUUU533wzwwYUUUUUUUUUUUU53SUUUU333wwwwwwwwYUUUUUUUUUUUUU3SUUUU333ݻۻwwwwwwwwwwwYUUUUUUUUUUUUUU3SUUU5333ݻwwwwwwwwwwUUUUUUUUUUUUUUUUUUU33UU53333ݻwwwwUUUUUUUUUUUUUUUUUUUU533UU33333ݻۻwwYUUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwUUUUUUUUUUUUUUUUUUUUUUUUU3333333333wwwwwwwwwwYUUUUUUUUUUUUUUUUUUUUUUUUU3333333333wwwwwwwwwwYUUUUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwwwwwYUUUUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwwwwwYUUUUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwwwjYUUUUUUUUUUUUUUUUUUUUUU3333333333333~wwwwwwwwjffUUUUUUUUUUUUUUUUUUUUUUU3333333333333~wwwwwwwwwwwwwjffffUUUUUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwwwwwwwwjfffffUUUUUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwwwwwwwwffffffUUUUUUUUUUUUUUUUUUUUUUU5333333333333~wwwwwwwwwwwwjfffffUUUUUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwwwwzwwjfffffYUUUUUUUUUUUUUUUUUUUUUU3333333333333wwwwwwwffffffYUUUUUUUUUUUUUUUUUUUUUU3333333333333wwwwwwwffffffYUUUUUUUUUUUUUUUUUUUUU3333333333333~wwwwwwffffffYUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwfffffffUUUUUUUUUUUUUUUUUU33333333333333wwwwwwjffffffffYUUUUUUUUUUUUUUUUU533333333333333wwwwwwjfffffffffYUUUUYUUUUUUUUUUUUUUUUU533333333333333wwwwwwfffffffffffYD$"BUUUUUUUUUUUUUUUUUU533333333333333~wwwwwfffjffffffffffE$"""UYUUUUUUUUUUUUUUUUUU533333333333333~wwwwjffffffffffffffffE$"""TYUUUUUUUUUUUUUUUUUUU33333333333333~wwwfffffffffffffffD""""RUUUUUUUUUUUUUUUUUUUU33333333333333뾻~wwwwffffffffffffffYYD"""""UYUUUUUUUUUUUUUUUUUUUU33333333333333wwwwgfffffffffffffYE$"""""TUUUUUUUUUUUUUUUUUUUUUU33333333333333wwwwgfffffffffffYE""""""RUUUUUUUUUUUUUUUUUUUUUU33333333333333wwwwfffffffffffiUD"""""""UUUUUUUUUUUUUUUUUUUUUU33333333333333~wwwwfffffffffffED"""""""UUUUUUUUUUUUUUUUUUUDTDD4333#3333333"~wwwwwffffffffffE$"""""""TUUUUUUUUUUUUUUUDUUDDDD33"""33333#""~wwwwwwwwffffffffffiD$"""""""RUUUUUUUUUUUUUUDDUDDDDDD"""""23#""""~wwwwwwwwwwwgffffffffD$"""""""RUUUUUUUUUUUUUUDDDDDDDDD""""""""""""~wwwwwwwwwwwwwffgffffffffE"""""""""UUUUUUUUUUUUUEDDDDDDDDD""""""""""""wwwwwwwwwwwfffffffffffffiE"""""""""RUUUUUUUUUUUUDDDDDDDDD"""""""""""""wwwwwwwwfffffffffffffffE""""""""""UUUUUUUUUDDDDDDDD$BD""""""""""""""wwwwwwwfffffffffffffffE""""""""""BUUDUUUDDDDDDD""""""""""""""""""""wwwwwwjffffffffffffffiUD"""""""""""BDDDDDDDDD$"""""""""""""""""""""jfffffffffffffUUUUED$""""""""""BDDDDDD$"""""""""""""""""""""""YUUUUUUTUDD"""""""""""""BDDDD$""""""""""""""""""""""""UUUUUUUUUUUUUUUUUEDDDDDTYUEDDD""""""""""""""""""""""""""""""""""""""""""""YUUUUUUUUDDDDDDDDDDDUUUUUUUUUUUUUDDD""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUDDDDDDDDDDDDDD"""DDDDDDDDDD""""""""""""""""""""""YUUUUUUUUUUUUUUDDDDDDDD$"""""""""""""""""!""UUUUUUUUUUUUUUUDDDDDDDD$"""""""""""""""""""""""""YUUUUUUUUUUUUUUEDDDDDDDD$""""""""""""""""""""""""UUUUUUUUUUUUUUUDDDDDDDD""""""""""""""""""""""""""UUUUUUUUUUDTUUEDDDDDD""""""""""""""""""""""""UUUUUUUUUUUUUUUD$B$""""""""""""""""""""""""""UUUUUUUUUUUUUUDDDD$""""""""""""""""""""""""""""!"UUUUUUUUUUUDDDDTDD""""""""""""""""""""""""""""UUUUUUUUUUUEDDDDD$"""""""""""""""""""""""""""UUUUUDDDDDUUDD$"""""B""""""""""""""""""""""""UUUD""D"BDUUDDDD$"""B"""""""""""""""""""""UUETEDDDDUUUTUEDDD""""""""""""""""""""""UD$"BDDTUUUDDD$""""""""""""""""""""""""!""UUDDTUDTEDDD$D""DD$"""""""""""""""""""""""UUUUUUDUEDD$""$"""D""""""""""!"""""""UUUUUUUUDD$""B$"DDD""""""""""""""""""""""DDTUDDDDDDDDDDDDDDD"""""""""""""""""""""""""DDTUEDUUDTUUUUDDDD"""""""""""""""""""""UUUUUUUEDTUUUE$BD$"""""""""""""""""""DUUUUUUUDTUUED"""""""""""""""""""""""""""""""DDTDDDDDDUE$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""UEDD"""""""""""""""""""""""""""""""UUUUEDD$"""D"""""""""""""""""""""""""""UUUUUEUD""BDDD$""""""""""""""""""""""""UUUUED$"D$"""""""""""""""""""""""""""""""""UUUEDDDUD$"""""""""""""""""""""!"""""""""UUUEDTTUDD$"BD""""""""""""""""""""!""DD""DD""DDD$B$""""""""""""!"""""""""""BD""BDD$BD"""""""""""""""""""""""DDDD$DDDDD"""""""""""""""""""""""""DDDDDDDDD""""""""""""""""""""""DDDDDD"$""!""""""""""""""""BD"""""""""""""""B$"""""""""""""""D"""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""!""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""""""!"[UUUUUUUUUUUUUUUU533333333333333333333333333333333̬[UUUUUUUUUUUU53333333333333333333333333̪UUUUUUUUUUUUUU333333333333333333333333̬UUUUUUUUUUUUUU533333333333333333333333̬UUUUUUUUUUUUUUU33333333333333333333333̬UUUUUUUUUUUUUUU33333333333333333333333̬UUUUUUUUUUUUUUU53333333333333333333333̬UUUUUUUUUUUUUUUUU333333333333333333333̬UUUUUUUUUUUUUUUUUU53333333333333333333̬UUUUUUUUUUUUUUUUUU53333333333333333333̬UUUUUUUUUUUUUUUUUUU3333333333333333333̪UUUUUUUUUUUUUUUUUUU3333333333333333333̬[UUUUUUUUUUUUUUUUUU3333333333333333333̬[UUUUUUUUUUUUUUUUU5333333333333333333̬UUUUUUUUUUUUUUUUUU333333333333333333̪[UUUUUUUUUUUUUU5333333333333333333̪[U[UUUUUUUUUUUUUU333333333333333̬[UUUUUUUUUUUUUUU33333333333333̬UUUUUUUUUUUUUUUUUUUU333333333̬[UUUUUUUUUUUUUUUUUU333333333̬[UUUUUUUUUUUUUUUUUU33333SUU3̪kVUUU[UUUUUUUUUUUUUUUUUU333SUUUU3̬kffUUUU[UUUUUUUUUUUUUUUUUU333UUUUU3̪kkfVUUUUUUUUUUUUUUUUUUUUUUU33SUUUU53̪fkfffkfffVUUUUUUUUUUUUUUUUUUUUUUUU53SUUUU53̬fffffffffffVUUUUUUUUUUUUUUUUUUUUUUUUUU3SUUUU33̮fffffffkfffUUUUUUUUUUUUUUUUUUUUUUUUUUU3SUUU533gfffffffffVUUUUUUUUUUUUUUUUUUUUUUUUUUU3SUU5333wwwwwwwwwgfffffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUU33UU3333w~wwwwwwfffffffffVUUUUUUUUUUUUUUUUUUUUUUUUUUU533333333wwwwwwwwwwwwfffffffffVUUUUUUUUUUUUUUUUUUUUUUUUUUU533333333wwwwwwwwwwwwgfffffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333wwwwwwwwwwwwgffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwfffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU533333333333~wwwwwwwwwwwfffffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU533333333333~wwwwwwwwwwwgfffffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU533333333333}wwwwwwwwwwwwffffffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU533333333333~wwwwwwwwwwwwwwfffffffffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU53S333333333}wwwwwwwwwwwwwffffffffffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwwgffffffffffffffffUUUUUUUUUUUUUUUUUUUUUUUUUU533333333333鞙~wwwwwwwwwwwwwgffffffffffffffffVUUUUUUUUUUUUUUUUUUUUUUUUU533333333333~wwwwwwwwwwwwwfffffffffffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwwgffffffffffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwwgfffffffffffffVE$"DTUUUUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwwffffffffffffffVD"""BUUUUUUUUUUUUUUUUUUUUUUUU533333333333}wwwwwwwwwwgffffffffffffffffVD""""UUUUUUUUUUUUUUUUUUUUUUU5333333333333}wwwwwwwwwwfffffffffffffffffU$""""UUUUUUUUUUUUUUUUUUUUUUU3333333333333}wwwwwwwwwgfffffffffffffffffE$""""RUUUUUUUUUUUUUUUUUUUUUU3333333333333}wwwwwwwgfffffffffffffffffUUE"""""RUUUUUUUUUUUUUUUUUUUUUU3333333333333}wwwwwwfffffffffffffffffffUUD""""""UUUUUUUUUUUUUUUUUUUUU53333333333333}wwwwwgfffffffffffffffffffED$""""""RUUUUUUUUUUUUUUUUUUUUU3333333333333}wwwwgffffffffffffffffffVED"""""""RUUUUUUUUUUUUUUUUUUUUU5333333333333}wwwwfffffffffffffffffffVED"""""""BUUUUUUUUUUUUUUUUUUUUU3333333333333wwwwfffffffffffffffffffVD$""""""""UUUUUUUUUUUUUUUUUUUUU3333333333333wwwwgffffffffffffffffffVD"""""""""UUUUUUUUUUUUUUUUUUUUU3333333333333wwwwffffffffffffffffffvVD"""""""""UUUUUUUUUUUUUUUUUUUUU5333333333333}wwwwfffffffffffffffffffVD"""""""""RUUUUUUUUUUUUUUUUUEDDDD333#3333333}wwwwwfffffffffffffffffffVD"""""""""RUUUUUUUUUUUUUUDUUDDDD33"""23333#"}wwwwwwwwwfffffffffffffffffffVD"""""""""2UUUUUUUUUUUUUEDUDDDDDD$""""23#"""wwwwwwwwwwwwgfffffffffffffffffffVE""""""""""UUUUUUUUUUUUUDDDDDDDDD"""""""""""wwwwwwwwwwwwwgvgffffffffffffffffUffffE""""""""""SUUUUUUUUUUUEDDDDDDDDD$""""""""""wwwwwwwwwwwwfffffffffffffffffffffVUUffffE""""""""""RUUUUUUUUUUUDDDDDDDDD""""""""""""wwwwwwwwwfffffffffffffffffffffffUUUefffVE"""""""""""SUUUUUUUDDDDDDDDDDD"""""""""""""wwwwwwwgfffffffffffffffffffffVUUUefffffVE$"""""""""""DTUUUDDDDDDD"""""""""""""""""""wwwwwwgfffffffffffffffffffffVUUUUffffVUUUED"""""""""""BDDDDDDDD$""""""""""""""""""""fffffffffffffffffffffffffffVUUUUffffVUUUUED""""""""""""BDDDDD$""""""""""""""""""""""fffffVUUUfUUUUUUUUUUUfVUUUUUUUUfffffUEDED$""""""""!""""DDDD$"""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUUUUUUDTUUfffUUUEDD$"""""""""!"""""$"""""""""""""""""""""""""UUUUUUUUUUUUDDDDDDDDDDTUUUUUUUUUUUUUUUDD$""""""""!"""""""""""""""""""""""""""""""UUUUUUUUUUUUUDDDDDDDDDDDDDDDDDDTUUTUDDDDDDD"""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUDDDDDDDD""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUDDDDDDDD"""""""""""""""""UUUUUUUUUUUUUUUUEDDDDDDD$""""""""""""""""""UUUUUUUUUUUUUUUUDDDDDDDB""""""""""""""""""""UUUUUUUUUUUDDUUUDDDDDD""""""""""""""""""""""UUUUUUUUUUUUUUUUDDBD$"""""""""""""""""""""""!"UUUUUUUUUUUUUEUEDDDD"""""""""""""""""""""""""UUUUUUUUUUUUUDDDDDDD$"""""""""""""""""""""""""UUUUUUUUUUTUUEDDDDD$""""""""""""""""""""""""""UUUUUEDDDDDUUED$""""""""""""""""""""""""""""""UUUUEDBD""DUUEDDDD$B"""""""""""""""""""""""!UUUUEETEDDUUUEDUDDD$""""""""""""""""""""""UUUEDDTUUUUUDDDD""""""""""""""""""""""""""UUUUUUUEDUEDDDDD"DDD"""""""""""""""""""""""UUUUUUDDUU$""""""""B$""""""""""""""!"UUUUUUUUE$""""D$"BDD$""""""""""""""""""""UE$DTE$DDDDDDDDDDDDD"""""""""""""""""""""""""UEDUUUUUUDTUUUUDDDD$""""""""""""""""""""""UUUUUUUUEDBTUUUD"DD""""""""""""""""""""DDTUUUUEDDDDTUD$""""""""""""""""""""""""""!"""B$"DDDDDDDDD"""""""""""""""""""""""""""""""""B$"""""""""""""""""""""""""""""""""""""UUUEDDD"""""""""""""""""""""""""!"UUUUUUUED$"BDDB"""""""""""""""""""""""""UUUUUUEDD$""DDDD""""""""""""""""""""""""UUUUED$"$BD""""""""""""""""""""""""""""""""UUUUUDDUUU$""""""""""""""""""""""""""""""UUUEUEDDTDDDD"B$"""""""""""""""!"!""$"""""B$"DDD"""""""""""""""""""""""""""""DDDDDDD""DD""""""""""""""""""""""BDDDDD"DDDD$""""""""""""""""""""""""BDDDDDDD$""""""""""""!""""""""D$""DDD$""""!""""""!""""""D"""BD"""""""""""""!""""!"DD""B$"""""""""""""DD"""D""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""!"""!"""""!""""""""""""""""""!""""""""""""""""""!"""̼YUUUUUUUUUUUUUUUUUUU33333333333333333333333333333333333̼UUUUUUUUUUUUUUUU5333333333333333333333333ݪ̼UUUUUUUUUUUUUUUUUU33333333333333333333333ݪ̻YUUUUUUUUUUUUUUUUU53333333333333333333333̼UUUUUUUUUUUUUUUUUU3333333333333333333333̼UUUUUUUUUUUUUUUUUU5333333333333333333333̼˻YUUUUUUUUUUUUUUUUUU533333333333333333333̼YUUUUUUUUUUUUUUUUUUU33333333333333333333̼UUUUUUUUUUUUUUUUUUUU5333333333333333333̼UUUUUUUUUUUUUUUUUUUU5333333333333333333̻UUUUUUUUUUUUUUUUUUUUU333333333333333333̼UUUUUUUUUUUUUUUUUUUUU533333333333333333̼YUUUUUUUUUUUUUUUUUUUU533333333333333333̻YUUUUUUUUUUUUUUUUUUU533333333333333333̻UUUUUUUUUUUUUUUUUUUU33333333333333333̻UUUUUUUUUUUUUUUUUUU33333333333333333̻UUUUUUUUUUUUUUUUUUUUUUU53333333333333̻YUUUUUUUUUUUUUUU5333333333333̻YUUUUUUUUUUUUUUUUUUU33333333̼UUUUUUUUUUUUUUUUUU33333333ʼfeUUUUUUUUUUUUUUUUUU333333UUʻiVUUUUUUUUUUUUUUUUUUUUUU3333UUUU̼iffUUUUUUUUUUUUUUUUUUUUUUU333UUUUU̻ffUUUUUUUUUUUUUUUUUUUUUUUU533UUUUUfVUUUUUUUUUUUUUUUUUUUUUUUUU3SUUUU5zwzwwifUUUUUUUUUUUUUUUUUUUUUUUUUU3SUUUU3wwwwwwwwwwwwwwwwwwwifVUUUUUUUUUUUUUUUUUUUUUUUUUU3SUUU53wwwwwwwwwwwwwwwwwwwwwffUUUUUUUUUUUUUUUUUUUUUUUUUUU33UUU33wwwwwwwwwwwwwwwwwwwwwwwwwfVUUUUUUUUUUUUUUUUUUUUUUUUUUU333S533wwwwwwwwwwwwwwwwwwwwwwwwwffUUUUUUUUUUUUUUUUUUUUUUUUUUU53333333wwwwwwwwwwwwwwwwwwwwwwwwfiffUUUUUUUUUUUUUUUUUUUUUUUUUUU33333333wwwwwwwwwwwwwwwwwwwwwwwwififVUUUUUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwwwwwwwwwwwwwwwififVUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwwwwwwwiffffUUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwwwwwwiffffUUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwwwwiffffUUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwww뙙iiffffffVUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwfffffffffffUUUUUUUUUUUUUUUUUUUUUUUUUU3333333333wwwwwwwwwwwwwwwwiifffffffVUUUUUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwfffffffffVUDTUUUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwfffffffffVE""DUUUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwfffffffffVE""""UUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwifffffffffV$""""TUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwifffffffffU$""""RUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwifffffffffU$""""RUUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwifffffffffVVE""""""UUUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwwiffffffffffUUD""""""UUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwwffffffffffVED$""""""RUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwwiffffffffffVDD"""""""BUUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwffffifffffffffffVD$""""""""UUUUUUUUUUUUUUUUUUUUU333333333333wwwwwwwwwwwwifffffffffffffffffVD"""""""""UUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwwwwwwffffffffffffffffffV$"""""""""UUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwwww~wwifffffffffffffffffV$"""""""""SUUUUUUUUUUUUUUUUUUUU533333333333wwwwwwifffffffffffffffffV$"""""""""SUUUUUUUUUUUUUUUUUUUU533333333333wwwwiffffffffffffffffffV$"""""""""RUUUUUUUUUUUUUUUUUUUU533333333333wwwwffffffffffffffffffffU$"""""""""RUUUUUUUUUUUUUUUUUUUU533333333333wwwiffffffffffffffffffU$"""""""""2UUUUUUUUUUUUUUUUUEDDD43333#""333wwwiffffffffffffffffifUD""""""""""UUUUUUUUUUUUUUDUUDDDD43"""""""""wiffffffffffffffffifUD""""""""""UUUUUUUUUUUUUEDTEDDDDD$"""""""""niffffffffffffffffiffD""""""""""RUUUUUUUUUUUUDDDDDDDCD$"""""""""ifffffifffffffffffffffVeiffD""""""""""RUUUUUUUUUUUEDDDDDDDDDD$""""""""iffffffffffffffffffffffVUfifVD"""""""!"""UUUUUUUUUUUDDDDDDDDD$""""""""""fffffffffffffffffffffffUUfffffVD$""""""""""2TUUUUUEDDDDDDDDD$D""""""""""""fffffffffffffffffffffVUUefffffUUUD""""""""""""BDDDDDDDDD$""""""""""""""""""ifffffffffffffffffffffUUefffffUUUUE$""""""""""""DDDDDDD"""""""""""""""""""""fffffffffffffffffffffffVUUUfffffUEDUD$""""""""""""""DDDDD""""""""""""""""""""""UVUUVUUUUUUUUUUUUUUUUUUUUUUUUUUeffffVUDDD$"""""""!"""DDDD$""""""""""""""""""""""UUUUUUUUUUUUUUUUEDUUUUETUDDDDTUfffUUUUD""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUEDDDDDDDDDDTUUUUUUUUUUUUUEDD""""""!"""""""""""""""""""""""""""""UUUUUUUUUUUUUUEDDDDDDDDDDDD""""BDDDDDD$""""""""""""!""""""!"""""UUUUUUUUUUUUUUUUUUUDDDDDDD$"""""""""""""""""UUUUUUUUUUUUUUUUUUDDDDDDD"""""""""""""""""UUUUUUUUUUUUUUUUUUDDDDDDD""""""""""""""""""UUUUUUUUUUUUUUUUUDDDDDD$"""""""""""""""""""UUUUUUUUUUUEDDUUEDDDDDD""""""""""""""""""""UUUUUUUUUUUUUUUUEDDBD"""""""""""""""""""""""!"UUUUUUUUUUUUUUEDDDDDD$""""""""""""""""""""""!"UUUUUUUUUUUUUUDDDDDDD$"""""""""""""""""""""""UUUUUUUUUUUUUUEDDDDDD$"""""""""""""""""""""""UUUUUDDDBDDDDUEDDDD"$"B$""""""""""""""""""""UUUUUDDDDDDTUUUDDEDDD""""""""""""""""""""""UUUUUDDTUUUUDDEDDDDD"""""""""""""""""""""""UUUUUDTUUUUUUEDD$"BD"""""""""""""""""""""""UUUUUUUUDDUDBD""""BDDDD$"""""""""""""""UUUUUUUETUE"""""$"""D"""""""""""!"UUUUUUTDTD"""BDD$BDD$"""""""""""""""""""""TUE$DDEDDDDDTDDUDDDD$""""""""""""""""""""""""TUUUUUUUUUEDUUUUDDDD""""""""""""""""""""UUUUUUUUED$"DUUE$BD"""""""""""""""""""!"$""TUUEUDDDDDTD$"""""""""""""""""""""""""""""""B"""BDTDDDD$""""""""""""""""""""""""""""BDDD$""""D"""$"""""""""""""""""""!!"""TUUUEDDDDD"""$"""""""""""""""""""!""!"UUUUUUUUDD$"DDDDD""""""""""""""""""""""""UUUUUED$"D"""D$""""""""""""""""""""""""""UUUUUD""BDD$""""""""""""""""""""""""""""""UUUUUUUUUUUD"""BD$"""""""""""""""""""""EDDDUEDDDDUE$""B$"""""""""""!"""""""""$"""""""$""BD"""""""""""""""""""""""DDDDD""""""BD""""""""""""""""""""""BDDD$"BDDD"""$"""""""""""""""""DDDDDDD"""""""""""""""""D$"""B$""""""""""""!!"""""D"""""""""""""""""""""!"""""""""DDDD"""""""""""""""""""""""!""DDD$"""""""""""""""""""""""""""""""""DDDD""""""""""""""""""""""""""""""!"""""""""""""""""!"!""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""!"""""""""!""""!"""!"""""""""""""""!""""""""""""""""""""""""""""""""""""!"""""ݼ̼UUUUUUUUUUUUUUU333333333333333333333333333333333ݻ[UUUUUUUUUUUUU533333333333333333333333ݻ[UUUUUUUUUUUUUU5333333333333333333333ݻUUUUUUUUUUUUUU5333333333333333333333ݽUUUUUUUUUUUUUUU333333333333333333333ݽ[UUUUUUUUUUUUUU533333333333333333333̽[UUUUUUUUUUUUUUU53333333333333333333̻[UUUUUUUUUUUUUUUU5333333333333333333̼[UUUUUUUUUUUUUUUUU533333333333333333̼[UUUUUUUUUUUUUUUUUU33333333333333333̻[UUUUUUUUUUUUUUUUUU33333333333333333̻[UUUUUUUUUUUUUUUUUU53333333333333333̻[U[UUUUUUUUUUUUUUUU53333333333333333̼UUUUUUUUUUUUUUUUU3333333333333333̻UUU[UUUUUUUUUUU3333333333333333̻[U[UUUUUUUUUUU5333333333333333̻UUUUUUUUUUUUUUU333333333333̼UUUUUUUUUUUUUU533333333333̻UUUUUUUUUUUUUUUUUU3333333̼UUUUUUUUUUUUUUUUUU3333333̼ZUUUUUUUUUUUUUUUUU333SUUU̼̻ZUUUUUUUUUUUUUUUUU333UUUU̻ZUUUUUUUUUUUUUUU33SUUUUffkffZUUUUUUUUUUUU53UUUUUfffffffffUUUUUUUUUUUUUU3UUUUUwlfffffffZUUUUUUUUUUUUUUU3UUUUUwwlffffffffUUZUUUUUUUUUUUUUUUUUUU3UUUU5wwwwwwwwwwlffffffZUUUUUUUUUUUUUUUUUUUUUUU3SUU53wwwwwwwwwwww|wlffffffUUUUUUUUUUUUUUUUUUUUUUUUU333333wwwwwwwwwww|wwllfffffZUUUUUUUUUUUUUUUUUUUUUUUUUU333333wwwwwwwwwwffffffZUUUUUUUUUUUUUUUUUUUUUUUUU3333333wwwwwwwwwwlfffffffUUUUUUUUUUUUUUUUUUUUUUUU533333333wwwwwwwwwwwwwwwlffffffffUUUUUUUUUUUUUUUUUUUUUUUU333333333wwwwwwwwwwwwwwwwffffffffUUUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwwwwwwwwwwlffffffffffUUUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwwwwwwwwwfffffffffffUUUUUUUUUUUUUUUUUUUUUUUUUU3333333333wwwwwwwwwwwwwwwwwwlfffffffffffZE"DUUZUUUUUUUUUUUUUUUUUUUUUUUU53333333wwwwwwwwwwwwwwwffffffffffffZ$""DRZUUUUUUUUUUUUUUUUUUUUUUU333333333wwwwwwwwwwwwwwlffffffffffffZ$""""ZUUUUUUUUUUUUUUUUUUUUUUU333333333wwwwwwwwwwwwwfffffffffffffZ$""""UZUUUUUUUUUUUUUUUUUUUUUUU333333333wwwwwwwwwwwflffffffffffffffE"""""RUUUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwlffffffffffffjE"""""RUUUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwlffffffffffffjE"""""2UUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwwwwlfffffffffffffU$""""""TUUUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwwwwwwwwffffffffffffffZDE"""""""RUUUUUUUUUUUUUUUUUUU5333333333wwwwwwwwwwwwwwwwwffffffffffffffJD$"""""""BUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwllffffffffffffffJD"""""""""UUUUUUUUUUUUUUUUUUU33333333333wwwwwwwwwwwwwwwwwwlfffffffffffffffffffE$"""""""""UZUUUUUUUUUUUUUUUUUU33333333333wwwwwwwwwwwwwwwwwwlffffffffffffffffffffE""""""""""TUUUUUUUUUUUUUUUUUUUU33333333333wwwwwwwwwwwwwwwwwwwfffffffffffffffffffffE""""""""""TUUUUUUUUUUUUUUUUUUUU33333333333wwwwwwwwwwwwwwwwwwffffffffffffffffffffjE""""""""""TUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwfffffffffffffffffffE""""""""""TUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwffffffffffffffffffffE""""""""""SUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwfffffffffffffffffffffE""""""""""RUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwgffffffffffffffffffjE""""""""""RUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwffffffffffffffffffE$"""""""""2UUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwwwwwwfffffffffffffffffjfE$"""""""""2UUUUUUUUUUUUUUUUUEDDD33333#""33wwwwwwwwwwwwwwwwwffffffffffffffffffjfZ$""""""""""UUUUUUUUUUUUUDDTUEDDD43""""""""wwwwwwwwwwwwwwwwfffffffffffffffffjfZ$""""""""""SUUUUUUUUUUUUDDDDDD43#"""""""""wwwwwwwwwwfffffffffffffffffffffffffZ$""""""""""RUUUUUUUUUUUEDDDDDD4D""""""""""wwwwwwwlfffffffffffffffffffffffffZ$""""""""""2UUUUUUUUUUEDDDDDDDDDD$""3#""""wwwwwfffffffffffffffffffffffffZD"""""""""""2DTUUUUUEDDDDDDDDDDD$"""""""""wwwlfffffffffffffffffffffffffZU$""""""""""""BDUUUDDDDDDDDDD$""""""""""""ffffffffffffffffffffjfffZUZUD"""""""""""""DDDDDDDDD""""""""""""""""""lffffffffffffffffffjffZEDED$"""""""!""BDDDDD"""""""""""""""""""""fffffffffffffffffffjffUDDD$"""""""""""DDDD""""""""""""""""""""""ZUUUUZUUUUUUUUUUUUUDB$"""""""!"""DD$""""""""""""""""""""""UUUUUUUUEDDDDDUEDDDUUUUUZUD""""""""""""""""""""""""""""""""""""ZUUUUUUUUUDDDDDDDD$DDDTUUUUUUUUUUUDD$"""""""!"""""!""""""""""""""""""ZUUUUUUUUUUUEDDDDDDDDDDD"""""""""""""""""""""!""""UUUUUUUUUUUUUUUUUDDDDDDD$""""""""""""""ZUUUUUUUUUUUUUUUDDDDDDD"""""""""""""""""ZUUUUUUUUUUUUUUEDDDDDDD"""""""""""""""""UUUUUUUUUUUUUUUUUUDDDDDD$"""""""""""""""""""UUUUUUUUUUUUUUEUUEDDDDDD""""""""""""""""""""UUUUUUUUUUUUUUUUUEDD"$"""""""""""""""""""""""!UUZUUUUUUUUUUUDDDDDDD"""""""""""""""""""""""UUUUUUUUUUUUUUUDDDDDDD$""""""""""""""""""""""UUUUUUUUUUUUUUUDDDDDDD"""""""""""""""""""""""UUUUUEDD$BDDTUUDDDDD$"""""""""""""""""""""""UUUUUUDUDDDDUUUUUUEDD"""""""""""""""""""""""UUUUUEDDUUUUEDDDDDDD"""""""""""""""""""""""UUUUUUUUUUUUEUDDD$BDDD""""""""""""""""""""""UUUUUUUUDTUU$""""""""DD$"""""""!""""UUUUUUUUUUU$"""""D""D$"""""""""""""""UUUUUED$"DDDDDDDD$BDD$""""""""""""""""""""""DDDDDDUUUUUDDUUUUDDDD"""""""""""""""""""""""""UUUUUUUUUUUE$TUUEDDD$"""$"""""""""""""""UEDTUUUUUDD""DDDD$"""""""""""""""""""""""D"""DDDDEUDDDDD$"""""""""""""""""""""""""""""""""B""""DDDDDD"""""""""""""""""""""""""""""BDDUDD$""""BDD"""""""""""""""""""!DUUUUUTUDDD""DD""""""""""""""""""""""""TUUUUUUUD"D""DDDDD"""""""""""""""""""""""UUUUUUD"""""""""""""""""""""""""""""""""""UUUUUUEDDDDDD"B"""""""""""""""""""!""""""UUUUUUUUUUUUED$"BD$""""""""""!""""""""""EDD"DDDDD$BTED"""D""""""""""""""""""""""DD"""""""""""D"""""""""""""""""""!DBDDD$"""""BDD"""""""""""""!"!"""""BDD$"DDD$""""""""""""!"""""""""BDDDDD$""""""""""""!""!""DD""""""""""""""""""""!"""!""""!"""DD""""""""""""""""""""""""""""""""BDDDD"""""""""""""""""""""""""""""""""DDDDDD$B$"""""""""""""""""""""""""""""DDDDDD"""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""!!"""""""""""""""""""""""""""""""""""""""""""""""""""!""""""!""""""""""!"""""!""""""""""""""""""""""""""""""""""""!"""""""!"!"!"!"""! \ No newline at end of file diff --git a/Video 126p/video-02.bin b/Video 126p/video-02.bin new file mode 100644 index 0000000..f21d8f9 --- /dev/null +++ b/Video 126p/video-02.bin @@ -0,0 +1 @@ +ݻ333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwwwݽ93333DDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwݻ333333CDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwݽ3333333DDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwݽ9333333CDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwݽ3333333DDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwݻ33333333DDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwݻ33333333CDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwݽ33333333DDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwݽ93333333CDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwݻ3333333CDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwݻ3333333DDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwݽ9333333DDDDDDDDDDDDDDDwwwwwwwwwwwwwwwݻ3333333DDDDDDDDDDDDDDwwwwwwwwwwwwwwwݻ3333333CDDDDDDDDDDDDD|wwwwwwwwwwwwwwwwݻ33333333CDDDDDDDDDDDDwwwwwwwwwwwwwwwwݽ93333333333DDDDDDDDDDDwwwwwwwwwwwwwwwݽ933333333333DD3CDDDDDD|w|wwwwwwwwwwwwwwݽ333333333333333DDDDDDwwwwwwwwwwww3333333333333DDDD43|wwwwwwwww绻9333333333DD4333|wwwwwwwww933333333DD3333|wwwwww333333333D43333wwww33333333333333333www333333333333333333333333333333333333UU\U9333333333333333333U\UUUU3933333333333333333333\UUUUnff93333333333333333333333DDUUUUUfffff33333333333333333333333CDDUUUUUUUUUUUffff99333333333333333333333333CDD\UUUUUUUUUUUnffff3339333333333333333333333333CDDUUUUUUUUUUUUfnffff333399333333333333333333333333CDDU\UUUUUUUUUUUfffffffff93""2333333333333333333333333333CDD\UU\UUUUUUUUUUUffnfffffffffj:3""""233333333333333333333333333CDD\U\UUU\UUUUUUUUUUffffffffffffffffj:3"""""33333333333333333333333333CDDUUUUUUU\UUUUUUUUUoffffffffffffffff93"""""3933333333333333333333333333CDDUUUUUUU\UUUUofffffffffffffff9#"""""293333333333333333333333333343CDUUUUUUUUUUUUffffffffffffffffff3#"""""233333333333333333333333333DDDDDUUUUUUUUUUUoffffffffffffffffff3""""""233333333333333333333333333DDDDDUUUUUUUUUUUoffffffffffffffffff9#"""""""333333333333333333333333333DDDDDUUUUUUUUUfffffffffffffffffff933""""""""233333333333333333333333333DDDDD\UUUUUUUfffffffffffffffffffffi93#""""""""233333333333333333333333333DDDDD\\U\UUUUoffffffffffffffffffffffi:#""""""""""33333333333333333333333333DDDDD\UUUUUUoffffffffffffffffffffff9#""""""""""33333333333333333333333333DDDDD\UUUUUUUUUffffffffffffffffffffff9"""""""""""2333333333333333333333333CDDDDD\\UUUUUUUUUUfffffffffffffffffffffff3"""""""""""3333333333333333333333333DDDDDDUUUUUUUUUUUUUfffffffffffffffffffffff3"""""""""""333333333333333333333333DDDDDDDUUUUUUUUUUUUUUUofffffffffffffffffffff9"""""""""""33333333333333333333333CDDDDDDDUUUUUUUUUUUUUUUffffffffffffffffffffff9"""""""""""33333333333333333333333DDDDDDDDUUUUUUUUUUUUUUUfffffffffffffffffffff9"""""""""""3333333333333333333333CDDDDDDDDUUUUUUUUUUUUUUUffffffffffffffffffff9"""""""""""3333333333333333333333CDDDDDDDDUUUUUUUUUUUUUUUffffffffffffffffff3"""""""""""3333333333333333333333CDDDDDDDDUUUUUUUUUUUUUUUUffffffffffffffffff33"""""""""""4333333333333333333333CDDDDDDDDUUUUUUUUUUUUUUUUofffffffffffffffff933"""""""""""2333333333333333333333CDDDDDDDDUUUUUUUUUUUUUUofffffffffffffffff933#""""""""""2333333333333333333333CDDDDDDDDUUUUUUUUUUofffffffffffffffffi93#""""""""""23333333333333333333333DDDDD$"BUUUUUUUUffffffffffffffffff93#""""""""""23333333333333333333333DDDDD"""UUUUUUoffffffffffffffffffffff93#""""""""""B33333333333333333333DDDDD"""""UUUUUUfffffffffffffffffffffffff9#"""""""""""33333333333333333333DDD"""""""UUUUfffffffffffffffffffffffffif#"""""""""""433333333333333333D"""""""""""offfffffffffffffffffffffffjf#""""""""""""433333333333#""""""""""""$"""offfffffffffffffffffffffffff93#""""""""""""4333333333#"""""""""""""""""ffffffffffffffffffffffff93333#""""""""""""233333"""""""""""""""""""""nfffffffffffffffffffffffff333#""""""""""3333""""""""""""""""""""""fffffffffffffffffffffffif93""""""""""""23""""""""""""""""""""""""ff3#"""""""""!"B$""""""""""""""""""""""""3333333333333333333333393#"""""""!""""""""""""""""""""""""""93333333333333333333333333333333#""""""""""""""""""""""""""""""""933333333333333#"""""""""""33333333333#""""""""!""""3333333333333333333333#"""""""""""""""""""!"3333333333333333333333""""""""""""""""""333333333333333333333#"""""""""""""""""""993333333333333333333#"""""""""""""""""""3339333333333333333333#""""""""""""""""""""333333333333333333333""""""""""""""""""""""3333333333333333333#""""""""""""""""""""""""9333333333333333333#""""""""""""""""""""""""33333333333333333333""""""""""""""""""""""""33333333333333333"33#"""""""""""""""""""""""333333#23"33"333#"23#""""""""""""""""""""""333333""3"""23333333""""""""""""""""""""""333333#23333333#""""""""""""""""""""""""""333333333333333#""""""""""""""""""""""""""33333333#3333"""""""""""""""""""""""33333333#""3"""""""""""""""""""""!"""3333333"""3333333"""""""""""""""""""""""""33333333333333333#"#""""""""""""""""""""""3333333333333#233"""""""""""""""""""""""""33"333333333#"""""""""""""""""""""""""""""33"""3333#""""""""""!"""""""""""""""""""33#"2#"""""""""""""""""""""""""""""""!"333"33"2#"23#"""""""""""""""""""""!""2333333333""""""""""""""""""""""""""""""333333333#""""23""""""""""""""""""""""""333333#"""""""2#2#"""""""""""""""""""""""33333333333""2333#"""""""""""""""""""""""333333333333333"""""""""""""""""""""33"""""3#"""""""""""""""""""""""""""3""""33#"""""""""""""""""""""""""#"3333#""""""""""""""""""!"!"""""3""""""""""""""""""""""""""""""""""""""""""""""""33#"""""""""""""""""""""""""""!"""33""""""""""""""""""""""!"""""""""""3"""""""""""""""""""""""!""""""""""""""""""""""""""""""!""""!"""""""""""""2"""""""""""""""""!"""""""""""""""""""""""""""!""""""""""""""""""""""""""""""""""""""""""""""""""""""!""3"""""""""""""""""""""""""""""!"!"""""""""""!"""""""""""""""""""""!""!""""""""""""""""""""""""""""""""""""""""""""""!""""""""""""""""""""""""!"""""""""""""""""""""""""!""!"!"""!!"!""""""""""""""""""!"!""";3333333333333333333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwwww;3333333333333333UUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwww3333333333333333333SUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwww;3333333333333333333UUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwww;3333333333333333333SUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwww;3333333333333333333SUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwww33333333333333333333UUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwww;33333333333333333333SUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwwww333333333333333333333UUUUUUUUUUUUUUwwwwwwwwwwwwwwwwwww333333333333333333333SUUUUUUUUUUUUUwwwwwwwwwwwwwwwwwww333333333333333333333SUUUUUUUUUUUUUwwwwwwwwwwwwwwwwwwww3333333333333333333333UUUUUUUUUUUUUwwwwwwwwwwwwwwwwwwww;3333333333333333333333UUUUUUUUUUUUwwwwwwwwwwwwwwwwwww333333333333333333333SUUUUUUUUUUU}wwwwwwwwwwwwwwww3333333333333333333333UUUUUUUUUUUwwwwwwwwwwwwwww33333;333333333333333SUUUUUUUUUUwwwwwwwwwwwwwwww3;3333333333333333SUUUUUUUUUwww}wwwwwwwwwwww333333333333333333333UUUUUwwwwwwwwwwwww;33333333333333333333SUUU}wwwwwwwwwww;333333333333333333333533}wwwwwwwww;333333333333333333333333wwwwww33;333333333333333333333333}wwwﮪ333333333333333333333333333www;33333333333333333333333333www33333;33333333333333333333m3333333333333333333333333333333m;3333333333333333333333333333333mfff3;33333333333333333333333333333333ffff;333333333333333333333333333333333333mfffff;3)333333333333333333333333333333333333fmfffffff;3""33333333333333333333333333333333333mfffffffff;3""""333333333333333333333333333333333fffffffffff;3"""""333333333333333333333333333333333fffffffffff;""DDD233333333333333333333333333333333ffmfffffffff3""BDD233333333333333333333333333333333mffffffffffffffff;3)""BDD233333333333333333333333333333333fffffffffffffffff;)""BDDR33333333333333333333333333333333ffffffffffff3"""DDD$33333333333333333333333333333333ffffffffffff33""BDDDD$2333333333333333333333333333333Ufffffffffff33)""DDDDDDR33333333333333333333333333333SUffmfffffff3)"DDDDDDD$33333333333333333333333333333UUffffffffff;)"BDDDDDDDD53333333333333333333333333333UUmfffff;""DDDDDDDDD233333333333333333333333333UUUUffffff"BDDDDDDDDD233333333333333333333333333UUUUmffffffff;#BDDDDDDDDDD2333333333333333333333333YUUUUmffffffffff#BDDDDDDDDDD9333333333333333333333333UUUUmffffffffffff#BDDDDDDDDDD33333333333333333333333YUmffffffffffff̻BDDDDDDDDDD3333333333333333333333UUfffffffffffffff̼"DDDDDDDDDD333333333333333333333UUffffffffffffff̼"DDDDDDDDD$333333333333333333333YUUffffffffffffff̻3"DDDDDDDDD$3333333333333333333333UUUffffffffffffff̻;3)"DDDDDDDDD$3333333333333333333333UUUUffffffffffffff̻33)"DDDDDDDDD$3333333333333333333333UUUUfffffffffffffff̼333"DDDDDDDDDD9333333333333333333333UUUUfffffffffffff̼333"DDDDDDDDDD2333333333333333333333UUUUfffffffff̼333)BDDDDDDDDD233333333333333333333UUUUffffffff̻333)BDDDDDDDDD533333333333333333U"fffffff̼333"DDDDDDDDDD53333333333333333"""fffff̼33)DDDDDDDDDD5333333333333333""""fff̼33)DDDDDDDDDDR3333333333333)Y""""""f̻33)"DDDDDDDDD$33333333333"""""""̼;33"DDDDDDDDDD"933333333"""""""""""̻333"BDDDDDDDDDD"9333)"""""""""""""""̼3;333)""DDDDDDDDDDDD)""""""""""""""""""""33;3"""BDDDDDDDDDDDDD$)""""""""""""""""""""";3;3)"DDDDDDDDDAD$"""""""""""""""""""""";3;3333333333333333333333333;3"DDDDDDDDDDD"""""""""""""""""""""""""333333333333333333333393;333)DDDDDDDD$"""""""""""""""""""""""""333333333333333)""""""3333333333)""BDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD33333333333333333""""""""""""""DDDDDDDDDDDAD333333333333333333333"""""""""""""DDDDD333333333333333333333)"""""""""""""BDDDD33333333333333333333)"""""""""""""BDDDDDAD33333333333333333333""""""""""""""BDDDDDDDD33333333333333333333"""""""""""""""DDDDDDDDDD333333333333333333)""""""""""""""""DDDDDDDDDDD33333333333333333""""""""""""""""BDDDDDDDA3333333333333333""""""""""""""""BDDDDDDD333333333333333"""""""""""""""BDDDDDDDD333333333"""""""""""""""BDDDDDDDDDD33333)"39333"""""""""""""""DDDDDDDDDD33333333333""""BDBDD$"""DDD"""BDDDDD3333333333333)""""""""""DDDDDDDD"""DDDDDD3333333)""""""""""""""BDDDDDDDDDDDDDDDD333333)""""""""""BD""DDDDDDDDDDDDDDD333333""9333393"""BDBDDD$BDDDDDDDDDDDDDAD3393333333393""""""""""""DDDDDDDDDDDDAD333333333333)"""""""""""""BDDDDDDDDDDDDDD3#333333)""""""DDDDDDDD"""BDDDDDDDDDDDDD3#""23)"""""""DDDDDDDDDDDDDDDDDDDDDDDDDDDD93)"9#""""""""BDDDDDDDDDDDDDDDDDDDDDDDDDD93939")""""""""""""""DDDDDDDDDDDDDD333333333""")"""""""""""BDDDDDDDDDDDDD3333333"""BD""""""""""DDDDDDDDDDDDDDD333333""D$)""D"""""""""BDDDDDDDDDD33333333339)"""""D$BDDDDDDDDDDDDDDD333393333333)B"""BD"""DDDDDDDDDDDDDDD""""3""""""""""""B$"DDBDDDDDDDDDDD933"""DB$DDDDDD"DDDDDDDDDDDD"9333)BD$""""DDDDDDDDDDDDDADDD""""""""")""D$""DDDDDDDDDDDDDD"""""""""""BDDDDDDDDDDDDDDDDDDDDDDD3"D""""DDDDDDDDDDDDDDDDDDDDDDDDDDDD)""""BDDDDDDDD"DDDDDDDDDDDDDDDDDDDDD"""B""""""""""""""DDDDDDDDADDDDDDDDD""""D$)")""""""""BDDDDDDDDDADDDDDDDD"")")"""BD"""DDDDDDDDDDDDDDDDD"""""""""""""""""D"BDDDDDDDDDDD""""""B"""BD$""""""BDDDDDDDDDD)""BDDDDDDDD"""""BDDDDDDDDDD"""BDDBDDDDDDDDDDDDDDDDAADDDD"BDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""BDDDDDDDDDDDDDDDDD""DDDDDDDDDD$BDDDDDDAADDDADDDDDDDDDDDDDADDDDDDDDDADDDDDDDDDADDDDDDDDAADDDDDDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDADDDDDDDDDDDADDADDDDDDDDDDDADDDDDDDDADDffff̪ZUUUUUUUUUUUUUUUUU%""""""""""""""""""ffffffffffffffffff̬ZUUUUUUUUUUUUUUUUU%""""""ffffffffffffffffff̬UUUUUUUUUUUUUUUUUUUU"""""ffffffffffffffffff̪ZUUUUUUUUUUUUUUUUUUU"""""ffffffffffffffffff̬ZUUUUUUUUUUUUUUUUUUUU%"""ffffffffffffffffff̪UUUUUUUUUUUUUUUUUUUU%"""ffffffffffffffffff̪ZUUUUUUUUUUUUUUUUUUUU"""ffffffffffffffffff̪ZUUUUUUUUUUUUUUUUUU%"""fffffffffffffffffff̬UUUUUUUUUUUUUUUUUU%%UUfffffffffffffffffff̬UUUUUUUUUUUUUUUUUUUUU%ffffffffffffffffffff̪UUUUUUUUUUUUUUUUUUUU%ffffffffffffffffffff̬ZUUUUUUUUUUUUUUUUUUUUffffffffffffffffffff̪UUUUUUUUUUUUUUUUUUUUnfnfffffffffffffff̬ZUUUUUUUUUUUUUUUUUUUnfffffffffffffff̪ZUUUUUUUUUUUUUUUUUUUfffffffffffffff̬̪ZUUUUUUUUUUUUUUUUUUUffffffffffffffff̪̪ZUUUUUUUUUUUUUUUUUUUnffnffffffffffff̬ZUUUUUUUUUUUUUUUUUUfffffffffff̼̼̬ZUUUUUUUUUUUUUUUUUffffffffffUUUUUUUUUUUUUUUUUfffffffffUUUUUUUUUUUUUUUUUffffffUUUUUUUUUUUUUUUUUnfffUUUUUUUUUUUUUUUUUUUnf_ZUZUUUUUUUUUUUUUUUUUUUwwwwwwwkw_UDTUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwwww׽UU$"TZUUUUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwwwwݽ_U""BERUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwݝ_E"""""UUUUUUUUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwwݽ_E"""""RUUUUUUUUUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwݛUE"""""RUZUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwݙ_ED"""""RUZUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwݽ_D$""""""ZUUUUUUUUUUUUUUUUUUUUUUUUUUUUww~wwww~wwwwwwwwwwݙUD$""""""UZUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwwwwwwwwwݙE$"""""""UUUZUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwwwwݝ_UUD""""""""RUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~ww~wwwwwwwݙ_UED"""""""""UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~w~wwwwwwwݛED$"""""""""UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwݽED$""""2333"UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwݻUD""""23333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwݻUD""""33333#RUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUww~wwwwwݽ_DD"233333333RUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwݝDD$23333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwݙED$23333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwwwwݝUD$23333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwݝUD$23333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwݙED$23333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU%""wwwwwwwwwwwwݙ_ED"23333333"UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"""wwwwwwwwwwwwݙ_UD"22333333"UUUUUZUUUUUUUUUUUUUUUUUUUUUUU"""wwwwwwwwwwwwݙUUD$""2333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUU"""wwwwwwwwwwwwݙ_UDD"""2333333#UUUUUZUUUUUUUUUUUUUUUUUUUUUU""""wwwwwwwwwwwwݙ_UTE"""2333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUU""""wwwwwwwwwwݝ_ETE$""2333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUU""""wwwwwwݝ_ETU$""3333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUU"U%"wwwwwݙ_UU_"""3333333#UUUUUUUUUUUUUUUUUUUUUUUUUUUUU"UU%wwwwݝUTE""33333333#UUUUUEDEDTUUUUUUUUUUUUUUUUUUU"UU"wwwݝUUE"""3333333#UUUUEUDDDDUUUUUUUUUUUUUDDUUDT""""wݙ_UE"""3333333#UUUUUUEDUUUUUUUUUUEDDEDDDDDDD""""ݙ_UE"""2333333#"UUUUUETUUUUUUUUUDDDDDDDDDD$"""""ݙ_UUD$""3333333""UUUUUUUUUUUUUDDDDDDDDDDD$""""""ݙ_UUUE$""33333333#"UUUUUUUUUUEDDDDDDDDDDD""""""""ݝUEDDD"""333333333#BUUUUUUUUDDDDDDDDD""""""""""""EDD$"""23333333333"TUUUUTEDDDDDDDDD$""""""""""""_D$""""233333333333#BDDDDDDDDD$""""""""""""""""""_UUUUD"""""3333333333333"DDDDDDD"""""""""""""""""""""ZUUUUUUUUUUUUUUUEDTUEDUUUDTUUUD"""233333333333333""""D$"""""""""""""""""""""""UUUUUUUUUUUUUDDDDDDDDDDDDDTUUUUUUE$"""23333333333333#""""""""""""""""""""""""""""UUUUUUUUUUUUUUEDDDDDDDDDDD""BDDDDDDD""""""23333333333333333333333333333333333333#"""UZUUUUUUUUUUUUUUUUUDDDDDD$""""""""""""3333333333333333333333333333333333333333333UZUUUUUUUUUUUUUUUEDDDDDDD$""""""""""""333333331333333333333333333ZUUUUUUUUUUUUUUUUDDDDDDDD$""""""""""""333333333333333333333333333333333333333ZUUUUUUUUUUUUUUUEDDDDDDD"$""""""""""""233333333333333333333333333333333333333UUUUUUUUUTUUUUUUEDDDDD""""""""""""""""23333333333333333333333333333333333333UUUUUUUUUUUUUUUEDDDDDD""""""""""""""""2333333333333333333333333333333333333UUUUUUUUUUUUUUUEDDD"BDDD""""""""""""""23333333333333333333333333333333333UUUUUUUUUUUUUEDDDDD$"DDDD$""""""""""""2333333333333333333333333333333333UUUUUUUUUUUUUDDDDDDDDDDDD"""""""""""""233333333333333333333333333333333UUEDTUUDDTUUEDDDDDDDDDDD$"""""""""""""23333333333333333333333333333333UUE"DUDDDTUUUDDDDDD"""""""""""""""""""33333333333333333333333333333333UUEDTUUUUUUEDDDDDD"""""""""""""""""""233333333333333333333333333333333UUUUUUUUUUDD"BDDDDD""""""""""""""""""23333333333333333333333333333UUUUD"DDDD""""D""DDDD""""23""""2""""2333333333333333333333333333333DUUUDDDEDDDD$"$"B$""""""""#"""23#""33333333333333333333333333333UEUEDDTUUUUDUUDDD$""""""""""""""""33333333333333333333333333DTUUUUUUUUUTUUDD$""""""""""""""""""3#"33333333333333333333333333333UUUUUUUUUDUDDDDD$""""$"""""""2#"23#33333333333333333333333333333333333DTUUUUUDDDD$"""""2""""""""""""2""""233333333333333333333333333333333BTUUUDBDDBDD""2333333#"""""""23""#333333333333331333333333333333333BU%BDDDDDD$""""333#""""""""""""33333333333333333131333333333TUEDUUDDDDDDDD$"""""""""""23#"233333333333133333333333333UUUUUUUDDDDDDDD""""""""""""""""333333333333333333333333UUUUEDD$"""DDDDDD"""""""""""""""""23333331333333333333UUUDDD$""""DDDDD""""""""""""2"""""233333333333333333UUUUUUUEDDDUDDDD$""""""""""""#""23"333333313333333333UDDDUETDDTDD"BDD""""""""333#"23333333333331333333"DDTED$""D$"""B$"""""""""23""3333333333333133333TUDTUD"""""23#""""23#23"33""333333333333333333UUUUED""D""23""333""33333333333333313$D$BD"B$""""""""23333333333333333333"""""DDB$"""""""33333#"#23333333333333333""""""""23333#23333""""""""3333333333333313333333333"D$"""""""""""2"""""233333333333"3331333333333333331"$""""BDD""""""""23333333333333333313333333333333""""BDDDDD"""""""""""33333333#""233333313313D"""BDDDD$""""""""""2333333333333333333D$BDDDD""""""""""""""33333333333333333""""B$"""""""""""""""23333333333333333""""""""""""""""""3#23333333333333333""""""""""""""""""233333333333333333""""""#"""233333333333333333333333332##"""""23333333333333""233333333333333333333#"""""""23333#""23"""233333"""""""2333333333"""""233""""""""3333333333333"""""""""""233333333333333333333""""""""233333333#"33333333333333333323333333#"233333333333333333333333333#33333333333333#"""23333333333333333#""""""33333333333233#""""333333333333#""""3333113333333333333133333333333333333313333333333333333333333333333333333133#"2333333333333333333#233333333333333|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwDDD|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwGDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwGDD|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwGDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwGDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwGDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwww||f|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgVvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgfEdwwwwwwwwwwwwwwwwwwwwwwwwwffDDvwwwwwwwwwwwwwwwwwwwwwwwwwwwfVDDdfewwwwwwwwwwwwwwwwwwwwwwwwwgVDDDDDvww|wwwwwwwwwwwwwwwwwwwwwwwwwgVDDDDDdwwww|wwwwwwwwwwwwwwwwwwwwwwwwww|fVDDDDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwlfVDTEDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwڙlfVDDDDDDvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgfFDDDDDDvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwݙ̜ffEDDDDDDtwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgglVUDDDDDDDdwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgfgfgUDDDDDDDDdwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgflffEDDDDDDDDDvwwwwwwwwwwwwwwwwwwwwwwwwwvwwwwwwwffifVEDDDDDDDDDtwwwwwwwwwwwwwwwwwwwwwwwwgvwwwwwwwffVUDDDDDDDDDDtwwwwwwwwwwwwwwwwwwwwwwwwffvwwgfffffݝlVUUEDDDDDDDDdwwwwwwwwwwwwwwwwwwwwwwwwgfvwwffffffڙfUefVEDD433CDdwwwwwwwwwwwwwwwwwwwwgfwwwwfffffffffVUfffVD433333dwwwwwwwwwwwwwwwwwwwwgfwwwwwffffffff|VeVeUfE433333dvwwwwwwwwwwgfvwwwwwwffvwwwgffffffffəWeVeUfE433333dvwwwwwwwwwfffvwwwwwgfffffffffffffffݝilfVeUfF43333CtvwwwwwwwwffffvgffwfffffffffffffffffݝlfffffF43333Cvwwwwwwwwgffffffffffffffffffffffffffݝl|feffUF43333CwwwwwwwgffffffffffffffffffffffffffffڝiwfVUUeE43333DwwgwwwwfffffffffffffffffffffffffffffڝlffVETUD33333CwvwwwwwffgffffffffffffffffffffffffffݝlffUeVfUD33333CwwwwwwwfffffffffffffffffffffffffffݝifVUUUUD433333CwwwwwwwfffffffffffffffffffffffffffݝlfUUDDDD433333Cwwwwwwffv|ffffffffffffffffffffffffffݝlfUUDDDD433333Cwwwwwwffffffffffffffffffffffffffffffݙ̙lfeVEDDD433333CwwwwwwgfffffffffffffffffffffffffffffݙəfVefEDDD433333Cwwwwwggfffffffffffffffffffffffffffffݝ̙ffeVDDDD333333Cwvgvwfffffffffffffffffffffffffffffffݝ̙feeVD4CD333333CffffffffffffUfffffffffffffffffffffffݝ̙̙ifeFDDDD333333CwwffffffffVUUfffffffffffffffffffffffݙlfƙ̙ifeEDDDD333333CwwgfffffffUfffffffffffffffffffUUUUUUڪݝ|ffvlifUEDDDD333333CvwgfffffffeffffffffffffffUUUUUUUUUUUݙfƙifUEDDDD333333CvwgfffffffffffffffffffffUUUUUUUUUUUEݝffUDDDDC333333dvgfffffffffffffffffffVUUUUUUDDDDDDDݙ|ffVVDDD3333333DDfffffffffffffffffffVUUUUUUDDDDDDDDݙlfffVDDD33333333CDffffffffffffffUUfVUUUUUEDDDDDDDDD̙fVUVUDDDD33333333DdfffffffffffUUUUUUUUUEDDDDDDDDDDD̙gVUUUDDDD4333333333DffffffffffUUUUUUUUEDDDDDDDDDDDDD̜|fVUUDDDD43333333333CdffffffffVUUUUUUUEDDDDDDDDDDDDDDwwwwwwwwwfffffvwwwwwwwwwg̙|ffVUDDDD433333333333CDffffffffUUUUUUUEDDDDDDDDDDDDDDDwwwgfffffffffffffffffffffv̙gffVUDDD43333333333333DTeffffffUUUUUUEDDDDDDDDDDDDDDDDwwwfffffffffUUUUUUUUUUUUfvwffffVUDDD43333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwgffffffffffVUUUUUUUUETUUUUUUUUUEDDDDDDD33333333333333333333333333333333333DD4CDDDDwwgffffffffffffffffffUUUUUUUUUDDDDD43333333#"""""33333333333333333333333333333333333wwwgfffffffffffffffffVUUUUUUUUDDDDDD333333""""""233333333333333333333"""""""""""""""wffffffffffffffffffffVUUUUUUUUDDDDD43333333"""2333333333333333333333333333#"""""""""ffffffffffffffffffffUUUUUUUUDDDDDDD433333333#23333333333333333333333333333#"""""""""fffffffffffffffffffUUUUUEUUEDDDDDDD433333333333333333333333333333333333333""""""""""fffffffffffffffffffUUUUUDTUEDDDDDDD433333333333333333333333333333333333333""""""""""gffffffffffffffffffUUUUUDTUEDDDDDDD4333333333333333333333333333333333333#"""""""""""wgfffffffffffffffffUUUUEDDUDDDDDDDD4333333333333333333333333333333333333""""""""""""wfffffffffffffffffUUUUUEDDDDDDDDDDD433333333333333333333333333333333333"""""""""""""ffffffeffffffffffUUUUUUDDDDDDDDDDDD433333333333333333333333333333333333"""""""""""""ffffffffffffffffVUUUUUUDDDDDDDDDDDD33333333333333333333333333333333333""""""""""""""fffffffffffffffVEDDDDUEDDDDDDDDDDDD33333333333333333333333333333333333#"""""""""""""fffffffffffffffVUUEDDDDDDDDDDDDDDD433333333233333333333333333333333#""""""""""""""""ffVUffVUUUUfffffUUEDDDDDDDDDDDDDDCD3333333#""33333333333333333#233""""""""""""""""""UeffUDDTUDUUUfVUDDDDDDDDDDDDDCDDDD33333333#""3333333333333#"""""""""3#""""""""""""""VUfffffffffffUEDDDDDDDDDDDDDDDDD3333333333#""333333333333#""""""#"""""""""""""""""""fffffffffffUUEDDDDDTUUUUDDDDDDD43333333333#""33333333333333333333"""""""""""""""""""fffffffffVUUUDDDDDTUUUDDDDDDDDDD3333333333#""333333333333333333#""""""""""""""""""""fffffVUUUETUDDDDDDDUUDDDDDD3CDDD4333333333#"""33333333333333#""#""""""""""""""""""""ffVUUETUUDDD43333CDDDDDDDDD4CDDD44333333333#""2333333333333333333#""""""""""""""""""fVUUUUUUUDDD43DDDDDDDDDDDDDDD3C333333333333#""""233333333333333333#""""""""""""""""fffVUUUfUEDDDDDDDTDDDDDDDDDD333333333333"23"333333#"!"23"333333333#""""""""""""""""fffffffffVUUUEDDDDDDDDDDDDDD4333D433333#""233333333#""""""3333333333#""""""""""""""fUUUUTUUUUUUUUEDDDDDDDDDDDDDDDDDD43333""!"""333333333#"""!33333333333#"""""""""""""UUUDDDDDUUUUEDDDDDDDDDDDDDDDDDDD433333"""2333333333""""""""3333333#"""""""""""""ffffVefUfVUUUDDDDDDDDDDDD4CDDDDD433333#""""333333333"""""""""""""23""""""""""""""ffVefffffUUUUUDDTUDDD4CDDD34333C3333333!""!23""233""""""""""""""""""""""""TUUUDDDDDDDUUEDDDDDDDD43CDDDD3333333333!"""23#""""2#"""""""""""""""eUEDDDDDDDDDDUEDDDDDDDD3CD333333333333#""""33#"""33#""""""!"""""efVEDDD4333CDDDD43C4333334333333333333""""""33"""""!"""fVUDDDDDDDDDDD43DD3333333333333333313!!""""""""""""""""DEDDDDDDDDDDDD3333DD4333333333333!"!"""""""""""""""""DDDDDDDDDDDDDDDDDDDDDDD333333333333""""""""""""""""""DDDDDDDDDDDDDDDDDDDDD33C43333333333333!23333"""""""""!""DDDEDUEDDDDDDDDDDDDD3333333333333333332333333"""""""!""DDUUUUUEDTEDDDDDDDD4333333333333333!233#"""""""!""!""DDUUUUUUDDDDDDDDDDD33333333DD4333333323#""""""""""DTUUTEDDDDDDDDDDDD4333333333333333333""#""""""UUUUDDDDDDDDDDDDDD433333333333333333!"""""!"""UDUUDDDDDDDDDDDDDD33333333333333333!"""""""DDDDDDDDDDDDDDDDDD33333333334333333!"""!""DDDDDDDDDDDDDDDD333DD4333CDD4333333!""D43DDDDDD33333333DDDDD333CDD33333#!""DDDDD4CDDDDDDDDDDDDDDD33333333333DDD33CDDDDDDDDD3C43333333233DDD33DDDDDDDDDDDD433333333DDDDDDDDDDDDDDDDD4333333333!DDDD4CDDDDDDD4DDDD3333333333DD333DDDDDDDDDDD433333333333DD33CDDDDDDDDD3333333#DDDDDDDDDDD433333333DDDDDDDDDD433333333DDDDDDDD4333333333#!"DDDDD433333333333!333"33333333313333333333333#13333333333333333333333333333!"1#3CDDDDD333333333333333333333#nffffffffffffffffffffffffffffffffffffff3333333333333333nfffffffffffffffffffffffffffffffffffffffffff33ffffffffffffffffffffffffffffffffffffffffff33nfffffffffffffffffffffffffffffffffffffffff63ݪfffffffffffffffffffffffffffffffffffffffff63ݪnffffffffffffffffffffffffffffffffffffffff63ݭffffffffffffffffffffffffffffffffffffffff63ݪnffffffffffffffffffffffffffffffffffffffff3ݪffffffffffffffffffffffffffffffffffffffff6ݭfffffffffffffffffffffffffffffffffffffffffݭfffffffffffffffffffffffffffffffffffffffffݭfffffffffffffffffffffffffffffffffffffffffݭfffffffffffffffffffffffffffffffffffffffffݽfffffffffffffffffffffffffffffffffffffffffݻoffffffffffffffffffffffffffffffffffffffffݻfffffffffffffffffffffffffffffffffffffffݽoVffffffffffffffffffffffffffffffffffݻooUefffffffffffffffffffffffffffffffݽlfUUffffffffffffffffffffffffffffffݽVV5Sffffffffffffffffffffffffffffffݻ~wVU33eoffffffffffffffffffffffffffffffݽwwVU33SfffofffffffffffffffffffffffffffffffݻywwwVU333U3effffffffffffffffffffffffffffffffffݻywwVU33333SfffffffffffffffffffffffffffffffffffݻwwwVU333333effffffffffffffffffffffffffffffffffffݽwwwwwlUU335333cffffffffffffffffffffffffffffffffffffݻywwwwww\U533333CSffffffffffffffffffffffffffffffffffffݽywwwwwwVU533333DSffffffffffffffffffffffffffffffffffffݻݽywwwVU53333CD4ffffffffffffffffffffffffffffffffffffݽݻwwwVoUU53333DD4efffffffffffffffffffffffffffffffffffݻݻݽywwU\U33333CDD4efffffffffffffffffffffffffffffffffffݻݻywwwUUV53333CDDDDefffffffffffffffffffffffffffffffffffݽݽywwwwww\UU3333DDDDDDcffffffffffffffffffffffffffffffffffUݻݻwwwwwww\UU333DDDDDDDSffffffffffffffffffffffffffffffffffUݻݛwwwwwwwUU33CDDDDDDD4ffffffffffffffffffffffffffefffffffUݻݛywwwwwwlU53CDDDDDDDD4fffffffffffffffffffffffffVeffffffVUݛwwywwwwwwwwU533DDDDDDDDD4fffffffffffffffffffffffffVUeffVUUUUݛwwwwwwwwwwwwwwwwwwo53SUUCDDDDDDD4fffffffffffffffffffffffffVUefVUUUUUݛwwwwwwwwwwwwwwwwwww53UUU5DDDDDDD4ffffffffffffffffffffUVefffVUUUUUUUUݝwwwwwwwwwwwwwwwwwUSUUUUCDDDDDD4effffffffffffffffffffUUfffffUUUUUUUݝwwwwwwwwwwwwwwwww\lVUUUUEDDDDDD4efffffffffffVUeffffffUUefffVUUUUUUUݽywwwwwwwwwwwwww\\UUUU5DDDDDD4effffffffVffUUefffffUUUUUUUUUUUUUUUݙwwwwwwwwwww\\\UUU5DDDDDDSeffffffffUUUUUeVUUfUUUUUUUUUUUUUUUUݝwwwwwwwwwww\UUUU5DDDDDDcUeffffffUUUUUUUUUUUUUUUUUUUUUUUUUUUݝwwwwwwwwwww\\\UUUUEDDDDDDeeVffffVUUUUUUUUUUUUUUUUUUUUUUUUUUUUݝwwwwwwwwwww\UUUUUEDDDDDDeeVffffVUUUUUUUUUUUUUUUUUUUUUUUUUUUUݝwwwwww|ww\UUUU5UUCDDDDDDeefefffVUoUUUUUUUUUUUUUUUUUUUUUUUUUUݝwwwwww\UU3UUU5DDDDDDDeffffffUVUUUUUUUUUUUUUUUUUUUUUUUUUywwwwww\UU3SU5CDDDDDDDeffffffUVUUUUUUUUUUUUUUUUUUUUUUUUUywwwwww\UUU33DDDDDDDDDefffffVUUfUU53UUUUUUUUUUUUUUUUUUUUUUywwwwww\UUU3CDDDDDDDDDefffffVUUUUU53UUUUUUUUUUUUUUUUUUUUUUywwwwwwwwUUUU3CDDDDDDDDDefffffVUUUUUUSUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwUUUU3CDDDDDDDDDefffffVUUUUU5UUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwUUU5CDDDDDDDDDDeUUUefUUUUUU3UUUUUUUUUUUUUUUUUUUUUUUwwwwwwwww\UU5CDDDDDDDDDDUUUUUUUUUUU53UUUUUUUUUUUUUUUUUUUUUUUywwwwwww\UU5CDDDDDDDDDDffVUUUUUUUU33SUUUUUUUUUUUUUUUUUUUUUUywwwwwwUUUU\UU5CDDDDDDDDDDefVUUUUUUU5UUUUUUUUUUUUUUUUUUUUUU33UywwwwwUUUUUU\UU5CDDDDDDDDDDSeVUUUUUUUUUUUUUUUUUUUUUUUUUUUU33333wwwwwwwwwwwwUUU5C4DDDDDDDDDcfVUUUUUUUUUUUUUUUUUUUUUUUUU53333333wwwwwwwwwwwwwwwwwUUU333DDDDDDDD4eVUUUUUUUUUUUUUUUUUUUUUUUU533333333wwwwwwwwwwwwwwwwUUU533DDDDDDDDD4SUUUUUUUUUUUUUUUUUUUUUU53333333333wwwwwwwwwwwwwww\UUU533DDDDDDDDDD3UUUUUUUUUUUUUUUUUUUU5333333333333wwwwwwwwwwwwwwUUUU333DDDDDDDDDDDSUUUUUUUUUUUUUUUUUU33333333333333wwwwwwwww\U53333DDDDDDDDDDDD4UUUUUUUUUUUUUUUUU333333333333333UU3333DDDDDDDDDDDDD4SUUUUUUUUUUUUUUU3333333333333333fffffUUUUUUUUUUUUUUUUUUUU\U533CDDDDDDDDDDDDDDDSUUUUUUUUUUU33U53333333333333333ffffUUUUUUUUUUUUUUUUUUUUUe\UUU3CDDDDDDDDD$"""BDD4UUUUUUUUUUUUUU53333333333333333ffffUUUUUUUUUUU333333333UUflUUUUUU33CDDDDDD$""""""BDD3333333333333333333333333333333ffffUUUUUUUUUUUUUUUUU53333333333333CDDDDDDDD"""""""DDDDDDDDDDDDDDDDDDDDDDDDD33333333fffUUUUUUUUUUUUUUUUUUU333333333333DDDD"""""""""""""""""DDDDDD"""""""""""""""$"BDDDDDffffUUUUUUUUUUUUUUUUUUU33333333333CDDD"""""""""""BDDDDDDD$""""""""""""""""""""""""""fUUUUUUUUUUUUUUUUUUUUUU33333333333DDDD$"""""""""BDDDDDDDDDD"""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUU33333333333DDDDD"""""""""DDDDDDDDDDDD""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUU3333333333CDDDDD$"""""""BDDDDDDDDDDDD""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUU3UU3333333333DDDDDD$"""""""BDDDDDDDDDDDD""""""""""""""""""""""""fUUUUUUUUUUUUUUUUUUU5533333333333DDDDDD$"""""""DDDDDDDDDDDDD$"""""""""""""""""""""""fVUUUUUUUUUUUUUUUUUUU533333333333DDDDDDD"""""""DDDDDDDDDDDDDD$""""""""""""""""""""""fVUUUUUUUUUUUUUUUUU3UU5333333333DDDDDDDD"""""""BDDDDDDDDDDDDDD""""""""""""""""""""""UUUUUUUUUUUUUUUUUU53SU333333333DDDDDDDDD"""""""""DDDDDDDDDDDDD""""""""""""""""""""""UUUUUUUUUUUUUUUUU3SUSU33333333CDDDDDDDD$"""""""""DDDDDDDDDDDD"""""""""""""""""""""""UUUUUUUUUUUUUUU53333333333333333CDDDDD$""""""""""BDDDDDDDDDD$"""""""""""""""""""""""VUUUUUUUUUUUUUUU33333333333C43333DDDDD""""""""""""DDD"""""""""""""""""""""""""""""""UU5SUU3333SUUUUU533333C43333333CDDDDD$""""""""""""""""""""""""""""""""""""""""""""""5SUU533S533UUU533333CDCD333334333DDDD"""""""""""""""""""""""""""""""""""""""""""""""5SUUUUUUUUUUUU333333333333CDDD43DDDDD"""""""""""""""""""""""""""""""""""""""""""""""UUVUUUUUUUUUU333C333333333DDDDDDDDDDD$"""""""""""""BDDD"""""""""""""""""""""""""""""UUUUUUUUUU5333D4C33S53333DDDDDDDDDDDD$"""""""""BDDDDDDDDD"""""""""""""""""""""""""""UUUUUUSU5333333C333S3333DDDDDDDDDDDDD$"""""""""DDDDDDDDD$"""""""""""""""""""""""""""UUUS5333533CDDDDDD433D3CDDDDDDDDDDDDD$""""""""""DDDDDDD$""""""""""""""""""""""""""""UUUSU335333DDDDD4333CD4C4CDDDDDDDDDDD"""""""""""""DDDDD$""""""""""""""""""""""""""""UUUUUUUUU5333333333333CDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUU533333333333DDDDDDDDDDDDD$"""""""""""""!""""""""""""""""""""""""""""""UU533333UUU333333333333CDDDDDDDDDDDD""""!"""""""B""""""""""""""""""""""""""""""""""5SU33333SUU333CD33333333CDDDDD4CDDDD"""""""""""""BDD$"""""""""""""""""""""""""""""""UUUUUUUUUUU333C3333333333DDCDDDCDDDD"""""""""""""BDD$"""""""""""""""""""""""""""""""UUUUUUUUUU33333333333333CDDDDDDDDDD$""""!"""""""""""""""""""""!"""""""""""""""""33333333DD33333333C4DDDDDDDDDDDDDD""""""!!"""""""!"""""""""""""""""""""""U533333CDDD4333D433333DDD43DDDDDDD$!"""""""""""""""!""""""""""""UU53333DD$BD33CDDDDDDDDDDD$BDDDDB$""""""""""""""""!"""""""""""UU33333CDDDDDDCDDDDD$BDDDDDD$""""!"""""""""""!"""""""""""""333333D333333CDDDDDDDDD"BDDDDDD$"!"""""""""""""""""""!"!333333D4333CDDDDDD3DDDDDDDDDBDDD"""""""!"""""""""""""""3333C3333333333CD334CDDDDDDDDDDD$!"""""""!"""!""""33333333333333CDDDDDDDDDDDDDDDDD$"!"""""""""""""!""33353333333333DDDD4CD""BDDDDDDDD$"!"""""""""""""!"""D433333333333D4333CD$!"DDDDDDD$""!""""""""""!"""""333333333333333333DDD$""""DDDDDDDDD$"!"""""""""!!"""333333333333333333DDDDDDDDDDDDDDDDDD"!""""""""""""""3333333333333333DDDDDDDDDBDD$DDDDDD"!""""""""""""33333333333333CDDDDDDDDDDDDDDDDD$""""""""""!""333333333333333DDDDDDDBDDDDDDDD$"""!""""""!""""3333D3333DDDDDDDDDDDDDDDDDDDDD$"""""""""333333DD333333CDDDDDDDDDDBDDDD$""""""33333333333333CDDDDDDDDD$"DDD$"""!""3333333333333CDDDDDDD$DDDD"""33333333C43333DDDD""""DDDD3D4DDDDDDDD4D4DDDDDDDDDDDD"!"""3DDDDDDDDDDDDDDDDDDDDDDDDD""!"""DDDDDD333DDDDDD"$""DD""""""D33C43333DDDDD!!""33333333CDDD""B$"""333D333DDDDDDDD$"""DDDDDDD"""""""BDD$""DD"BD$"""""""DDDDD""""!"""""BDDDDDDDDDDDDDDDD$"""""""""""!""""DDDDDDDD$""BDDDDDDDDD""""""""""wwffffffffffffffffffffffffffffffffffffffffff33333333333333333zwzffffffffffffffffffffffffffffffffffffffffffffffffff3wwffffffffffffffffffffffffffffffffffffffffffffffffff3wfffffffffffffffffffffffffffffffffffffffffffffffff3zwwwwmfffffffffffffffffffffffffffffffffffffffffffffff63wwwwwfffffffffffffffffffffffffffffffffffffffffffffff63wwwwwmffffffffffffffffffffffffffffffffffffffffffffff63zwwwwffffffffffffffffffffffffffffffffffffffffffffff63wwwfffffffffffffffffffffffffffffffffffffffffffff33ꮪzwwmffffffffffffffffffffffffffffffffffffffffffff33zwwwfffffffffffffffffffffffffffffffffffffffffff33wwwfffffffffffffffffffffffffffffffffffffffffff33zwwwmffffffffffffffffffffffffffffffffffffffffff63wwwwmfffffffffffffffffffffffffffffffffffffffffff3wzwwwfffffffffffffffffffffffffffffffffffffffffff6wwwwwwffffffffffffffffffffffffffffffffffffffffffffzzwwwwwffffffffffffffffffffffffffffffffffffffffffffzwwwwwwffffffffffffffffffffffffffffffffffffffffffffzwwwwwwfmffffffffffffffffffffffffffffffffffffffffffffzwwwwwwfmUfffffffffffffffffffffffffffffffffffffffffffwwwwwwfVUeffffffffffffffffffffffffffffffffffffffffffwwwwwwVVDTfffffffffffffffffffffffffffffffffffffffzwwwwwUU4Cffffffffffffffffffffffffffffffffffffwwwww}UU33emfmffffffffffffffffffffffffffffffffwwwwwwwmUE33SfUfmfffffffffffffffffffffffffffffffzwwwwwwwUE333D3SmfffffffffffffffffffffffffffffffzwwmUE333333mfffffffffffffffffffffffffffffffwmUE335333effmfffffffffffffffffffffffffffffffwwVUE335333SffmfffffffffffffffffffffffffffffffwwwVUE333333Sffffffffffffffffffffffffffffffffff}wUUD3333333ffffffffffffffffffffffffffffffffffffww]UUE3333333fffffffffffffffffffffffffffffffffffffwwwmUUED3333333ffffffffffffffffffffffffffffffffffffewwwwmUUD433333333effffffffffffffffffffffffffffffffffffwwwmUE4333333333cffffffffffffffffffffffffffffffffffffwwmUeE4333333333cffffffffffffffffffffffffffffffffffffwwUUE3D43333333SffffffffffffffffffffffffffffffffffffwwwVUDTUU4333333SffffffffffffffffffffffffffffffffffffwwwwwVDTUUUE3333333ffffffffffffffffffffffeffffffffffffVwwwwwwUDDUUUEU4#"23"3fVUffffffffffffffffffVUfffffffffffffwwwwwwEDDUEUEU5#3"323fefefffffffffffffffffVUfffffffffffffwwwwwUDDUUUUU5#3#323fefeffffffVffffffffffVUfffffffffffffwwwwwUDDUUUUUE#3"3"3fUffffffffUefffffffffVUeffffffUefffV|wwwwwwwwww]DDUUUUU5#""#"3fUUffffffV5SfefffffffVUefffffVUUefffwwwwwwwwww}]44UTUUT5#"3#23fffffffVUUU33SfffffffUUeffffUUUUefffwwwwwwwwww]4DTEDDU4#33#2SfefefffVUeU43SffffffVUUUfUUVUUUUUeffwwwwwwwwww]UDDTUUUU3#33#"SfffefffVT}VDDTffffffUUUUUUUUUUUUUUffwwwwwwwwwwUED3TUU4333333cfffffffVdwgDDTUffffVUUUUUUUUUUUUUUUU|wwwwwwwwww]UD3CDD3333333efffffffEd}]DDDUUefUUUUUUUUUUUUUUUUUU|wwwwwwwwww]UD33333333333effffffVDDfEDDDTUUUUUUUUUUUUUUUUUUUUU|wwwwwwwwwwwwwUED33333333333effffffVDDTDDD3SUUUUUUUUUUUUUUUUUUUUU|wwwwwwwwwwmwww]UDD33333333333effffffVEDDDD4CUUUUUUUUUUUUUUUUUUUUUU|wwwwwwwwww]wUEDD33333333333effffffVUDDDD3CUUUUUUUUUUUUUUUUUUUUUUwwwwwwwww]]UEDD33333""2"23fVUfUefVUDDD33SUUUUUUUUUUUUUUUUUUUUUUwwwwwwwww]VUDTD33333"""""2UUUVUUfVUDDD33CUUUUUUUUUUUUUUUUUUUUUUwwwwwww]UUDTE33333"3#"32UefVUUeVUDDDDDDUUUUUUUUUUUUUUUUUUUUUU|wwwwwww]UUUUUUUUDT43333323#"32VUeVUUeUUUUDTUUUUUUUUUUUUUUUUUUUUUUUU|wwwwwww]UUUUUUMDET333"23"""""2VUUUUUfVUUUEUUUUUUUUUUUUUUUUUUUUUUUUU|wwwwwww]UUEDT33333#""#""3VUUUUUfVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwEDD33333#23#"33VeUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwEDD33333#""""33VUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUUUUUUwwwww]UUD433333""2"33VUUUUUUUUUUUUUUUUUUUUUUUUUUUEDDTUUUUU|www]UE433333333333ffVUUUUUUUUUUUUUUUUUUUUUUUUDDDDDDDUUU|wwww]UE433333333333ffVUUUUUUUUUUUUUUUUUUUUUUDDDDDDDDDDDD|wwwwUU433333333333cffUUUUUUUUUUUUUUUUUUUUUDDDDDDDDDDDDDwwwww}UUED33333333333cfVUUUUUUUUUUUUUUUUUUUDDDDDDDDDDD433|wwwwwwwwwwwwwww]UUUU433333333333UVUUUUUUUUUUUUUUTEUDDDDDDDDDDDD3333wwwwwwwwwwwww}w]ETED3333333333333UUUUUUUUUUUUUUDDDDDDDDDDDDDD333333wwwwwwwwww}wmUDDD33333333333333SUUUUUUUUUUUDDDDDDDDDDDDDD43333333wwwwwwwww]EDD33333333"""""33SUUUUUUUUUUDDDDDDDDDDD333333333333UUDD3333333#"""""""33UUUUUUUUUEDDDDDDDDD33333333333333fffUUUUUUUUUUUUUUUUUUUUU]UUD4333333#"""""""""3SUUUUUUUUEDDDDDDDD333333333333333fffUUUUUUUUUUDDDDUUDDDDUmUUUD43333#"""""""""""233DDDDDDDDDDDDDD33333333333333333ffVUUUUUUUUUDDDDDDDDDDDUefVUUUUUD43333#""""""""""""333333333333333333333333333333333ffVUUUUUUUUUUUUUEDDDDDDD33DDDD33333333#"""""""""""""""""""""""""""""""""""3333333333fffUUUUUUUUUUUUUUUUDDDDDDDDD4333333"""""""""""""""""""""""""""""""""""""""""""""""""ffVUUUUUUUUUUUUUUUUEDDDDDDDDD333333"""""""""""""""""""""""""""""""""""""""""""""""""UUVUUUUUUUUUUUUUUUUDDDDDDDDDD333333"""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUEDDDDDDDD33333333"""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUDDDDDDDDD433333333"""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUDDDDDDDDD333333333#"""""""""""""2#"""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUEDDDDDDDD333333333#"""""""""""""2#"""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUEDDDDDD4DD333333333#""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUDDDDDD333CDD3333333"""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUEDDDDD4333333333333#"""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUEDDDDDD4333333333333""""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUD333D4D43D4333333333""""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUDUUUUUED43333433DD33333333#""""""""""""""""""""""""""""""""""""""""""""""""""UUEUUUDDDDUUUUEDD333333CD33333333#""""""""""""""""""""""""""""""""""""""""""""""""""DTUDTUEDDTUUUEDDDD333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUEDDDD33DD443333333333333"""""""""""""""""""""""""""""""""""""""""""""""""""UUUUETUUDDDD433333DD4333333333333"""""""""""""""""""""""""""""""""""""""""""""""""""UUUUDDDD3CDDD3333DDD43333333333333""""""""""""""""""""""""""""""""""""""""""""""""""UUUDUUDD333C4333333333333333333333#""""""""""""""33"""""""""""""""""""""""""""""""""UUUDTUDD33333333333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""""UDUDDDDD433333333333333333333333#"""""""""""""""""""""""""""""""""""""""""""""""""""UEDDDTETUUDD433DD433333333333333""""""""""""""""""""""""""""""""""""""""""""""""""""UEDTUUUUEUUUDDDDDD43333333333333""""""""""""""""""""""""""""""""""""""""""""""""""""UUEDDDUUDTDDD4D4333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""""DUE433TUDD43333333333333333333333""""!""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUDDD33333333433333333333""""!"""""""""""""""""""""""""""""""""""""""UUUUUUUUDDDD43D433333333""33333#""""!"""""""""""""""""""""""""""""""""""""C433333333333334333333333333333"""!""""""""""""""""""!""""""""""""""""333333333333333333333333333333"""!"""""""""""""""!"""""""""""!"""D433333333333333333333333#""2""""""""""""""""""""""""!""""""""!""E43333333333333333"""""23"33#""""""""""""!""""""""""""""""43333333333333333333#""333333""""""!"""""""""""""""3333333333333333333333333#"""2"!""""""""""""!""33333333333333#333333333333#"3"""""""""""""!"""DDDDDDDDD333#"""23333333333333"""!"""""""""!"""33CD433DD433""""23333#"""33333""""!""""""""!"""""33D333DDD4333333333""""23#""""!""""""""!"!"""DD433CDDD433333333#"!""23333"""!""""""""""DD3333CDD433333333""""""""2333""""""""""""""""""!""D43333343333333333""""""""""""""""""""""""""""""DDD43C3333333333""#2"""""""""""!"""""!""""""""CD433D33333333333333"2"""333"""""""!""""!""3333333333333333333333333333"""!!""""""""""33CD3333333333333333333"3333""""!""""""""""DDD43333333#""2333333""""333""""!"""4333333333333333""233""""""""""3333333333333333"""""""""""!"""!33333333333333333333333""""""!3333333333333#"""""3333"""""""""333333333333"!"""""""""""3333333333""!" \ No newline at end of file diff --git a/Video 126p/video-03.bin b/Video 126p/video-03.bin new file mode 100644 index 0000000..54f1369 --- /dev/null +++ b/Video 126p/video-03.bin @@ -0,0 +1 @@ +fffffffffffffffffffffffffffffffffffffff3333333333333333jfffffffffffffffffffffffffffffffffffff333jfffffffffffffffffffffffffffffffffffff3333jfffffffffffffffffffffffffffffffffffff3333fffffffffffffffffffffffffffffffffffff6333ffffffffffffffffffffffffffffffffffffff333jfffffffffffffffffffffffffffffffffffff633jffffffffffffffffffffffffffffffffffff633jffffffffffffffffffffffffffffffffffff633fffffffffffffffffffffffffffffffffffff633fffffffffffffffffffffffffffffffffffff633ffffffffffffffffffffffffffffffffffffff33jfffffffffffffffffffffffffffffffffffff63jfffffffffffffffffffffffffffffffffffffff̙jfffffffffffffffffffffffffffffffffffffff̜fffffffffffffffffffffffffffffffffffffff̙ffffffffffffffffffffffffffffffffffffff̙jjjffffffffffffffffffffffffffffffffff̜fjffffffffffffffffffffffffffffffffff̙̙jVejfffffffffffffffffffffffffffffffffff̙̙jfUUjfffffffffffffffffffffffffffffffff̙̙jeUTfffffffffffffffffffffffffffffffff̙ZUEDejffffffffffffffffffffffffffffffff̙ZUE3Sjffffffffffffffffffffffffffffffff̜VU43Cjfffffffffffffffffffffffffffffffff̙VU433eUTjfffffffffffffffffffffffffffffff̙VU433333cfffffffffffffffffffffffffffffff̙VU433333Sjffffffffffffffffffffffffffffff̙UU43S3333jffffffffffffffffffffffffffffff̙ɜoUU43S3333ffffffffffffffffffffffffffffff̙jUU4333333ejfffffffffffffffffffffffffffff̜yZUU4333333Sfffffffffffffffffffffffff̙ywwoUUU43333333fjfffffffffffffffffffffffffwwywwwwoeZUUU43333333fffffffffffffffffffffffffff|wwwwwwwwݽUZUED43333333fjffffffffffffffffffffffffff|wwwwwwwwwwwwݽUVD4333333333ffffjfjfffffffffffffffffffffffffffwwwwwwwwwwwwwUeVTUE33333333efffffffffffffffffffffffffffffffffffwwwwwwwwwwwwwUUU_E3333333cfffffffffffffffffffffffffffffffffffwwwwwwwwwwwwwwoUU_U_3333333cfffffffffffffffffffffffffffffffffffwwwwwwwwwwwwwwwUE_U4##23"3cVUeffffffffffffffffffffffffffffffff|wwwww}w_E_T5#3#323SVfeffffffffffffffffffffffffffffffffw|wwww_UT_U?#3#"23SVfeffffffVeffffffffffffffffffffffff|wwwwwwwwEDTO#3"3""3UUeffffff5SffffffffffVeffffffffffffwwwwwwwww_DD_T?#"2#"33UVfffffUU33UUfffffffffeffffffffffffw|wwwwwwwwwDDUTUUU5#33#23SUfeffff433333effffffffUffffffffefffw|wwwwwwwwwEDTEDDU4#33#"3SUfeffff4eV333effffffffUfffffffVUeffwwwwwww}VUDTUUUE3#33#""SfffffffTk333effffffffUeffffffVUeffwwwwwwwwwwVD3TUU43333333cffffffVT533efffffffVUeffffefVUUff~wwwwwwwwwݽVD43D433333333cffffffETk333SfffffffVUUUUUUUfUUUef~wwwwwwwwwݽoVE433333333333efffffVD4eF3333efffffUUUUUUUUUfUUUUU~wwwwwwwwwݽ_oUE433333333333ffffffVE433333CeffffUUUUUUUUUUUUUUUU~wwwwwwwwwݻ_oUU433333333333fffffffU433333TUUUUUUUUUUUUUUUUUUUUU~wwwwwwwww__UE433333333333fffffffV333333UUUUUUUUUUUUUUUUUUUUUU~wwwwwwwww_UUD43333"""""33UUfUUffV333333UUUUUUUUUUUUUUUUUUUUUU~wwwwwwwww_UEDD33333"""""23UUVUUefV333333UUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwU_EDD33333"3#"3"3efVUVefVD43333UUUUUUUUUUUUUUUUUUUUUU~wwwwwwwwwww_UUUUUU_ETD3333323#"3"3efVUUefVUU4CUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwww_UUUUUUVUEDD33"23""""""3TUVUUefUUUETUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwUUUEEDE3333323#""23efVUUeVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwEDD53333#23#"233eeVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwEEDE33333""""333UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwUUDE33333""""33SUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwUTE33333333333cfVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwUTE33333333333cffUUUUUUUUUUUUUUUUUUUUUUUUUUUUETUUUUwwwwwwwwwwwUTD33333333333SffVUUUUUUUUUUUUUUUUUUUUUUEUUUUDDDTUUwwwwwwww}wUUD33333333333SffVUUUUUUUUUUUUUUUUUUUUUUEUEDDDDDDDTwww_UD33333333333SffUUUUUUUUUUUUUUUUUUUUUUEDDDDDDDDDDD_UE333333333333efVUUUUUUUUUUUUUUUUUUUUUEDDDDDDDDDDD_UUD333333333333efUUUUUUUUUUUUUUUUUUUTDDDDDDDDDDD43_UUUU33333333333SfVUUUUUUUUUUUUUUUDTEDDDDDDDDDDD333UEUED333333333333SUUUUUUUUUUUUUUDDDDDDDDDDDDDD33333_UDD433333333333333UUUUUUUUUUUUEDDDDDDDDDDDDD3333333UDDD3333333#""""233UUUUUUUUUUEDDDDDDDDDDD4D433333333oUDD3333333""""""""3SUUUUUUUUEDDDDDDDDDD3333333333333ffjffffffofffjffffff_UUD4333333"""""""""23UUUUUUUUEDDDDDDDD433333333333333fffVUUUUUUUUUUUUUUUUUUUUUoUUED33333#"""""""""""33CDDDDDDDDDDDDDD3333333333333333fffUUUUUUUUEDDDDDDDDDDDTUoUUUUED33333""""""""""""233333333333333333333333333333333fffVUUUUUUUUUEDDDDDDDDDDTUUEDDDDD33333"""""""""""""""""333""""""""""""2"""3333333333fffVUUUUUUUUUUUUUUUDDDDDDDDDD433333#""""""""""""""""""""""""""""""""""""""""""""""""fffVUUUUUUUUUUUUUUUUDDDDDDDDDD33333#""""""""""""""""""""""""""""""""""""""""""""""""fffVUUUUUUUUUUUUUUUUDDDDDDDDDD33333#""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUDDDDDDDDD3333333#""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUDDDDDDDDD43333333#""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUDDDDDDDDDD33333333#""""""""""""""33""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUEDDDDDDDDD333333333""""""""""""""3"""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUDDDDDDDDD33333333#""""""""""""""""""""""""""""""""""""""""""""""""fUUUUUUUUUUUUUUUEDDDDDDD3DDD4333333#"""""""""""""""""3#"""""""""""""""""""""""""""""fUUUUUUUUUUUUUUUEDDDDD43333D3333333""""""""""""""""""3#"""""""""""""""""""""""""""""UUUUUUUUUUUUUUUEDDDDDD333333333333#"""""""""""""""""23#"""""""""""""""""""""""""""""UUUUUUUUUUUUUUUDDDDD4C333333333333""""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUED33333C33D433333333""""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUDDDTUUUUD43333333DD33333333""""""""""""""""""""""""""""""""""""""""""""""""""TEUEDUUDDDTUUUUDD33333333433333333""""""""""""""""""""""""""""""""""""""""""""""""""DTUUUUUUUUUUUUDDDDD34333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUEDDDD33333DD433333333333#""""""""""""""""""""""""""""""""""""""""""""""""""UUUUEDDDE43DDD3333DDD4333333333333""""""""""""""""""""""""""""""""""""""""""""""""""UEUUEDDD433DDTD3DDDD43333333333333#"""""""""""""""""""""""""""""""""""""""""""""""""UUUUTUUDD33333333333333333333333333""""""""""""""2#""""""""""""""""""""""""!"""""UUUUUDUD4333333333333333333333333#"""""""""""""""""""""""""""""""""""""""""!""""""UUUUDDDDDDD4333333333333333333333"""""""""""""""""""""""""""""""""""""""""""""""""UEDDDUUUUUUUDDDDDD43333333333333""""""!"""""""""""""""""""""""""""""""""""""""""""UUUEDUUUUUUUEDDDDDD333333333333#""""""""""""""""""""""""""""""""""""""""""""""""UUUDDDTUUUDD433333333333333333""""""!"""""""""""""""""""""""""""""""""""""""""TUUUUUUUUED4333333333333333333333""""""""""""""""""""""""""""""""""""""""""UUUUUUUUUDDDD3333333333333333333""!""""""""""""""""""""""""""""""""""""""DDDDDDDDD4DDD3D4333333333#""333#""!""""""""""""""""""""""""""""""""""3333333333333333333333333333333""!"""""""""""""""""""""""""""""""""DD4333333333333333333333333#"3#""""""""""""""!""""""""""""""""""""DDDD333333333333333333#"3#23#"""""""""""""""""""""""""""""""DDDD33333333333333#""""233333#""!""""""""""""""""""""DDDD3333333333333333333333333##"!"""""!"""""""DD433333333333333333333333""""3"""""!""""!"""""DDDDDDDD333333#""3#333333333""""""""""""""!"!"""D4CDDDDDDD43#"""""""2333333323""""!""""""""!"""""333D433DDD33#""""""""3#""""3""""""!""""""""!"""333333CDDD4333333333""!""""""""""!"""""""!""""CD4333CDDD433333333"""""""""333""""""!"""""""""DD3333DDD4333333333""""""""""""!""""""""""""""""""DD333CDD43333333333""""""""""""!"""""""""""""""DDDDDD4333333333333""""""""""""""""""!""""""""DD433D333333333333333""""333"""""""""""!""""4333D43333333333333333333333"""!"!!"""""""DDDDD3333333#"""333333332333""""""!""""""DD4333333333""33333333"""2333"""!"!""D333333333333333""233#""""""""""!""333333333333333333333#"""""""!"wwwwwwwwWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU5333333CD뻻wwwwwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU5{wwwwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwwwwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwwuWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwuWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwuwUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwwwUW3UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU{wwwwwwwwwwff3UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwff3SUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻{wwwwwwwgffD4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻{wwwwwwwgf6DDcUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̼{{wwwww{wgf6DD4f6UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻{wwwwwwwgf6DDD3DSUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̼{wwwwwwwgf6DDDDD4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻wwwwwwwwgf6DDDDDD4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̼{wwwwwwwgf3DD3DDDDuWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̼{wwwwwgf3DD3DDDDuwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻{wwwwwf63DDDDDDDuwwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̼wwwwwf63DDDDDDDUWuwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻gfwwvf63DDDDDDD4UUwwwUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻wfwwff63DDDDDDDDUfwwwWUUUUUUUUUUUUUUUUUUUUUUUUUUUUU̻wgvgff63DCDDDDDDUUwwwwwwfffUUUUUUUUUUUUUUUUUUUUUUUU̼̜wgfgF3CDDCDDDDDDUUvwwwwwwffVUUUUUUUUUUUUUUUUUUUUUUU̜ygfgDdDDDDDDDDDDUUfwwwwwgffVUUUUUUUUUUUUUUUUUUUUUUUꮪ̜ygfgfffDDDDDDDDDUUfvwwwgfffUUUUUUUUUUUUUUUUUUUUUUUU̙ywfvwwwFDDDDDDDDSUefffffffVUUUUUUUUUUUUUUUUUUUUUUUU̙wgvfvgwfgDD"DD$"D4SUUffVUUUUUUUUUUUUUUUUUUUUUUUUUUUU̙wwwfwgvfwF$D"D""DDUSUefVUUUUUUUUUUUUUUUUUUUUUUUUUUUUݙywwgfwgvfwG$D$B"DDDU3UefVUUUUUUUUUUUUUUUUUUUUUUUUUUUUʜݝwwffwwwwwG$D$B"DDDUSUffVUUU4UUUUUUUUUUUUUUUUUUUUUUUUꪪ̙ݝyffdwwwwvG$""$""BDDSUffVUUEDSUUUUUUUUUUUUUUUUUUUUUUUݝgDdgvwgdG$""$"DDD5SUefV33DDD3SUUUUUUUUUUUUUUUUUUUUUʬ̜w}wwwfFwfffvF$BD$"BDDUSUffVCDCDDDSUUUUUUUUUUUUUUUUUUUUU}wwwwwwwfFvfDdgD$"""""DDU5fffVCT7DDDdUUUUUUUUUUUUUUUUUUUUU}wwwwwwffFdvwwFD$"""""B4UUfffVC{CDDdVUUUUUUUUUUUUUUUUUUUU}wwwwwwwgFDfffDD$""""BDSUefffVDFDD4fUUUUUUUUUUUUUUUUUUUU}wwwwwwwgfDDDDDD$"""""DSeffffFDskCDDDcUUUUUUUUUUUUUUUUUUUU}fwwwwwwwwgfFDDDDD$"""""DUfffffCD46DDDDdfUUUUUUUUUUUUUUUUUUU̙}wwfwwwwwwwwffFDDDDD$"""""4efffffFDDDDDDDcfffVUUUUUUUUUUUUUUUU}wwfwwwwwwwwffFDDDDD$""""B4effffffDDDDDD4ffffVUUUUUUUUUUUUUUUU}wwfwwwwwwwgffFDDDDD$""""B4effffffCDDDDDdffffffUUUUUUUUUUUU3SUwwwfwwwwwgvfffDD"BD"""""""BcffffffCDDDDDdffffffVUUUU33SUUU53SU}wwwfwwwwwwgFDfDDBB$"""""""BcffffffCDDDDDdffffffVUUU533SUUU53SUwwwgfvwwwgwwFDFDDDD$"""""""TfffffffCDDDDDdffffffffU3333SUUU3333wwfffffffwgwwgDdDDDD$"""""""dfffffffffFDcffffffffff63333SU533333}wwwfffffffwwffgDdDD"B$"""""""D3fF4ffffff4fffffffffff633333U533333wwwwwwwwwwwwwwffDdDDDD$"""""""Tffffffffffffffffffffffff33333333333wwwwwwwwwwwwwwfFDDDDDD$"""""""dffffffffffffffffffffffff33333333333wwwwwwwwwwwwwwfFDFDDDD$"""""""dffffffffffffffffffffffff33333333333wwwwwwwwwwwwgfffdfDD"B$""""""B3ffffffffffffffffffffffff33333333333wwwwwwwwwwwwwwwfffDDDDD$"""""Beffffffffffffffffffffffff33333333333wwwwwwwwwwwwwwwfFfDDDDD""""""Beffffffffffffffffffffffff33333333333wwwwwwwwwwwwwwwfFfDDDDD""""""Bcffffffffffffffffffffff6333333333333wwwwwwwwwwwwwwwffFDDDDD""""""Bcffffffffffffffffffffff3333333333333wwwwwwwwwwwwwwwffFDDDDD""""""BTfffffffffffffffffffff63333333333333}wwwwwwwwwwwwwwgfFDDDDD$"""""BTfffffffffffffffffffff33333333333333}wwwwwwwwwwwwwwwgfFDDDDD$"""""BSefffffffffffffffffff633333333333333}wwwwwwwwwwwwwwwwwfFDDDDD$"""""BTUfffffffffffffffffff633333333333C33}wwwwwwwwwwwwwwwwwwwwwff6DDDDDD"""""DSfffffffffffffffffff33333D3D33DDDD4}wwwwwwwwwwwwwwwwwwwwwwwwwfffDDDDD""""""DDSffffffffffffffff33333CDDCDDDDDDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgff6DDDDD$"""""BD4effffffffffff6333333CDDDDDDDDDDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwffDDDDDDD"""""""DDSfffffffffff3333333DDDDDDDDDDDDDDwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgfFDDDDDDD""""""""D43cfffffff6333333DDDDDDDDDDDDDDDDffffffffffffffvwwwwwgffffvwwwwwgfFDDDDDDD"""""""""BD33333333333333DDDDDDDDDDDDDDDDDDffffffffffffffffffffffffffwwwwgffFDDDDDD"""""""""""D3333333333333DDDDDDDDDDDDDDDDDDDfffffffffffff33CDDDDDDDD4fvwwffffFDDDDD$"""""""""""BDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDfffffffffffff3333DDDDDDDDcffffffFDDDDDD"""""""""""""DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDffffffffffffff33333333DDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""DDDDDDDDDfffffffffffffff63333333CDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""ffffffffffffffff6333333CDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""fffffffffffffff3333333CDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""ffffffffffffff6333D43CDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""cffffffffff3ff333CD33CDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""ffffffffff63cf3333333DDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""ffffffffffffff633DDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""fff633cffffff6333DDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""ffff3fffffff3336CDDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""fffffffffff33f33CD3DDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""ff333f3fff33333DDD3DDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""ff633633333333CDDDDDDDDDDDDDDDDDDD$"""""""""""""""""""""""""""""""""""""""""""""""""ff63333CDD4333CDDDDDDDDDDDDDDDDDDD$"""""""""""""""""""""""""""""""""""""""""""""""""3f6333c33C4333CDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""""ffff33ff633CDDDDDDDDDDDDDDDDDDDD$"""""""""""""""""""""""""""""""""""""""""""""""""""fff63333DDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""""63D33CDDDDDDDDDDDDDDDDDDDDDDD$"BD$""""""""""""""""""""""""""""""""""""""""""""""""""f63333CDDDDDDDDDDDDDDDDDDDDDDDD""$""""""""""""""""""""""""""""""""""""""""""""""""""ff6CDD4C3DDDDDDDDDDDD"DDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""f33333333DDDDDDDDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""!63CDDD333C43DDDDDDDDDDDDDDDDDDDD"""""""!""""""""""""""""""""""""""""""""""""""""""""ffCDD4333D433CDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""ff33343333CDCDDDDDDDDDDDDDDDDDD""""""""""""""""""""""""""""""""""""""""""""""3333333333DDDDDDDDDDDDDDDDDDDD$""""""!"""""""""""""""""""""""""""""""""""""""4363DDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""""333DD4D4DDDDDDDDDDDDDDDDDDDDD"BD$""""""""""""""""""""""""""""""""""""""DDDDDDDDDDDDDDDDDDDDDDDDD"""""""""!"""""""""""""""""""""""""""""""""""""DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""""""""""""4DDDDDDDDDDD$DDDDDDDDDDDDDD$"""""""""""""""""""""""""""""""""""""""""DDDDDDDDDDDDDDDDDD$BDDDDDDD"""""""""""""""""""""""""""""""""""D333DDDDDDDDDDDDDDD$""BDDD""""""!"""""!"!""""""""""""""""""33333CDDDDDDDDDDDDDDDDDDDDDDDD$"!""""""""""!""""433333DDDDDDDDD""DDDDDDDDDDD$DB""""""""""!""""DDDDDDDDDDDDD$""""""DD$"DDDD$""""""""""!"""DDDDDDDDDDDDD"""!""""""D"""""""!""""!!""!""DDDDDDDDDDDDDD$"""""""""""""""""""""""""!"!DDDDDDDDDDDDDDDDDD$"""""""""""""""!DDDDDDDDDDDDDDDDDDD$""""!"""!"""""""DDDDDDDDDDDDDDDDDDD$"$"""""!""""!"""""!"""DDDDDDDDDDDDDDDDDDDDDDDD"""!""""""""""""DDDDDDDDDDDDDDDDDDDDDD$"""""""""""""""""!""!"DDDDDDDDDDDDDDDDDDDDDD$"""""""""""""""""""""DDDDDDDDDDD$DD$DDDDDDDD$"DD""""""""""""!"""""333DDDDDDD"""""D"DDDDDD"BDD"""""""!""33DD"DDDDDDDDDD$"""""""""BDD""""""!"3CDDDDDDDDDDDDD$""""""""""""""""ݽ{wwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݻwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUݽwwwwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUݽwwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUݽwwwwwwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUݻ{wwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUݻ{wwwwwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUݻwwwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUݽ{wwwwwwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUݽ{wwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUݻwwwwwwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUUUUUUUUݽ{wwwwwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUݽ{wwwwwwwwwwwwwwwwDDDDDDDDDDDDDDDDDDDDDDDDUUEDUUUUUUUUUUUUUUUݽwwwwwwwwwwwwwwwwwGDDDDDDDDDDDDDDDDDDDDDDUUEDUUUUUUUUUUUUUUUݽ{wwwwwwwwwwwwwwwGwGDDDDDDDDDDDDDDDDDDDDDDUUEDUUUUUUUUUUUUUUUݻwwwwwwwwwwwwwwwGtGDDDDDDDDDDDDDDDDDDDDDDUUUDUUUUUUUUUUUUUUUݽ{wwwwwwwwwwwwwGtGtGCDDDDDDDDDDDDDDDDDDDDDUUUDUUUUUUUUUUUUUUUݻwwwwwwwwwwwwwwtgf63DDDDDDDDDDDDDDDDDDDDDUUEDUUUUUUUUUUUUUUUݽ{w{wwwwwwwwwwwvgf63DDDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUUUݻwwwwwwwwwwwwwwgf63CDDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUUUݻzwwwwwwwwwwwwwgf633DDDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUUݻwwwwwwwwwwwwwff633CDDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUU޻zwwwwwwwwwwwwff3333D3CDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUwwwwwwwwwwwwff333333CDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUwwwwwwwwwwwwff3333333DDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUwwwwwwwwwwwff3333333CDDDDDDDDDDDDDDDDDDDDDDDUUUUUEDTUUEwwwwwwwwwwwff33333333DDDDDDDDDDDDDDDDDDDDDDDDDDTUUUEUUDzwwwwwwwwwgf633333333twGDDDDDDDDDDDDDDDDDDDDDDDDDTUDDDDwwwwwwwwwgf633333333twwGDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDzwwwwvwwwgf633333333DtwwwDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwfvwgwf633333333CDwwwDDDDDDDDDDDDDDDDDDDDDDDDDDDDDzffwgff6333333333DwwwDDDDDDDDDDDDDDDDDDDDDDDDDDDDDzwfvfff3333333333DwwwGdDfffDDDDDDDDDDDDDDDDDDDDDDDzwfvf333333333333DtwwwwgfffDDDDDDDDDDDDDDDDDDDDDDDzwfv6333333333333DtwwwwwwwffDDDDDDDDDDDDDDDDDDDDDDwfvgf33333333333DfwwwwwwgffDDDDDDDDDDDDDDDDDDDDDDwfw63333333333CdvwwwwgfffDDDDDDDDDDDDDDDDDDDDDDwwvwwo3333333333CdfffgffffFDDDDDDDDDDDDDDDDDDDDDDwgwgwow6#""3""2#"CDdffffffDDDDDDDDDDDDDDDDDDDDDDDDzwwww|o?#2"2""""23DDfffffDDDDDDDDDDDDDDDDDDDDDDDDDϪzwzvwo?#2""""""23DDdfffDDDDDDDDDDDDDDDDDDDDDDDDDDgwwv?#2"""""""3DDdfFDD3CDDDDDDDDDDDDDDDDDDDDDDDzfw?#""""""""CDDdfFD433DDDDDDDDDDDDDDDDDDDDDDD鞙wwv?#"""""""2CDDff6333333DDDDDDDDDDDDDDDDDDDDDz|wwvgoo6#"""""""23DDff6333333DDDDDDDDDDDDDDDDDDDDDww|gfvgf3#"""""""23Dfff6Cw3333DDDDDDDDDDDDDDDDDDDDDwwwwgvww?3#"""""""3CDfff6s7333DDDDDDDDDDDDDDDDDDDDDzwwwwwwwwfff333"""""""3Dffff3s7333CDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwf633333"""""""3dfff63cw33333DDDDDDDDDDDDDDDDDDDDfwwwwwwwwwwff33333"""""""3dfff333333333FDDDDDDDDDDDDDDDDDDDgfwwwwwwwwwgff33333"""""""Cffff63333333cfDDDDDDDDDDDDDDDDDDDgfwwwwwwwwwfff33333"""""""Cfffff3333333ffDDDDDDDDDDDDDDDDDDDzgfwwwwwwwwwfff33333"""""""Cfffff6333333fffffffDDDDDDDDDDDDDD|gfwwwwwfvggf33#"#"""""""""C63fff6333333fffffffFDDDDDDDDDDDDDwgfwwwwgwwgff3333#"""""""""C6fcff6333333fffffffFDDD4CDDDDD433wwgfffffwgwwgvf3333#""""""""2C6fcff6333333ffffffffF3333DDDDD333gfffffffwgwwgffc633#""""""""2d6fcffff63cfffffffffff33333CDD3333wgfffffffwwfwgfcc6#2#"""""""""d63ffffff3ffffffffffff633333D43333|wwwwwffffwwwfgf3c633#""""""""2d66fffffffffffffffffffff3333333333wwwwwwwwwwwwwfgc6c633#""""""""2d6fcffffffffffffffffffff3333333333|wwwwwwwwwwwgvgc6c633#""""""""2f6fcffffffffffffffffffff3333333333|wwwwwwwwwwgfwwfff6#"#""""""""2ffffffffffffffffffffffff3333333333|wwwwwwwwwwwwwwgff6333#"""""""2ffffffffffffffffffffffff3333333333|wwwwwwwwwwwwwwgff6333""""""""2ffffffffffffffffffffffff3333333333|wwwwwwwwwwwwwwgff6333""""""""2fffffffffffffffffffffff33333333333|wwwwwwwwwwwwwwgff3333""""""""2ffffffffffffffffffffff633333333333|wwwwwwwwwwwwwwgff3333#"""""""2ffffffffffffffffffffff633333333333|wwwwwwwwwwwwwwwff33333"""""""2ffffffffffffffffffffff633333333333|wwwwwwwwwwwwwwwff33333"""""""2dffffffffffffffffffff6333333333333|wwwwwwwwwwwwwwwwgf33333"""""""2Dfffffffffffffffffff63333333333333wwwwwwwwwwwwwwwwwwwwwgf63333"""""""2Cfffffffffffffffffff63333333333333|ww|wwwwwwwwwwwwwwwwwwwwwwwwgff6333#"""""""3cffffffffffffffff6333333333333333wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfff3333#"""""""23fffffffffffffff33333333333333333wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgf633333#""""""""33ffffffffffff6333333333333333333wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwff333333"""""""""23cfffffffff333333333333333333333ffffffffwgfwwwwwwwwwwwwwfffwwwwwwgf633333#""""""""""33cff633333333333333333333333333fffffffffffffffffffffffffffvwwwwfff333333"""""""""""23333333333333333333333333333333fffffffffffff6333333333333fvwwwfff63333#"""""""""""""3333333333333333333333333333333fffffffffffff63333333333333fffffff63333#"""""""""""""2333333333333333333333333333333fffffffffffffff3333333333333333333333"""""""""""""""""""""""""""""""""""""#233333333ffffffffffffffff63333333333333333333#"""""""""""""""""""""""""""""""""""""""""""""""fffffffffffffffff6333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""ffffffffffffffff63333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""cfffffffffffffff3333333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""3cffffffffffffff33333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""ffffffffffff33f633333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""fffffffffffffff633333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""fffff333fffffff333333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""fffff333ffffff33c6333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""fffffffffffff3c63333333333333333333"""""""""""""""""""""""""""""""""""""""""""""""""ffff33c6cff63333333333333333333333#"""""""""""""""""""""""""""""""""""""""""""""""""ffff33f333333333333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""""ffff633333333333333333333333333333""""""""""""""""""""""""""""""""""""""""""""""""""cfff6333f333333333333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""fffff63cf633333333333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""ffff63333333333333333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""ff333333333333333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""""""fff63333333333333333333333333#""""""""""""""""""""""""""""""""""""""""""""""""""""""ffff333333333"""""2#"""233""2333"""""""""""""""""""""""""""""""""""""""""""""""!""3f63333333333333333333333333333#"""""""""""""""""""""""""""""""""""""""""""""3c63333333333333333333333333333"""""""""""""""""""""""""""""""""""""""""""""""""""""ffff3333333333333333333333333333"""""""""!"""""""""""""""""""""""""""""""""""""""""ffff3333333333333333333333333333""""""""""""""""""""""""""""""""""""""""""""""63333333333333333333333333333#2#"""""""""""""""""""""""""""""""""""""""""""""333c333333333333333333333333333"""""""!"""""""""""""""""""""""""""""""""""""333333333333333333333333"""""#""""""!""""""""""""""""""""""""""""!""""""3333333333333333333333#"""""""""""""!""""""""""""""""""""""""""""""""""""3333333333333333333333333#""""3#"""""""""""""""""""""""""""""""""""""""3333333333333""""3333333333#"""""""!"""""""""""""""""""""""""""""""""""3333333333333""33333333#"23#""""""!""""""""""""""""""""""""""""""33333333333333333333""3#3#""""""""""""""""""""""""""""""""""3333333333333333333333""""33""""""!""""""""!"!"""""""3333333333333333""23333333333"3#"""""""""""!"""""3333333333333#""""""2333"2333"""""!""""!"""3333333333333#"""""!""""""3#""""""!""""!""""333333333333333"""""!"""""""""""""""!""""!""3333333333333333#""""""""""""""""""!"!"3333333333333333333"""""!"""""""""!"3333333333333333333#""""""""!""""""""""""!33333333333333333333""2""""""""""""!""""""""3333333333333333#"33333""""""""""""""!""""""""3333333333333333333333"""""""""""""""""""""""""33333333333#""""233333""""""""""!"!"""""""""""""!3333333333#"""""""2333"""""""""""""""33333333#"2333#"3""""""""""""""""""!""33333333333#"3333""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUEDDDDDDݝ\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݙUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݙUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݝ\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݙUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݝ\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݙUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݙUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\flFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUffDTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUffDDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlff4CUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlff43TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlff43CUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlfF333D43UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlfF333333TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlfF333333SUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlfF333333CUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwlfF33C4333TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUffF33C4333CUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwffF4333333CUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwfffF4333333CU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwflfF43333333U\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwfflfffF43333333TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwlfffffD44333333CUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwff4dDD34333333CUUUUUUUUUUUUUUUUUUUUUUUUUUUUUww̼̬fff333334333333CU\UUeUUUUUUUUUUUUUUUUUUUUUUUUUwwww̪fnf33333333333CUlffffffUUUUUUUUUUUUUUUUUUUUUUwwwwwwww63333333333CUlffffUUUUUUUUUUUUUUUUUUUUUwwwwwln33333333333UfffUUUUUUUUUUUUUUUUUUUUUwwwlnf6#""3""2#"2UffffVUUUUUUUUUUUUUUUUUUUUUwwwnf>#3#3"33#2"TfffffVUUUUUUUUUUUUUUUUUUUUUUwwwwwwww>#3#2"33#23TUfffffFVUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwl>#3#3""2#"2UUeffff3SUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwln>#""3""2#"2UUefff433DDUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwnn6#333"33#22UUef6333333UUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwlfff6#333""2#23UUef63D3333UUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwffln3#333""2#23TUef6C5333UUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwlf633333#"233CUUff6Y333TUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwfff633333333333SUeff3c\333CUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwn檪f63333333333333SUef63363333TUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwn檪ff3333333333333Teff633333333dVUUUUUUUUUUUUUUUUUUwwwwwwwwwwwLìff4333333333333Tffff3333333CfVUUUUUUUUUUUUUUUUUUwwwwwwwLfff4333333333333effff6333333dfVUUUUUUUUUUUUUUUUUUwwwwwwwLcfff43333333#"333effff6333333fffUUUUUUUUUUUUUUUUUUwwwwwww3<333333UUUU=3;333""SUUU53333333,""UU33<3<,"""""""!,"""""!"""!"UUUU[D)"""""""""""""""""""""""""""""""""""[[u""""""""""""""""""""""""""""""""""[Zu""""""""""""""""""""""""""""""""""UUZG"""""""""""""""""""""""""""""""""""UUwG93""""""""""""""""""""""""""""""""""""UUUUwD33""""""""""""""""""""""""""""""""""""[UUUUuD3333""""""""""""""""""""""""""""""""""""[UUUUUyuD33333#"""""""""""""""""""""""""""""""""""UUUUUUyuD333333"""""""""""""""""""""""""""""""""""UUUUUUzwDD33333"""""""""""""""""""""""""""""""""""ݽݽ[UUUUUywGD933"""""""""""""""""""""""""""""""""""ݻUUUUUUywwD)""""")"""""""""""""""""""""""""""ݻUUUUUUUzwwG"""""""""""""""""""""""""""ݽUUUUUUUUwwwG"""""""""""""""""""""""""""ݽ[UUUUUUUwwwG)"""""""""""""""""""""""""""ݻ[UUUUUUwwwG)"""""""""""""""""""""""""""ݻ[UUUUwwwG)"""""""""""""""""""""""""""ݽݽUUUUwwwG"""""""""""""""""""""""""""""ݻݽUUUUUwwwG"""""""""""""""""""""""""""""ݽUUUUUwwwG"""""""""""""""""""""""""""""ݽ[UUUUUUwwwG"""""""""""""""""""""""""""""ݽUUUUUUUwwwGD"""""""""""""""""""""""""""""ݻUUUUUUUUzwwwGD""""""""""""""""""""""""""""""ݻ[UUUUUUUUUZwwwGD""""""""""""""""""""""""""""""m[UUUUUUUUUUUUwwwGD93"""""""""""""""""""""""""""""m[UUUUUUUUUUUUuwwuwwwGDD33"""""""""""""""""""""""""""""mU[UUUUUUUUUUUUUZUwwwuwwwGD3""""""""""""""""""""""""""""""fUUUUUUUUUUUUUUUZUUwwwwwwwGD33""""""""""""""""""""""""""""""ݽUUUUUUUUUUUUUUUUUUwwwwwwwGD9333""""""""""""""""""""""""""""""ݻUUUUUUUUUUUUUUUZUUUwwwwwwwGD333333#""""""""""""""""""""""""""""""[UUUUUUUUUUUUUUUUUUUUwwwwwwwwD9333333#""""""""""""""""""""""""""""""ݽ[UUUUUUUUUUUUUUUUUUUwwwwwwwwwD93333333#""""""""""""""""""""""""""""""ݽUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwD93333333#""""""""""""""""""""""""""""""]UUUUUUUUUUUUUUUUUUUUUuwwwwwwwwwD9333333333#""""""""""""""""""""""""""""""\UUUUUUUUUUUUUUUUUUUUUvwwwwwwwwwGD9333333333#""""""""""""""""""""""""""""""VUUUUUUUUUUUUUUUUUUUUgvwwwwwwwwwGD333333333#""""""""""""""""""""""""""""""mffUUUUUUUUUUUUUUUUUUUfvwwwwwwwwwGD333333333!"""""""""""""""""""""""""""""fffVUUUUUUUUUUUUUUUUevwwwwwwwwwwG33333333!")""""""""""""""""""""""""""fffVUUUUUUUUUUUUUUUevwwwwwwwwwwG93333333!")"""""""""""""""""""""""""lffffUUUUUUUUUUUUUewwwwwwwwwwwD93333333!""""""""""""""""""""""""""ffffUUUUUUUUUUUUUewDtwwwwwwwwD9333333!")""""""""""""""""""""""""fffVUUUUUUUUUUUUewDtwwwwDDwDD333333!")"""""""""""""""""""""""fffUUUUUUUUUUUUewDwwwwDDDwDD333333!")"""""""""""""""""""""""lfffUUUUUUUUUUUuwwwwwwDDDtD9333333!"""""""""""""""""""""""ffffUUUUUUUUUUuwwwwwGDDDDD3333333"""""""""""""""""""""lfffVUUUUUUUUUuwwwwwGDDDD3333333!)"""""""""""""lffVUUUUUUUUuwwwwwGIDD93333333!)""""""""""""ffUUUUUUUUvwwwwwG3333333!""""""""""""fffVUUUffefwwwwwD93333333!""""")""lffffffffffwtwwGD93333333!)fffffffffffGDwwGD3333333!"fffffffffffwwwwDD3333333""lffffffffffwwwwGDDD3333333""lffffffffffwwwwGDtG93333333!""fffffffffffvwwwGDwD933333333!2"fffffffffffffwwGDDG33333333331"lfffffffffffffwwDDtG933333333333ffflfffffffffffffvwwDDtDD933333333333lffffffffffffffvgffwwwDDDDDD333333333333lffffffffffffffwwgwwwGDDDDD333333333333fflfffffffffffffffwwwwwDDDDDDD333333333333lfffffffffffffffffffwwwwwDDDDDDD93333313lfffffffffffvgffffvwwwwwDDDDDDD93333lffffffffUUgwwwwwfwwwwwwDDDDDDD93333)lfffffffVUUgwwwwwwwwwwwwGDDDDD9333"lfffffffVUUgwwwwwwwwwwwwwGDDDD9331fffffffffUwwwwwwwwwwwwwwwGDDD9331ffffffffffwwwwwwwwwwwwwwwGDDD933313lfffffffffvwwwwwwwwwwwwwwwwDDD9331313)lfffffffffwwwwwwwwwwwwwwwwwGDD933133133lffffffffwwwwwwwwwwwwwwwwwwwGD933333133lfffffffwwwwwwwwwwwwwwwwwwwwDD931333331333fffffffvwwwwwwwwwwwwwwwwwwwwDD9313333333"393lfffffffvwwwwwwwwwwwwwwwwwvwGDD9333333333333)"333339lfffffffffvwwwwwwwwwwwwwGDwwwwGDD9333333333333233333333333fffffffffffwwwwwwwwwwwwwGDDwwwGDDD33133333333393333333333333ffffffffffvwwwwwwwwwwwwGDDtwwwDDDD33133333313339333333333333333ffffffffffvwwwwwwwwwwwwDDDwwwwDDDD33333333133393333333333333333ffffffffffwwwwwwwwwwwwwDDtwwwwGDDD3333333313393333333333333333ffffffffffwwwwwwwwwwwwGDDwwwwwGD933133333313393333333333333333fffffffffwwwwwwwwwwwwGDDDwwwwwGD333133333313393333333333333333wwgfvwwwwwwwwwwwwwwwwGDDtwwGtwDD333333333333393333333333333333wwwwwwwwwwwwwwwwwwwwwwDDwwGDDDDD933333333333333333333333333333wwwwwwwwwwwwwwwwwwwwwwGtwwDDDDDD3333333333933333333333333333wwwwwwwwwwwwwwwwwwvwwwwwwGDDDDDD3333333333399333333333333333333wwwwwwwwwwwwwwwDwgvwwwwwwDDDDDDD9333331333333333333333333333333333333wwwwwwwwwwwwwwDtwwwwwGDwwDDDDDD333333333333133333339333333333333333333333333IDDDDwwwGDDwwwwwGDDDDDDDDDD3333333333333333133333333333333333333333333IDwwwwGDDDDDDDD99333333313313333333333333333333333333IwwwwDDDDDDDD39333331333333333333333333333333339DDDD9393333333333333333333333399393333393333333133333333333313333333333333333333333333333333333333333333333333333333333333333331333333333933333333333333333333333311339333333333333333333333333333333333333333333333333333339333333333333333333333333333933393333133333333333333333333313333333333333333333333333333333333333933333333333333333333333399333333333333331133333333333333333333331333333333333933333313333333333333313333133333333333333193333333333333333333313333933333333333333339333333333333333333333333333331333333333333339333333333933333333333333333333333333333331313333333YUUUUUUUUUUUUUUUUUEDDDUUUDUUDDDDDDDDDDDDDDD""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUEDTUEDDDDDDDDDDDDDDDD""""""""""""""""""""""""YUUUUUUUUUUUUUUUUUUUUUUEDDDDDDDDDDDDDDDDDDDD$"""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUUEDDDDDDDDDDDDDDDDDDDDD$""""""""""""""""""""""YUUUUUUUUUUUUUUUUUUUUUeUDDDDDDDDDDDDDDDDDDDDDDDDD"D""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUeUDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUeVEDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUfVUDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""""""""""""UUUUUUUUUUUUUUUUUUUUUUffUEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"BDDD"""""""UUUUUUUUUUUUUUUUUUUUUUffVEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""YUUUUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""YUUUUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""YUUUUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""UUUUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""YUUUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""YUUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""YUUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""YUUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""UUUUUUUUUUUUUUUUUUUfffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""YUUUUUUUUUUUUUUUUUUeffUEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""UUUUUUUUUUUUUUUUUUeffUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""""UUUUUUUUUUUUUUUUUUfffVDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$B"""""""YUUUUUUUUUUUUUUUUUfffVEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDB"""""""""UUUUUUUUUUUUUUUUefffVUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""UUUUUUUUUUUUUUUUffffVUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""""""""UUUUUUUUUUUUUUUUffffVUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""YUUUUUUUUUUUUUUeffffUUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""""""YUUUUUUUUUUUUUUeffffUUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""""""UUUUUUUUUefVUUeffffUUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""""""UUUUUUUUUffffVeffffVUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""""""YUUUUUUUeffffffffffVUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""UUUUUUUeffffffffffVEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""""""YUUUUUUUfffffffffffVEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""""YUUUUUUUffffffffffffUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""""YUUUUUUeffffffffffffVEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$D""""""YUUUUUeffffffffffffVEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""XUUUUUfffffffffffffVEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""""""gVUUUUfffffffffffffUDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$"""""xwfUUUefffffffffffffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""B"wwwwgUUefffffffffffffEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwUefffffffffffffVDDDDDDDDDDCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwgffffffffffffffVDDDDDDDDD4CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwgffffffffffffffUDDDDDDDDD43DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwffffffffffUUffUDDDDDDDDD3#"""BDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwgffffffffVUUeVUDDDDDDDDD3#"B""DDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwffffffffVETeUEDDDDDDDDD3""""DDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwffffffffVDDUUEDDDDDDDC333""""DDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwfffffffUDDTDDDDDDDDD3333""""DDEDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwfffffffEDDDDDDDDDDD4333""""DDEDDDDDDDDDDDDDDDDDDDDDDDDDwwwwxwwwwwgffffffEDDDDDDDDDDD4333"""DDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwxwwwwwfffffffVDDDDDDDDDDD4333!BDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwfffffffVEDDDDDDDDDD3333"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwwwwwffffffffEDDDDDD3DD43333BDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwwwwwwffffffffEDDDDDD33333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwfffffffVEDDDDD433333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgwwfffffffVDDDDDD333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgfffwfffffffVDDDDD4333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwwwwwwwwgfffffffffffVEDDDD3333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwgffffffffffffEDDD43333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwwwwffffffffffffVDDD433333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwxwwwwwwwwwwwwwwwwwffffffffffefVDDD333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwwgfvgfffffffffffefEDDD333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwwwwwwwwwfffffffffffffffUfEDD4333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwwgffffffffffffffUfEDD4333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwgfwwgfffffffffffffffVfEDD3333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwwwgfgfffffffffffffffffVVDD43333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxwwwwwwwwgffffffffffffffffffffVDD43333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgffffffffffffffffffffUDD43333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwgffffffffffffffffffffUDD4333333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwggfffffffffffffffffffffUDD4333333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwfffffffffffffffffffffffVDD4333333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwfffffffffffffffffffffffVDD4333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwfffffffffffffffffffffffVDD433333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwfffffffffffffffffffffffUDD43333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgfffffffffffffffffffffffUDD43333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgffffffffffffffffffffffVEDDD3333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgffffffffffffffffffffffUEDDD3333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgfffffffffffffffffffffVUEDDD3333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwgffffffffffffffffffffVUUDDDD333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwgfffffffffffffffffffffVEDDDDD333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwgfffffffffffffffffffffffVEDDDDD333333CD43333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwffffffffffffffffffffffffffffffVUDDDD4333333DD43333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDfffffffffffffffffffffffffffffffVUDDDD43333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDfffffffffffffffffffffffffffffffVUDDD433333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDfffffffffffffffffffffffffffffffVEDDD333333333333333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDffffffffffffffffffffffffffffUUUUDDD4333D43DD3333133DDDDD4CDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUffefffffffffffVUUUUDDDD33CDDDDD43333CD33333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUefffffeffffVUDDDDDDDD3DDDDDD43333CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDeffffVUUUUUUEDDDDDDDDDCDDDDD333ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUfffUUDDDDDDDDDDDDDDDDCDDDD3331DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD3DDDDDDD3CDDD4333CDDDDDDDDDDDDDDDDDDDDD$"DDDDDDDDDDDDDDDDDDDDDDDDDDD43333333333333333ADDDDDDDDDDDDDD333!DDDDDDDDDDDDDDDDDDDDDDDDDDD4333333333133DDDDDDDDDD43333!DDDDDDDDDDDDDDDDDDDDDDDDDDD33333333313433333DDDDDDDDDDDDDDDDDDDDDDDDDD3333333333DDDDDDDDDDDDDDDDDDDDDDD4333333333333DDDDDDDDDDDDDDDDDDDDDDD4333333333333DDDDDDDDDDDDDDDDDDDDDDDDD333333333333DDDDDDDDDDD4CD43CDD33CDD433333333333DDDDDDDDDDD43DDDD3333C43333333333333DDDDDDDD3DDDDDDDD3C333433C333333333DDDDDDD43DDDDDDDDDD433433333C33333DDDDDDDDD3DDDDD4CDD33333333333333333DDDDDDDDDDDDDDDD4CD33333333333333333DDDDDDDDDDDDDDD43333333333333333333DDDDDDDDDDDD33133313333333333333DDDDDDDDDDD333333333333333333DDDDDDDDDDD333113133333DDDDDDDDDDDDDD333333333333333DDDDDD433DDD433333333DDDDD433333333D333331DDDDDDDCDD433311D43333DDDDDDDD33DDDDD4D3313331333DDDDDDDDD333433D43DDDDDDDDD433DDDDDDDDDDDDDD4333333DDDDDDDDDDD3333333333133333DDDDDDDDDDD4333333331333333333DDDDDDDDDDDD433133333333333333333CDDD333333331333333333333333331333133333D333CD433333331343431333333333433333333331333 \ No newline at end of file diff --git a/assets/6x8 font/LICENSE.txt b/assets/6x8 font/LICENSE.txt new file mode 100644 index 0000000..00e4e50 --- /dev/null +++ b/assets/6x8 font/LICENSE.txt @@ -0,0 +1 @@ +The 6x8 pixel font used in the program is a slightly modified version of the "even" font created by Christian Munk (CMunk), which can be found at https://fontstruct.com/fontstructions/show/275268/even_2. The "even" font is lincesed under Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0). Original License URL: https://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/assets/6x8 font/char 6x8 v3-3.png b/assets/6x8 font/char 6x8 v3-3.png new file mode 100644 index 0000000..ace7812 Binary files /dev/null and b/assets/6x8 font/char 6x8 v3-3.png differ diff --git a/assets/6x8 font/char 6x8 v4.png b/assets/6x8 font/char 6x8 v4.png new file mode 100644 index 0000000..0569e37 Binary files /dev/null and b/assets/6x8 font/char 6x8 v4.png differ diff --git a/assets/Mine Sweeper Text.txt b/assets/Mine Sweeper Text.txt new file mode 100644 index 0000000..00c35f9 --- /dev/null +++ b/assets/Mine Sweeper Text.txt @@ -0,0 +1,94 @@ +@ +Classic MineSweeper: \M; +Knight Sweeper: \K; +All Modes: \F; +Custom: !; +Leaderboard: \L; +Settings: \G; +Help: ?; +Exit Game: \E; +@ +Quick Game:; +Game Mode: \K; +Preset: \F; +Size: #; +Difficulty: %; +Start Game: \M; +Custom: \G; +Main Menu: \E; +@ +Pattern Selection: \F; +Random Mode: ?; +Select Preset: \M; +Custom Game: \G; +Main Menu: \E; +@ +Game Mode: \K; +Size X:; +Size Y:; +Mine Count: \M; +Percentage: %; +Start Game: \F; +Main Menu: \E; +@ +High Scores: \L; +1.; +2.; +3.; +4.; +5.; +6.; +Game Mode: \K; +Main Menu: \E; +@ +Safe Guessing:; + +Cording (Alpha):; +Maximum FPS:; +Version:; +Main Menu \E; +@ +Video Mode:; +Background Effects:; +Accessibility Mode:; +@ +Super Sweeper is a version of MineSweeper; +for the Ti84CE with several modes and; +features. To play, one can start a quick; +game from the main menu, this includes; +options for different difficulties and; +presets. Once in a game, your objective; +is to safely Flag \F all the Mines \M by; +using the numbered tiles as clues to; +figure out where each Mine \M is located.; +; +Use Alpha to search a tile, 2nd to Flag \F; +a tile, Y= to mark a ? onto a tile, XT0n; +to chord, mode to pause, and del to quit.; +; +I hope you enjoy my game :); +@ +Paused:; +Resume Game; +Restart; +Main Menu; +Exit Application; +Remaining Tiles:; +Time Taken:; +@ +Game Over!; +Restart; +Main Menu; +Resume Game; +Exit Application; +Remaining Tiles:; +Time Taken:; +@ +Game Complete!; +Resume Game; +Restart; +Main Menu; +Exit Application; +Score:; +Time Taken:; +@ \ No newline at end of file diff --git a/assets/colors.txt b/assets/colors.txt new file mode 100644 index 0000000..281033f --- /dev/null +++ b/assets/colors.txt @@ -0,0 +1,33 @@ +256 Color Table + +0-F: Standard 4bit +0 Black +1 Maroon +2 Green +3 Olive +4 Navy +5 Purple +6 Cyan +7 Silver +8 Gray +9 Red +A Lime +B Yellow +C Blue +D Fuchsia +E Teal +F White + +10 Orange + +11-16: Fade Colors +11 Similiar to Cyan +16 Similiar to teal + +17 Similiar to Red, Mine Highlight + +18-1B: LCD Colors +18 Similiar to Red +19 Darker Maroon +1A Similiar to Black +1B Similiar to Silver \ No newline at end of file diff --git a/assets/keypad/Collasped 0.png b/assets/keypad/Collasped 0.png new file mode 100644 index 0000000..46855d0 Binary files /dev/null and b/assets/keypad/Collasped 0.png differ diff --git a/assets/keypad/Collasped 1.png b/assets/keypad/Collasped 1.png new file mode 100644 index 0000000..09e4821 Binary files /dev/null and b/assets/keypad/Collasped 1.png differ diff --git a/assets/keypad/Collasped 2.png b/assets/keypad/Collasped 2.png new file mode 100644 index 0000000..d82b3f0 Binary files /dev/null and b/assets/keypad/Collasped 2.png differ diff --git a/assets/keypad/Expanded 0.png b/assets/keypad/Expanded 0.png new file mode 100644 index 0000000..307ab70 Binary files /dev/null and b/assets/keypad/Expanded 0.png differ diff --git a/assets/keypad/Expanded 1.png b/assets/keypad/Expanded 1.png new file mode 100644 index 0000000..7915d61 Binary files /dev/null and b/assets/keypad/Expanded 1.png differ diff --git a/assets/keypad/Expanded 2.png b/assets/keypad/Expanded 2.png new file mode 100644 index 0000000..e9ce08b Binary files /dev/null and b/assets/keypad/Expanded 2.png differ diff --git a/assets/keypad/Keypad 0.png b/assets/keypad/Keypad 0.png new file mode 100644 index 0000000..2a17c68 Binary files /dev/null and b/assets/keypad/Keypad 0.png differ diff --git a/assets/keypad/Keypad 1.png b/assets/keypad/Keypad 1.png new file mode 100644 index 0000000..db13d37 Binary files /dev/null and b/assets/keypad/Keypad 1.png differ diff --git a/assets/keypad/Keypad 2.png b/assets/keypad/Keypad 2.png new file mode 100644 index 0000000..ab7a6cf Binary files /dev/null and b/assets/keypad/Keypad 2.png differ diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/build/.gitignore b/build/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/build/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..3d0ca55 Binary files /dev/null and b/icon.png differ diff --git a/lib/.gitignore b/lib/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/lib/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..dfe2cf5 --- /dev/null +++ b/makefile @@ -0,0 +1,38 @@ +# DEPRECATED +# USE CMAKELISTS.TXT INSTEAD + +#g++ main.cpp ./glad/src/glad.c -I./glad/include -o prog.exe -lmingw32 -lSDL2main -lSDL2 + +#SRC_FILES = $(wildcard $(SRC_DIR)/*.cpp) +#OBJ_FILES = $(patsubst $(SRC_DIR)/%.cpp,$(BIN_DIR)/%.o,$(SRC_FILES)) $(BIN_DIR)/glad.o + +#Compilier +CC = g++ +# Directories +SRC_DIR = ./src ./glad/src +OBJ_DIR = ./obj +BIN_DIR = ./bin + +# Output +BIN_OUTPUT = ./bin/Super-Sweeper-v77.exe +# Sources +SRC_FILES = ./src/main.c ./glad/src/glad.c + +# Flags +CFLAGS = -I./glad/include +LDFLAGS = -lmingw32 -lSDL2main -lSDL2 -mwindows -static-libgcc -static-libstdc++ +OBJ = $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) + +$(BIN_OUTPUT): $(OBJ) + $(CC) $(OBJ) $(CFLAGS) -o $@ $(LDFLAGS) -O3 + +($OBJ_DIR)/%.o: %.cpp + $(CC) $(CFLAGS) -c $< -o $@ + +($OBJ_DIR)/%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + rm -f $(BIN_DIR)/* + +.PHONY: $(BIN_OUTPUT) clean \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..25e5579 Binary files /dev/null and b/screenshot.png differ diff --git a/src/Super CSV/bin/.gitignore b/src/Super CSV/bin/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/src/Super CSV/bin/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/src/Super CSV/input.csv b/src/Super CSV/input.csv new file mode 100644 index 0000000..fa25602 --- /dev/null +++ b/src/Super CSV/input.csv @@ -0,0 +1,74 @@ +Type,void*,uint8_t,uint8_t,void*,uint8_t,uint16_t,0,1,2,3,4,5,6,7 +Headers,Function,Previous,,,,,,,,,,,, +Boxes,Function,Direct,Color,Pointer,Minimum Value,Maximum Value,Click,Scroll,Dial,Direct,Value,Dot,Boolean,Text +@Main Menu,,@Exit,,,,,,,,,,,, +Classic MineSweeper: \M,modeSet,@Quick Game,0x05,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Knight Sweeper: \K,modeSet,@Quick Game,0x0B,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +All Modes: \F,,@All Modes,0x09,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Custom: !,,@Custom Game,0x0C,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Leaderboard: \L,,@Leaderboard,0x06,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Settings: \G,,@Settings,0x02,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Help: ?,,@Help,0x01,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Exit Game: \E,quitGame,@Main Menu,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Quick Game,buildPattern,@Main Menu,,,,,,,,,,,, +Quick Game:,,,0x05,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Game Mode: \K,drawPattern,,0x08,&gameMode,0,16,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Preset: \F,,,0x08,&quickPreset,,,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE +Size: #,,,0x08,&quickSize,,,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE +Difficulty: %,,,0x08,&quickSkill,,,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE +Start Game: \M,gameStart,,0x07,,,,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Custom: \G,,@Custom Game,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Main Menu: \E,,@Main Menu,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@All Modes,buildPattern,@Main Menu,,,,,,,,,,,, +Pattern Selection: \F,drawPattern,,0x0A,&gameMode,0,16,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Random Mode: ?,randomMode,,0x0E,&gameMode,,,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Quick Game: \M,,@Quick Game,0x07,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Custom Game: \G,,@Custom Game,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Main Menu: \E,,@Main Menu,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Custom Game,buildPattern,@Main Menu,,,,,,,,,,,, +Game Mode: \K,drawPattern,,0x08,&gameMode,0,16,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Size X:,boardCent,,0x08,&sizeX,8,52,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Size Y:,boardCent,,0x08,&sizeY,8,27,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Mine Count: \M,mineCent,,0x09,&chance,8,702,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Percentage: %,perCent,,0x08,&percent,5,50,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Start Game: \F,gameStart,,0x01,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Main Menu: \E,,@Main Menu,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Leaderboard,leadChange,@Main Menu,,,,,,,,,,,, +High Scores: \L,,,0x05,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +1.,,,0x08,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +2.,,,0x08,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +3.,,,0x08,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +4.,,,0x08,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +5.,,,0x08,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +6.,,,0x08,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Game Mode: \K,leadChange,,0x0A,&gameMode,0,16,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Main Menu: \E,,@Main Menu,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Settings,versionText,@Main Menu,,,,,,,,,,,, +Swap Alpha and 2nd,swapPrimaries,,0x01,&swapAlphaSecondBind,0,1,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE +Game Settings,,@Game Settings,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Video Settings,,@Video Settings,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Data Management,,@Data Settings,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +Version:,,,0x07,,,,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Main Menu \E,,@Main Menu,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Game Settings,,@Settings,,,,,,,,,,,, +Safe Guessing,,,0x09,&safeGuess,0,2,FALSE,FALSE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE +Chording,,,0x08,&chording,0,1,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE +Auto Solver,,,0x08,&autoSolver,0,2,FALSE,FALSE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE +Return \E,,@Settings,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Video Settings,testGraphic,@Settings,,,,,,,,,,,, +Video Mode,videoUpdate,,0x0B,&displayMode,0,3,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE +Accessibility Mode,accessSet,,0x08,&accessMode,0,1,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE +Background Effects,,,0x08,&fadeEffect,0,2,FALSE,FALSE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE +Cursor Graphic (Alpha),,,0x08,&cursorGraphic,0,1,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE +Enable Movie Intro,,,0x0C,&movieIntro,0,1,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE +Maximum FPS,fpsUpdate,,0x05,&fpsT,6,1080,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Return \E,,@Settings,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Data Settings,,@Settings,,,,,,,,,,,, +Auto Save Count,,,0x08,&autoSaveMax,0,3,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE +Clear Auto Saves,,,0x08,,,,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Clear Leaderboard,,,0x08,,,,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Clear All Data,,,0x09,,,,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE +Return \E,,@Settings,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Help,helpText,@Main Menu,,,,,,,,,,,, +Main Menu \E,,@Main Menu,0x08,,,,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE +@Exit,quitGame,@Main Menu,,,,,,,,,,,, \ No newline at end of file diff --git a/src/Super CSV/makefile b/src/Super CSV/makefile new file mode 100644 index 0000000..167bf76 --- /dev/null +++ b/src/Super CSV/makefile @@ -0,0 +1,10 @@ +# ---------------------------- +# Makefile Options +# ---------------------------- +bin/MenuBuilder: obj/main.o + gcc $^ -o bin/MenuBuilder + +obj/main.o: src/main.c + gcc -c $< -o "$@" + +# ---------------------------- \ No newline at end of file diff --git a/src/Super CSV/output.txt b/src/Super CSV/output.txt new file mode 100644 index 0000000..9d39aae --- /dev/null +++ b/src/Super CSV/output.txt @@ -0,0 +1,16 @@ + +void (*menuFunction[11])() = {0,buildPattern,buildPattern,buildPattern,0,versionText,0,testGraphic,0,helpText,quitGame}; +uint8_t menuBack[11] = {10,0,0,0,0,0,5,5,5,0,0}; +uint16_t boxIndex[12] = {0,8,16,21,28,37,43,47,54,59,60,60}; +uint8_t menuRows[11] = {8,8,5,7,9,6,4,7,5,1,1}; + +uint8_t boxType[60] = {9,9,9,9,9,9,9,9,0,22,4,4,4,1,9,9,22,1,9,9,9,22,22,22,22,22,9,9,0,0,0,0,0,0,0,22,9,65,9,9,9,0,9,52,65,52,9,54,65,52,65,65,22,9,21,1,1,1,9,9}; +uint8_t boxColor[60] = {5,11,9,12,6,2,1,8,5,8,8,8,8,7,8,8,10,14,7,8,8,8,8,8,9,8,1,8,5,8,8,8,8,8,8,10,8,1,8,8,8,7,8,9,8,8,8,11,8,8,8,12,5,8,8,8,8,9,8,8}; +uint8_t boxDirect[60] = {1,1,2,3,4,5,9,0,0,0,0,0,0,0,3,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,8,0,0,0,0,0,5,0,0,0,0,0,0,5,0,0,0,0,5,0}; +uint16_t textIndex[61] = {0,23,41,54,64,79,91,99,112,124,137,147,155,169,183,193,206,227,242,256,271,284,297,305,313,327,341,355,368,383,386,389,392,395,398,401,414,427,446,460,475,491,500,512,526,535,547,556,567,586,605,628,647,659,668,684,701,719,734,743,755}; +void (*boxFunction[60])() = {modeSet,modeSet,0,0,0,0,0,quitGame,0,drawPattern,0,0,0,gameLoop,0,0,drawPattern,randomMode,0,0,0,drawPattern,boardCent,boardCent,mineCent,perCent,gameLoop,0,0,0,0,0,0,0,0,leadChange,0,swapPrimaries,0,0,0,0,0,0,0,0,0,videoUpdate,accessSet,0,0,0,fpsUpdate,0,0,0,0,0,0,0}; +void* boxPointer[60] = {0,0,0,0,0,0,0,0,0,&gameMode,&quickPreset,&quickSize,&quickSkill,0,0,0,&gameMode,&gameMode,0,0,0,&gameMode,&sizeX,&sizeY,&chance,&percent,0,0,0,0,0,0,0,0,0,&gameMode,0,&swapAlphaSecondBind,0,0,0,0,0,&safeGuess,&chording,&autoSolver,0,&displayMode,&accessMode,&fadeEffect,&cursorGraphic,&movieIntro,&fpsT,0,&autoSaveMax,0,0,0,0,0}; +uint8_t boxMin[60] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0}; +uint16_t boxMax[60] = {0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,16,0,0,0,0,16,52,27,702,50,0,0,0,0,0,0,0,0,0,16,0,1,0,0,0,0,0,2,1,2,0,3,1,2,1,1,1080,0,3,0,0,0,0,0}; + +uint8_t sourceText[755] = {66,101,90,108,108,98,92,32,76,98,103,94,82,112,94,94,105,94,107,39,32,25,33,74,103,98,96,97,109,32,82,112,94,94,105,94,107,39,32,30,33,64,101,101,32,76,104,93,94,108,39,32,26,33,66,110,108,109,104,102,39,32,48,33,75,94,90,93,94,107,91,104,90,107,93,39,32,44,33,82,94,109,109,98,103,96,108,39,32,43,33,71,94,101,105,39,32,27,33,68,113,98,109,32,70,90,102,94,39,32,45,33,80,110,98,92,100,32,70,90,102,94,39,33,70,90,102,94,32,76,104,93,94,39,32,30,33,79,107,94,108,94,109,39,32,26,33,82,98,115,94,39,32,46,33,67,98,95,95,98,92,110,101,109,114,39,32,41,33,82,109,90,107,109,32,70,90,102,94,39,32,25,33,66,110,108,109,104,102,39,32,43,33,76,90,98,103,32,76,94,103,110,39,32,45,33,79,90,109,109,94,107,103,32,82,94,101,94,92,109,98,104,103,39,32,26,33,81,90,103,93,104,102,32,76,104,93,94,39,32,27,33,80,110,98,92,100,32,70,90,102,94,39,32,25,33,66,110,108,109,104,102,32,70,90,102,94,39,32,43,33,76,90,98,103,32,76,94,103,110,39,32,45,33,70,90,102,94,32,76,104,93,94,39,32,30,33,82,98,115,94,32,87,39,33,82,98,115,94,32,88,39,33,76,98,103,94,32,66,104,110,103,109,39,32,25,33,79,94,107,92,94,103,109,90,96,94,39,32,41,33,82,109,90,107,109,32,70,90,102,94,39,32,26,33,76,90,98,103,32,76,94,103,110,39,32,45,33,71,98,96,97,32,82,92,104,107,94,108,39,32,44,33,1,34,33,2,34,33,3,34,33,4,34,33,5,34,33,6,34,33,70,90,102,94,32,76,104,93,94,39,32,30,33,76,90,98,103,32,76,94,103,110,39,32,45,33,82,112,90,105,32,64,101,105,97,90,32,90,103,93,32,2,103,93,33,70,90,102,94,32,82,94,109,109,98,103,96,108,33,85,98,93,94,104,32,82,94,109,109,98,103,96,108,33,67,90,109,90,32,76,90,103,90,96,94,102,94,103,109,33,85,94,107,108,98,104,103,39,33,76,90,98,103,32,76,94,103,110,32,45,33,82,90,95,94,32,70,110,94,108,108,98,103,96,33,66,97,104,107,93,98,103,96,33,64,110,109,104,32,82,104,101,111,94,107,33,81,94,109,110,107,103,32,45,33,85,98,93,94,104,32,76,104,93,94,33,64,92,92,94,108,108,98,91,98,101,98,109,114,32,76,104,93,94,33,65,90,92,100,96,107,104,110,103,93,32,68,95,95,94,92,109,108,33,66,110,107,108,104,107,32,70,107,90,105,97,98,92,32,37,64,101,105,97,90,38,33,68,103,90,91,101,94,32,76,104,111,98,94,32,72,103,109,107,104,33,76,90,113,98,102,110,102,32,69,79,82,33,81,94,109,110,107,103,32,45,33,64,110,109,104,32,82,90,111,94,32,66,104,110,103,109,33,66,101,94,90,107,32,64,110,109,104,32,82,90,111,94,108,33,66,101,94,90,107,32,75,94,90,93,94,107,91,104,90,107,93,33,66,101,94,90,107,32,64,101,101,32,67,90,109,90,33,81,94,109,110,107,103,32,45,33,76,90,98,103,32,76,94,103,110,32,45,33}; \ No newline at end of file diff --git a/src/Super CSV/src/main.c b/src/Super CSV/src/main.c new file mode 100644 index 0000000..8bdbfa5 --- /dev/null +++ b/src/Super CSV/src/main.c @@ -0,0 +1,620 @@ +#include + +#include + +#include + +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +#define menuDataSize (3+2+1+1) +#define boxDataSize (1+1+1+2+3+3+1+2) + +char fileName[] = "input.csv"; +FILE * Iptr; +FILE * Optr; +//char* input; +char input[65536]; // Should be large enough +u32 len = 0; +u32 lines = 0; +u32 textPos = 0; + +struct String { + char str[40]; // Better hope it works +}; + +struct Menu { + struct String func; + u16 boxes; + u8 rows; + u8 backI; + struct String backS; +}; +struct Menu menu[256]; +struct String header[256]; + +// Boxes +struct Box { + struct String func; + u16 text; + u8 directI; + struct String directS; + u8 color; + struct String pointer; + u8 min; + u16 max; + u8 type; +}; +struct Box box[4096]; +struct String text[4096]; + +u32 menuIndex = 0; +u32 boxIndex = 0; +u32 i = 0; +u32 j = 0; //Previous + +uint32_t sourceTextLength = 0; +uint8_t sourceText[16384]; +char lex0[] = {'0','1','2','3','4','5','6','7','8','9','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','?','<','>','|','|',' ',';','.',',','/','(',')',':','-','%','|','|','|','|','#','=','!','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; +char lex1[] = {'|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'M', 'F', '|', '|', '|', 'K', 'I', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'X', 'G', 'L', 'E', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|'}; +char lex2[] = {'|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'm', 'f', '|', '|', '|', 'k', 'i', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'x', 'g', 'l', 'e', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|'}; + +void convertAscii() { + u32 x = 0; + for (u32 t = 0; t < boxIndex; t++) { + u8 y = 0; + while (text[t].str[y] != '\0') { + if (text[t].str[y] == '\\' && text[t].str[y + 1] != '\0') { + u32 c = 0; + y++; + while (lex1[c] != text[t].str[y] && lex2[c] != text[t].str[y]) { //Finds the char in the look up tables + c++; + } + sourceText[x] = c; + x++; + } else { + u32 c = 0; + while (lex0[c] != text[t].str[y]) { //Finds the char in the look up tables + c++; + } + sourceText[x] = c; + x++; + } + y++; + } + sourceText[x] = 33; // ; + x++; + } + sourceTextLength = x; +} + +void printType(u8 type) { + if (type & 0x01) { printf("C"); } else { printf("-"); } + if (type & 0x02) { printf("F"); } else { printf("-"); } + if (type & 0x04) { printf("N"); } else { printf("-"); } + if (type & 0x08) { printf("P"); } else { printf("-"); } + if (type & 0x10) { printf("V"); } else { printf("-"); } + if (type & 0x20) { printf("D"); } else { printf("-"); } + if (type & 0x40) { printf("B"); } else { printf("-"); } + if (type & 0x80) { printf("T"); } else { printf("-"); } +} + +void printAllMenu() { + printf("\n\n"); + u32 b = 0; + for (u32 a = 0; a < menuIndex; a++) { + printf("\nHeader %d: %s : rows: %d : function: %s", a, header[a].str, menu[a].rows, menu[a].func.str); + printf("\n Type : Function : Direct : Color : Pointer : Min : Max : Text"); + for (; b < menu[a].boxes; b++) { + printf("\n "); + printType(box[b].type); + printf(" | %-10.10s | %-10.10s | 0x%02X | %-10.10s | %3d | %5d | %-20s", + box[b].func.str, box[b].directS.str, box[b].color,box[b].pointer.str, box[b].min, box[b].max, text[b].str); //73 or 93 characters + + } + printf("\n"); + } +} +void printAllText() { + printf("\n\n"); + u32 b = 0; + for (u32 a = 0; a < menuIndex; a++) { + printf("\nHeader %d: %s",a,header[a].str); + for (; b < menu[a].boxes; b++) { + printf("\n %s",text[b].str); + } + printf("\n"); + } +} + +void printHeader() { + printf("\n\n"); + for (u32 a = 0; a < menuIndex; a++) { + printf("\nHeader %2d: %s | rows: %d | function: %s", a, header[a].str, menu[a].rows, menu[a].func.str); + } +} + +char _TRUE[] = "TRUE"; +char _FALSE[] = "FALSE"; + +u8 compareString(char a[], char b[]) { + u8 k = 0; + while (k != 255) { + if (a[k] == '\0' && b[k] == '\0') { //Same Length + return 1; + } + if (a[k] == '\0' || b[k] == '\0') { //Different Length + return 0; + } + if (a[k] != b[k]) { + return 0; + } + k++; + } +} + +u32 getNumber() { + j = i; + u32 sum = 0; + u8 base = 10; + do { + i++; + if (input[i] != ',' && input[i] != '\n' && input[i] != '\0') { // Ends on comma + sum *= base; + if (input[i] >= '0' && input[i] <= '9') { // 0-9 + sum += input[i] - '0'; + } + if (input[i] >= 'A' && input[i] <= 'F') { // A-F hex + sum += input[i] - 'A' + 10; + } + if (input[i] >= 'a' && input[i] <= 'f') { // a-f hex + sum += input[i] - 'a' + 10; + } + if (input[i] == 'x') { // Change to base 16 + sum = 0; + base = 16; + } + } else { + break; + } + } while (i < len); + return sum; +} + +uint8_t backSlashes = 0; +void getText(struct String* arg) { + backSlashes = 0; + j = i; + u8 t = 0; + do { + i++; + if (input[i] != ',' && input[i] != '\n' && input[i] != '\0') { + if (input[i] == '\\') { + backSlashes++; + } + arg->str[t] = input[i]; + t++; + } else { + break; + } + } while (i < len && t < 39); + if (t == 0) { + arg->str[t] = '0'; + t++; + } + arg->str[t] = '\0'; +} + +void headerCase() { + u8 x = 0; + + for (; i < len; i++) { + + if (x == 0) { // Header text + getText(&header[menuIndex]); + x++; + } + + if (x == 1) { // Function + getText(&menu[menuIndex].func); + x++; + } + + if (x == 2) { // Back + getText(&menu[menuIndex].backS); + x++; + } + if (x == 3 || input[i] == '\n') { + i++; + break; + } + } + // for (; i < len; i++) { + // if (input[i] == '@') { + // i--; + // return; + // } + // } +} + +void boxCase() { + u8 x = 0; + + for (; i < len; i++) { + + if (x == 0) { // Box text + getText(&text[boxIndex]); + textPos += i - j - backSlashes; //+ 1; // + 1 for newline character + x++; + } + + if (x == 1) { // Function + getText(&box[boxIndex].func); + x++; + } + + if (x == 2) { // Direct + getText(&box[boxIndex].directS); + x++; + } + if (x == 3) { // Color + box[boxIndex].color = getNumber(); + x++; + } + if (x == 4) { // Pointer + getText(&box[boxIndex].pointer); + x++; + } + if (x == 5) { // Minimum + box[boxIndex].min = getNumber(); + x++; + } + if (x == 6) { // Maximum + box[boxIndex].max = getNumber(); + x++; + } + if (x == 7) { // Type + u8 t = 0; + struct String compare; + for (u8 r = 0; r < 8; r++) { + getText(&compare); + if (compareString(compare.str,_TRUE) == 1) { + t += 1 << r; + } + } + i = j; + + box[boxIndex].type = t; + x++; + } + if (x == 8 || input[i] == '\n') { + i++; + break; + } + } +} + +void convert() { + menuIndex = 0; + for (i = 0; i < len; i++) { //Skips to the start of the data + if (input[i] == '@') { + i--; + break; + } + } + u32 x = 0; + u32 y = 0; + + u32 row = 0; + for (; i < len; i++) { + if (input[i] == '\n') { + if (input[i + 1] == '@') { + menu[menuIndex].boxes = row; + headerCase(); + menuIndex++; + } else { + box[boxIndex].text = textPos; + boxCase(); + row++; + boxIndex++; + } + } + if (input[i] == '\0') { + printf("\nEOF"); + } + } + for (u8 k = 0; k < menuIndex - 1; k++) { + menu[k].rows = menu[k + 1].boxes - menu[k].boxes; + } + menu[menuIndex - 1].rows = 1; +} + +void copyText() { + lines = 1; + char w; + char * ptr = input; + printf("\n\n"); + for (u32 i = 0; i < len; i++) { + fscanf(Iptr, "%c", & w); + if (w == '\n') { + lines++; + } + * ptr = w; + //printf("%c",*ptr); + ptr++; + } + printf("\n"); +} + +void setReferances() { + for (u8 h = 0; h < menuIndex; h++) { + for (u8 m = 0; m < menuIndex; m++) { + if (compareString(header[h].str, menu[m].backS.str) == 1) { + menu[m].backI = h; + } + } + for (u8 b = 0; b < boxIndex; b++) { + if (compareString(header[h].str, box[b].directS.str) == 1) { + box[b].directI = h; + } + } + } +} + +void writeText() { + + printf("\n\nFile Output:\n"); + + if((Optr = fopen("output.txt", "w")) == NULL){ + printf("\nError"); + } + + //fprintf(Optr,"\nvoid (*menuFunction[%d])() = {%s", menuIndex, menu[0].func.str); + + //Menu Arrays + + //Initial Function + printf("\nvoid (*menuFunction[%d])() = {%s", menuIndex, menu[0].func.str); + for (u32 a = 1; a < menuIndex; a++) { + printf(",%s", menu[a].func.str); + } + printf("};");; + + //Back Direct + printf("\nuint8_t menuBack[%d] = {%d", menuIndex, menu[0].backI); + for (u32 a = 1; a < menuIndex; a++) { + printf(",%d", menu[a].backI); + } + printf("};"); + + //Box Position + printf("\nuint16_t boxIndex[%d] = {%d", (menuIndex + 1), menu[0].boxes); + for (u32 a = 1; a < menuIndex; a++) { + printf(",%d", menu[a].boxes); + } + printf(",%d", boxIndex); + printf("};"); + + //Menu Rows + printf("\nuint8_t menuRows[%d] = {%d", menuIndex, menu[0].rows); + for (u32 a = 1; a < menuIndex; a++) { + printf(",%d", menu[a].rows); + } + printf("};"); + + //Box Arrays + printf("\n"); + + //Type + printf("\nuint8_t boxType[%d] = {%d", boxIndex, box[0].type); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%d", box[a].type); + } + printf("};"); + + //Color + printf("\nuint8_t boxColor[%d] = {%d", boxIndex, box[0].color); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%d", box[a].color); + } + printf("};"); + + //Direct + printf("\nuint8_t boxDirect[%d] = {%d", boxIndex, box[0].directI); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%d", box[a].directI); + } + printf("};"); + + //Text Position + printf("\nuint16_t textIndex[%d] = {%d", (boxIndex + 1), box[0].text); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%d", box[a].text); + } + printf(",%d", sourceTextLength); + printf("};"); + + //Function + printf("\nvoid (*boxFunction[%d])() = {%s", boxIndex, box[0].func.str); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%s", box[a].func.str); + } + printf("};"); + + //Pointer + printf("\nvoid* boxPointer[%d] = {%s", boxIndex, box[0].pointer.str); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%s", box[a].pointer.str); + } + printf("};"); + + //Minimum + printf("\nuint8_t boxMin[%d] = {%d", boxIndex, box[0].min); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%d", box[a].min); + } + printf("};"); + + //Maximum + printf("\nuint16_t boxMax[%d] = {%d", boxIndex, box[0].max); + for (u32 a = 1; a < boxIndex; a++) { + printf(",%d", box[a].max); + } + printf("};"); + + //Source Text + printf("\n"); + printf("\nuint8_t sourceText[%d] = {%d", sourceTextLength, sourceText[0]); + for (u32 a = 1; a < sourceTextLength; a++) { + printf(",%d", sourceText[a]); + } + printf("};"); + + //SPRINTF!!! + + //Menu Arrays + + //Initial Function + fprintf(Optr,"\nvoid (*menuFunction[%d])() = {%s", menuIndex, menu[0].func.str); + for (u32 a = 1; a < menuIndex; a++) { + fprintf(Optr,",%s", menu[a].func.str); + } + fprintf(Optr,"};");; + + //Back Direct + fprintf(Optr,"\nuint8_t menuBack[%d] = {%d", menuIndex, menu[0].backI); + for (u32 a = 1; a < menuIndex; a++) { + fprintf(Optr,",%d", menu[a].backI); + } + fprintf(Optr,"};"); + + //Box Position + fprintf(Optr,"\nuint16_t boxIndex[%d] = {%d", (menuIndex + 1), menu[0].boxes); + for (u32 a = 1; a < menuIndex; a++) { + fprintf(Optr,",%d", menu[a].boxes); + } + fprintf(Optr,",%d", boxIndex); + fprintf(Optr,"};"); + + //Menu Rows + fprintf(Optr,"\nuint8_t menuRows[%d] = {%d", menuIndex, menu[0].rows); + for (u32 a = 1; a < menuIndex; a++) { + fprintf(Optr,",%d", menu[a].rows); + } + fprintf(Optr,"};"); + + //Box Arrays + fprintf(Optr,"\n"); + + //Type + fprintf(Optr,"\nuint8_t boxType[%d] = {%d", boxIndex, box[0].type); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%d", box[a].type); + } + fprintf(Optr,"};"); + + //Color + fprintf(Optr,"\nuint8_t boxColor[%d] = {%d", boxIndex, box[0].color); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%d", box[a].color); + } + fprintf(Optr,"};"); + + //Direct + fprintf(Optr,"\nuint8_t boxDirect[%d] = {%d", boxIndex, box[0].directI); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%d", box[a].directI); + } + fprintf(Optr,"};"); + + //Text Position + fprintf(Optr,"\nuint16_t textIndex[%d] = {%d", (boxIndex + 1), box[0].text); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%d", box[a].text); + } + fprintf(Optr,",%d", sourceTextLength); + fprintf(Optr,"};"); + + //Function + fprintf(Optr,"\nvoid (*boxFunction[%d])() = {%s", boxIndex, box[0].func.str); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%s", box[a].func.str); + } + fprintf(Optr,"};"); + + //Pointer + fprintf(Optr,"\nvoid* boxPointer[%d] = {%s", boxIndex, box[0].pointer.str); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%s", box[a].pointer.str); + } + fprintf(Optr,"};"); + + //Minimum + fprintf(Optr,"\nuint8_t boxMin[%d] = {%d", boxIndex, box[0].min); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%d", box[a].min); + } + fprintf(Optr,"};"); + + //Maximum + fprintf(Optr,"\nuint16_t boxMax[%d] = {%d", boxIndex, box[0].max); + for (u32 a = 1; a < boxIndex; a++) { + fprintf(Optr,",%d", box[a].max); + } + fprintf(Optr,"};"); + + //Source Text + fprintf(Optr,"\n"); + fprintf(Optr,"\nuint8_t sourceText[%d] = {%d", sourceTextLength, sourceText[0]); + for (u32 a = 1; a < sourceTextLength; a++) { + fprintf(Optr,",%d", sourceText[a]); + } + fprintf(Optr,"};"); + + fclose(Optr); + + printf("\n\nFinished: %d bytes\n",(menuIndex * menuDataSize + boxIndex * boxDataSize)); +} + +int main(void) { + printf("Enter CSV\n\n"); + + Iptr = fopen(fileName, "rb"); + if (Iptr == NULL) { + printf("\nError: File does not exist."); + exit(1); + } + + fseek(Iptr, 0, SEEK_END); + len = ftell(Iptr); + fseek(Iptr, 0, SEEK_SET); + + //printf("\nLength: %ld",len); + if (len <= 2) { + printf("\nError: File is too short"); + exit(1); + } + if (len > 16777216) { + printf("\nError: File is too long"); + exit(1); + } + + copyText(); + //printf("\n\nInput Length: %d", len); + convert(); + setReferances(); + convertAscii(); + //printHeader(); + printAllMenu(); + //printAllText(); + writeText(); + return 0; +} \ No newline at end of file diff --git a/src/Text Conversion Tool/Engine.java b/src/Text Conversion Tool/Engine.java new file mode 100644 index 0000000..865cfad --- /dev/null +++ b/src/Text Conversion Tool/Engine.java @@ -0,0 +1,253 @@ +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Scanner; + +import javax.imageio.ImageIO; + +public class Engine { + static int resX = 112; + static int resY = 72; + static int[] value = new int[resX * resY]; + static boolean type = true; + + //Old Text + //static char[] table = {' ',';','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','.',',',':','-','?','!','%','/','(',')','>','<','m','f','x','k','g','l','r'}; + //static char[] table = {' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','`','~','!','@','#','$','%','^','&','*','(',')','-','_','=','+','[','{',']','}','\\','|',';',':','\'','"',',','<','.','>','?','/'}; + + //ISO Text 0 + //static char[] table = {'0','1','2','3','4','5','6','7','8','9','|','|','|','|','|','|','|','m','f','?','>','<',':','-','%','x','k','s','l','r','!','|',' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','.',',','/','(',')'}; + //ISO Text 2 + /* + static char[] table = {'0','1','2','3','4','5','6','7','8','9','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','?','<','>','|','|', + ' ','|','.',',','/','(',')',':','-','%','|','|','|','|','#','=', + 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', + 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', + 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', + 'w','x','y','z','','','','','','','','','','!','','', + '|','|','|','|','|','|','|','|','\'','`','^','|','~','"','*','_', + + '','','','','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','','','|','|', + '|','|','|','|','','[',']','','|','|','','|','|','|','|','|', + '|','|','|','','','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','','|', + '|','|','','|','|','|','|','','|','|','|','','|','','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','','','|'}; + + static char[] extra = {'','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','M','F','','|','|','K','I', + 'W','D','|','|','|','|','|','|','|','','x','G','L','E','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','N','n','C','c','A','a','B','y','o','','?','!', + '|','|','|','|','|','|','|','|','`','\'','^','|','|','|','|','-', + + '0','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','','','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|', + '|','|','|','|','|','|','|','|','|','|','b','Y','','|','|','|', + + 'O'}; + */ + static char[] lex0 = {'0','1','2','3','4','5','6','7','8','9','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','?','<','>','|','|',' ',';','.',',','/','(',')',':','-','%','|','|','|','|','#','=','!','|','|','|','|','|','|','|','|','|','|','|','|','|','|','|','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + static char[] lex1 = {'|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'M', 'F', '|', '|', '|', 'K', 'I', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'X', 'G', 'L', 'E', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|'}; + static char[] lex2 = {'|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'm', 'f', '|', '|', '|', 'k', 'i', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', 'x', 'g', 'l', 'e', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|'}; + +// static char[] chars0 = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '|', '?', '<', '>', '|', '|', ' ', '|', '.', ',', '/', '(', ')', ':', '-', '%', '|', '|', '|', '|', '#', '=', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; +// static char[] index0 = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}; +// static char[] chars1 = {}; +// static char[] index1 = {}; + + static char[] other = {'','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''}; + static int[] glyph = {120,121,122,124,125,126,120,121,122,125,120,121,122,125,120,121,122,124,125,120,121,122,125,120,121,122,124,125,126,120,121,122,125,120,121,122,125,120,121,122,124,125,120,121,122,125,123,123, 62, 88}; + static int[] letter = {112,112,112,112,112,112,113,113,113,113,114,114,114,114,115,115,115,115,115,116,116,116,116,117,117,117,117,117,117,118,118,118,118,119,119,119,119,115,115,115,115,115,116,116,116,116, 99, 99, 52, 78}; + + static int[] text = new int[65536]; + static int[] block = new int[65536]; + + public static void main(String[] args) { + + if (type) { + Scanner keyboard = new Scanner(System.in); + String input; + do { + int track = 0; + int index = 0; + System.out.println("Type Text:"); + input = keyboard.nextLine(); + int i = 0; + while (i < input.length() && i < 65536) { + char output = input.charAt(i); + int f = 0; + /*if (output == ';') { //New Line + text[index] = 33; + index++; + f = 1; + }*/ + if (output == '@') { //New Section + block[track] = index; + track++; + f = 1; + } + if (output == '\\') { + output = input.charAt(i + 1); + for (int j = 0; j < lex1.length; j++) { + if (lex1[j] == output) { + text[index] = j & 127; + index++; + f = 1; + } + } + if (f == 0) { + for (int j = 0; j < lex2.length; j++) { + if (lex2[j] == output) { + text[index] = j & 127; + index++; + f = 1; + } + } + } + i++; + } else { + for (int j = 0; j < lex0.length; j++) { + if (lex0[j] == output) { + text[index] = j & 127; + index++; + f = 1; + } + } + } + if (f == 0 && f == 1) { //Diacritics + for (int j = 0; j < other.length; j++) { + if (other[j] == output) { + text[index] = glyph[j]; + index++; + text[index] = letter[j]; + index++; + f = 1; + } + } + } + if (f == 0) { + text[index] = 32; + index++; + f = 1; + } + i++; + } + System.out.print("\n{" + text[0]); //Was * 2 + if (index > 1) { + for (int a = 1; a < index; a++) { + System.out.print("," + text[a]); //Was * 2 + } + } + System.out.println("};\n"); + System.out.println("Length: " + index); +// System.out.print("{" + block[0]); +// if (track > 1) { +// for (int a = 1; a < track; a++) { +// System.out.print("," + block[a]); +// } +// } +// System.out.println("};\n"); + } while (input.length() > 0 && false); + keyboard.close(); + + + + + + } else { + + loadImage(); + for (int i = 0; i < resX * resY; i++) { + if (value[i] == 16777215) { + value[i] = 1; + } + } + System.out.print("{"); + /* + for (int v = 0; v < resY; v += 9) { + for (int u = 0; u < resX; u += 7) { + int i = 0; + int j = 0; + for (int y = v; y < v + 4; y++) { + for (int x = u; x < u + 6; x++) { + //System.out.print(value[y * resX + x]); + j += value[y * resX + x] * (int)Math.pow(2, i); + i++; + } + } + if (v == 0 && u == 0) { + System.out.print(j); + } else { + System.out.print("," + j); + } + i = 0; + j = 0; + for (int y = v + 4; y < v + 8; y++) { + for (int x = u; x < u + 6; x++) { + //System.out.print(value[y * resX + x]); + j += value[y * resX + x] * (int)Math.pow(2, i); + i++; + } + } + System.out.print("," + j); + //System.out.print("\n"); + } + } + System.out.print("};"); + */ + + for (int v = 0; v < resY; v += 9) { + for (int u = 0; u < resX; u += 7) { + + for (int x = u; x < u + 6; x++) { + int i = 0; + int j = 0; + for (int y = v; y < v + 8; y++) { + //System.out.print(value[y * resX + x]); + j += value[y * resX + x] * (int)Math.pow(2, i); + i++; + } + if (x == 0 && v == 0) { //If first element + System.out.print(j); + } else { //General Case + System.out.print("," + j); + } + } + + } + } + System.out.print("};"); + + } + + } + + private static void loadImage() { + try { + //File file = new File("C:\\Users\\zerico\\Downloads\\Text Font 6x8 Version 0.png"); + File file = new File("C:\\Users\\zerico\\Documents\\Programming\\superSweeper\\assets\\char 6x8 v4.png"); + BufferedImage bufferedImage = ImageIO.read(file); + + for (int y = 0; y < resY; y++) { + for (int x = 0; x < resX; x++) { + value[y * resX + x] = Math.abs(bufferedImage.getRGB(x, y)) - 1; // the sample in the specified band for the pixel at the specified coordinate. + //System.out.println(Math.abs(bufferedImage.getRGB(x, y)) - 1); + } + } + + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/Text Conversion Tool/README.txt b/src/Text Conversion Tool/README.txt new file mode 100644 index 0000000..97d013e --- /dev/null +++ b/src/Text Conversion Tool/README.txt @@ -0,0 +1 @@ +Engine.java was run in Eclispe Studio. Last Modified 2023/06/30 21:56 \ No newline at end of file diff --git a/src/Video Convert/Engine.java b/src/Video Convert/Engine.java new file mode 100644 index 0000000..1f21f60 --- /dev/null +++ b/src/Video Convert/Engine.java @@ -0,0 +1,445 @@ +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; +import java.io.*; +import javax.imageio.*; +import javax.swing.*; +import java.lang.Object.*; +import java.io.OutputStream.*; + +public class Engine { + + static int pSize = 16; //Palette Size + + static int resX = 168; + static int resY = 126; + static int frames = 84; + static int[] video = new int[resX * resY * frames]; + static int[] color = new int[pSize * frames]; + static int iX = 168; + static int iY = 126; + static int[] image = new int[iX * iY * 3]; + + static int[] colorR = new int[pSize * frames]; + static int[] colorG = new int[pSize * frames]; + static int[] colorB = new int[pSize * frames]; + + static int frame = 0; + + static int[] count = new int[32769]; //32768 is null + static int[] rank = new int[pSize]; + static int[] order = new int[pSize]; + + static int limit = 3; //1: 15bit, 2: 12bit, 4: 9bit, 8: 6bit + static int[] bin = new int[pSize]; + + static String[] huffCode = {"00","010","011","10000","10001","1001","101","110000","1100010","1100011","110010","110011","11010","110110","110111","111"}; + + public static void makeColor() { + + int[] temp = new int[pSize]; + for (int i = 0; i < 32768; i++) { + count[i] = 0; + } + for (int i = 0; i < iX * iY; i++) { //Counts each color present, limit reduces the bit depth to improve results + int r = (image[3 * i] / 8) / limit * limit; //Converts to 15bit then reduces bit depth + int g = (image[3 * i + 1] / 8) / limit * limit; + int b = (image[3 * i + 2] / 8) / limit * limit; + int c = (r * 1024) + (g * 32) + b; + count[c]++; + } + + for (int j = 0; j < pSize; j++) { + temp[j] = 32768; //32768 doesn't exist + } + + temp[0] = 0; //Hard-coded black + count[0] = 65535; //pSize - 1 + + + + for (int i = 1; i < 32768; i++) { //Loops through all colors except black + if ((i == 28672 || i == 29568) && (frame >= 23 && frame <= 61)) { + i++; + } + if (count[i] != 0) { //Check that the color still exists + //int low = 65536; + for (int j = 0; j < pSize; j++) { //Runs through the leaderboard of colors + if (count[i] > count[temp[j]] && colorDistance(i,j)) { + temp[j] = i; + break; + } + } + } + } + +// if (frame >= 0 && frame <= 77) { +// temp[15] = 0; +// } + //temp[15] = 0; + if (frame >= 25 && frame <= 61) { + temp[15] = 28672; //Red + temp[14] = 29568; //Yellow + } +// if (frame >= 0 && frame <= 62) { +// temp[15] = 0; +// } +// if (frame >= 23 && frame <= 61) { +// temp[14] = 28672; //Red +// temp[13] = 29568; //Yellow +// } + + for (int i = 0; i < pSize; i++) { + int c = temp[i]; + color[i + (frame * pSize)] = c; + colorR[i + (frame * pSize)] = (c / 1024) * 8; + colorG[i + (frame * pSize)] = ((c / 32) % 32) * 8; + colorB[i + (frame * pSize)] = (c % 32) * 8; + //System.out.println(c); + } + } + + public static boolean colorDistance(int c, int d) { + float r0 = (float)((c / 1024) * 8); + float g0 = (float)(((c / 32) % 32) * 8); + float b0 = (float)((c % 32) * 8); + + float r1 = (float)((d / 1024) * 8); + float g1 = (float)(((d / 32) % 32) * 8); + float b1 = (float)((d % 32) * 8); + float distance = (float) Math.sqrt( (r1-r0)*(r1-r0) + (g1-g0)*(g1-g0) + (b1-b0)*(b1-b0) ); + if (distance < 36) { //36 + return false; + } else { + return true; + } + } + + public static void main(String[] args) { + egaColor(); + + for (frame = 0; frame < frames; frame++) { + loadImage(frame + 0); + makeColor(); + float xR = (float)iX / (float)resX; + float yR = (float)iY / (float)resY; + int oV = frame * resX * resY; + for (int y = 0; y < resY; y++) { + for (int x = 0; x < resX; x++) { + int u = (int)((float)x * xR); + int v = (int)((float)y * yR); + video[(y * resX) + x + oV] = findColor(3 * (v * iX + u)); + } + } + System.out.println("Frame: " + frame); + imageIoWrite(); + } + //huffMan(); + export(); + } + + public static void export() { + + try { + + int blocks = ((resX * resY / 2) * frames) / 65536; + if (blocks % 65536 != 0) {blocks++;} //Ceiling Function + int i = 0; + + for (int f = 0; f < blocks; f++) { + OutputStream out = new FileOutputStream("video-" + String.format("%02d", f) + ".bin"); + for (int j = 0; j < resX * resY * 6 / 2; j++) { + out.write(((video[i + 1] << 4) + video[i])); +// if (video[i + 1] > 8 && video[i] > 8) { +// System.out.println(); +// System.out.println((video[i + 1] << 4) + video[i]); +// System.out.println(video[i + 1] << 4); +// System.out.println(video[i]); +// } + i += 2; + } + out.close(); + } + + System.out.println(); + for (int f = 0; f < blocks; f++) { + System.out.println("convbin --archive --input \"C:\\Users\\zerico\\Eclispe Java\\Video Convert\\video-" + String.format("%02d", f) + ".bin\" --output \"C:\\Users\\zerico\\Documents\\FOO\\video-" + String.format("%02d", f) + ".8xv\" --iformat bin --oformat 8xv --name VOD" + String.format("%02d", f)); + } +// int blocks = ((resX * resY / 2) * frames) / 65536; +// if (blocks % 65536 != 0) {blocks++;} +// for (int f = 0; f < blocks; f++) { +// Writer out = new FileWriter("video-" + f + ".txt"); +// out.write("unsigned char data[" + (resX * resY * frames / 2 / blocks) + "] = {" + ((video[1] << 4) + video[0])); +// for (int i = 2 + f * (resX * resY * frames / blocks); i < (f + 1) *(resX * resY * frames / blocks); i += 2) { +// out.write("," + ((video[i + 1] << 4) + video[i])); +// } +// out.write("};"); +// out.close(); +// } + +// out.write("unsigned char data[" + (resX * resY * frames / 2) + "] = {" + ((video[1] << 4) + video[0])); +// for (int i = 2; i < resX * resY * frames; i += 2) { +// out.write("," + ((video[i + 1] << 4) + video[i])); +// } +// out.write("unsigned int data[" + (resX * resY * frames / 6) + "] = {" + ((video[5] << 20) + (video[4] << 16) + (video[3] << 12) + (video[2] << 8) + (video[1] << 4) + video[0])); +// for (int i = 6; i < resX * resY * frames; i += 6) { +// out.write("," + ((video[i + 5] << 20) + (video[i + 4] << 16) + (video[i + 3] << 12) + (video[i + 2] << 8) + (video[i + 1] << 4) + video[i])); +// } +// out.write("};"); + + System.out.println("\nFinished Video"); + + } catch (Exception e) { + e.getStackTrace(); + + } + for (int f = 0; f < 15; f++) { //debug start + System.out.println("convbin --archive --input \"C:\\Users\\zerico\\Eclispe Java\\Video Convert\\video-" + String.format("%02d", f) + ".bin\" --output \"C:\\Users\\zerico\\Documents\\FOO\\video-" + String.format("%02d", f) + ".8xv\" --iformat bin --oformat 8xv --name VOD" + String.format("%02d", f)); + } //debug end + try { + Writer out = new FileWriter("color.txt"); + + //out.write("unsigned short palette[" + (pSize * frames) + "] = {/*0*/" + color[0]); + out.write("unsigned short palette[" + ((pSize - 1) * frames) + "] = {/*0*/"); //If skipping black + for (int i = 1; i < pSize * frames; i++) { +// if (i % 16 == 0) { +// out.write("/*" + (i/16) + "*/"); +// } +// out.write("," + color[i]); + if (i % 16 == 0) { //If skipping black + out.write("/*" + (i/16) + "*/"); + } else { + out.write("," + color[i]); + } + } + out.write("};"); + + System.out.println("\nFinished Palette"); + + out.close(); + } catch (Exception e) { + e.getStackTrace(); + } + + } + + public static void huffMan() { + System.out.println("\nColor Count:\n"); + for (int i = 0; i < pSize; i++) { + rank[i] = 0; + order[i] = i; + } + for (int i = 0; i < resX * resY * frames; i++) { + rank[video[i]]++; + } + //bubbleSort(); + for (int i = 0; i < pSize; i++) { + System.out.println(rank[i] + " " + order[i]); + } + System.out.println("\nOriginal Bytes: " + (resX * resY * frames / 2)); + + int[] sum = new int[pSize]; + int[] node0 = new int[pSize]; + int[] node1 = new int[pSize]; + + int[][] value = new int[pSize][pSize + 1]; + + for (int i = 0; i < pSize; i++) { + value[i][pSize] = order[i]; + } + for (int i = 0; i < pSize; i++) { + value[i][pSize] = order[i]; + } +// if (rank[i] < low[]) { +// low[] = rank[i]; +// } +// System.out.println(rank[i]); + System.out.print("\nint n = " + pSize); + System.out.print("\nchar[] charArray = {" + order[0]); + for (int i = 1; i < pSize; i++) { + System.out.print("," + order[i]); + } + System.out.print("};"); + System.out.print("\nint[] charfreq = {" + rank[0]); + for (int i = 1; i < pSize; i++) { + System.out.print("," + rank[i]); + } + System.out.print("};\n\n"); + + for (int i = 0; i < huffCode.length; i++) { + //System.out.println(huffCode[i]); + bin[i] = 0; + for (int j = 0; j < huffCode[i].length(); j++) { + bin[i] = bin[i] * 2; + if (huffCode[i].charAt(j) == '1') { + bin[i]++; + } + } + } + + for (int i = 0; i < huffCode.length; i++) { + int bin = 0; + for (int j = 0; j < huffCode[i].length(); j++) { + bin = bin * 2; + if (huffCode[i].charAt(j) == '1') { + bin++; + } + } + System.out.println(bin); + } + } + + public static void bubbleSort() { + int n = pSize; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n - 1; j++) { + if (rank[j] > rank[j + 1]) { + int t = rank[j]; + int p = order[j]; + rank[j] = rank[j + 1]; + order[j] = order[j + 1]; + rank[j + 1] = t; + order[j + 1] = p; + } + } + } + } + + public static void bubSort() { + int n = pSize; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n - 1; j++) { + if (order[j] > order[j + 1]) { + int t = rank[j]; + int p = order[j]; + rank[j] = rank[j + 1]; + order[j] = order[j + 1]; + rank[j + 1] = t; + order[j + 1] = p; + } + } + } + } + + + + public static int compareColor(int c) { + float r0 = (float)((c / 1024) * 8); + float g0 = (float)(((c / 32) % 32) * 8); + float b0 = (float)((c % 32) * 8); + int best = 0; + float score = 65535; + for (int i = 0; i < 32768; i++) { + if (count[i] != 0) { + float r1 = (float)((i / 1024) * 8); + float g1 = (float)(((i / 32) % 32) * 8); + float b1 = (float)((i % 32) * 8); + float distance = (float) Math.sqrt( (r1-r0)*(r1-r0) + (g1-g0)*(g1-g0) + (b1-b0)*(b1-b0) ); + if (distance < score) { + best = i; + score = distance; + } + } + } + return best; + } + + public static int findColor(int index) { + float r0 = (float)image[index]; + float g0 = (float)image[index + 1]; + float b0 = (float)image[index + 2]; + int best = 0; + float score = 65535; + for (int i = 0; i < pSize; i++) { + float r1 = (float)colorR[frame * pSize + i]; + float g1 = (float)colorG[frame * pSize + i]; + float b1 = (float)colorB[frame * pSize + i]; + float distance = (float) Math.sqrt( (r1-r0)*(r1-r0) + (g1-g0)*(g1-g0) + (b1-b0)*(b1-b0) ); + if (distance < score) { + best = i; + score = distance; + } + } + return best; + } + + public static int colorP(int index) { + return 0; + } + + private static void loadImage(int i) { + try { + //File file = new File("E:\\Coding\\Fractal Video 0\\Frame " + (i * 5) + ".png"); + File file = new File("E:\\Youtube\\MineSweeper\\PNG Video 126p\\Frame-" + String.format("%03d", i) + ".png"); + BufferedImage bufferedImage = ImageIO.read(file); + for (int y = 0; y < iY; y++) { + for (int x = 0; x < iX; x++) { + Color c = new Color(bufferedImage.getRGB(x,y)); + image[3 * (y * iX + x)] = c.getRed(); + image[3 * (y * iX + x) + 1] = c.getGreen(); + image[3 * (y * iX + x) + 2] = c.getBlue(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void imageIoWrite() { + try { + int e = 0; + int g = 0; + int b = 0; + + BufferedImage img; + + int oV = frame * resX * resY; + img = new BufferedImage(resX, resY, BufferedImage.TYPE_INT_RGB); + for (int y = 0; y < resY; y++) { + for (int x = 0; x < resX; x++) { + e = colorR[frame * pSize + video[oV + ((y * resX) + x)]]; + g = colorG[frame * pSize + video[oV + ((y * resX) + x)]]; + b = colorB[frame * pSize + video[oV + ((y * resX) + x)]]; + int color = (e << 16) | (g << 8) | b; + img.setRGB(x, y, color); + } + } + + if (frames > 1) { + ImageIO.write(img, "PNG", new File("E:\\Youtube\\MineSweeper\\Calculator 126p\\Frame-" + frame + ".png")); + } else { + ImageIO.write(img, "PNG", new File("E:\\Youtube\\MineSweeper\\Calculator 126p\\Frame-" + System.nanoTime() + ".png")); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void egaColor() { + int[] ega = { 0, 31744, 32736, 992, 1023, 31, 31775, 32767, 7399, 15360, 15840, 480, 495, 15, 15375, 24311 }; + //int[] ega = { 0x0000, 0x0842, 0x1084, 0x18C6, 0x2108, 0x294A, 0x318C, 0x39CE, 0x4210, 0x4A5, 0x4E93, 0xD6B5, 0xDEF7, 0xE739, 0xEF7B, 0xF7BD}; //Greyscale + for (int i = 0; i < pSize * frames; i++) { + color[i] = ega[i%pSize]; + colorR[i] = (color[i%pSize] / 1024) * 8; + colorG[i] = ((color[i%pSize] / 32) % 32) * 8; + colorB[i] = (color[i%pSize] % 32) * 8; + } +// for (int i = 0; i < pSize * frames; i++) { +// int foo = (int)(Math.random() * 32768); +// color[i] = foo; +// colorR[i] = (foo / 1024) * 8; +// colorG[i] = ((foo / 32) % 32) * 8; +// colorB[i] = (foo % 32) * 8; +// } + } + public static void printColor(int i) { + System.out.print("\n" + String.format("%05d",i)); + System.out.print(" "); + System.out.print(String.format("%03d",((i / 1024) * 8))); + System.out.print(" "); + System.out.print(String.format("%03d",(((i / 32) % 32) * 8))); + System.out.print(" "); + System.out.print(String.format("%03d",(i % 32) * 8)); + } +} diff --git a/src/Video Convert/README.txt b/src/Video Convert/README.txt new file mode 100644 index 0000000..156a1b8 --- /dev/null +++ b/src/Video Convert/README.txt @@ -0,0 +1 @@ +Engine.java was run in Eclispe Studio. Last Modifed 2023/01/28 16:33 \ No newline at end of file diff --git a/src/col.h b/src/col.h new file mode 100644 index 0000000..497a694 --- /dev/null +++ b/src/col.h @@ -0,0 +1,78 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +//#ifndef COL_H +#ifdef COL_H //Lol +#define COL_H + +#include +#include +#include + +/* +Took me long enough to make this .h file +Previously, I would use my knuckles to find the color I needed, +my first knuckle was color 1 or Red, then 2 Yellow, 3 Green, 4 Teal +5 Blue, 6 Magenta, and 7 White. Adding 8 to the number to set the Alpha Bit +*/ + +enum COLORS { + Black,Red,Yellow,Lime,Teal,Blue,Magenta,White, + Grey,Maroon,Brown,Green,Cyan,Navy,Purple,Silver +}; + +#ifdef DEVBUILD + +// If I am ever to lazy to find a color, should be fixed by release +/* +uint8_t findColor1555(uint16_t c); +uint8_t findColor888(uint8_t r, uint8_t g, uint8_t b); +uint8_t findColor565(uint16_t c); + +uint8_t findColor1555(uint16_t c) { + uint8_t r = (c & 0x7C00) >> 10; + uint8_t g = (c & 0x03E0) >> 4; + g += (c & 0x8000) ? 1 : 0; + uint8_t b = (c & 0x001F); + + u8 best = 0x00; + u16 low = 0xFFFF; + for (u8 i = 0; i < 0xF0; i++) { //Avoids temp color zone + u16 col = paletteRAM[i]; + uint8_t r0 = (col & 0x7C00) >> 10; + uint8_t g0 = (col & 0x03E0) >> 4; + g0 += (c & 0x8000) ? 1 : 0; + uint8_t b0 = (col & 0x001F); + u16 dif = (r - r0) * (r - r0) + (g - g0) * (g - g0) + (b - b0) * (b - b0); + if (dif < low) { + low = dif; + best = i; + } + } + return best; +} +uint8_t findColor888(uint8_t r, uint8_t g, uint8_t b) { + u8 i = (g & 0x04) >> 2; + r >>= 3; + g >>= 2; + b >>= 3; + return findColor1555((i << 15) + (r << 10) + (g << 5) + b); +} +uint8_t findColor565(uint16_t c) { + uint8_t r = (c & 0xF800) >> 11; + uint8_t g = (c & 0x07C0) >> 6; + uint8_t b = (c & 0x001F); + uint8_t i = (c & 0x0020) >> 5; + return findColor1555((i << 15) + (r << 10) + (g << 5) + b); +} +*/ +//WHAT? WHY IT NO WORKY!?!?!?!?!?!? :( + +#endif + +#endif /* COL_H */ diff --git a/src/dataLoad.h b/src/dataLoad.h new file mode 100644 index 0000000..b8f365e --- /dev/null +++ b/src/dataLoad.h @@ -0,0 +1,109 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef DATALOAD_H +#define DATALOAD_H + +#include +#include +#include +#include + +// OUTDATED IMPORT FROM LAPTOP // +// OUTDATED IMPORT FROM LAPTOP // +// OUTDATED IMPORT FROM LAPTOP // +// OUTDATED IMPORT FROM LAPTOP // +// OUTDATED IMPORT FROM LAPTOP // +// OUTDATED IMPORT FROM LAPTOP // +// OUTDATED IMPORT FROM LAPTOP // +// OUTDATED IMPORT FROM LAPTOP // + +uint8_t data[8000]; + +void loadUserData(uint8_t input) { + uint8_t prgm; + //Load AppVar + unsigned char txt[7] = "SWPDAT"; + // unsigned char num[4]; + // sprintf(num, "%03d", input); + // prgm = ti_Open(strcat(txt, num), "r"); + prgm = ti_Open(txt, "r"); + + ti_Seek(0, SEEK_SET, prgm); //Seeks to the required data + ti_Read(&data, 3, 8000, prgm); + + uint8_t* rom = data; + uint16_t* blit = 0xD44B00; // ((320 - 168) / 4) + ((240 - 126) * 80) + uint8_t b = 1; + for (uint24_t y = 0; y < 8000; y++) { //(320*200) / 8 + b = 1; + for (uint8_t x = 0; x < 8; x++) { + *blit = *rom & b ? 0xFFFF : 0x0000; + blit++; + b <<= 1; + } + rom++; + } + + ti_Close(prgm); + prgm = 0; +} + +void saveGame(void* ptr) { + ptr[0] = (uint8_t)gameMode; + ptr[1] = (uint8_t)sizeX; + ptr[2] = (uint8_t)sizeY; + ptr[3] = (uint24_t)tile; + ptr[6] = (uint24_t)chance; + ptr[9] = (uint24_t)flags; + ptr[12] = (uint24_t)score; + ptr[15] = (uint32_t)(systemTime.full - gameStartTime.full - gamePauseTime.full); + uint24_t i = 19; + uint24_t z = marX * 2 + borderIndexes; + for (uint8_t y = 0; y < sizeY; y++) { + for (uint8_t x = 0; x < sizeX; x++) { + uint8_t b = state[z] == 255 ? 3 : state[z]; + b += flag[z] == gFlag ? 4 : 0; + b += flag[z] == gQuestion ? 8 : 0; + b += board[z] == gMine ? 16 : 0; + ptr[i] = b; + i++; + z++; + } + z += borderIndexes * 2; + } +} + +void loadGame(void* ptr) { + gameMode = ptr[0]; + sizeX = ptr[1]; + sizeY = ptr[2]; + tile = ptr[3]; + chance = ptr[6]; + flags = ptr[9]; + score = ptr[12]; + gameStartTime.full = systemTime.full - ptr[15]; + + uint24_t i = 19; + uint24_t z = marX * 2 + borderIndexes; + for (uint8_t y = 0; y < sizeY; y++) { + for (uint8_t x = 0; x < sizeX; x++) { + board[z] = ptr[i] & 16 ? gMine : 0; + uint8_t b = state[z] == 255 ? 3 : state[z]; + b += flag[z] == gFlag ? 4 : 0; + b += flag[z] == gQuestion ? 8 : 0; + b += board[z] == gMine ? 16 : 0; + ptr[i] = b; + i++; + z++; + } + z += borderIndexes * 2; + } +} + +#endif /* DATALOAD_H */ \ No newline at end of file diff --git a/src/gameMenu.h b/src/gameMenu.h new file mode 100644 index 0000000..ba25301 --- /dev/null +++ b/src/gameMenu.h @@ -0,0 +1,475 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef GAMEMENU_H +#define GAMEMENU_H + +#include "prime2D.h" +#include "global.h" +#include +#include +#include "mineSweeper.h" +#include "x86render.h" + +void pause6x8(uint24_t xW, uint24_t yW, uint8_t lexicon) { + uint8_t* bitImage = (uint8_t*)char6x8 + (lexicon * 6); + uint8_t* fill = (uint8_t*)VRAM + (yW * 320 + xW); + uint8_t b = 1; + uint8_t fColor = (gColor << 4) + gColor; + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 6; x++) { + *fill = *bitImage & b ? fColor : *fill; + fill += 160; + *fill = *bitImage & b ? fColor : *fill; + fill-= 159; + bitImage++; + } + bitImage -= 6; + fill += 314; // 320 - 6 + b <<= 1; + } +} + +void text6x8b4(uint24_t xW, uint24_t yW, uint8_t lexicon) { //Incompatibile with 0.70.Alpha and later + uint24_t bitImage0 = char6x8[lexicon]; + uint24_t bitImage1 = char6x8[lexicon + 1]; + uint8_t* fill0 = (uint8_t*)VRAM + (yW * 320 + xW); + uint8_t* fill1 = fill0 + 1280; + uint24_t b = 1; + uint8_t fColor = gColor << 4; + for (uint24_t y = 0; y < 8; y++) { + for (uint24_t x = 0; x < 3; x++) { + *fill0 = bitImage0 & b ? gColor : 0; + *fill1 = bitImage1 & b ? gColor : 0; + b <<= 1; + *fill0 += bitImage0 & b ? fColor : 0; + *fill1 += bitImage1 & b ? fColor : 0; + fill1++; + fill0++; + } + fill0 += 157; //320 - 6 + fill1 += 157; + } +} + +uint8_t scoreSort() { //broken + uint24_t off = gameMode * 6; + for (uint8_t i = 0; i < 6; i++) { + if (score > leaderboard[i + off]) { + for (uint8_t j = i; j < 5; j++) { + leaderboard[j + 1 + off] = leaderboard[j + off]; + } + score = leaderboard[i + off]; + return i; + } + } + return 99; //Probably Keys +} + +void fadeIn() { + uint16_t *fP = paletteRAM; //Fade in after setup + for (uint8_t k = 0; k < 32; k++) { + uint32_t flashTime = timer_Get(1); + uint8_t j = 31 - k; + for (uint16_t i = 0; i < 256; i++) { + *fP = (linear((initialPalette[i] >> 10) & 31, 31, 0, 31, j) << 10) | (linear((initialPalette[i] >> 5) & 31, 31, 0, 31, j) << 5) | (linear(initialPalette[i] & 31, 31, 0, 31, j)); + fP++; + } + fP -= 256; + while (deltaTime(timer_Get(1),flashTime) < 1536); + } +} + +void printStat(uint24_t n) { //Proprietary + if (n > 999) { + pause6x8(127, 324, ((n / 1000) % 10)); + } + if (n > 99) { + pause6x8(134, 324, ((n / 100) % 10)); + } + if (n > 9) { + pause6x8(141, 324, ((n / 10) % 10)); + } + pause6x8(148, 324, (n % 10)); +} + + +void scoreScreen() { //broken //I shall fix the sorting now that I can code insertion sort + return; + /* + uint16_t *fP = paletteRAM; //Fade in after setup + for (uint8_t k = 0; k < 32; k++) { + uint8_t j = 31 - k; + for (uint16_t i = 0; i < 256; i++) { + *fP = (linear((initialPalette[i] >> 10) & 31, 31, 0, 31, j) << 10) | (linear((initialPalette[i] >> 5) & 31, 31, 0, 31, j) << 5) | (linear(initialPalette[i] & 31, 31, 0, 31, j)); + fP++; + } + fP -= 256; + } + uint8_t name[3] = {33,33,33}; + gColor = 0; + fillRect(0,240,320,120); //Clears the screen + gColor = 7; + { + uint24_t x = 8; + uint24_t y = 248; + uint8_t i = 0; + for (uint24_t j = section[9]; j < section[10]; j++) { //Set to Win Screen text for temporary measures + if (text[j] == 146) { + x = 8; + y += 12; + if (i == 0 || i == 4) { + y += 8; + } + i++; + if (i > 0 && i < 5) { + x = 15; + } + } else { + pause6x8(x, y, text[j]); + x += 7; + } + } + } + + gColor = 7; + pause6x8(148, 268, (scoreSort() % 10)); + pause6x8(148, 280, (score % 10)); + pause6x8(148, 292, (timer % 10)); + gColor = 0; + pause6x8(50, 304, 66); + pause6x8(57, 304, 66); + pause6x8(64, 304, 66); + option = 0; + while (!(kb_Data[1] & (kb_Graph | kb_Del))) { + do { + keyPress(); + + } while(key == 0); + if (kb_Data[7] & kb_Up) { + if (name[option] == 58) { + } else { + name[option] = 33; + name[option]++; + } + gColor = 7; + fillRect(50 + (option * 7),304,6,8); + gColor = 0; + pause6x8(50 + (option * 7), 304, name[option]); + } + if (kb_Data[7] & kb_Down) { + if (name[option] == 33) { + name[option] = 58; + } else { + name[option]--; + } + gColor = 7; + fillRect(50 + (option * 7),304,6,8); + gColor = 0; + pause6x8(50 + (option * 7), 304, name[option]); + } + if (kb_Data[7] & kb_Left) { + if (option == 0) { + option = 2; + } else { + option--; + } + } + if (kb_Data[7] & kb_Right) { + if (option == 2) { + option = 0; + } else { + option++; + } + } + if ((kb_Data[6] & kb_Enter) || (kb_Data[2] & kb_Alpha)) { + break; + } + } + */ +} + +void timeDisplay(uint32_t input) { //systemTime - gameStartTime - gamePauseTime + uint32_t _1000mili = 0; + uint32_t _100mili = 0; + uint32_t _10mili = 0; + //uint32_t _1mili; + //uint32_t _100micro; + if (cleared != 0) { + _1000mili = (input / 32768); // Time to nearest second, full accuracy + _100mili = (input / 3277); // 100 mili Second, 16385/16384 ~6.104e-5 accuracy + _10mili = (input / 328); // 10 mili Second, 1025/1024 ~9.766e-4 accuracy + //_1mili = (input / 33); // 1 mili Second, 4125/4096 ~7.080e-3 accuracy + //_100micro = (input / 3); // 100 micro Second, 1875/2048 ~8.447e-2 accuracy + } + if (_1000mili > 9999) { // ~2.8 Hours + pause6x8(103, 336, ((_1000mili / 10000) % 10)); + } + if (_1000mili > 999) { // ~16.7 minutes + pause6x8(110, 336, ((_1000mili / 1000) % 10)); + } + if (_1000mili > 99) { // 100 Seconds + pause6x8(117, 336, ((_1000mili / 100) % 10)); + } + if (_1000mili > 9) { // 10 Seconds + pause6x8(124, 336, ((_1000mili / 10) % 10)); + } + pause6x8(136, 336, 34); //Decimal Point + pause6x8(131, 336, (_1000mili % 10)); // 1 Second + pause6x8(141, 336, (_100mili % 10)); // 100 MiliSeconds + pause6x8(148, 336, (_10mili % 10)); // 10 MiliSeconds +} + +void pauseScroll() { + if ((kb_Data[7] & (kb_Up | kb_Down)) && (keyReady & VERT)) { + keyReset(vERT); + gColor = 0; + pause6x8(8, 268 + (option * 12), 29); + pause6x8(141, 268 + (option * 12), 28); + if ((kb_Data[7] & kb_Up)) { + if (option == 0) { + option = 3; + } else { + option--; + } + } else { //Must be Down + if (option == 3) { + option = 0; + } else { + option++; + } + } + gColor = 7; + pause6x8(8, 268 + (option * 12), 29); + pause6x8(141, 268 + (option * 12), 28); + } +} + +void winScreen() { + if (gameFinishTime == 0) { + gameFinishTime = systemTime - gameStartTime - gamePauseTime; + } + pauseTime = systemTime; + *frameBase = (uint24_t)((size_t)WRAM); + *videoMode = 0x925; //4bit mode + gColor = 0; + fillRect(0,240,320,120); //Clears the screen + + // if (scoreSort() != 99 || 1) { //Force Debug Run + // scoreScreen(); + // } //Do not use for now please + + gColor = 7; + { + uint24_t x = 8; + uint24_t y = 248; + uint8_t i = 0; + uint24_t j = 0; + if (cheater == 1) { + j = 14; //Majic Number + for (uint8_t j = 0; j < cheatTextLength; j++) { + pause6x8(x, y, cheatText[j]); + x += 7; + } + } + for (; j < winTextLength; j++) { + if (winText[j] == 33) { + x = 8; + y += 12; + if (i == 0 || i == 4) { + y += 8; + } + i++; + if (i > 0 && i < 5) { + x = 22; + } + } else { + pause6x8(x, y, winText[j]); + x += 7; + } + } + } + + pause6x8(8, 268, 29); + pause6x8(141, 268, 28); + + option = 0; + printStat(score); + + timeDisplay(gameFinishTime); + + fadeIn(); + + while (!(kb_Data[1] & (kb_Graph | kb_Del))) { + keyPress(); + + + pauseScroll(); + + if (((kb_Data[6] & kb_Enter) || (kb_Data[2] & kb_Alpha)) && (keyReady & ALPHA)) { + keyReset(aLPHA); + if (option == 0) { //Resume + gamePauseTime += (systemTime - pauseTime); + } else if (option == 1) { //Restart + //key = 90; + status = RESTART; + } else if (option == 2) { //Main Menu + //key = 80; + status = QUIT; + } else if (option == 3) { //Quit + //key = 49; + status = FORCEQUIT; + } + *frameBase = 0xD40000; + *videoMode = 0x927; //8bit mode + break; + } + } + *frameBase = 0xD40000; + *videoMode = 0x927; //8bit mode +} + +void gameOver() { //160x120 screen due to poor coding + pauseTime = systemTime; + + uint24_t *vR = frameBase; + *vR = 0xD52C00; + *videoMode = 0x925; //4bit mode + gColor = 0; + fillRect(0,240,320,120); //Clears the screen + + gColor = 7; + { + uint24_t x = 8; + uint24_t y = 248; + uint8_t i = 0; + for (uint24_t j = 0; j < gameOverTextLength; j++) { + if (gameOverText[j] == 33) { + x = 8; + y += 12; + if (i == 0 || i == 4) { + y += 8; + } + i++; + if (i > 0 && i < 5) { + x = 22; + } + } else { + pause6x8(x, y, gameOverText[j]); + x += 7; + } + } + } + pause6x8(8, 268, 29); + pause6x8(141, 268, 28); + + + option = 0; + uint24_t clearTemp = ((sizeX) * (sizeY)) - mines - cleared + 1; + printStat(clearTemp); + + timeDisplay(systemTime - gameStartTime - gamePauseTime); + + fadeIn(); + + + while (!(kb_Data[1] & (kb_Graph | kb_Del))) { + keyPress(); + + pauseScroll(); + + if ((kb_Data[6] & kb_Enter) || (kb_Data[2] & kb_Alpha)) { + if (option == 0) { + //key = 90; + status = RESTART; + } else if (option == 1) { + //key = 80; + status = QUIT; + } else if (option == 2) { //Resume + gamePauseTime += (systemTime - pauseTime); + } else if (option == 3) { + //key = 49; + status = FORCEQUIT; + } + *vR = 0xD40000; + *videoMode = 0x927; //8bit mode + break; + } + } + *vR = 0xD40000; + *videoMode = 0x927; //8bit mode +} + +void pause() { + pauseTime = systemTime; + gColor = 0; + fillRect(0,240,320,120); //Clears the screen + + gColor = 7; + { + uint24_t x = 8; + uint24_t y = 248; + uint8_t i = 0; + for (uint24_t j = 0; j < pauseTextLength; j++) { + if (pauseText[j] == 33) { + x = 8; + y += 12; + if (i == 0 || i == 4) { + y += 8; + } + i++; + if (i > 0 && i < 5) { + x = 22; + } + } else { + pause6x8(x, y, pauseText[j]); + x += 7; + } + } + } + pause6x8(8, 268, 29); + pause6x8(141, 268, 28); + + option = 0; + uint24_t clearTemp = ((sizeX) * (sizeY)) - mines - cleared; + printStat(clearTemp); + + timeDisplay(systemTime - gameStartTime - gamePauseTime); + + *frameBase = 0xD52C00; + *videoMode = 0x925; //4bit mode + + while (!(kb_Data[1] & (kb_Graph | kb_Del))) { + keyPress(); + + pauseScroll(); + + if ((kb_Data[6] & kb_Enter) || (kb_Data[2] & kb_Alpha)) { + + if (option == 0) { //Resume + gamePauseTime += (systemTime - pauseTime); + } else if (option == 1) { + status = RESTART; + //key = 90; + } else if (option == 2) { + status = QUIT; + //key = 80; + } else if (option == 3) { + status = FORCEQUIT; + //key = 49; + } + *frameBase = 0xD40000; + *videoMode = 0x927; //8bit mode + break; + } + } + *frameBase = 0xD40000; + *videoMode = 0x927; //8bit mode +} + +#endif /* GAMEMENU_H */ \ No newline at end of file diff --git a/src/global.h b/src/global.h new file mode 100644 index 0000000..a9bc56e --- /dev/null +++ b/src/global.h @@ -0,0 +1,368 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef GLOBAL_H +#define GLOBAL_H + +//#include +#include +#include "x86render.h" //Contains the windows version of everything + +//#define VIDEO //Disables cutscene and saves a few bytes +#define DEVBUILD + +//System specification +//#define TI84CE +#define WINDOWS + +//#ifdef WINDOWS + +//#endif /* WINDOWS */ + + +typedef uint32_t uint24_t; +typedef int32_t int24_t; +typedef uint32_t u24; +typedef int32_t i24; + +typedef uint8_t u8; +typedef uint16_t u16; +//typedef uint24_t u24; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t i8; +typedef int16_t i16; +//typedef int24_t i24; +typedef int32_t i32; +typedef int64_t i64; + + + +#ifdef TI84CE +void* VRAM = (void*)0xD40000; +void* WRAM = (void*)0xD52C00; +void* XRAM = (void*)0xD65800; +uint24_t* frameBase = (uint24_t*)0xE30010; +volatile uint16_t* videoMode = (uint16_t*)0xE30018; +uint16_t* paletteRAM = (uint16_t*)0xE30200; + +uint32_t* LCDTiming0 = (uint32_t*)0xE30000; //0x1F0A0338 +uint32_t* LCDTiming1 = (uint32_t*)0xE30004; //0x0402093F +uint32_t* LCDTiming2 = (uint32_t*)0xE30008; //0x00EF7802 +uint32_t* LCDTiming3 = (uint32_t*)0xE3000C; //0x00000000 + +uint32_t* lcd_CrsrImage = (uint32_t*)0xE30800; +uint32_t* lcd_CrsrCtrl = (uint32_t*)0xE30C00; +uint32_t* lcd_CrsrConfig = (uint32_t*)0xE30C04; +uint32_t* lcd_CrsrPalette0 = (uint32_t*)0xE30C08; +uint32_t* lcd_CrsrPalette1 = (uint32_t*)0xE30C0C; +uint32_t* lcd_CrsrXY = (uint32_t*)0xE30C10; +uint16_t* lcd_CrsrX = (uint16_t*)0xE30C10; +uint16_t* lcd_CrsrY = (uint16_t*)0xE30C12; +uint32_t* lcd_CrsrClip = (uint32_t*)0xE30C04; + +#endif /* TI84CE */ + +enum COLORS { //Will it be used? Or will knuckles prevail + Black,Red,Yellow,Lime,Teal,Blue,Magenta,White, + Grey,Maroon,Brown,Green,Cyan,Navy,Purple,Silver +}; + +/* +** This file is a file where I dumped all the global variables so things would not break +*/ + +uint24_t mines = 0; //U16 +int24_t flags = 54; //S16 +uint24_t cleared = 0; //U16 +uint8_t win = 1; +uint24_t flagColor = 1; +u8 cheater = 0; +u8 autoLoss = 0; + +int24_t score = 0; + +int24_t tile; + +/* Parameters */ + +#define gameModeCount 16 +uint24_t gameMode = 0; +uint24_t sizeX = 25; //Board X +uint24_t sizeY = 15; //Board Y +uint24_t chance = 54; //Refactor + +/* Parameters */ + +/* Game Backend */ + +uint16_t offPos = 0; //gameMode index +uint8_t offLen = 16; //gameMode length +uint8_t marX = 29; //Array X +uint8_t marY = 19; //Array Y +int24_t posX = -15; +int24_t posY = 6; + +uint8_t disX = 13; //Define spacing between squares +uint8_t disY = 13; +uint8_t padX = 3; +uint8_t padY = 2; +uint8_t font = 0; +uint8_t fontSize = 7; + +/* Graphical Backend */ + +/* Settings */ +u8 swapAlphaSecondBind = 0; +//Game Settings +u8 safeGuess = 2; //off,on,extra +u8 chording = 1; //off,on +u8 autoSolver = 0; //off,manual,automatic + +//Video Settings +uint24_t displayMode = 0; //Originally videoMode +u8 accessMode = 0; //Increases Readability, Disables Quake +u8 fadeEffect = 1; //off,static,dynamic //Refactor to bgEffects +u8 fpsCounter = 1; //Debug thing +u8 cursorGraphic = 0; +u8 movieIntro = 1; + +uint32_t FPS = (32768 / 1024); //Set to 0 for unlimited +uint32_t fpsT = 120; //temp value + +//Data Settings +u8 autoSaveMax = 0; + +/* Settings */ + +/* Text */ +uint8_t guideText[511] = {82,110,105,94,107,32,82,112,94,94,105,94,107,32,98,108,32,90,32,111,94,107,108,98,104,103,32,104,95,32,76,98,103,94,82,112,94,94,105,94,107,33,95,104,107,32,109,97,94,32,83,98,8,4,66,68,32,112,98,109,97,32,108,94,111,94,107,90,101,32,102,104,93,94,108,32,90,103,93,33,95,94,90,109,110,107,94,108,34,32,83,104,32,105,101,90,114,35,32,104,103,94,32,92,90,103,32,108,109,90,107,109,32,90,32,106,110,98,92,100,33,96,90,102,94,32,95,107,104,102,32,109,97,94,32,102,90,98,103,32,102,94,103,110,35,32,109,97,98,108,32,98,103,92,101,110,93,94,108,33,104,105,109,98,104,103,108,32,95,104,107,32,93,98,95,95,94,107,94,103,109,32,93,98,95,95,98,92,110,101,109,98,94,108,32,90,103,93,33,105,107,94,108,94,109,108,34,32,78,103,92,94,32,98,103,32,90,32,96,90,102,94,35,32,114,104,110,107,32,104,91,99,94,92,109,98,111,94,33,98,108,32,109,104,32,108,90,95,94,101,114,32,69,101,90,96,32,26,32,90,101,101,32,109,97,94,32,76,98,103,94,108,32,25,32,91,114,33,110,108,98,103,96,32,109,97,94,32,103,110,102,91,94,107,94,93,32,109,98,101,94,108,32,90,108,32,92,101,110,94,108,32,109,104,33,95,98,96,110,107,94,32,104,110,109,32,112,97,94,107,94,32,94,90,92,97,32,76,98,103,94,32,25,32,98,108,32,101,104,92,90,109,94,93,34,33,33,84,108,94,32,64,101,105,97,90,32,109,104,32,108,94,90,107,92,97,32,90,32,109,98,101,94,35,32,2,103,93,32,109,104,32,69,101,90,96,32,26,33,90,32,109,98,101,94,35,32,88,47,32,109,104,32,102,90,107,100,32,90,32,27,32,104,103,109,104,32,90,32,109,98,101,94,35,32,87,83,0,103,33,109,104,32,92,97,104,107,93,35,32,102,104,93,94,32,109,104,32,105,90,110,108,94,35,32,90,103,93,32,93,94,101,32,109,104,32,106,110,98,109,34,33,33,72,32,97,104,105,94,32,114,104,110,32,94,103,99,104,114,32,102,114,32,96,90,102,94,32,39,38,33}; +#define guideTextLength 511 //helpText had a naming conflict >:( + +uint8_t pauseText[84] = {79,90,110,108,94,93,39,33,81,94,108,110,102,94,32,70,90,102,94,33,81,94,108,109,90,107,109,33,76,90,98,103,32,76,94,103,110,33,68,113,98,109,32,64,105,105,101,98,92,90,109,98,104,103,33,81,94,102,90,98,103,98,103,96,32,83,98,101,94,108,39,33,83,98,102,94,32,83,90,100,94,103,39,33}; +#define pauseTextLength 84 +uint8_t gameOverText[87] = {70,90,102,94,32,78,111,94,107,48,33,81,94,108,109,90,107,109,33,76,90,98,103,32,76,94,103,110,33,81,94,108,110,102,94,32,70,90,102,94,33,68,113,98,109,32,64,105,105,101,98,92,90,109,98,104,103,33,81,94,102,90,98,103,98,103,96,32,83,98,101,94,108,39,33,83,98,102,94,32,83,90,100,94,103,39,33}; +#define gameOverTextLength 87 +uint8_t winText[81] = {70,90,102,94,32,66,104,102,105,101,94,109,94,48,33,81,94,108,110,102,94,32,70,90,102,94,33,81,94,108,109,90,107,109,33,76,90,98,103,32,76,94,103,110,33,68,113,98,109,32,64,105,105,101,98,92,90,109,98,104,103,33,82,92,104,107,94,39,33,83,98,102,94,32,83,90,100,94,103,39,33}; +#define winTextLength 81 +uint8_t cheatText[16] = {88,104,110,32,66,97,94,90,109,94,93,48,32,29,39,37}; +#define cheatTextLength 16 +/* Text */ + +/* IO Handeling */ +enum STATUS {OKAY,RESTART,QUIT,FORCEQUIT}; +uint8_t status = 0; +/* IO Handeling */ + +/* Chording/Cursor */ + +uint24_t cursorAllow = 0; + +/* Chording/Cursor */ + +/* Legacy */ +const uint8_t hiddenText[43] = { //SuperSweeper V:X.XX.X ZERICO2005 YYYY/MM/DD + 82,110,105,94,107,82,112,94,94,105,94,107,32,85,39, /* Text */ + 0,34,7,7,34,1, /* Version */ + 32,89,68,81,72,66,78,2,0,0,5,32, /* Text */ + 2,0,2,3,36, /* Year */ + 0,6,36,0,3, /* Month Day */ +}; +const uint8_t hiddenTextLength = 43; + +const uint8_t blockLimits[6] = {8,4,8,8,6,6}; //Minus 1 +// + +uint8_t category = 0; + +uint8_t names[288] = { + 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40, 66,68,25,76,68,26,83,68,30,66,71,48,40,40,40,40,40,40 +}; + +uint16_t leaderboard[96] = { + 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0, 1600,1100,700,400,0,0 +}; + +//8bit Color Pallete +//0-15 EGA, 16 Orange, 17-20 Fade +//5x5 Image and Color +//Number Colors +const uint8_t color[28] = { +/*0*/ 7, 5,11, 1,13, 9,12, 0 +/*1*/, 8,14,10, 6, 4, 2, 0, 8 +/*2*/, 7, 0, 0, 0, 0, 0, 0, 0 +/*3*/, 0, 0, 0,13 +}; + +//Outdated Text +//const uint8_t text[1311] = {50,85,74,92,92,82,76,32,60,82,87,78,66,96,78,78,89,78,91,39,32,25,33,58,87,82,80,81,93,32,66,96,78,78,89,78,91,39,32,30,33,48,85,85,32,60,88,77,78,92,39,32,26,33,50,94,92,93,88,86,39,32,109,33,59,78,74,77,78,91,75,88,74,91,77,39,32,44,33,66,78,93,93,82,87,80,92,39,32,43,33,55,78,85,89,39,32,27,33,52,97,82,93,32,54,74,86,78,39,32,45,33,64,94,82,76,84,32,54,74,86,78,39,33,54,74,86,78,32,60,88,77,78,39,32,30,33,63,91,78,92,78,93,39,32,26,33,66,82,99,78,39,32,46,33,51,82,79,79,82,76,94,85,93,98,39,32,41,33,66,93,74,91,93,32,54,74,86,78,39,32,25,33,50,94,92,93,88,86,39,32,43,33,60,74,82,87,32,60,78,87,94,39,32,45,33,63,74,93,93,78,91,87,32,66,78,85,78,76,93,82,88,87,39,32,26,33,65,74,87,77,88,86,32,60,88,77,78,39,32,27,33,66,78,85,78,76,93,32,63,91,78,92,78,93,39,32,25,33,50,94,92,93,88,86,32,54,74,86,78,39,32,43,33,60,74,82,87,32,60,78,87,94,39,32,45,33,54,74,86,78,32,60,88,77,78,39,32,30,33,66,82,99,78,32,71,39,33,66,82,99,78,32,72,39,33,60,82,87,78,32,50,88,94,87,93,39,32,25,33,63,78,91,76,78,87,93,74,80,78,39,32,41,33,66,93,74,91,93,32,54,74,86,78,39,32,26,33,60,74,82,87,32,60,78,87,94,39,32,45,33,55,82,80,81,32,66,76,88,91,78,92,39,32,44,33,1,34,33,2,34,33,3,34,33,4,34,33,5,34,33,6,34,33,54,74,86,78,32,60,88,77,78,39,32,30,33,60,74,82,87,32,60,78,87,94,39,32,45,33,66,74,79,78,32,54,94,78,92,92,82,87,80,39,33,69,82,77,78,88,32,60,88,77,78,39,33,49,74,76,84,80,91,88,94,87,77,32,52,79,79,78,76,93,92,39,33,48,76,76,78,92,92,82,75,82,85,82,93,98,32,60,88,77,78,39,33,50,88,91,77,82,87,80,32,37,48,85,89,81,74,38,39,33,60,74,97,82,86,94,86,32,53,63,66,39,33,69,78,91,92,82,88,87,39,33,60,74,82,87,32,60,78,87,94,32,45,33,66,94,89,78,91,32,66,96,78,78,89,78,91,32,82,92,32,74,32,95,78,91,92,82,88,87,32,88,79,32,60,82,87,78,66,96,78,78,89,78,91,33,79,88,91,32,93,81,78,32,67,82,8,4,50,52,32,96,82,93,81,32,92,78,95,78,91,74,85,32,86,88,77,78,92,32,74,87,77,33,79,78,74,93,94,91,78,92,34,32,67,88,32,89,85,74,98,35,32,88,87,78,32,76,74,87,32,92,93,74,91,93,32,74,32,90,94,82,76,84,33,80,74,86,78,32,79,91,88,86,32,93,81,78,32,86,74,82,87,32,86,78,87,94,35,32,93,81,82,92,32,82,87,76,85,94,77,78,92,33,88,89,93,82,88,87,92,32,79,88,91,32,77,82,79,79,78,91,78,87,93,32,77,82,79,79,82,76,94,85,93,82,78,92,32,74,87,77,33,89,91,78,92,78,93,92,34,32,62,87,76,78,32,82,87,32,74,32,80,74,86,78,35,32,98,88,94,91,32,88,75,83,78,76,93,82,95,78,33,82,92,32,93,88,32,92,74,79,78,85,98,32,53,85,74,80,32,26,32,74,85,85,32,93,81,78,32,60,82,87,78,92,32,25,32,75,98,33,94,92,82,87,80,32,93,81,78,32,87,94,86,75,78,91,78,77,32,93,82,85,78,92,32,74,92,32,76,85,94,78,92,32,93,88,33,79,82,80,94,91,78,32,88,94,93,32,96,81,78,91,78,32,78,74,76,81,32,60,82,87,78,32,25,32,82,92,32,85,88,76,74,93,78,77,34,33,33,68,92,78,32,48,85,89,81,74,32,93,88,32,92,78,74,91,76,81,32,74,32,93,82,85,78,35,32,2,87,77,32,93,88,32,53,85,74,80,32,26,33,74,32,93,82,85,78,35,32,72,47,32,93,88,32,86,74,91,84,32,74,32,27,32,88,87,93,88,32,74,32,93,82,85,78,35,32,71,67,0,87,33,93,88,32,76,81,88,91,77,35,32,86,88,77,78,32,93,88,32,89,74,94,92,78,35,32,74,87,77,32,77,78,85,32,93,88,32,90,94,82,93,34,33,33,56,32,81,88,89,78,32,98,88,94,32,78,87,83,88,98,32,86,98,32,80,74,86,78,32,39,38,33,63,74,94,92,78,77,39,33,65,78,92,94,86,78,32,54,74,86,78,33,65,78,92,93,74,91,93,33,60,74,82,87,32,60,78,87,94,33,52,97,82,93,32,48,89,89,85,82,76,74,93,82,88,87,33,65,78,86,74,82,87,82,87,80,32,67,82,85,78,92,39,33,67,82,86,78,32,67,74,84,78,87,39,33,54,74,86,78,32,62,95,78,91,109,33,65,78,92,93,74,91,93,33,60,74,82,87,32,60,78,87,94,33,65,78,92,94,86,78,32,54,74,86,78,33,52,97,82,93,32,48,89,89,85,82,76,74,93,82,88,87,33,65,78,86,74,82,87,82,87,80,32,67,82,85,78,92,39,33,67,82,86,78,32,67,74,84,78,87,39,33,54,74,86,78,32,50,88,86,89,85,78,93,78,109,33,65,78,92,94,86,78,32,54,74,86,78,33,65,78,92,93,74,91,93,33,60,74,82,87,32,60,78,87,94,33,52,97,82,93,32,48,89,89,85,82,76,74,93,82,88,87,33,66,76,88,91,78,39,33,67,82,86,78,32,67,74,84,78,87,39,33}; +//const uint24_t section[11] = {0,112,206,287,371,430,548,1059,1143,1230,1311}; + +/* Legacy */ + +uint16_t initialPalette[256] = { + /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/ /*A*/ /*B*/ /*C*/ /*D*/ /*E*/ /*F*/ +/*0*/ 0x0000,0x7C00,0x7FE0,0x03E0,0x03FF,0x001F,0x7C1F,0x7FFF,0x1CE7,0x3C00,0x3DE0,0x01E0,0x01EF,0x000F,0x3C0F,0x5EF7 +/*1*/,0x79E0,0x0210,0x0210,0x0210,0x0210,0x0210,0x1084,0x6000,0x7800,0x1400,0x0421,0x5294,0x5EE0,0x0000,0x0000,0x0000 +/*2*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*3*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*4*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*5*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*6*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*7*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*8*/,0x7800,0x1400,0x7BC0,0x14A0,0x03C0,0x00A0,0x7BDE,0x294A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*9*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*A*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*B*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*C*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*D*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*E*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +/*F*/,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 /* Menu fade effect */ +}; + +//const uint8_t CLICKABLE = 0b00000100; const uint8_t SELECT1 = 0b00000001; const uint8_t SELECT2 = 0b00000010; const uint8_t SELECT3 = 0b00000011; red darkRed 0grey 1grey +enum guiType {Click = 1, Scroll = 2, Dial = 4, Direct = 8, Value = 16, Dot = 32, BoolToggle = 64, Text = 128}; +enum GUITYPE { C = 1, F = 2, N = 4, P = 8, V = 16, D = 32, B = 64, T = 128}; + +/* Global */ +//Video + + + +//Graphics + +//Utilities +uint32_t seed = 0; //Used for random number generation //frameTime variable +uint32_t delta = 0; +uint32_t frameStart = 0; //When the new frame began +uint32_t clockMax = 0; +uint32_t clockTime = 0; + +uint32_t systemTime; +uint32_t pauseTime; +uint32_t gameStartTime; +uint32_t gamePauseTime; +uint32_t gameFinishTime; + + +/* Global */ + +/* Library Functions */ + + +#ifdef TI84CE +uint8_t* board = (uint8_t*)0xD5E000; +uint8_t* state = (uint8_t*)0xD5F000; +uint24_t* search = (uint24_t*)0xD60000; +uint8_t* flag = (uint8_t*)0xD62000; +#endif /* TI84CE */ + +#ifdef WINDOWS +uint8_t board[56*31]; +uint8_t state[56*31]; +uint24_t search[56*31]; +uint8_t flag[56*31]; +#endif /* WINDOWS */ + +uint24_t fadeSpeed = 0; + +const uint16_t orderPos[18] = { + 0,16,32,48,64,80,96,112,128,144,152,176,200,232,264,288,312,344 +}; +//344 + 16 for buffer reasons since this keeeps being a probelmy +const int8_t order[360] = { + -1,1,0,1,1,1,-1,0,1,0,-1,-1,0,-1,1,-1, + -1,2,1,2,-2,1,-2,-1,2,1,2,-1,-1,-2,1,-2, + 0,2,0,1,0,-1,0,-2,-2,0,-1,0,1,0,2,0, + -2,2,2,2,-1,1,1,1,-1,-1,1,-1,-2,-2,2,-2, + 2,2,2,-2,-2,2,-2,-2,1,0,-1,0,0,1,0,-1, + -1,2,2,1,1,-2,-2,-1,1,0,-1,0,0,1,0,-1, + 1,1,1,2,-1,-1,-1,-2,-2,1,-1,1,2,-1,1,-1, + -2,1,-1,1,2,1,1,1,-2,-1,-1,-1,2,-1,1,-1, + 1,1,1,-1,-1,1,-1,-1,2,0,1,0,-1,0,-2,0, + -1,0,1,0,0,1,0,-1, + -1,1,0,1,1,1,-1,0,1,0,-1,-1,0,-1,1,-1, -1,0,1,0,0,1,0,-1, + -1,1,0,1,1,1,-1,0,1,0,-1,-1,0,-1,1,-1, -1,-1,1,1,-1,1,1,-1, + 0,2,0,1,0,-1,0,-2,-2,0,-1,0,1,0,2,0, -2,2,2,2,-1,1,1,1,-1,-1,1,-1,-2,-2,2,-2, + -1,1,0,1,1,1,-1,0,1,0,-1,-1,0,-1,1,-1, -1,2,1,2,-2,1,-2,-1,2,1,2,-1,-1,-2,1,-2, + -1,0,1,0,0,1,0,-1, 2,2,2,-2,-2,2,-2,-2,1,0,-1,0,0,1,0,-1, + -1,0,1,0,0,1,0,-1, 0,2,0,1,0,-1,0,-2,-2,0,-1,0,1,0,2,0, + 0,2,0,1,0,1,0,-1,0,-1,0,-2, 2,0,1,0,1,0,-1,0,-1,0,-2,0, 1,1,1,-1,-1,1,-1,-1 +}; + +const uint8_t fontArray[40] = { + 0,0,0,1,1,2,2,2, 6,8,8,8,10,9,11,13, 8,8,10,8,10,11,13,13, 1,2,2,1,2,1,2,3, 1,1,2,1,2,1,2,2 +}; + +uint8_t bX[18] = {14,20,24,29,32,34, 34,36,40,47,54,56, 14,24,32,34,40,54}; //Plus 4 +uint8_t bY[18] = {14,14,16,19,20,22, 25,28,29,29,29,31, 14,16,20,25,29,29}; //Plus 4 +uint24_t bM[18] = {10,18,30,54,72,90, 108,136,180,240,300,3, 10,30,72,108,180,300}; +uint8_t bF[6] = {7,7,7,7,7,7}; + +///fff + + +uint8_t option = 0; + +#define RGB4bit 0x825 +#define RGB8bit 0x827 +#define RGB16bit 0x82D +#define BGR4bit 0x925 +#define BGR8bit 0x927 +#define BGR16bit 0x92D + +//Broken Functions +/* +uint8_t findColor1555(uint16_t c); +uint8_t findColor888(uint8_t r, uint8_t g, uint8_t b); +uint8_t findColor565(uint16_t c); + +uint8_t findColor1555(uint16_t c) { + i8 r = (c & 0x7C00) >> 10; + i8 g = (c & 0x03E0) >> 4; + g += (c & 0x8000) ? 1 : 0; + i8 b = (c & 0x001F); + + u8 best = 0x00; + u16 low = 0xFFFF; + for (u8 i = 0; i < 0xF0; i++) { //Avoids temp color zone + u16 col = paletteRAM[i]; + i8 r0 = (col & 0x7C00) >> 10; + i8 g0 = (col & 0x03E0) >> 4; + g0 += (c & 0x8000) ? 1 : 0; + i8 b0 = (col & 0x001F); + u16 dif = (abs(r - r0) * abs(r - r0)) + (abs(g - g0) * abs(g - g0)) + (abs(b - b0) * abs(b - b0)); + if (dif < low) { + low = dif; + best = i; + } + } + return best; +} +uint8_t findColor888(uint8_t r, uint8_t g, uint8_t b) { + u8 i = (g & 0x04) >> 2; + r >>= 3; + g >>= 2; + b >>= 3; + return findColor1555((i << 15) + (r << 10) + (g << 5) + b); +} +uint8_t findColor565(uint16_t c) { + uint8_t r = (c & 0xF800) >> 11; + uint8_t g = (c & 0x07C0) >> 6; + uint8_t b = (c & 0x001F); + uint8_t i = (c & 0x0020) >> 5; + return findColor1555((i << 15) + (r << 10) + (g << 5) + b); +} +*/ + + +//Menu stuff + + + +#endif /* GLOBAL_H */ \ No newline at end of file diff --git a/src/int24_type.h b/src/int24_type.h new file mode 100644 index 0000000..3ea731b --- /dev/null +++ b/src/int24_type.h @@ -0,0 +1,120 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef INT24_TYPE +#define INT24_TYPE + +/* +** Version 1.0.2 +** 2023/04/10 +*/ + +class uint24_t { + private: + //Stored across 3 bytes + uint8_t b0; + uint8_t b1; + uint8_t b2; + + //Conversions + uint24_t format24(uint32_t i) { //32bit to 24bit + uint24_t z; + z.b0 = i & 255; + z.b1 = (i >> 8) & 255; + z.b2 = (i >> 16) & 255; + return z; + } + uint32_t format32(uint24_t z) { //24bit to 32bit + return (z.b0) + (z.b1 << 8) + (z.b2 << 16); + } + + public: + //Constructors + uint24_t() {} + uint24_t(uint32_t i) { + b0 = i & 255; + b1 = (i >> 8) & 255; + b2 = (i >> 16) & 255; + } + operator uint32_t () { + return (b0) + (b1 << 8) + (b2 << 16); + } + + //Bitwise Not + uint24_t operator~() { + uint32_t z = (b0) + (b1 << 8) + (b2 << 16); + return format24(~z); + } + + //Debug + void print_uint24_t() { + uint32_t w = (b0) + (b1 << 8) + (b2 << 16); + printf("\n%8d | %d,%d,%d",w,b2,b1,b0); + } +}; + +class int24_t { + private: + //Stored across 3 bytes + uint8_t b0; + uint8_t b1; + uint8_t b2; + + //Conversions + int24_t format24(int32_t i) { //32bit to 24bit + int24_t z; + z.b0 = (uint32_t)(i) & 255; + z.b1 = ((uint32_t)(i) >> 8) & 255; + z.b2 = ((uint32_t)(i) >> 16) & 255; + return z; + } + int32_t format32(int24_t z) { //24bit to 32bit + int32_t w = (z.b0) + (z.b1 << 8) + (z.b2 << 16); + if (b2 & 128) { //If bit 23 is set + w |= 0xFF000000; + } + return w; + } + + public: + //Constructors + int24_t() {} + int24_t(int32_t i) { + b0 = (uint32_t)(i) & 255; + b1 = ((uint32_t)(i) >> 8) & 255; + b2 = ((uint32_t)(i) >> 16) & 255; + } + operator int32_t () { + int32_t w = (b0) + (b1 << 8) + (b2 << 16); + if (b2 & 128) { //If bit 23 is set + w |= 0xFF000000; + } + return w; + } + + //Bitwise Not + int24_t operator~() { + int32_t z = (b0) + (b1 << 8) + (b2 << 16); + return format24(~z); + } + + //Debug + void print_int24_t() { + int32_t w = (b0) + (b1 << 8) + (b2 << 16); + if (b2 & 128) { //If bit 23 is set + w |= 0xFF000000; + } + printf("\n%8d | %d,%d,%d",w,b2,b1,b0); + } + void print_uint24_t() { + uint32_t w = (b0) + (b1 << 8) + (b2 << 16); + printf("\n%8d | %d,%d,%d",w,b2,b1,b0); + } +}; + +#endif /* INT24_TYPE */ \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..96a03dc --- /dev/null +++ b/src/main.c @@ -0,0 +1,155 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#include +//#include +//#include +#include +#include +//#include +//#include +//#include +//#include +#include +#include "prime2D.h" +#include "mineSweeper.h" +#include "menu.h" +#include "global.h" +#include "video.h" +#include +#include "x86render.h" +//#include + +/* +cd "C:\Users\erico\Documents\Programming\superSweeper" +cd "C:\Users\Eric Ross\Documents\Super-Sweeper-CE" +cd "C:\Users\\Documents\Programming\Super-Sweeper-CE" + +cd "C:\Users\ +\Documents\Programming\Super-Sweeper-CE" +*/ +//0.71.3 2023/02/16 21:58 + +/* +It is CRITICAL to fix system time, something allows it to overflow randomly,abtract it so it updates when it is read by a variable or something +*/ + +//When were these suggestions added? Only Git knows now. + +//Implement sliders and proper preset selection + +//Changed flag color to accessability mode +//Fixed percent and mines in custom and added some wack code to it +//Added video intro + +//Some asm speed up in prime2D.h, 118fps to 159fps +//Font changes too in the 0.64.0 update, brought back frame base shifter thing + +//finsih up the menu and get beack to school work +//Add europe text next + +//Add file saving and loading +//And the silver colored mine somehow (Fixed) +//Aranges variables so settings can write to them without temp arrays +//Fix the menus +//Fix the fade effect and the timers and wrist watch clocks +//Why am I using the flagCountColor variable to toggle quake mode? +//Exiting is broken in pause menus from keys being replaced + +void hidden6x8(uint24_t xW, uint24_t yW, uint8_t lexicon) { + uint8_t* bitImage = (uint8_t*)char6x8 + (lexicon * 6); + uint16_t* fill = (uint16_t*)VRAM + (yW * 320 + xW); + uint8_t b = 1; + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 6; x++) { + *fill = *bitImage & b ? 16392 : *fill; + bitImage++; + fill++; + } + bitImage -= 6; + fill += 314; // 320 - 6 + + b <<= 1; + } +} + +void restore() { + *lcd_CrsrConfig = 0x00000000; + *lcd_CrsrCtrl = 0x00000000; + *LCDTiming2 = (uint32_t)(*LCDTiming2 & ~(uint32_t)0x03FF0000) | (uint32_t)(240 - 1) << 16; + *frameBase = 0xD40000; + if (darkMode) { //Reverts to normal Mode + /* + ((void(*)(void))0x384)(); + *(volatile uint8_t*)0xF80018 = 0x08; + *(volatile uint8_t*)0xF80018 = 0x44; + *(volatile uint8_t*)0xF80018 = 0x20; + *(volatile uint8_t*)0xF80008 = 0x01; + */ + } + kb_Reset(); + *videoMode = 0x92D; +} + +int main(void) { + //printf("\nStarting\n"); fflush(stdout); + initLCDcontroller(); + //printf("Ready\n"); fflush(stdout); + //timer_Enable(1, TIMER_32K, TIMER_NOINT, TIMER_UP); //Restart clock + systemTime = timer_Get(1); + #ifdef VIDEO //Toggles video player code + if (1) { //Video Player Code + *videoMode = 0x925; //4bit mode 1001 0010 0101 + gColor = 0; + fillScreen(); + uint8_t exitVideo = splashVideo(); + if (exitVideo == 1) { //If user decides to force quit program + restore(); + return 0; + } + if (exitVideo == 0) { + gColor = 0; + fillScreen(); + delay32K(32768/3); + } + } + #endif /* VIDEO */ + + *videoMode = 0x927; //8bit mode 1001 0010 0111 + + gColor = 0; + for (uint24_t y = 256; y < 400; y += 9) { + for (uint24_t x = 0; x < 144; x += 9) { + fillRect(x,y,8,8); + gColor++; + } + } + + for (u16 r = 0; r < 256; r++) { + paletteRAM[r] = initialPalette[r]; + } + + hidden6x8(2, 230, 50); + { + uint24_t xW = 10; + for (uint8_t j = 0; j < hiddenTextLength; j++) { //Change me as well + hidden6x8(xW, 230, hiddenText[j]); + xW += 7; + } + } //Hidden text + hidden6x8(312, 230, 50); + + fpsT = 32768 / FPS; //Sets fpsTemp for settings menu + fontSize = 7; + + menuLoop(); + + restore(); + terminateLCDcontroller(); + return 0; +} \ No newline at end of file diff --git a/src/menu.h b/src/menu.h new file mode 100644 index 0000000..11a3087 --- /dev/null +++ b/src/menu.h @@ -0,0 +1,399 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef MENU_H +#define MENU_H + +#include +#include "global.h" +#include "subMenu.h" +#include "x86render.h" + +/* Menu Header */ + +void fadeColor(); +void fadeSet(); +void fadeClear(); +void cursorAdjust(); + +void mineScale(); +void execute(); + +#define boxPos (offset + row) + + +/* Menu Header */ + +/* Menu Data */ + + + +// struct menuBlock { +// uint8_t type; +// uint8_t color; + +// uint8_t min; +// uint16_t max; + +// void* pointer; +// void* function; +// } +// menuBlock[64]; + + +//255 Quit, 127-254 Special Event +//128 start game, 180 random game mode, 190 main menu update fps + +//Binaries, nothing to see here, please back away now... + + + + +void blockText(uint8_t block, uint8_t y) { //Commonly used code + gColor = 0; + //uint16_t t = textIndex[boxIndex[block]]; + + uint8_t x = 20; + for (uint16_t s = textIndex[boxIndex[block]]; s < textIndex[boxIndex[block + 1]]; s++) { + if (sourceText[s] == 33) { //New Line + //text6x8(x, y, 17); //17 lolololololololololololololol + y += 24; + x = 20; + } else { + text6x8(x, y, sourceText[s]); + x += 7; + } + } +} + +#define GWI 22 //Game Width Index //Was intended to automatically enable and disable the cursor +/*void cursorAdjust() { + blockMax[GWI] = cursorAllow == 1 ? 27 : 52; + if (*blockPointer[GWI] > blockMax[GWI]) { + *blockPointer[GWI] = blockMax[GWI]; + } +}*/ + +/* Fade Effect */ +uint16_t* fColor; +uint8_t fR; +uint8_t fG; +uint8_t fB; +uint8_t fRMin; +uint8_t fGMin; +uint8_t fBMin; +uint8_t fRMax; +uint8_t fGMax; +uint8_t fBMax; +uint8_t phase = 0; +void fadeClear() { + fColor = paletteRAM; + fColor += (row + 0xF0); + *fColor = initialPalette[boxColor[row + offset]]; +} +#define darkMax 6 +void fadeSet() { + fColor = paletteRAM; + fColor += (row + 0xF0); + fR = (*fColor >> 10) & 31; + fG = (*fColor >> 5) & 31; + fB = (*fColor) & 31; + + fRMin = (fR << 1) / 5; // * 2/5 + fRMax = (fR << 3) / 5; // * 8/5 + if (fRMax < darkMax) { fRMax = darkMax;} + if (fRMax > 31) { fRMax = 31;} + + fGMin = (fG << 1) / 5; // * 2/5 + fGMax = (fG << 3) / 5; // * 8/5 + if (fGMax <= darkMax) { fGMax = darkMax;} + if (fGMax > 31) { fGMax = 31;} + + fBMin = (fB << 1) / 5; // * 2/5 + fBMax = (fB << 3) / 5; // * 8/5 + if (fBMax <= darkMax) { fBMax = darkMax;} + if (fBMax > 31) { fBMax = 31;} + // printUInt(fColor,6,16,2,56); + // printUInt(*fColor,4,16,2,64); +} +#define fadeSpeed 16383 +#define fadeSplit 8191 +#define fadeShift 5 + +// uint8_t fCycle = 0; +// uint24_t fTimer = 0; +void fadeColor() { + if (((uint24_t)systemTime & fadeSpeed) <= fadeSplit) { + phase = ((uint24_t)systemTime & fadeSplit) >> fadeShift; + } else { + phase = 255 - (((uint24_t)systemTime & fadeSplit) >> fadeShift); + } + + // printUInt(phase,2,16,2,80); + fR = linear0(fRMin,fRMax,255,phase); + fG = linear0(fGMin,fGMax,255,phase); + fB = linear0(fBMin,fBMax,255,phase); + // printUInt(fR,2,10,2,96); + // printUInt(fG,2,10,2,104); + // printUInt(fB,2,10,2,112); + + // printUInt(select,2,10,2,132); + // printUInt(number,3,10,2,140); + *fColor = ((fR << 10) | (fG << 5) | fB); +} +/* Fade Effect */ + +u16 getNumber(u16 index) { + if (boxMax[index] < 255) { + return *(uint8_t*)boxPointer[index]; + } else { + return *(uint16_t*)boxPointer[index]; + } +}; +void setNumber(u16 index, u16 value) { + if (boxMax[index] < 255) { + *(uint8_t*)boxPointer[index] = (uint8_t)value; + } else { + *(uint16_t*)boxPointer[index] = (uint16_t)value; + } +}; + +void buildMenu() { + + gColor = 15; + fillScreen(); + uint24_t j = 20; + uint8_t pColor = 0xF0; + for (row = 0; row < menuRows[sector]; row++) { + gColor = boxColor[boxPos]; + initialPalette[pColor] = initialPalette[gColor]; + paletteRAM[pColor] = initialPalette[gColor]; + gColor = pColor; + // if (select != 0) { + // gColor = blockColor[select + offSec]; + // } else { + // gColor = 16; + // } + fillRect(16, j - 4, 196, 16); + + if (boxType[boxPos] & Value) { + gColor = 0; + text6x8(202, j, 29); //>> + uint16_t value = getNumber(boxPos); + text6x8(195, 20 + (24 * row), (value % 10)); + text6x8(188, 20 + (24 * row), ((value / 10) % 10)); + if (boxMax[boxPos] < 100) { + text6x8(181, j, 28); //<< + } else { + text6x8(181, 20 + (24 * row), ((value / 100))); //Unexpected above 2599 + text6x8(174, j, 28); //<< + } + } + if (boxType[boxPos] & BoolToggle) { + gColor = row + 0xF0; + fillRect(202, j, 6, 8); + gColor = 0; + if (boxMax[boxPos] < 255) { + if (*(uint8_t*)boxPointer[boxPos] == boxMax[boxPos]) { + text6x8(202, j, 50); + } else { + text6x8(202, j, 49); + } + } else { + if (*(uint16_t*)boxPointer[boxPos] == boxMax[boxPos]) { + text6x8(202, j, 50); + } else { + text6x8(202, j, 49); + } + } + } + // if (blockType[select + offSec]) { + // gColor = 0; + // text6x8(202, j + 4, 29); //>> + // text6x8(195 - dots * 5, j + 4, 28); //<< + // uint8_t dX = 202 - dots * 5; //8bit since it will be less than 255 + // uint8_t dY = j + 7; //(j + 4) + 3 + // for (uint8_t e; e < dots; e++) { + // fillRect(dX,dY,2,2); + // dX += 5; + // } + // fillRect(201 - value * 5, j + 6 ,4,4); //Highlighted one + // } + + pColor++; + j += 24; + } + row = 0; + gColor = 0; + blockText(sector,20); + + //fillRect(247,120,30,65); //Was Green + fadeClear(); + fadeSet(); + if (menuFunction[sector] != 0) { + (*menuFunction[sector])(); + } +} + +void scroll() { + // gColor = blockColor[number]; + // fillText(16, 16 + (24 * select), 196, 16); + if (kb_Data[7] & kb_Down) { + row++; + if (row == menuRows[sector]) { + row = 0; + } + } else if (kb_Data[7] & kb_Up) { + if (row == 0) { + row = menuRows[sector]; + } + row--; + } + // gColor = 16; + // fillText(16, 16 + (24 * select), 196, 16); +} + +/* +//Unfinished +void slideReset() { + fillRect(201 - value * 5, 20 + (24 * select), 4, 4); //Clear + fillRect(202 - value * 5, 21 + (24 * select),2,2); //Reset + fillRect(201 - value * 5, yCord, 4, 4); //Highlight +} +void slideHL() { + fillRect(201 - value * 5, 20 + (24 * select), 4, 4); //Highlight +} +*/ + +void dial(uint16_t boxOffset, uint8_t boxRow) { //uint8_t src, uint8_t des + uint16_t box = boxOffset + boxRow; + uint24_t yCord = 20 + (24 * row); + u16 value = getNumber(box); + if ((kb_Data[7] & kb_Right)) { //Right + if (value == boxMax[box]) { + value = boxMin[box]; + } else { + value++; + } + } else if (kb_Data[7] & kb_Left) { //Left + if (value == boxMin[box]) { + value = boxMax[box]; + } else { + value--; + } + } + setNumber(box,value); + + if ((boxType[box] & F) && boxFunction[box] != NULL) { //Function + (*boxFunction[box])(); + } + + gColor = boxRow + 0xF0; //16 + fillRect(188, yCord, 13, 8); + if (boxMax[box] > 99) { + fillRect(181, yCord, 6, 8); + gColor = 0; + text6x8(181, yCord, ((value / 100))); //Undefined Behaviour above 2599 + } + gColor = 0; + text6x8(195, yCord, (value % 10)); + text6x8(188, yCord, ((value / 10) % 10)); +} + +void button(uint16_t box) { + (*boxFunction[box])(); +} + +void buttonToggle(uint16_t index) { + gColor = row + 0xF0; + fillRect(202, 20 + (24 * row), 6, 8); + gColor = 0; + if (boxMax[index] < 255) { + if (*(uint8_t*)boxPointer[index] == boxMax[index]) { + *(uint8_t*)boxPointer[index] = boxMin[index]; + text6x8(202, 20 + (24 * row), 49); // O + } else { + *(uint8_t*)boxPointer[index] = boxMax[index]; + text6x8(202, 20 + (24 * row), 50); // X + } + } else { + if (*(uint16_t*)boxPointer[index] == boxMax[index]) { + *(uint16_t*)boxPointer[index] = boxMin[index]; + text6x8(202, 20 + (24 * row), 49); // O + } else { + *(uint16_t*)boxPointer[index] = boxMax[index]; + text6x8(202, 20 + (24 * row), 50); // X + } + } +} + +void menuLoop() { + //Setup + buildMenu(); + //Code + + while (status == OKAY || 1 == 1) { + keyPress(); if (status != OKAY) { return; } //KeyPress + + fadeColor(); + if (kb_Data[7] & (kb_Up | kb_Down)) { + if (keyReady & VERT) { + keyReset(vERT); + fadeClear(); + scroll(); + fadeSet(); + } + } + if (kb_Data[7] & (kb_Left | kb_Right)) { + if ((keyReady & HORIZ) && (boxType[boxPos] & Value)) { + keyReset(hORIZ); + fadeClear(); + dial(offset, row); + fadeSet(); + } + } + if ((kb_Data[2] & kb_Alpha) || (kb_Data[6] & kb_Enter)) { + if ((keyReady & ALPHA) && (boxType[boxPos] & Click)) { + keyReset(aLPHA); + if (boxType[boxPos] & BoolToggle) { //Button Toggle + buttonToggle(boxPos); + } + if (boxFunction[boxPos] != NULL) { + button(boxPos); //Button + } + if (boxType[boxPos] & Direct) { //Direct + sector = boxDirect[boxPos]; + offset = boxIndex[boxDirect[boxPos]]; + row = 0; + buildMenu(); + } + } + } + if (kb_Data[1] & kb_2nd) { + if (keyReady & SECOND) { + offset = boxIndex[menuBack[sector]]; //Different order is intentional, otherwise it will summon the RAINBOW OF ULTIMATE DOOM!!! + sector = menuBack[sector]; + row = 0; + buildMenu(); + } + } + if (keyReady & OTHER) { + + } + if (keyReady & DEBUG) { + + } + if (kb_Data[1] & kb_Del) { + return; //Quit + } + }; + + //Reset +} + +#endif /* MENU_H */ \ No newline at end of file diff --git a/src/mineSweeper.h b/src/mineSweeper.h new file mode 100644 index 0000000..61a55cd --- /dev/null +++ b/src/mineSweeper.h @@ -0,0 +1,1275 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef MINESWEEPER_H +#define MINESWEEPER_H + +#include "prime2D.h" +#include "global.h" +#include +#include +#include "gameMenu.h" +#include "x86render.h" +//#include + +#define borderIndexes 2 +//Graphic numbers +#define gMine 25 +#define gFlag 26 +#define gQuestion 27 + +#define currentTime (systemTime - gameStartTime - gamePauseTime) +void gameControl(); //Temporary May 23 + +/* +//legacy +const uint8_t seg7[18] = {0b1011111,0b0000011,0b1110110,0b1110011,0b0101011,0b1111001,0b1111101,0b1000011,0b1111111,0b1111011,0b1101111,0b0111101,0b1011100,0b0110111,0b1111100,0b1101100,0b0000000,0b0100000}; +//Characters: HEX,_,- +void displaySeg7(uint24_t i, uint8_t d, uint8_t b, uint24_t x, uint24_t y) { //Number, Digits, X-2, Y-2 + //Colors: 24/25/26/27 + uint24_t pow = 1; + uint24_t z = (uint24_t)VRAM + y * 320; //Constant offset + x += ((d << 3) + d) - 9; //d * 9 - 9 == 9 * (d - 1) + for (uint8_t n = 0; n < d; n++) { //Since d was decremented + uint8_t j = (i / pow) % b; + gColor = (seg7[j] & 64) ? 24 : 25; + if (gColor ^ (z + x + (0*320+1))) { //Checks for change in color + horiz(x+1,y,6); + horiz(x+2,y+1,4); + } + gColor = (seg7[j] & 32) ? 24 : 25; + if (gColor ^ (z + x + (6*320+2))) { + horiz(x+2,y+6,4); + horiz(x+1,y+7,6); + horiz(x+2,y+8,4); + } + gColor = (seg7[j] & 16) ? 24 : 25; + if (gColor ^ (z + x + (13*320+2))) { + horiz(x+2,y+13,4); + horiz(x+1,y+14,6); + } + gColor = (seg7[j] & 8) ? 24 : 25; + if (gColor ^ (z + x + (1*320+0))) { + vert(x,y+1,6); + vert(x+1,y+2,4); + } + gColor = (seg7[j] & 4) ? 24 : 25; + if (gColor ^ (z + x + (8*320+0))) { + vert(x,y+8,6); + vert(x+1,y+9,4); + } + x += 6; + gColor = (seg7[j] & 2) ? 24 : 25; + if (gColor ^ (z + x + (8*320+0))) { + vert(x,y+2,4); + vert(x+1,y+1,6); + } + gColor = (seg7[j] & 1) ? 24 : 25; + if (gColor ^ (z + x + (8*320+0))) { + vert(x,y+9,4); + vert(x+1,y+8,6); + } + x -= 15; + pow *= b; //base + } +}*/ + +uint8_t alphaBind() { + if (swapAlphaSecondBind == 0) { + if ((kb_Data[2] & kb_Alpha)) { + return 1; + } + } else { + if ((kb_Data[1] & kb_2nd)) { + return 1; + } + } + return 0; +} +uint8_t secondBind() { + if (swapAlphaSecondBind == 0) { + if ((kb_Data[1] & kb_2nd)) { + return 1; + } + } else { + if ((kb_Data[2] & kb_Alpha)) { + return 1; + } + } + return 0; +} + +enum tileStates {sHIDDEN = 0, sCLEARED = 1, sVOID = 255}; +enum tileDrawCodes {tCLEAR = 0, tSELECT = 1, tFLAG = 2}; +enum tileFlagCodes {fBLANK = 0, fFLAG = 1, fQUESTION = 2}; + +struct dataSeg7 { + uint8_t digits; + uint24_t x; + uint24_t y; + uint8_t offC; + uint8_t onC; +}; + +struct dataSeg7 timeLCD; +struct dataSeg7 scoreLCD; +struct dataSeg7 flagLCD; + +const uint8_t seg7[18] = { + 0b1011111,0b0000011,0b1110110,0b1110011,0b0101011,0b1111001,0b1111101,0b1000011,0b1111111,0b1111011,0b1101111,0b0111101,0b1011100,0b0110111,0b1111100,0b1101100,0b0000000,0b0100000 +}; +//Characters: HEX,_,- +//void displaySeg7(uint24_t i, uint8_t d, uint8_t b, uint24_t x, uint24_t y) { //Number, Digits, X-2, Y-2 +void displaySeg7(uint24_t i, uint8_t b, struct dataSeg7* lcd) { //Number, Digits, X-2, Y-2 + //Colors: 24/25/26/27 + uint24_t x = lcd->x; + uint24_t y = lcd->y; + uint8_t d = lcd->digits; + uint8_t hi = lcd->onC; + uint8_t lo = lcd->offC; + + uint24_t pow = 1; + uint24_t z = (uint24_t)((size_t)VRAM) + y * 320; //Constant offset + x += ((d << 3) + d) - 9; //d * 9 - 9 == 9 * (d - 1) + for (uint8_t n = 0; n < d; n++) { //Since d was decremented + uint8_t j = seg7[(i / pow) % b]; + gColor = (j & 64) ? hi : lo; + if (gColor ^ (z + x + (0*320+1))) { //Checks for change in color + horiz(x+1,y,6); + horiz(x+2,y+1,4); + } + gColor = (j & 32) ? hi : lo; + if (gColor ^ (z + x + (6*320+2))) { + horiz(x+2,y+6,4); + horiz(x+1,y+7,6); + horiz(x+2,y+8,4); + } + gColor = (j & 16) ? hi : lo; + if (gColor ^ (z + x + (13*320+2))) { + horiz(x+2,y+13,4); + horiz(x+1,y+14,6); + } + gColor = (j & 8) ? hi : lo; + if (gColor ^ (z + x + (1*320+0))) { + vert(x,y+1,6); + vert(x+1,y+2,4); + } + gColor = (j & 4) ? hi : lo; + if (gColor ^ (z + x + (8*320+0))) { + vert(x,y+8,6); + vert(x+1,y+9,4); + } + x += 6; + gColor = (j & 2) ? hi : lo; + if (gColor ^ (z + x + (8*320+0))) { + vert(x,y+2,4); + vert(x+1,y+1,6); + } + gColor = (j & 1) ? hi : lo; + if (gColor ^ (z + x + (8*320+0))) { + vert(x,y+9,4); + vert(x+1,y+8,6); + } + x -= 15; + pow *= b; //base + } +} + +void buildSeg7(uint24_t input, uint8_t base, struct dataSeg7* lcd, uint8_t digits, uint24_t x, uint24_t y, +uint8_t bgC, uint8_t borC, uint8_t offC, uint8_t onC) { //Number, Digits, Base, x, y, ptr, Colors: backGround, border, off, on + gColor = borC; //27 + uint24_t u = digits * 9 + 2; + horiz(x,y,u); + horiz(x,y+18,u+1); + vert(x,y,18); + vert(x+u,y,18); + gColor = bgC; //26 + fillRect(x+1,y+1,u-1,17); + lcd->digits = digits; + lcd->x = x + 2; //Offset of where the number graphic is + lcd->y = y + 2; + lcd->offC = (accessMode == 1) ? 0x00 : offC; + lcd->onC = onC; + displaySeg7(input,base,lcd); +} + +void quake() { + if (accessMode == 0) { //Remove this + delay32K(32768/15); //Waits 32768Hz / FPS + uint24_t shake; + int8_t amount = chance / 3; + if (amount < 12) { + amount = 12; + } + if (amount > 90 || chance > 255) { + amount = 90; + } + + for (uint8_t i = 0; i < amount; i++) { + shake = 0xD40000 - (2560 * 3) - (8 * 3); + shake += 8 * (rand() % 7); + shake += 2560 * (rand() % 7); + *frameBase = shake; + delay32K(32768/20); + } + *frameBase = 0xD40000; + delay32K(32768/2); + } else { + delay32K(24576); // 0.75 seconds + } +} + +enum expressionCode { eHAPPY = 0, eSAD = 1, eNULL = 2, eCHORD = 3, eNORMAL = 4, eSHADES = 5, eXX = 6, eSLEEP = 7 }; +void expression(unsigned char e) { //Updates the smiley face + if (e < 4) { //0-3 + gColor = 2; + fillRect(156, 12, 7, 3); //y2 = 3 because of chordCheck + gColor = 0; + if (e == eHAPPY) { //Happy + horiz(157, 13, 5); + plot(156, 12); + plot(162, 12); + return; + } + if (e == eSAD) { //Sad + horiz(157, 12, 5); + plot(156, 13); + plot(162, 13); + return; + } + if (e == eNULL) { //Null + horiz(156, 13, 7); + return; + } + if (e == eCHORD) { //Chord + gColor = 2; + fillRect(156,12,7,2); + gColor = 0; + fillRect(158,12,3,3); + return; + } + } else if (e < 8) { //4-7 + gColor = 10; + plot(143,4); //Clears potential sunglasses + gColor = 2; + fillRect(156, 5, 7, 4); + gColor = 0; + if (e == eNORMAL) { //Normal + vert(157, 7, 2); + vert(161, 7, 2); + return; + } + if (e == eSHADES) { //Sunglasses + fillRect(156, 7, 7, 2); + gColor = 2; + plot(159, 8); + gColor = 0; + plot(162, 6); + plot(163, 5); + plot(156, 6); + plot(157, 5); + return; + } + if (e == eXX) { //XX + plot(156,6); + plot(156,8); + plot(157,7); + plot(158,6); + plot(158,8); + + plot(160,6); + plot(160,8); + plot(161,7); + plot(162,6); + plot(162,8); + return; + } + if (e == eSLEEP) { //Sleep + horiz(156, 8, 2); + horiz(161, 8, 2); + return; + } + } +} + +void flash() { //uint8_t x + for (uint8_t j = 0; j < 32; j++) { + uint32_t flashTime = timer_Get(1); + uint8_t i = 0; + for (uint16_t *f = paletteRAM; f < paletteRAM + 0x100; f++) { + *f = (linear0((initialPalette[i] >> 10) & 31, 31, 31, j) << 10) + (linear0((initialPalette[i] >> 5) & 31, 31, 31, j) << 5) + (linear0(initialPalette[i] & 31, 31, 31, j)); + i++; + } + while (deltaTime(timer_Get(1),flashTime) < 1536); + } +} + +void flagDraw(uint8_t symbol, uint24_t xP, uint24_t yP) { + gColor = accessMode ? 0 : color[symbol]; + symbol <<= 1; + uint16_t bitImage0 = char5x5[symbol]; + uint16_t bitImage1 = char5x5[symbol + 1]; + uint8_t* z = (uint8_t*)VRAM + (yP * 320 + xP); + for (uint24_t y = 0; y < 5; y++) { + for (uint24_t x = 0; x < 5; x++) { + if (bitImage0 & 1) { + *z = gColor; + } + z += 960; + if (bitImage1 & 1) { + *z = gColor; + } + bitImage0 >>= 1; + bitImage1 >>= 1; + z -= 959; // 960 - 1 + } + z += 315; // 320 - 5; + } +} + +/* +//Legacy, keep this function around +void flagCount() { + gColor = 15; + for (int24_t z = 15; z <= 35; z += 10) { //Flag Counter + fillRect(z, 5, 7, 7); + } + gColor = 0; + if (flags >= 100) { + flagDraw(flags / 100 % 10,17,7); + } else if (flags <= -10){ + gColor = 0; + horiz(17, 9, 5); + } + if (flags >= 10 || flags <= -10) { + flagDraw(abs(flags) / 10 % 10,27,7); + } else if (flags < 0 && flags >= -9) { + gColor = 0; + horiz(27, 9, 5); + } + flagDraw(abs(flags) % 10,37,7); +} +*/ + +//uint8_t lcdColor[20] = {0x60}; //0x70 +// flagLCD.onC = color[((plags / 100) % 10)] & 7; +// flagLCD.offC = color[((plags / 100) % 10)] | 8; + +//Slow, but its the only way to do signed flag counts for now +void flagCount() { //Add a color number mode for nostalga + uint16_t plags = abs(flags); + flagLCD.x = 11; + if (flags >= 100) { + displaySeg7((plags / 100) % 10, 10, &flagLCD); + } else if (flags <= -10){ + displaySeg7(17, 18, &flagLCD); + } else { + displaySeg7(16, 17, &flagLCD); + } + flagLCD.x = 20; + if (flags >= 10 || flags <= -10) { + displaySeg7((plags / 10) % 10, 10, &flagLCD); + } else if (flags < 0 && flags >= -9) { + displaySeg7(17, 18, &flagLCD); + } else { + displaySeg7(16, 17, &flagLCD); + } + flagLCD.x = 29; + displaySeg7(plags % 10, 10, &flagLCD); +} + +void glyph(int16_t space, uint8_t symbol) { + gColor = color[symbol]; + if (symbol == gFlag) { + if (~fontSize & 1 || fontSize == 0) { //0,1,3,5 + gColor = 22; //Changes flag pole color to be more readable + } + } + if (font == 2) { //6x8 Font + uint8_t* bitImage = (uint8_t*)char6x8 + (symbol * 6); + uint8_t* z = (uint8_t*)VRAM + ((space / marX * disY + posY + padY) * 320 + (space % marX * disX + posX + padX)); + uint8_t b = 1; + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 6; x++) { + *z = *bitImage & b ? gColor : *z; + bitImage++; + z++; + } + bitImage -= 6; + z += 314; // 320 - 6 + b <<= 1; + } + + if (symbol == 26) { + gColor = flagColor; + fillRect(space % marX * disX + posX + padX, space / marX * disY + posY + padY + 1, 3, 3); + } else if (symbol == 25) { + //gColor = 7; + z -= 1918; // -320*6 + 2 + *z = 7; // 2,2 // White + z += 319; //320 - 1 + *z = 7; // 1,3 // White + } + return; + } else if (font == 1) { //5x5 Font + symbol <<= 1; + uint16_t bitImage0 = char5x5[symbol]; + uint16_t bitImage1 = char5x5[symbol + 1]; + // uint24_t z0 = VRAM + ((space / marX * disY + posY + padY) * 320 + (space % marX * disX + posX + padX)); + // uint24_t z1 = z0 + 960; + uint8_t* z = (uint8_t*)VRAM + ((space / marX * disY + posY + padY) * 320 + (space % marX * disX + posX + padX)); + for (uint24_t y = 0; y < 5; y++) { + for (uint24_t x = 0; x < 5; x++) { + if (bitImage0 & 1) { + *z = gColor; + } + z += 960; + if (bitImage1 & 1) { + *z = gColor; + } + bitImage0 >>= 1; + bitImage1 >>= 1; + z -= 959; // 960 - 1 + } + z += 315; // 320 - 5; + } + if (symbol == 52) { + gColor = flagColor; + fillRect(space % marX * disX + posX + padX, space / marX * disY + posY + padY, 2, 2); + } else if (symbol == 50) { + //gColor = 7; + z -= 1279; // -320*4 + 1 + *z = 7; // 1,1 // White + } + return; + } + //3x5 Font + uint16_t bitImage = char3x5[symbol]; + uint8_t* z = (uint8_t*)VRAM + ((space / marX * disY + posY + padY) * 320 + (space % marX * disX + posX + padX)); + for (uint24_t y = 0; y < 5; y++) { + for (uint24_t x = 0; x < 3; x++) { + if (bitImage & 1) { + *z = gColor; + } + bitImage >>= 1; + z++; + } + z += 317; // 320 - 3 + } + if (symbol == gFlag) { + gColor = flagColor; + fillRect(space % marX * disX + posX + padX, space / marX * disY + posY + padY, 2, 2); + } + return; +} + +void fillTile(int16_t space, int8_t mode) { + gColor = 15; //grey + if (state[space] == 0) { + + if (mode == tSELECT) { gColor = 16; } + fillRect(space % marX * disX + 1 + posX, space / marX * disY + 1 + posY, disX - 3, disY - 3); + if (flag[space] == 1) {glyph(space, gFlag);} else if (flag[space] == 2) {glyph(space, gQuestion);} + + } else { + + if (board[space] == gMine) { + autoLoss = 1; + gColor = mode == tCLEAR ? 0x17 : 0x01; //Dark red if mine is not highlighted, Bright red if mine is highlighted + } else { + gColor = mode == tSELECT ? 0x10 : 0x0F; + } + fillRect(space % marX * disX + posX, space / marX * disY + posY, disX - 1, disY - 1); + //fillRect(tile % marX * disX + posX, tile / marX * disY + posY, disX - 1, disY - 1); + if (board[space] > 0) { glyph(space, board[space]); } + + } +} + +uint24_t item = 0; //U16 +uint24_t max = 0; //U16 +void floodFill() { + search[item] = tile; + max++; + do { + uint24_t target = search[item]; + int24_t u; + int24_t v; + for (uint8_t i = 0; i < offLen; i += 2) { + u = order[offPos + i]; + v = order[offPos + i + 1]; + const uint24_t square = target + (v * marX) + u; + if (board[square] != 255 && state[square] != 1) { //If tile is not out of bounds and not cleared yet + state[square] = 1; + cleared++; + score += 12; + if (board[square] == 0) { + search[max] = square; + max++; + } + fillTile(square, 0); + if (flag[square] == 1) { + flags++; + score -= 10; + flag[square] = 0; + } + } + } + item++; + } while (search[item] != 0); +} + +/* +// Attempt at making it faster +bool mineCheck(int24_t tileM) { + if (tileM == tile) { + return true; + } + if (safeGuess == 2) { + int8_t* u = order + offPos; + int8_t* v = order + offPos + 1; + for (uint8_t i = 0; i < offLen; i += 2) { + u += 2; + v += 2; + if ((tile + (*v * marX) + *u) == tileM) { + return true; + } + } + u = order; + v = order + 1; + if (gameMode == 3 || gameMode == 9) { + for (uint8_t i = 0; i < 8; i++) { + u += 2; + v += 2; + if ((tile + (*v * marX) + *u) == tileM) { + return true; + } + } + } + + } + return false; +} +*/ + + +// Legacy +bool mineCheck(int24_t tileM) { + if (tileM == tile) { + return true; + } + if (safeGuess != 0) { + int24_t u; + int24_t v; + for (uint8_t i = 0; i < offLen; i += 2) { + u = order[offPos + i]; //Probably more memory effeicent than an algorithm + v = order[offPos + i + 1]; + if ((tile + (v * marX) + u) == tileM) { + return true; + } + } + if ((gameMode == 3 || gameMode == 9) && safeGuess == 2) { + for (uint8_t i = 0; i < 8; i++) { + u = order[i]; //Probably more memory effeicent than an algorithm + v = order[i + 1]; + if ((tile + (v * marX) + u) == tileM) { + return true; + } + } + } + } + return false; +} + +void mineGenerate() { + srand(seed); + uint24_t z; + for (uint24_t i = 0; i < chance; i++) { + do { + z = (((rand() % sizeY) + borderIndexes) * marX) + (rand() % sizeX) + borderIndexes; + } while (board[z] == 25 || mineCheck(z)); + board[z] = 25; + } + + for (uint8_t y = borderIndexes; y < marY - borderIndexes; y++) { + for (uint8_t x = borderIndexes; x < marX - borderIndexes; x++) { + if (board[y * marX + x] != 25) { + uint8_t count = 0; + int24_t u; + int24_t v; + for (uint8_t i = 0; i < offLen; i += 2) { + u = order[offPos + i]; + v = order[offPos + i + 1]; + if (board[(y + v) * marX + (x + u)] == 25) { + count++; + } + } + board[y * marX + x] = count; + } + } + } +} + + +/* +// Attempt at making it constant time O(1) +void mineGenerate() { + + srand(seed); + const uint24_t sizeZ = sizeX * sizeY; + + //fillMemory(25,flag,chance); //ASM LDIR + + uint8_t* fill = flag; //Address of flag array + for (uint24_t i = 0; i < chance; i++) { //Slower because Clang is unware of LDIR + *fill = 25; + fill++; + } + + uint8_t temp; + uint24_t swap; + + for (uint24_t i = 0; i < sizeZ; i++) { //Random Shuffle + swap = rand() % sizeZ; + temp = flag[i]; + flag[i] = flag[swap]; + flag[swap] = temp; + } + + uint8_t* aux = flag; + uint8_t* grid = board + border + (marX * border); + for (uint8_t y = 0; y < sizeY; y++) { + for (uint8_t x = 0; x < sizeX; x++) { + if (*grid != 30) { + *grid = *aux; + aux++; + } else { + printUInt(grid - board,6,16,2,72); + printUInt(*grid,4,10,2,81); + printUInt(aux - flag,6,16,2,99); + printUInt(*aux,4,10,2,108); + } + grid++; + } + grid += (border * 2); + } + + fill = flag; + for (uint24_t i = 0; i < 52*27; i++) { // Resets flag array + *fill = 0; + fill++; + } + + for (uint8_t y = border; y < marY - border; y++) { + for (uint8_t x = border; x < marX - border; x++) { + if (board[y * marX + x] != 25) { + uint8_t count = 0; + int24_t u; + int24_t v; + for (uint8_t i = 0; i < offLen; i += 2) { + u = order[offPos + i]; + v = order[offPos + i + 1]; + if (board[(y + v) * marX + (x + u)] == 25) { + count++; + } + } + board[y * marX + x] = count; + } + } + } +} +*/ + +void chord() { + *lcd_CrsrX = ((tile % marX) - 2) * disX + posX; + *lcd_CrsrY = ((tile / marX) - 2) * disY + posY; +} +uint8_t gridType[25]; +void cursorSetup() { + //memcpy(lcd_CrsrImage, chordImage, 1024); + //uint8_t* ci = (uint8_t*)lcd_CrsrImage; + /* //Crashes calculator and maybe broken + for (uint24_t i = 0; i < 1024; i++) { + *ci = 0b10101010; //Transparent + ci++; + } + */ + for (uint8_t i = 0; i < offLen; i += 2) { //Generates fill grid from search pattern + int8_t u = order[offPos + i]; + int8_t v = order[offPos + i + 1]; + gridType[12 + u + (v * 5)] = 0b00000011; + } + gridType[12] = 0b01; + + uint8_t dX = (disX * 5) - 1; + uint8_t dY = (disY * 5) - 1; + uint8_t* i = (uint8_t*)lcd_CrsrImage; + uint8_t v = 0; + for (uint8_t y = 0; y < dY; y++) { //Fills 2bit grid + if (y % disY == disY - 1) { + i += 16; + v += 5; + } else { + uint8_t u = 0; + for (uint8_t x = 0; x < 64; x += 4) { + uint8_t g = 0; + for (uint8_t z = 0; z < 4 && (z + x < dX); z++) { + if ((x + z) % disX != disX - 1) { + //g |= (gridType[((y / disY) * 5) + (x / disX)] << 5) >> z; + g |= (gridType[u + v] << 6) >> (z << 1); + } else { + u++; + } + } + *i |= g; + i++; + } + } + } + + *lcd_CrsrCtrl = 0x00000000; // enable cursor + *lcd_CrsrPalette0 = 0x00FFBF00; //24bit 888 BGR + *lcd_CrsrPalette1 = 0x000000FF; + // *lcd_CrsrXY = 0; // reset cursor position + chord(); + *lcd_CrsrClip = 0; // reset clipping + *lcd_CrsrConfig = 0x00000001; + *LCDTiming2 = (uint32_t)(*LCDTiming2 & ~(uint32_t)0x03FF0000) | (uint32_t)(320 - 1) << 16; //Set CPL +} + +void drawGame() { + + gColor = 17; + //gColor = findColor888(0x00,0x70,0x70); //Failed test + fillScreen(); //Cyan + if (fadeEffect > 0) { + if (fadeEffect == 1) { + uint16_t *fP = paletteRAM; + fP += 18; + for (uint24_t i = 18; i < 22; i++) { + *fP = 330; + fP++; + initialPalette[i] = 330; + } + } + for (uint24_t rY = 4; rY < 240; rY += 32) { + for (uint24_t rX = 4; rX < 320; rX += 32) { + gColor = 18; + text6x8(rX, rY, 25); + gColor = 19; + text6x8(rX + 16, rY, 26); + gColor = 20; + text6x8(rX, rY + 16, 30); + gColor = 21; + text6x8(rX + 16, rY + 16, 31); //116 inverted flag + vert(rX + 15, rY + 16, 8); + vert(rX + 22, rY + 16, 8); + } + } + } + + gColor = (15); //Fill Sqaures + for (int24_t y = 2; y < marY - 2; y++) { + for (int24_t x = 2; x < marX - 2; x++) { + fillRect(x * disX + posX + 1, y * disY + posY + 1, disX - 2, disY - 2); + } + } + /*for (uint24_t x = 5; x < 55; x += 10) { // Flag Squares + fillRect(x, 5, 9, 9); + }*/ //Don't delete me + //Shaded Lines + for (int24_t i = (disX * 2) + posX; i < disX * (marX - 2) + posX; i += disX) { + gColor = (7); + vert(i, (disY * 2) + posY, disY * (sizeY) - 1); + gColor = (0); + vert(i + disX - 2, (disY * 2) + posY, disY * (sizeY) - 1); + } + for (int24_t i = (disY * 2) + posY; i < disY * (marY - 2) + posY; i += disY) { + gColor = (7); + horiz((disX * 2) + posX, i, disX * (sizeX) - 1); + gColor = (0); + horiz((disX * 2) + posX, i + disY - 2, disX * (sizeX) - 1); + } + if (!(disX & 1)) { //% 2 + gColor = *videoMode & 2 ? 0x07 : 0x00; //Inverted Colors + vert(319, 0, 240); + } + //Border Lines + gColor = (8); + for (int24_t i = (disY * 2) - 1 + posY; i <= disY * (marY - 2) - 1 + posY; i += disY) { + horiz((disX * 2) - 1 + posX, i, disX * (sizeX) + 1); + } + for (int24_t i = (disX * 2) - 1 + posX; i <= disX * (marX - 2) - 1 + posX; i += disX) { + vert(i, (disY * 2) - 1 + posY, disY * (sizeY) + 1); + } + + /* + //UI Lines //Don't delete this + horiz(4, 4, 51); + horiz(4, 14, 51); + for (uint24_t i = 4; i < 64; i += 10) { + vert(i, 5, 9); + } + */ + /*{//Manually Draw Flag UI (Don't delete me) + uint16_t bitImage0 = char5x5[52]; + uint16_t bitImage1 = char5x5[53]; + uint16_t bitImage2 = char5x5[50]; + uint16_t bitImage3 = char5x5[51]; + uint24_t z0 = VRAM + (7 * 320) + 7; + uint24_t z1 = z0 + 960; + uint24_t z2 = VRAM + (7 * 320) + 47; + uint24_t z3 = z2 + 960; + gColor = 0; + for (uint24_t y = 0; y < 1600; y += 320) { + for (uint24_t x = 0; x < 5; x++) { + if (bitImage0 & 1) { + plotFast(z0 + y + x); + } + if (bitImage1 & 1) { + plotFast(z1 + y + x); + } + if (bitImage2 & 1) { + plotFast(z2 + y + x); + } + if (bitImage3 & 1) { + plotFast(z3 + y + x); + } + bitImage0 >>= 1; + bitImage1 >>= 1; + bitImage2 >>= 1; + bitImage3 >>= 1; + } + } + gColor = flagColor; + fillRect(7, 7, 2, 2); + gColor = 7; + plotFast(VRAM + (320 * 8) + 48); //x48 y8 + }*/ + + for (uint24_t x = 154; x <= 164; x++) { + for (uint24_t y = 5; y <= 15; y++) { + if ((x - 159) * (x - 159) + (y - 10) * (y - 10) < 36) { + gColor = 2; + plotFast(VRAM + y * 320 + x); + } + } + } + + expression(eNORMAL); + expression(eHAPPY); + + //GUI Counters + flagCount(); + /* Color numbers */ + buildSeg7(4912,18,&flagLCD,3,9,0,0x00,0x1B,0x81,0x80); //Flags 17^3 - 1 + flagLCD.digits = 1; + gColor = 0x1B; + fillRect(0,0,9,19); + fillRect(39,0,9,19); + flagCount(); + //Manual Symbol Draw + gColor = 0x00; + text6x8(2,1,gMine); + text6x8(40,1,gFlag); + gColor = 0x01; + fillRect(40,2,3,3); + gColor = 0x07; + plot(4,3); + plot(3,4); + /* Color numbers */ + + buildSeg7(104975,18,&timeLCD,4,224,0,0x00,0x1B,0x83,0x82); //Time 18^4 - 1 + buildSeg7(1889567,18,&scoreLCD,5,272,0,0x00,0x1B,0x85,0x84); //Score 18^5 - 1 + +} + +const uint8_t fontList[] = {24,16,6, 28,16,5, 35,19,4, 31,21,2, 39,27,2, 39,21,1, 39,27,0}; +void fontCheck() { //Plus 4 + uint8_t i = 7; + for (uint8_t j = 0; j < 24; j += 3) { + if (fontSize == i && (sizeX > fontList[j] || sizeY > fontList[j + 1])) { + fontSize = fontList[j + 2]; + } + i--; + } + font = fontArray[fontSize]; + disX = fontArray[fontSize + 8]; + disY = fontArray[fontSize + 16]; + padX = fontArray[fontSize + 24]; + padY = fontArray[fontSize + 32]; +} + +void resetGame() { + + //1: Board + marX = sizeX + 4; + marY = sizeY + 4; + fontSize = 7; // Resets font size to the largest available before doing the font check stuff + fontCheck(); //Fits font to screen size + + posX = 160 - (disX >> 1) * marX; //Allign game board + if (disX & 1) { //Special case of even distance X + posX -= marX >> 1; + } + posY = 21 - (disY * 2); + + for (int24_t i = 0; i < marX * marY; i++) { //Writes invalid spaces + board[i] = 255; + state[i] = 255; + search[i] = 0; + } + for (int24_t y = borderIndexes; y < marY - borderIndexes; y++) { //Clears arrays + for (int24_t x = borderIndexes; x < marX - borderIndexes; x++) { + uint24_t i = y * marX + x; + board[i] = 0; + state[i] = 0; + flag[i] = 0; + } + } + + //2: Reset + autoLoss = 0; + cheater = 0; + item = 0; //Resets the search pointer + max = 0; //Resets the search max + cleared = 0; //Resets the amount of cleared tiles + win = 1; //Enables winning again + score = 0; + gamePauseTime = systemTime; + offPos = orderPos[gameMode]; + offLen = orderPos[gameMode + 1] - orderPos[gameMode]; + if (chance > ((sizeX) * (sizeY)) / 2) { //Caps game at 50% mines + chance = ((sizeX) * (sizeY)) / 2; + } + flags = chance; + mines = chance; + tile = (marX * 7) + 7; //Initial tile + + //3: Graphics + drawGame(); + + //4: Cursor + if (cursorAllow) { + cursorSetup(); + } + + //5: Finalize + fillTile(tile, 1); //Color in select tile to show that setup is finished +} + +//8x8: 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111 ,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010 ,0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111 ,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010 ,0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111 ,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010 ,0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111 ,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010 ,0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111 ,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010 ,0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111, 0b11111111,0b11111111,0b11111111,0b10111111,0b11111111,0b11111111,0b11101111,0b11111111,0b11111111,0b11111011,0b11111111,0b11111111,0b11111110,0b11111111,0b11111111,0b11111111 ,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010 +//New Line: ,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010,0b10101010 + +uint8_t autoCheck = 0; +void autoChord() { + + if (state[tile] == 0) { + return; + } + int24_t u; + int24_t v; + uint8_t bC = 0; //Blank Count + uint8_t mC = 0; //Mine Count + uint8_t fC = 0; //Flag Count + uint24_t square; + for (uint8_t i = 0; i < offLen; i += 2) { + u = order[offPos + i]; + v = order[offPos + i + 1]; + square = tile + (v * marX) + u; + if (board[square] != 255) { //If tile is in bounds + if (board[square] == 25) { + mC++; + } + if (flag[square] == 1 || (board[square] == 25 && state[square] != 0)) { + fC++; + } + if (state[square] != 1 || board[square] == 25) { //== 0 + bC++; + } + } + } + + + if (fC == mC) { //Flag Chording, clears tiles + for (uint8_t i = 0; i < offLen; i += 2) { + u = order[offPos + i]; + v = order[offPos + i + 1]; + square = tile + (v * marX) + u; + if (board[square] != 255 && state[square] != 1 && flag[square] != 1) { //If tile is not out of bounds and not cleared yet + state[square] = 1; + //Floodfill + cleared++; + if (board[square] == 0) { + uint24_t tileAC = tile; + tile = square; + floodFill(); + tile = tileAC; + } + score += 10; + fillTile(square, tCLEAR); + autoCheck = 1; + } + } + } else if (board[tile] == mC && bC == mC) { //fC != mC //Tile Chording, places flags + for (uint8_t i = 0; i < offLen; i += 2) { + u = order[offPos + i]; + v = order[offPos + i + 1]; + square = tile + (v * marX) + u; + if (board[square] != 255 && state[square] != 1 && flag[square] != 1) { //If tile is not out of bounds and not cleared yet + flag[square] = 1; + flags--; + gColor = 15; + fillRect(square % marX * disX + 1 + posX, square / marX * disY + 1 + posY, disX - 3, disY - 3); + glyph(square, gFlag); + autoCheck = 1; + } + } + flagCount(); + } +} + +void autoSolve() { + cheater = 1; + uint24_t tileAS = tile; + for (uint8_t i = 0; i < autoSolver; i++) { //Genius Right? 1 if manual, 2 if auto haha + autoCheck = 0; + tile = marX * borderIndexes + borderIndexes; + for (uint8_t y = 0; y < sizeY; y++) { + for (uint8_t x = 0; x < sizeX; x++) { + autoChord(); + tile++; + } + tile += (borderIndexes * 2); + } + if (autoCheck != 0) { + i = 0; + } + } + tile = tileAS; +} + +uint8_t chordCheck = 0; +void gameLoop() { + //key = 99; //Prevents endless restart loop + do { + status = OKAY; + resetGame(); + gameControl(); + } while (status == RESTART); + if (status == QUIT) { + status = OKAY; + } + if (cursorAllow) { + lcd_CrsrConfig = 0x00000000; + *lcd_CrsrCtrl = 0x00000000; + *LCDTiming2 = (uint32_t)(*LCDTiming2 & ~(uint32_t)0x03FF0000) | (uint32_t)(240 - 1) << 16; + } +} + +void gameControl() { + while (status == OKAY) { + keyPress(); if (status != OKAY) { break; } + + if (cleared != 0) { //Time + displaySeg7(score,10,&scoreLCD); //Score + if (currentTime < 327680000) { // <10000 seconds or <2.78 Hours + displaySeg7(currentTime >> 15,10,&timeLCD); + } else { //Blinks after 9999 seconds + if ((uint24_t)systemTime & 16384) { + displaySeg7(104975,18,&timeLCD); //Time ---- 18^4 - 1 + } else { + displaySeg7(9999,10,&timeLCD); //Time 9999 + } + } + } else if (currentTime >= 327680000) { + displaySeg7(9999,10,&timeLCD); //Time 9999 + } + + if ((kb_Data[3] & kb_GraphVar) && cleared != 0 && keyReady & CHORD) { + keyReset(cHORD); + autoChord(); + } + + if (kb_Data[6] & kb_Power && cleared != 0 && keyReady & DEBUG && autoSolver) { + keyReset(dEBUG); + expression(eCHORD); + autoSolve(); + if (win) { + expression(eHAPPY); + } else { + expression(eSAD); + } + } + + if (cursorAllow) { + if (keyReady & CHORD) { + if ((kb_Data[3] & kb_GraphVar)) { + keyReset(cHORD); + *lcd_CrsrCtrl = 0x00000001; + expression(eCHORD); + chordCheck = 1; + } else if (chordCheck == 1) { + *lcd_CrsrCtrl = 0x00000000; + if (win) { + expression(eHAPPY); + } else { + expression(eSAD); + } + chordCheck = 0; + } + } + } + + if (kb_Data[7] && (keyReady & ARROW)) { //Checks that an arrow key was pressed + keyReset(aRROW); + + fillTile(tile, tCLEAR); //Clears Tile + + if (kb_Data[7] & kb_Up) { + if (board[tile - marX] != 255) { + tile -= marX; + } else { + tile += marX * (marY - 5); + } + } + if (kb_Data[7] & kb_Down) { + if (board[tile + marX] != 255) { + tile += marX; + } else { + tile -= marX * (marY - 5); + } + } + if (kb_Data[7] & kb_Left) { + if (board[tile - 1] != 255) { + tile--; + } else { + tile += (marX - 5); + } + } + if (kb_Data[7] & kb_Right) { + if (board[tile + 1] != 255) { + tile++; + } else { + tile -= (marX - 5); + } + } + if (cursorAllow) { + chord(); + } + + fillTile(tile, tSELECT); //Draws Tile + } + + if ((keyReady & ALPHA) && alphaBind()) { + keyReset(aLPHA); + + if (flag[tile] == fFLAG) { //Removes flag from tile and updates flag counters + flag[tile] = fBLANK; + flags++; + fillTile(tile, tSELECT); + flagCount(); + } else { + flag[tile] = fBLANK; //Clears fQUESTION to 0 + if (cleared == 0) { + // if (safeGuess == 1) { + // board[tile] = 30; + // } + // if (safeGuess == 2) { + // int24_t u; + // int24_t v; + // for (uint8_t i = 0; i < offLen; i += 2) { + // u = order[offPos + i]; + // v = order[offPos + i + 1]; + // board[tile + (v * marX) + u] = 30; + // } + // if (gameMode == 3 || gameMode == 9) { + // for (uint8_t i = 0; i < 8; i++) { + // u = order[i]; + // v = order[i + 1]; + // board[tile + (v * marX) + u] = 30; + // } + // } + // } + mineGenerate(); + gamePauseTime = 0; + gameStartTime= systemTime; + } + + if (state[tile] == sHIDDEN) { + cleared++; //Add uncleared tile to cleared counter + score += 10; + } + state[tile] = sCLEARED; + + if (board[tile] == gMine) { //If tile contains mine + + fillTile(tile, tFLAG); + //cleared--; + } else { + fillTile(tile,tSELECT); + if (board[tile] == 0) { // ZERO MINES FLOODVILLE TIME! + floodFill(); + flagCount(); + } + if (((sizeX) * (sizeY)) - mines - cleared == 0 && win) { //Win + expression(eSHADES); + *lcd_CrsrCtrl = 0x00000000; + flash(); + winScreen(); + } + } + } + + + } + + if (autoLoss == 1 && win == true) { + expression(eSAD); + *lcd_CrsrCtrl = 0x00000000; + quake(); + flash(); + gameOver(); + win = false; + } + + if (((keyReady & SECOND) && secondBind()) && state[tile] != sCLEARED) { //2nd + keyReset(sECOND); + if (flag[tile] == fFLAG) { //If there is a flag remove it + flag[tile] = fBLANK; + flags++; + } else if (flags > -99) { //I don't want to display -100 flags + flag[tile] = fFLAG; + flags--; + } + fillTile(tile, tSELECT); + flagCount(); + } + if (((keyReady & OTHER) && (kb_Data[1] & kb_Yequ)) && state[tile] != sCLEARED) { //Y= + keyReset(oTHER); + if (flag[tile] == fQUESTION) { + flag[tile] = fBLANK; + } else { + if (flag[tile] == fFLAG) { + flag[tile] = fBLANK; //Why must it be fBLANK? + flags++; + flagCount(); + } + flag[tile] = fQUESTION; + } + fillTile(tile, tSELECT); + } + if ((keyReady & OTHER) && (kb_Data[1] & kb_Mode)) { //Mode + keyReset(oTHER); + pause(); + } + + } +} + +#endif /* MINESWEEPER_H */ \ No newline at end of file diff --git a/src/prime2D.h b/src/prime2D.h new file mode 100644 index 0000000..de0d774 --- /dev/null +++ b/src/prime2D.h @@ -0,0 +1,377 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef PRIME2D_H +#define PRIME2D_H +#include "x86render.h" +#include "global.h" +#include + +#include "prime2D_Font6x8.h" + +uint8_t gColor = 0; //Graphics color + +const uint16_t char3x5[28] = { + 0x7B6F, 0x749A, 0x73E7, 0x79A7, 0x49ED, 0x79CF, 0x7BCF, 0x24A7, 0x2AAA, 0x79EF, 0x5BEF, 0x7AEF, 0x624E, 0x3B6B, 0x72CF, 0x12CF, 0x5AAD, 0,0,0,0,0,0,0,0, 0x55D5, 0x7480, 0x21A7 +}; +const uint16_t char5x5[56] = { + 22335,1011, 4292,452, 32287,993, 29215,1008, 31909,132, 31807,1008, 31807,1009, 28959,264, 14894,465, 32319,1008, 22205,949, 19314,594, 30269,933, 26173,945, 30389,561, 29885,945, 29885,949, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 32213,686, 4228,996, 8750,128 +}; + +// const uint8_t char6x8[768]; // See prime2D_Font6x8.h + +//Debugging +const uint16_t num3x5[16] = { + 0x7B6F, 0x749A, 0x73E7, 0x79A7, 0x49ED, 0x79CF, 0x7BCF, 0x24A7, 0x7AAF, 0x79EF, + 0x5BEF, 0x7BC9, 0x724F, 0x7BE4, 0x72CF, 0x12CF +}; //Used for the printInt functions +void printInt(int24_t in, uint8_t len, uint8_t base, uint24_t xC, uint24_t yC) { //integer to print, length, base 2-16 //Auto adjusts for signage + uint8_t* off = (uint8_t*)VRAM + xC + (320 * yC); + uint8_t* v = off + 320; + len <<= 2; //len * 4 + const uint24_t x2 = 5 + len; + const uint24_t jump = 317 - x2; + for (uint8_t dY = 1; dY < 6; dY++) { + for (uint24_t dX = 0; dX < x2; dX += 4) { + *v = 0; + v += 4; + } + v += jump; + } + v = off; + for (uint24_t dX = 0; dX < x2; dX++) { + *v = 0; + v++; + } + v = off + 1920; // 320 * 6 + for (uint24_t dX = 0; dX < x2; dX++) { + *v = 0; + v++; + } + + uint24_t* negSign = 961 + (uint24_t*)off; //Fills three pixels //1 + (3 * 320) + *negSign = in < 0 ? 460551 : 0; //If Negative + uint24_t j = abs(in); + uint24_t pow = 1; + for (uint24_t k = 0; k < len; k += 4) { + uint16_t bitImage = num3x5[(j / pow) % base]; + uint8_t *fill = off + 321 + len - k; + for (uint8_t y = 0; y < 5; y++) { + for (uint8_t x = 0; x < 3; x++) { + *fill = bitImage & 1 ? 7 : 0; //White if true + bitImage >>= 1; + fill++; + } + fill += 317; //320 - 3 + } + pow *= base; + } +} +void printUInt(int24_t in, uint8_t len, uint8_t base, uint24_t xC, uint24_t yC) { //integer to print, length, base 2-16 + uint8_t* off = (uint8_t*)VRAM + xC + (320 * yC); //Something about casting off to uint8_t* adds 4 more bytes + uint8_t* v = off + 320; + len <<= 2; //len * 4 + const uint24_t x2 = 1 + len; //Can optomize out "1 + " for a saving of 8 bytes + const uint24_t jump = 317 - x2; + for (uint8_t dY = 1; dY < 6; dY++) { + for (uint24_t dX = 0; dX < x2; dX += 4) { + *v = 0; + v += 4; + } + v += jump; + } + v = off; + for (uint24_t dX = 0; dX < x2; dX++) { + *v = 0; + v++; + } + v = off + 1920; // 320 * 6 + for (uint24_t dX = 0; dX < x2; dX++) { + *v = 0; + v++; + } + uint24_t pow = 1; + for (uint24_t k = 0; k < len; k += 4) { + uint16_t bitImage = num3x5[(in / pow) % base]; + uint8_t* fill = off + 317 + len - k; + for (uint8_t y = 0; y < 5; y++) { + for (uint8_t x = 0; x < 3; x++) { + *fill = bitImage & 1 ? 7 : 0; //White if true + bitImage >>= 1; + fill++; + } + fill += 317; //320 - 3 + } + pow *= base; + } +} + +/* Key Constants */ +void keyReset(uint8_t type); +const uint8_t HORIZ = 1; const uint8_t VERT = 2; const uint8_t ALPHA = 4; const uint8_t SECOND = 8; const uint8_t OTHER = 16; const uint8_t DEBUG = 32; const uint8_t ARROW = 64; const uint8_t CHORD = 128; +const uint8_t hORIZ = 0; const uint8_t vERT = 1; const uint8_t aLPHA = 2; const uint8_t sECOND = 3; const uint8_t oTHER = 4; const uint8_t dEBUG = 5; const uint8_t aRROW = 6; const uint8_t cHORD = 7; +//uint8_t key = 0; //Compatibility + +#define keyTotal 8 //Use different keyDelay values in different menus +uint32_t keyDelay[keyTotal] = {2304, 3072, 4096, 4096, 2730, 1638, 3072, 2730}; //0 Horiz, 1 Vert, 2 Alpha, 3 Second, 4 Other, 5 Debug, 6 Arrow +uint32_t keyPressTime[keyTotal] = {0,0,0,0,0,0,0,0}; + +uint8_t keyReady = 255; //1 Horiz, 2 Vert, 4 Alpha, 8 Second, 16 Other, 32 Debug, 64 Arrow +/* Key Constants */ + +//Primatives +void fillRect(uint24_t x1, uint24_t y1, uint24_t x2, uint24_t y2) { //x start, y start, x length, y length + uint8_t* v = (uint8_t*)VRAM + x1 + (y1 * 320); + const uint24_t jump = 320 - x2; + for (uint24_t dY = 0; dY < y2; dY++) { + for (uint24_t dX = 0; dX < x2; dX++) { + *v = gColor; + v++; + } + v += jump; + } +} +void horiz(uint24_t x1, uint24_t y, uint24_t x2) { //x start, y postion, x length + uint8_t* z = (uint8_t*)VRAM + (x1 + x2) + (y * 320); + for (uint8_t* fill = (uint8_t*)VRAM + x1 + (y * 320); fill < z; fill++) { + *fill = gColor; + } +} +void vert(uint24_t x, uint24_t y1, uint24_t y2) { //x postion, y start, y length + uint8_t* z = (uint8_t*)VRAM + x + ((y2 + y1) * 320); + for (uint8_t* fill = (uint8_t*)VRAM + (y1 * 320) + x; fill < z; fill += 320) { + *fill = gColor; + } +} +// void plot(uint24_t x, uint24_t y) { //x position, y position +// uint8_t* fill = (uint8_t*)VRAM + x + (y * 320); +// *fill = gColor; +// } +// void plotFast(uint8_t* z) { //Memory address +// *z = gColor; +// } + +#define plot(x,y) *((uint8_t*)VRAM + x + (y * 320)) = gColor +#define plotFast(z) *((uint8_t*)z) = gColor + +// void fillScreen() { //Fills buffer 0 +// const uint24_t g = (gColor << 16) | (gColor << 8) | gColor; +// for (uint24_t* w = (uint24_t*)VRAM; w < (uint24_t*)WRAM; w++) { //Optomized to use 24bit +// *w = g; +// } +// } + +void fillScreen() { //Fills buffer 0 + const uint8_t g = gColor; + for (uint8_t* w = (uint8_t*)VRAM; w < (uint8_t*)WRAM; w++) { //Optomized to use 24bit + *w = g; + } +} + +//Text Engine +void text6x8(uint24_t xW, uint24_t yW, uint8_t lexicon) { //x position, y position, letter index + uint8_t* bitImage = (uint8_t*)char6x8 + (lexicon * 6); + uint8_t* fill = (uint8_t*)VRAM + (yW * 320 + xW); + uint8_t b = 1; + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 6; x++) { + *fill = *bitImage & b ? gColor : *fill; + bitImage++; + fill++; + } + bitImage -= 6; + fill += 314; // 320 - 6 + b <<= 1; + } +} + +void fillText(uint24_t x1, uint24_t y1, uint24_t x2, uint24_t y2) { //x start, y start, x length, y length //fillRect() that does not overwrite text + uint8_t* v = (uint8_t*)VRAM + x1 + (y1 * 320); + const uint24_t jump = 320 - x2; + for (uint24_t dY = 0; dY < y2; dY++) { + for (uint24_t dX = 0; dX < x2; dX++) { + *v = *v ? gColor : 0; + v++; + } + v += jump; + } +} + +/* Utilities */ +void quitGame() { //Placeholder + //key = 99; + status = FORCEQUIT; +} +uint8_t linear(uint8_t y0, uint8_t y1, uint8_t x0, uint8_t x1, uint8_t x) { //Linear Interpolation algorithm + return ((y0 * (x1 - x)) + (y1 * (x - x0))) / (x1 - x0); +} +uint8_t linear0(uint8_t y0, uint8_t y1, uint8_t x1, uint8_t x) { //x0 = 0, Optomized Linear Interpolation algorithm + return ((y0 * (x1 - x)) + (y1 * x)) / x1; +} +void shiftScreen() { //Moves the frame base around + uint8_t change = 0; + if (DEBUG & keyReady) { + keyReset(dEBUG); + if (kb_Data[4] & kb_8) { //Up + *frameBase -= 2560; + change = 1; + } + if (kb_Data[4] & kb_2) { //Down + *frameBase += 2560; + change = 1; + } + if (kb_Data[5] & kb_6) { //Right + *frameBase += 8; + change = 1; + } + if (kb_Data[3] & kb_4) { //Left + *frameBase -= 8; + change = 1; + } + if (kb_Data[4] & kb_5) { //Reset + *frameBase = 0xD40000; + change = 1; + } + if (change) { + printUInt(*frameBase,6,16,56,2); + } + } +} +/* Utilities */ + +/* Keyboard */ + +uint32_t deltaTime(uint32_t current, uint32_t previous) { //Calculates delta time through overflows + if (current >= previous) { + return current - previous; + } + return ~(previous - current) + 1; //16777215 - () +} + +void delay32K(uint32_t delay) { //32768hz, overflow resiliant + uint32_t start = timer_Get(1); + while (deltaTime(timer_Get(1), start) < delay); +} + +void keyReset(uint8_t type) { + keyReady = keyReady & ~(1 << type); + keyPressTime[type] = timer_Get(1); + //recentKeyPress +} + +void keyPress() { //Makes the game run at a constant FPS + + uint24_t frameDelta = 0; //stores the time between frames + uint24_t frameTime = 0; //stores timer_Get(1) + do { + frameTime = timer_Get(1); //frameTime and seed are the same so I only need to call timer_Get(1) once + if (frameTime >= frameStart) { + frameDelta = frameTime - frameStart; + } else { //Overflow case + frameDelta = (~(frameStart - frameTime)) + 1; + } + } while (frameDelta < FPS); + + systemTime = frameTime; + + if (fpsCounter) { + if (frameDelta > clockMax) { clockMax = frameDelta; } //Tracks the highest frame time + if (deltaTime(timer_Get(1), clockTime) > (32768 / 6)) { //Displays the highest frame time every 32768/FPS seconds + printUInt(clockMax, 5, 10, 2, 22); //Displays frame time + printUInt(32768 / clockMax, 3, 10, 2, 31); //Displays FPS + clockMax = 0; + clockTime = timer_Get(1); + } + } + + shiftScreen(); + + frameStart = timer_Get(1); + for (uint8_t i = 0; i < keyTotal; i++) { + if ((deltaTime(frameStart, keyPressTime[i])) >= keyDelay[i]) { + keyReady = keyReady | (1 << i); //Turns on a bit + } + } + kb_Scan(); + + seed = timer_Get(1); //temporary soultion + if (kb_Data[1] & (kb_Graph | kb_Del)) { //temporary soultion + status = FORCEQUIT; + } + + return; +} +/* Keyboard */ + + + +/* +void QfillRect(uint24_t x1, uint24_t y1, uint24_t x2, uint8_t y2) { + if (x1 >= 320) { + printUInt(x1,8,10,200,100); printUInt(y1,8,10,200,109); printUInt(x2,8,10,200,118); printUInt(y2,3,10,200,127); + delay32K(65536); + return; + } + if (y1 >= 480) { + printUInt(x1,8,10,200,100); printUInt(y1,8,10,200,109); printUInt(x2,8,10,200,118); printUInt(y2,3,10,200,127); + delay32K(65536); + return; + } + if (x1 + x2 >= 320) { + printUInt(x1,8,10,200,100); printUInt(y1,8,10,200,109); printUInt(x2,8,10,200,118); printUInt(y2,3,10,200,127); + delay32K(65536); + return; + } + if (y1 + y2 >= 480) { + printUInt(x1,8,10,200,100); printUInt(y1,8,10,200,109); printUInt(x2,8,10,200,118); printUInt(y2,3,10,200,127); + delay32K(65536); + return; + } + fillRect(x1,y1,x2,y2); +} +void Qhoriz(uint24_t x1, uint24_t y, uint24_t x2) { + if (x1 >= 320) { + printUInt(x1,8,10,200,140); printUInt(y,8,10,200,149); printUInt(x2,8,10,200,158); + delay32K(65536); + return; + } + if (y >= 480) { + printUInt(x1,8,10,200,140); printUInt(y,8,10,200,149); printUInt(x2,8,10,200,158); + delay32K(65536); + return; + } + if (x1 + x2 >= 320) { + printUInt(x1,8,10,200,140); printUInt(y,8,10,200,149); printUInt(x2,8,10,200,158); + delay32K(65536); + return; + } + horiz(x1,y,x2); +} +void Qvert(uint24_t x, uint24_t y1, uint24_t y2) { + if (x >= 320) { + printUInt(x,8,10,200,170); printUInt(y1,8,10,200,179); printUInt(y2,8,10,200,188); + delay32K(65536); + return; + } + if (y1 >= 480) { + printUInt(x,8,10,200,170); printUInt(y1,8,10,200,179); printUInt(y2,8,10,200,188); + delay32K(65536); + return; + } + if (y1 + y2 >= 480) { + printUInt(x,8,10,200,170); printUInt(y1,8,10,200,179); printUInt(y2,8,10,200,188); + delay32K(65536); + return; + } + vert(x,y1,y2); +} +*/ + +#endif /* PRIME2D_H */ \ No newline at end of file diff --git a/src/prime2D_Font6x8.h b/src/prime2D_Font6x8.h new file mode 100644 index 0000000..3a87218 --- /dev/null +++ b/src/prime2D_Font6x8.h @@ -0,0 +1,17 @@ +/* +** The 6x8 pixel font used in the program is a slightly modified version +** of the "even" font created by Christian Munk (CMunk), which can be +** found at https://fontstruct.com/fontstructions/show/275268/even_2. +** The "even" font is lincesed under Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +** Original License URL: https://creativecommons.org/licenses/by-sa/3.0/ +*/ + +#ifndef PRIME2D_FONT6X8_H +#define PRIME2D_FONT6X8_H +#include + +const uint8_t char6x8[768] = { + 126,255,145,137,255,126,0,132,254,255,128,0,198,231,177,153,207,198,98,235,137,137,255,118,48,44,35,255,255,32,111,239,137,137,251,115,126,255,137,137,251,114,3,3,225,249,31,7,118,255,137,137,255,118,78,223,145,145,255,126,6,255,0,255,129,255,6,255,0,6,255,0,6,255,0,230,145,142,6,255,0,137,137,118,6,255,0,15,8,255,6,255,0,111,137,241,6,255,0,126,137,241,6,255,0,17,249,23,6,255,0,118,137,118,6,255,0,142,145,126,241,143,0,255,129,255,241,143,0,134,255,128,241,143,0,0,241,143,241,143,0,137,137,118,241,143,0,15,8,255,90,52,122,126,60,90,14,74,74,126,64,64,6,7,209,217,15,6,16,40,68,16,40,68,68,40,16,68,40,16,12,142,234,254,255,188,165,203,133,129,195,165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,192,0,0,0,0,160,96,0,0,224,240,24,12,7,3,0,126,255,129,129,0,0,129,129,255,126,0,0,0,102,102,0,0,0,24,24,24,24,0,66,37,18,72,164,66,68,40,16,16,40,68,42,124,38,100,62,84,96,96,126,126,120,120,63,32,32,168,112,32,228,60,39,228,60,39,102,102,102,102,102,102,0,6,223,223,6,0,24,36,66,66,36,24,24,60,126,126,60,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,252,39,39,252,240,255,255,137,137,255,118,126,255,129,129,230,103,255,255,129,129,255,126,255,255,137,137,235,227,255,255,9,9,11,3,126,255,129,145,118,247,255,255,8,8,255,255,0,129,255,255,129,0,96,224,128,128,255,127,255,255,24,60,231,195,255,255,128,128,224,224,255,14,28,28,14,255,255,14,28,56,112,255,126,255,129,129,255,126,255,255,17,17,31,14,30,63,97,225,191,158,255,255,49,113,223,142,102,239,137,137,251,114,3,1,255,255,1,3,127,255,128,128,255,127,15,63,224,224,63,15,255,112,56,56,112,255,227,247,28,28,247,227,3,15,248,248,15,3,227,243,153,141,231,227,96,244,148,148,124,248,255,127,132,132,252,120,120,252,132,132,204,72,120,252,132,132,127,255,120,252,148,148,220,88,16,254,255,17,19,2,24,188,164,164,248,124,255,255,8,8,248,240,0,136,251,251,128,0,128,136,251,123,0,0,255,255,16,56,236,196,0,129,255,255,128,0,252,248,4,248,4,248,252,248,4,4,252,248,120,252,132,132,252,120,252,248,36,36,60,24,24,60,36,36,248,252,252,248,4,4,28,24,72,220,148,164,236,72,0,4,126,255,132,64,124,252,128,128,124,252,28,124,192,192,124,28,60,124,128,124,128,124,196,236,56,56,236,196,140,188,224,96,60,12,204,236,164,148,220,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +#endif /* PRIME2D_FONT6X8_H */ \ No newline at end of file diff --git a/src/subMenu.h b/src/subMenu.h new file mode 100644 index 0000000..257272f --- /dev/null +++ b/src/subMenu.h @@ -0,0 +1,473 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifndef SUBMENU_H +#define SUBMENU_H + +#include +#include "global.h" +#include "menu.h" +#include "x86render.h" + +/* Declarations */ + +#define boxPos (offset + row) + +//Main Menu +void modeSet(); +void randomMode(); +void quickPreset() {}; +void quickSize() {}; +void quickSkill() {}; + +//General Purpose +void drawPattern(); +void swapPrimaries(); +//Custom Game +void perCent(); +void mineCent(); +void boardCent(); + +void custom_SizePercent(); +void custom_Mines(); + +//Settings +void settingsMenu(); +void videoUpdate(); +void fpsUpdate(); +void accessSet(); + +void versionText(); +void testGraphic(); + +void buildMenu(); + +//Things +void leadChange(); +void gameStart(); +//What? +void helpText(); +void buildPattern(); + +/* Declarations */ + + +uint24_t presetT = 5; +uint24_t sizeT = 4; +uint24_t difficT = 3; +uint24_t percent = 14; +uint24_t scoreT = 0; + +uint8_t row = 0; +uint8_t offset = 0; //offset +uint8_t sector = 0; + +void (*menuFunction[11])() = {0,buildPattern,buildPattern,buildPattern,leadChange,versionText,0,testGraphic,0,helpText,quitGame}; +uint8_t menuBack[11] = {10,0,0,0,0,0,5,5,5,0,0}; +uint16_t boxIndex[12] = {0,8,16,21,28,37,43,47,54,59,60,60}; +uint8_t menuRows[11] = {8,8,5,7,9,6,4,7,5,1,1}; + +uint8_t boxType[60] = {9,9,9,9,9,9,9,9,0,22,4,4,4,1,9,9,22,1,9,9,9,22,22,22,22,22,9,9,0,0,0,0,0,0,0,22,9,65,9,9,9,0,9,52,65,52,9,54,65,52,65,65,22,9,21,1,1,1,9,9}; +uint8_t boxColor[60] = {5,11,9,12,6,2,1,8,5,8,8,8,8,7,8,8,10,14,7,8,8,8,8,8,9,8,1,8,5,8,8,8,8,8,8,10,8,1,8,8,8,7,8,9,8,8,8,11,8,8,8,12,5,8,8,8,8,9,8,8}; +uint8_t boxDirect[60] = {1,1,2,3,4,5,9,0,0,0,0,0,0,0,3,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,8,0,0,0,0,0,5,0,0,0,0,0,0,5,0,0,0,0,5,0}; +uint16_t textIndex[61] = {0,23,41,54,64,79,91,99,112,124,137,147,155,169,183,193,206,227,242,256,271,284,297,305,313,327,341,355,368,383,386,389,392,395,398,401,414,427,446,460,475,491,500,512,526,535,547,556,567,586,605,628,647,659,668,684,701,719,734,743,755}; +void (*boxFunction[60])() = {modeSet,modeSet,0,0,0,0,0,quitGame,0,drawPattern,0,0,0,gameStart,0,0,drawPattern,randomMode,0,0,0,drawPattern,boardCent,boardCent,mineCent,perCent,gameStart,0,0,0,0,0,0,0,0,leadChange,0,swapPrimaries,0,0,0,0,0,0,0,0,0,videoUpdate,accessSet,0,0,0,fpsUpdate,0,0,0,0,0,0,0}; +void* boxPointer[60] = {0,0,0,0,0,0,0,0,0,&gameMode,0,0,0,0,0,0,&gameMode,&gameMode,0,0,0,&gameMode,&sizeX,&sizeY,&chance,&percent,0,0,0,0,0,0,0,0,0,&gameMode,0,&swapAlphaSecondBind,0,0,0,0,0,&safeGuess,&chording,&autoSolver,0,&displayMode,&accessMode,&fadeEffect,&cursorGraphic,&movieIntro,&fpsT,0,&autoSaveMax,0,0,0,0,0}; +uint8_t boxMin[60] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0}; +uint16_t boxMax[60] = {0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,16,0,0,0,0,16,52,27,702,50,0,0,0,0,0,0,0,0,0,16,0,1,0,0,0,0,0,2,1,2,0,3,1,2,1,1,1080,0,3,0,0,0,0,0}; + +uint8_t sourceText[755] = {66,101,90,108,108,98,92,32,76,98,103,94,82,112,94,94,105,94,107,39,32,25,33,74,103,98,96,97,109,32,82,112,94,94,105,94,107,39,32,30,33,64,101,101,32,76,104,93,94,108,39,32,26,33,66,110,108,109,104,102,39,32,48,33,75,94,90,93,94,107,91,104,90,107,93,39,32,44,33,82,94,109,109,98,103,96,108,39,32,43,33,71,94,101,105,39,32,27,33,68,113,98,109,32,70,90,102,94,39,32,45,33,80,110,98,92,100,32,70,90,102,94,39,33,70,90,102,94,32,76,104,93,94,39,32,30,33,79,107,94,108,94,109,39,32,26,33,82,98,115,94,39,32,46,33,67,98,95,95,98,92,110,101,109,114,39,32,41,33,82,109,90,107,109,32,70,90,102,94,39,32,25,33,66,110,108,109,104,102,39,32,43,33,76,90,98,103,32,76,94,103,110,39,32,45,33,79,90,109,109,94,107,103,32,82,94,101,94,92,109,98,104,103,39,32,26,33,81,90,103,93,104,102,32,76,104,93,94,39,32,27,33,80,110,98,92,100,32,70,90,102,94,39,32,25,33,66,110,108,109,104,102,32,70,90,102,94,39,32,43,33,76,90,98,103,32,76,94,103,110,39,32,45,33,70,90,102,94,32,76,104,93,94,39,32,30,33,82,98,115,94,32,87,39,33,82,98,115,94,32,88,39,33,76,98,103,94,32,66,104,110,103,109,39,32,25,33,79,94,107,92,94,103,109,90,96,94,39,32,41,33,82,109,90,107,109,32,70,90,102,94,39,32,26,33,76,90,98,103,32,76,94,103,110,39,32,45,33,71,98,96,97,32,82,92,104,107,94,108,39,32,44,33,1,34,33,2,34,33,3,34,33,4,34,33,5,34,33,6,34,33,70,90,102,94,32,76,104,93,94,39,32,30,33,76,90,98,103,32,76,94,103,110,39,32,45,33,82,112,90,105,32,64,101,105,97,90,32,90,103,93,32,2,103,93,33,70,90,102,94,32,82,94,109,109,98,103,96,108,33,85,98,93,94,104,32,82,94,109,109,98,103,96,108,33,67,90,109,90,32,76,90,103,90,96,94,102,94,103,109,33,85,94,107,108,98,104,103,39,33,76,90,98,103,32,76,94,103,110,32,45,33,82,90,95,94,32,70,110,94,108,108,98,103,96,33,66,97,104,107,93,98,103,96,33,64,110,109,104,32,82,104,101,111,94,107,33,81,94,109,110,107,103,32,45,33,85,98,93,94,104,32,76,104,93,94,33,64,92,92,94,108,108,98,91,98,101,98,109,114,32,76,104,93,94,33,65,90,92,100,96,107,104,110,103,93,32,68,95,95,94,92,109,108,33,66,110,107,108,104,107,32,70,107,90,105,97,98,92,32,37,64,101,105,97,90,38,33,68,103,90,91,101,94,32,76,104,111,98,94,32,72,103,109,107,104,33,76,90,113,98,102,110,102,32,69,79,82,33,81,94,109,110,107,103,32,45,33,64,110,109,104,32,82,90,111,94,32,66,104,110,103,109,33,66,101,94,90,107,32,64,110,109,104,32,82,90,111,94,108,33,66,101,94,90,107,32,75,94,90,93,94,107,91,104,90,107,93,33,66,101,94,90,107,32,64,101,101,32,67,90,109,90,33,81,94,109,110,107,103,32,45,33,76,90,98,103,32,76,94,103,110,32,45,33}; + +/* Main Menu */ + +void modeSet() { + gameMode = row; //It does the job +} +void randomMode() { + srand(seed); + gameMode = rand() % (gameModeCount + 1); + gColor = 0xF0; + fillRect(188, 20+(0*24), 14, 8); //Clears characters + gColor = Black; + text6x8(195, 20+(0*24), (gameMode % 10)); + text6x8(188, 20+(0*24), ((gameMode / 10) % 10)); + drawPattern(); +} + +/* Main Menu */ + +/* General Purpose */ + +void gameStart() { + gameLoop(); + row = 0; + if (status != FORCEQUIT) { + buildMenu(); + } +} + +void drawPattern() { + gColor = 15; + for (int24_t y = 0; y < 65; y += 13) { + for (int24_t x = 0; x < 65; x += 13) { + if (!(x == 26 && y == 26)) { + fillRect(240 + x, 18 + y, 10, 10); + } + } + } + + offPos = orderPos[gameMode]; + offLen = orderPos[gameMode + 1] - orderPos[gameMode]; + gColor = 16; + int24_t u; + int24_t v; + for (int24_t i = 0; i < offLen; i += 2) { + u = order[offPos + i] * 13; //Probably more memory effeicent than an algorithm + v = order[offPos + i + 1] * 13; + uint8_t *fillR = (uint8_t*)VRAM + ((44 * 320) + 266 + (320 * v) + u); + if (*fillR == 0) { //Draws a 3 if 2 is already there + fillRect(266 + u, 44 + v , 10, 10); + gColor = 0; + text6x8(268 + u, 45 + v, 3); //3 + gColor = 16; + } else if (*fillR == 16) { //draws a two if a repeat is detected + fillRect(266 + u, 44 + v , 10, 10); + gColor = 0; + text6x8(268 + u, 45 + v, 2); //2 + gColor = 16; + } else { + fillRect(266 + u, 44 + v , 10, 10); + } + } +} + +void buildPattern() { //Draws it too + for (int24_t i = 239; i < 304; i += 13) { + gColor = (7); + vert(i, 17, 64); + gColor = (0); + vert(i + 11, 17, 64); + } + for (int24_t i = 17; i < 82; i += 13) { + gColor = (7); + horiz(239, i, 64); + gColor = (0); + horiz(239, i + 11, 64); + } + for (int24_t i = 16; i < 94; i += 13) { + gColor = (8); + horiz(238, i, 66); + } + for (int24_t i = 238; i < 316; i += 13) { + gColor = (8); + vert(i, 16, 66); + } + gColor = 1; //Draws the mine in the middle + fillRect(266, 44, 10, 10); + gColor = 0; + text6x8(268,45,25); + gColor = 7; + plotFast(VRAM + ((320 * 47) + 270)); + plotFast(VRAM + ((320 * 48) + 269)); + drawPattern(); +} + +/* General Purpose */ + +/* Custom Game Menu */ + +/* +uint24_t getPercent(uint24_t amountMines) { + uint24_t sizeZ = sizeX * sizeY; + uint24_t output = (amountMines * 200) / sizeZ; + output = output / 2 + output % 2; //Rounding + return output; +} +uint24_t getMines(uint24_t amountPercent) { + uint24_t sizeZ = sizeX * sizeY; + uint24_t output = (sizeZ * amountPercent) / 50; + output = output / 2 + output % 2; //Rounding + return output; +} +void setMines(uint24_t mines0) { + chance = mines0; + uint24_t yCord = 20 + (24 * 3); + gColor = 0xF3; + fillRect(181, yCord, 20, 8); + gColor = 0x00; + text6x8(195, yCord, (chance % 10)); + text6x8(188, yCord, ((chance / 10) % 10)); + text6x8(181, yCord, ((chance / 100))); //Unexpected above 2599 +} +void setPercent(uint24_t percent0) { + percent = percent0; + uint24_t yCord = 20 + (24 * 4); + gColor = 0xF4; + fillRect(181, yCord, 20, 8); + gColor = 0x00; + text6x8(195, yCord, (percent % 10)); + text6x8(188, yCord, ((percent / 10) % 10)); + text6x8(181, yCord, ((percent / 100))); //Unexpected above 2599 +} + +void custom_SizePercent() { + uint24_t chance0 = getMines(percent); + printUInt(chance0,6,10,2,100); + if (chance0 < 8) { + setMines(8); + setPercent(getPercent(8)); + } else if (chance0 > 702) { + setMines(702); + setPercent(getPercent(702)); + } else { + setPercent(chance0); + } +} + +void custom_Mines() { + uint24_t percent0 = getPercent(chance); + printUInt(percent0,6,10,2,109); + if (percent0 < 5) { + setPercent(5); + setMines(getMines(5)); + } else if (percent0 > 50) { + setPercent(50); + setMines(getMines(50)); + } else { + setMines(percent0); + } +} +*/ + +void boardCent() { + uint24_t sizeZ = sizeX * sizeY; + uint8_t w = 0; + if (chance > sizeZ / 2) { // Overflow + chance = (sizeZ) / 2; // Floor Division + w = 1; + } else if (chance < (sizeZ) / 20) { // Underflow + chance = sizeZ % 20 ? (sizeZ / 20) + 1 : sizeZ / 20; // Ceiling Division + w = 1; + } + percent = (chance * 100) / (sizeZ); + //Manual percent draw + uint24_t yCord = 20 + (24 * 4); + + gColor = 0xF4; + fillRect(181, yCord, 20, 8); + gColor = 0; + text6x8(195, yCord, (percent % 10)); + text6x8(188, yCord, ((percent / 10) % 10)); + text6x8(181, yCord, ((percent / 100))); //DEBUG + + + if (w) { + yCord -= 24; + + gColor = 0xF3; + fillRect(181, yCord, 20, 8); + gColor = 0; + text6x8(195, yCord, (chance % 10)); + text6x8(188, yCord, ((chance / 10) % 10)); + text6x8(181, yCord, ((chance / 100))); //Unexpected above 2599 + } +} + +void perCent() { + chance = (sizeX * sizeY * percent) / 100; + uint24_t yCord = 20 + (24 * 3); + + gColor = 0xF3; + fillRect(181, yCord, 20, 8); + gColor = 0; + text6x8(195, yCord, (chance % 10)); + text6x8(188, yCord, ((chance / 10) % 10)); + text6x8(181, yCord, ((chance / 100))); //Unexpected above 2599 +} + +void mineCent() { + uint24_t sizeZ = sizeX * sizeY; + if (chance > sizeZ / 2) { // Overflow + chance = sizeZ % 20 ? (sizeZ / 20) + 1 : sizeZ / 20; // Ceiling Division + } else if (chance < (sizeZ) / 20) { // Underflow + chance = (sizeZ) / 2; // Floor Division + } + percent = (chance * 100) / (sizeZ); + + + //Manual percent draw + uint24_t yCord = 20 + (24 * 4); + gColor = 0xF4; + fillRect(188, yCord, 13, 8); + fillRect(181, yCord, 6, 8); //DEBUG + gColor = 0; + text6x8(195, yCord, (percent % 10)); + text6x8(188, yCord, ((percent / 10) % 10)); + text6x8(181, yCord, ((percent / 100))); //DEBUG +} + + +/* Custom Game Menu */ + +/* Leaderboard */ + +void leadChange() { + { + int24_t m = 0; + uint8_t gameMod = 0; //using gameMode may be unsafe at this time, alas gameMod + for (int24_t y = 44; y <= 16 + ((7) * 24); y += 24) { + int24_t x = 20; + gColor = m + 0xF1; //0xF0 + 1 + fillRect(41, 44 + (24 * m), 48, 8); + gColor = 0; + text6x8(x + 21, y, names[m * 3 + (gameMod * 18)]); + text6x8(x + 28, y, names[m * 3 + 1 + (gameMod * 18)]); + text6x8(x + 35, y, names[m * 3 + 2 + (gameMod * 18)]); + text6x8(x + 49, y, ((leaderboard[m + (gameMod * 6)] / 1000) % 10)); + text6x8(x + 56, y, ((leaderboard[m + (gameMod * 6)] / 100) % 10)); + text6x8(x + 63, y, ((leaderboard[m + (gameMod * 6)] / 10) % 10)); + text6x8(x + 70, y, (leaderboard[m + (gameMod * 6)] % 10)); + m++; + } + } +} + +/* Leaderboard */ + + +/* Settings Interface */ +void fadeClear(); +void fadeSet(); +void swapPrimaries() { + if (boxColor[boxPos] == Red) { + boxColor[boxPos] = Blue; + } else { + boxColor[boxPos] = Red; + } + fadeClear(); + fadeSet(); +} + +void versionText() { + uint24_t x = 83; + for (uint8_t j = 15; j < 21; j++) { + text6x8(x, 116, hiddenText[j]); + x += 7; + } + x = 139; + for (uint8_t j = 33; j < 43; j++) { + text6x8(x, 116, hiddenText[j]); + x += 7; + } +} + +#define testGY 17 //Man this looks bad +void testGraphic() { + gColor = Grey; // Grey + horiz(217,testGY,98); + horiz(217,testGY+13,98); + vert(217,testGY+1,12); + vert(314,testGY+1,12); + gColor = 0x1C; + fillRect(218,testGY+1,96,12); + gColor = Black; + text6x8(220,testGY+3,gMine); + text6x8(228,testGY+3,gFlag); + gColor = White; + plot(222,testGY+5); + plot(221,testGY+6); + gColor = Red; + fillRect(228,testGY+4,4,3); + uint24_t x = 236; + for (uint8_t i = 0; i < 10; i++) { + gColor = color[i]; + text6x8(x,testGY+3,i); + x += i > 1 ? 8 : 7; + } +} + +void accessSet() { + //Placeholder +} + +void settingsMenu() { //Places Hidden Text and draws test palette + //Deprecated +} + +void videoUpdate() { //Requires an Update + + #ifdef TI84CE + if (displayMode & 2 && darkMode == 0) { + darkMode = 1; + ((void(*)(void))0x384)(); + *(volatile uint8_t*)0xF80018 = 0x08; + *(volatile uint8_t*)0xF80018 = 0x44; + *(volatile uint8_t*)0xF80018 = 0x21; + *(volatile uint8_t*)0xF80008 = 0x01; + } else if (displayMode < 2 && darkMode == 1) { + darkMode = 0; + ((void(*)(void))0x384)(); + *(volatile uint8_t*)0xF80018 = 0x08; + *(volatile uint8_t*)0xF80018 = 0x44; + *(volatile uint8_t*)0xF80018 = 0x20; + *(volatile uint8_t*)0xF80008 = 0x01; + } + #endif /* TI84CE */ + + #ifdef WINDOWS + if (displayMode & 2 && darkMode == 0) { + darkMode = 1; + } else if (displayMode < 2 && darkMode == 1) { + darkMode = 0; + } + #endif /* WINDOWS */ + + if (displayMode & 1) { + *videoMode = 0x827; + } else { + *videoMode = 0x927; + } + gColor = 0xF0; + fillRect(195, 20, 6, 8); + gColor = 0; + text6x8(195, 20, displayMode); + delay32K(7936); //10240 - 2304 + keyReset(hORIZ); +} + +/* Settings Interface*/ + +/* Functions */ + +void fpsUpdate() { + FPS = 32768 / fpsT; +} + +/* Functions */ + +/* Help */ +void helpText() { + gColor = 0x0B; //Dark green + fillRect(12,40,296,184); + gColor = 0; + uint24_t x = 16; + uint8_t y = 44; + for (uint16_t j = 0; j < guideTextLength; j++) { + if (guideText[j] == 33) { //New Line + x = 16; + y += 12; + } else { + text6x8(x, y, guideText[j]); + x += 7; + } + } +} + +/* Help */ + +#endif /* SUBMENU_H */ \ No newline at end of file diff --git a/src/video.h b/src/video.h new file mode 100644 index 0000000..a33396b --- /dev/null +++ b/src/video.h @@ -0,0 +1,151 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +#ifdef VIDEO +#ifndef VIDEO_H +#define VIDEO_H + +#include +#include +#include + +// Hard coded palette +const uint16_t palette[1260] = { + /*0*/3171,12684,12687,15855,18927,25266,31608,3,22098,25269,25368,25371,28440,31509,31512/*1*/,3171,12684,12687,15855,18927,25266,31608,3,22095,22098,25269,25368,25371,28440,31509/*2*/,3171,12684,12687,15855,18927,25266,31608,3,22095,22098,25269,25368,25371,28440,31509/*3*/,3171,12684,12687,15855,18927,25266,28437,3,31608,25368,25371,28440,31509,28536,31512/*4*/,3171,12684,12687,15855,18927,25266,28437,3,31608,25368,25371,28440,31509,28539,31512/*5*/,3171,12684,12687,15855,18927,25266,28437,3,31608,22200,25371,28440,31509,28539,31512/*6*/,3171,12684,12687,15855,18927,25266,28437,3,31608,25269,25368,25371,28440,31509,28539/*7*/,3171,12684,12687,15756,15855,25266,28437,3,22098,31608,25368,25467,28440,28539,31509/*8*/,3171,12684,12687,15756,15855,25266,28437,3,22098,25269,31608,25467,28539,31509,31512/*9*/,3171,12684,12687,15756,15855,25266,28437,3,31608,25368,22200,28539,31509,31512,31611/*10*/,3171,12684,12687,15756,15855,25266,31608,3,25269,28539,25368,25371,25467,31509,31512/*11*/,3171,12684,12687,15756,15855,25266,31608,3,28539,22095,22200,25368,25371,25467,31611/*12*/,3171,12684,15855,12687,31608,28437,28539,3,19029,22200,25368,31611,25467,28440,31512/*13*/,3171,12684,15855,12585,12687,31608,28539,3,15759,25368,25269,31509,31611,25371,28440/*14*/,3171,12684,6342,15756,15855,28539,31608,3,25269,19029,25368,22200,31509,31611,25170/*15*/,3171,3174,6342,12684,15756,15855,15858,3,28437,31608,31611,22200,31509,28542,31707/*16*/,3171,3174,12684,9513,15855,15858,28437,3,31608,28539,31611,28338,31707,25371,28341/*17*/,3171,3174,12684,15756,15855,15858,28437,3,31608,28539,31611,31509,28341,31707,31512/*18*/,3171,3174,12684,15756,15855,15858,31608,3,28539,22200,25368,31611,31509,31707,28341/*19*/,3171,3174,15855,15756,15858,18927,28437,3,31608,31707,28539,31611,31509,31710,31605/*20*/,3171,3174,15855,15858,12786,18927,28437,3,31707,31608,31611,31509,28638,31710,31212/*21*/,3171,3174,15756,15855,15858,18927,31707,3,28542,31608,31611,28440,28638,31509,31710/*22*/,3171,3174,15855,15858,18927,31707,31608,3,25266,25368,31611,28638,31710,31605,28515/*23*/,3171,3174,15858,15756,18927,28437,31707,31710,25368,25371,28440,28539,28638,31611,31605/*24*/,3171,3174,15858,18927,15855,28437,31608,31707,31710,25368,28638,28440,28539,31611,31614/*25*/,3171,3174,12786,15858,18927,28437,28542,31608,31707,31710,28638,31611,22299,29568,28672/*26*/,3171,12786,15855,15858,18927,28437,28542,31608,31707,31710,31611,22095,28341,29568,28672/*27*/,12786,15858,18927,28437,28542,31608,31707,31710,22299,25368,31611,31680,31509,29568,28672/*28*/,12786,15855,15858,18927,28437,28542,31608,31707,31710,25269,28638,31680,31614,29568,28672/*29*/,12786,15855,15858,18927,28437,28542,31608,31707,31710,25269,28638,30720,31680,29568,28672/*30*/,12786,15756,15855,15858,18927,28437,28542,31608,31707,31710,28638,31680,31512,29568,28672/*31*/,12786,15756,15858,18927,28437,28542,31608,31707,31611,31710,31512,28638,31680,29568,28672/*32*/,12786,15858,15855,18927,28437,28542,31608,31707,28539,31710,31512,31680,31509,29568,28672/*33*/,12786,15858,15855,18927,28437,28542,31608,28440,31707,31710,28638,31680,31512,29568,28672/*34*/,12786,15858,15855,28542,19128,31710,31707,31611,25368,25371,25470,28638,31512,29568,28672/*35*/,12786,15858,15855,18927,28437,28542,31710,31611,31707,28638,30720,31512,31680,29568,28672/*36*/,12786,15858,18927,19128,28437,28542,31710,31611,31707,28638,31512,31680,31017,29568,28672/*37*/,12786,15855,15858,19128,28437,28542,31608,31710,25470,28638,31509,31680,25272,29568,28672/*38*/,12786,15855,19128,28437,18927,28542,31608,28539,31710,31611,31509,30720,31680,29568,28672/*39*/,12786,15858,19128,28437,28542,31608,25266,25371,31707,31710,31509,31680,28341,29568,28672/*40*/,9615,12786,15858,28437,28542,31608,31707,28440,28539,31710,31611,31680,28434,29568,28672/*41*/,9615,12786,15855,28437,28542,31608,28539,31707,31710,31680,28638,31509,28341,29568,28672/*42*/,9615,12786,15855,28437,28542,31608,25371,28539,31611,31710,31509,25263,28341,29568,28672/*43*/,9615,15855,15756,28437,28542,31608,25371,28539,31710,31707,28536,31509,28638,29568,28672/*44*/,9615,15855,28437,31608,28539,28542,19029,25371,31707,31710,28440,30720,31680,29568,28672/*45*/,9615,15855,28437,31608,28539,28542,28338,31611,28434,31710,28440,31707,31680,29568,28672/*46*/,15855,15756,28437,31608,28539,28542,28338,25371,28434,31611,31707,31680,31710,29568,28672/*47*/,15855,15756,28437,25266,31608,22200,28542,19128,25368,25371,31611,30720,31680,29568,28672/*48*/,15855,9615,15756,12687,28437,28539,31608,28542,25371,28434,31611,31707,28440,29568,28672/*49*/,15756,15855,12585,12687,28437,25266,31608,28539,28542,31611,31707,31680,31605,29568,28672/*50*/,15756,15855,12684,28437,18927,25266,31608,28539,28542,31611,31707,25269,31605,29568,28672/*51*/,15756,9615,15855,12687,28437,28338,31608,28542,31611,30720,31707,31605,25263,29568,28672/*52*/,15756,9615,15855,12687,28437,25266,28539,31608,28434,28542,31611,31680,31707,29568,28672/*53*/,3171,15756,15855,12684,28437,28539,18927,25266,31608,28434,31611,31680,31707,29568,28672/*54*/,3171,15756,15855,12585,12684,28437,18927,28539,22200,25368,31608,28434,31611,29568,28672/*55*/,3171,15756,15855,12684,28437,15759,28539,25266,25368,31608,31611,31680,31707,29568,28672/*56*/,3171,15756,15855,12684,28437,28539,25266,25368,31608,31611,30720,31680,31707,29568,28672/*57*/,15756,12585,15855,28437,28338,28539,31608,25368,25371,28542,31611,31509,31707,29568,28672/*58*/,15756,15855,12684,28437,31608,22200,28539,25371,28542,31707,31680,31605,31611,29568,28672/*59*/,15756,15855,28338,28437,31608,25266,28539,28542,31707,31509,31680,31710,31704,29568,28672/*60*/,15756,12585,15855,22200,28437,31608,28542,31611,30720,31509,31680,31707,31710,29568,28672/*61*/,9615,15756,15855,28437,18927,28338,28542,31608,28440,31611,31707,28434,31710,29568,28672/*62*/,9615,12585,15756,15855,15858,28437,28338,28542,31608,28440,31707,31509,31710,31689,31017/*63*/,9615,15855,15756,28437,28338,25266,19128,28542,31608,31611,31707,31710,31605,25467,31614/*64*/,9615,15855,15756,28437,15858,28338,25266,28542,31608,31707,31710,31509,31605,31614,31512/*65*/,9615,15756,15855,28437,15858,22200,28338,28539,31608,31611,31710,28524,31707,31605,25467/*66*/,9615,12585,15756,15855,28437,22200,28338,28539,31608,25371,31611,31710,31707,31605,28443/*67*/,9615,12687,15756,15855,19029,28437,28338,28539,31608,31611,31710,25365,28341,31509,31707/*68*/,9615,12687,15855,19029,28338,28437,28539,31608,31611,28440,31710,25167,28434,25365,31707/*69*/,9615,12687,15855,19029,28338,28437,28539,31608,31611,31710,25272,28434,31707,31509,31605/*70*/,9615,12687,15855,22200,28338,28539,31608,31611,31710,25269,28434,31707,31605,25467,31614/*71*/,9615,12687,15855,22200,28338,28539,31608,28542,31611,31710,25269,31605,31509,31707,31614/*72*/,9615,12687,15855,19029,22200,28338,28539,31608,31611,31710,31605,28341,28536,31707,25365/*73*/,9615,12687,15855,19029,22200,28338,28437,28539,31608,31611,31710,31605,31707,31614,28536/*74*/,9615,12687,15855,22200,28338,28437,28539,31608,31611,25167,25269,31710,28440,31509,31605/*75*/,9615,12687,15756,15855,22200,28338,28437,28539,31608,31611,28341,31710,31605,28443,28536/*76*/,9615,12687,15756,15855,22200,28338,28437,28539,31608,31611,28341,28440,31509,31710,28335/*77*/,9615,12687,15756,15855,22200,28338,28437,28539,31608,31611,28341,28440,31509,28434,31710/*78*/,15756,12585,12687,15855,28338,28437,28539,31608,31611,28341,28440,31509,28434,31605,31710/*79*/,12687,9615,15756,25266,28437,25167,25371,28440,31608,25263,28338,28536,28341,28434,28539/*80*/,12684,22095,9513,25266,19029,22197,15954,22200,28437,25365,25272,18930,25170,25263,28341/*81*/,9513,9516,18924,19026,22095,22098,22194,3,22197,25266,21996,18828,21999,18921,25170/*82*/,6342,6345,9414,15753,15855,18927,15852,3,12585,12783,15858,19023,19026,32768,32768/*83*/,3171,3174,6243,6342,9513,12585,12681,12684,9612,32768,32768,32768,32768,32768,32768 +}; +uint24_t data[3528]; + +void cycle(); +void cycleFast(); +void loadFrame(unsigned int b, unsigned int f); +unsigned int block = 0; +uint8_t prgm; +uint24_t* rom; +uint24_t* blit; +uint24_t* pDAT = palette; //Change to 24bit +uint24_t slide = 0; + +uint24_t splashTimer; + +void splash32K() { //32768hz, overflow resiliant + while (deltaTime(timer_Get(1), splashTimer) < (32768/12)); + splashTimer = timer_Get(1); +} + +uint8_t splashVideo() { + *paletteRAM = 0; + *frameBase = 0xD49600; + pDAT = (void *)((uint8_t *)pDAT + 0); + + //cycle(); + + while (1) { + + kb_Scan(); //Scans Keys + if (kb_Data[1] & kb_Del) { + return 1; //Quit + } //Force Quit + if ((kb_Data[6] & kb_Enter) || (kb_Data[1] & kb_2nd) || (kb_Data[2] & kb_Alpha) || (kb_Data[7])) { + *frameBase = VRAM; + return 2; //Quit + } //Skip Cutscene + + //Load AppVar + unsigned char txt[6] = "VOD"; + unsigned char num[3]; + sprintf(num, "%02d", block); + prgm = ti_Open(strcat(txt, num), "r"); + + uint24_t offSET = 0; // where in the data block to search + + for (uint8_t frame = 0; frame < 6; frame++) { // 6 frames per block + + ti_Seek(offSET, SEEK_SET, prgm); //Seeks to the required data + ti_Read(&data, 3, 10584, prgm); + rom = &data; + blit = frame & 1 ? 0xD423C6 : 0xD4B9C6; // ((320 - 168) / 4) + ((240 - 126) * 80) + + for (uint8_t y = 0; y < 126; y++) { + for (uint8_t x = 0; x < 28; x++) { + *blit = *rom; + blit++; + rom++; + } + blit = (void *)((uint8_t *)blit + 76); // (320 - 144) / 2 Bytes + } + + *frameBase = frame & 1 ? 0xD40000 : 0xD49600; + cycleFast(); + offSET += 10584; + slide++; + splash32K(); //Forces 12FPS + if (slide == 84) { + ti_Close(prgm); + prgm = 0; + *frameBase = VRAM; + return 0; + } + } + + block++; + ti_Close(prgm); + } + + prgm = 0; + *frameBase = VRAM; + //*videoMode = 0x92D; //16 bit + return 0; //Quits program +} + +void cycle() { + uint24_t* pRAM = paletteRAM; //Change to 24bit + pRAM = (void *)((uint8_t *)pRAM + 2); + for (uint8_t z = 0; z < 10; z++) { //Change to 24bit + *pRAM = *pDAT; + pDAT++; + pRAM++; + } +} + +void cycleFast() { // Unrolling the loop + uint24_t* pRAM = 0xE30202; //paletteRAM + 2 + *pRAM = *pDAT; /*0*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*1*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*2*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*3*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*4*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*5*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*6*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*7*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*8*/ + pDAT++; + pRAM++; + *pRAM = *pDAT; /*9*/ + pDAT++; + pRAM++; +} + + +#endif /* VIDEO_H */ +#endif /* VIDEO */ \ No newline at end of file diff --git a/src/x86render.h b/src/x86render.h new file mode 100644 index 0000000..a2f1f81 --- /dev/null +++ b/src/x86render.h @@ -0,0 +1,534 @@ +/* +** Author: zerico2005 (2023) +** Project: Super-Sweeper-0.77.1 +** License: MIT License +** A copy of the MIT License should be included with +** this project. If not, see https://opensource.org/license/MIT +*/ + +//#include "global.h" +#ifndef X86RENDER_H +#define X86RENDER_H + +#include +//#include +#define SDL_MAIN_HANDLED +#include +#include +#include +#include +#include +#include +#include + +typedef uint32_t uint24_t; +typedef int32_t int24_t; +typedef uint32_t u24; +typedef int32_t i24; + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +/* Pointers */ + +uint8_t _VRAM[153600]; +void* VRAM = _VRAM + 0; +void* WRAM = _VRAM + 76800; +void* XRAM = _VRAM + 153600; + +uint32_t _frameBase = 0xD40000; +uint32_t* frameBase = &_frameBase; + +uint16_t _paletteRAM[256]; +uint16_t* paletteRAM = _paletteRAM; + +volatile uint16_t _videoMode = 0x92D; +volatile uint16_t* videoMode = &_videoMode; + +uint32_t _LCDTiming0 = 0x1F0A0338; +uint32_t* LCDTiming0 = &_LCDTiming0; +uint32_t _LCDTiming1 = 0x0402093F; +uint32_t* LCDTiming1 = &_LCDTiming1; +uint32_t _LCDTiming2 = 0x00EF7802; +uint32_t* LCDTiming2 = &_LCDTiming2; +uint32_t _LCDTiming3 = 0x00000000; +uint32_t* LCDTiming3 = &_LCDTiming3; + +uint32_t _lcd_CrsrImage; +uint32_t* lcd_CrsrImage = &_lcd_CrsrImage; +uint32_t _lcd_CrsrCtrl; +uint32_t* lcd_CrsrCtrl = &_lcd_CrsrCtrl; +uint32_t _lcd_CrsrConfig; +uint32_t* lcd_CrsrConfig = &_lcd_CrsrConfig; +uint32_t _lcd_CrsrPalette0; +uint32_t* lcd_CrsrPalette0 = &_lcd_CrsrPalette0; +uint32_t _lcd_CrsrPalette1; +uint32_t* lcd_CrsrPalette1 = &_lcd_CrsrPalette1; +uint32_t _lcd_CrsrXY; +uint32_t* const lcd_CrsrXY = &_lcd_CrsrXY; +uint16_t* lcd_CrsrX = (uint16_t*)lcd_CrsrXY; +uint16_t* lcd_CrsrY = (uint16_t*)((uint8_t*)lcd_CrsrXY + 2); +uint32_t _lcd_CrsrClip; +uint32_t* lcd_CrsrClip = &_lcd_CrsrClip; + +/* Pointers */ + +SDL_Event event; +SDL_Renderer *renderer; +SDL_Window *window; +SDL_Texture* texture; +SDL_Texture* buffer; + +#define resX 320 +#define resY 240 +int32_t pitch = resX * 3; + +uint8_t videoCopy[153600]; +uint16_t color16[256]; +uint8_t colorR[256]; +uint8_t colorG[256]; +uint8_t colorB[256]; +uint8_t scale = 2; + +#define keyBindSelection keyBind2 + +struct bound { + uint8_t x0; + uint8_t y0; + uint8_t x1; + uint8_t y1; +}; +struct bound expandedPos[56] = { + {1,1,4,2},{6,1,4,2},{11,1,4,2},{16,1,4,2},{21,1,4,2}, //F1-F5 + {19,4,3,3},{19,10,3,3},{16,7,3,3},{22,7,3,3},//Orthagonal UDLR + {22,4,3,3},{16,10,3,3},{16,4,3,3},{22,10,3,3},//Diagonal Shift Clockwise + {1,5,4,3},{6,5,4,3},{11,5,4,3}, //2nd + {1,9,4,3},{6,9,4,3},{11,9,4,3}, //Alpha + {1,14,4,2},{6,14,4,2},{11,14,4,2},{16,14,4,2},{21,14,4,2}, + {1,17,4,2},{6,17,4,2},{11,17,4,2},{16,17,4,2},{21,17,4,2}, + {1,20,4,2},{6,20,4,2},{11,20,4,2},{16,20,4,2},{21,20,4,2}, + + {1,23,4,2},{6,24,4,2},{11,24,4,2},{16,24,4,2},{21,23,4,2}, + {1,26,4,2},{6,27,4,2},{11,27,4,2},{16,27,4,2},{21,26,4,2}, + {1,29,4,2},{6,30,4,2},{11,30,4,2},{16,30,4,2},{21,29,4,2}, + {1,32,4,2},{6,33,4,2},{11,33,4,2},{16,33,4,2},{21,32,4,2}, + {1,35,4,2},{1,36,4,1} //On +}; + +void outputVRAM(); +void initLCDcontroller(); +void copyFrame(); +int terminateLCDcontroller(); +void displayFrame(); + +/* Replacement File IO */ +uint8_t ti_Open(const char* name, const char* mode) { + return 0; +} +uint8_t ti_Close(uint8_t handle) { + return 0; +} +uint8_t ti_Seek(int offset, unsigned int origin, uint8_t handle) { + return 0; +} +size_t ti_Read(void *data, size_t size, size_t count, uint8_t handle) { + return 0; +} +/* Replacement File IO */ + +/* Replacement Libary Functions */ + +uint24_t timer_Get(uint8_t timer) { + outputVRAM(); + double c = ( (double)clock() ) / ( (double)CLOCKS_PER_SEC ); //Time in seconds + c *= 32768.0; + uint32_t t = ((uint32_t)c) % 16777216; + uint24_t g = t; + return g; +} + +const uint8_t* KEYS; +int KEYCOUNT; +enum keyCode { + KB_Graph , KB_Trace , KB_Zoom , KB_Window , KB_Yequ , KB_2nd , KB_Mode , KB_Del , + KB_Sto = 9, KB_Ln , KB_Log , KB_Square , KB_Recip , KB_Math , KB_Alpha , + KB_0 , KB_1 , KB_4 , KB_7 , KB_Comma , KB_Sin , KB_Apps , KB_GraphVar , + KB_DecPnt , KB_2 , KB_5 , KB_8 , KB_LParen , KB_Cos , KB_Prgm , KB_Stat , + KB_Chs , KB_3 , KB_6 , KB_9 , KB_RParen , KB_Tan , KB_Vars , + KB_Enter = 40 , KB_Add , KB_Sub , KB_Mul , KB_Div , KB_Power , KB_Clear , + KB_Down = 48 , KB_Left , KB_Right , KB_Up +}; + +uint8_t kb_Data[8]; + +enum keyBit { + kb_Graph = 1 , kb_Trace = 2 , kb_Zoom = 4 , kb_Window = 8 , kb_Yequ = 16 , kb_2nd = 32 , kb_Mode = 64 , kb_Del = 128 , + kb_Sto = 2 , kb_Ln = 4 , kb_Log = 8 , kb_Square = 16, kb_Recip = 32 , kb_Math = 64 , kb_Alpha = 128 , + kb_0 = 1 , kb_1 = 2 , kb_4 = 4 , kb_7 = 8 , kb_Comma = 16 , kb_Sin = 32 , kb_Apps = 64 , kb_GraphVar = 128 , + kb_DecPnt = 1 , kb_2 = 2 , kb_5 = 4 , kb_8 = 8 , kb_LParen = 16, kb_Cos = 32 , kb_Prgm = 64 , kb_Stat = 128 , + kb_Chs = 1 , kb_3 = 2 , kb_6 = 4 , kb_9 = 8 , kb_RParen = 16, kb_Tan = 32 , kb_Vars = 64 , + kb_Enter = 1 , kb_Add = 2 , kb_Sub = 4 , kb_Mul = 8 , kb_Div = 16 , kb_Power = 32 , kb_Clear = 64 , + kb_Down = 1 , kb_Left = 2 , kb_Right = 4 , kb_Up = 8 +}; + +void setKey(uint8_t k) { + if (k >= 64) { //Out of Bounds + return; + } + uint8_t bit = 1 << (k % 8); + uint8_t off = k / 8; + kb_Data[off + 1] |= (bit); //+1 otherwise down becomes enter +} +void resetKey(uint8_t k) { + if (k >= 64) { //Out of Bounds + return; + } + uint8_t bit = 1 << (k % 8); + uint8_t off = k / 8; + kb_Data[off + 1] &= ~(bit); +} + +struct keyBind { + uint32_t SDL; + uint8_t CE; +}; + +struct keyBind keyBind0[] = { + /* Alpha Letters */ + {SDLK_a,KB_Math},{SDLK_b,KB_Apps},{SDLK_c,KB_Prgm},{SDLK_d,KB_Recip},{SDLK_e,KB_Sin}, + {SDLK_f,KB_Cos},{SDLK_g,KB_Tan},{SDLK_h,KB_Power},{SDLK_i,KB_Square},{SDLK_j,KB_Comma}, + {SDLK_k,KB_LParen},{SDLK_l,KB_RParen},{SDLK_m,KB_Div},{SDLK_n,KB_Log},{SDLK_o,KB_7}, + {SDLK_p,KB_8},{SDLK_q,KB_9},{SDLK_r,KB_Mul},{SDLK_s,KB_Ln},{SDLK_t,KB_4},{SDLK_u,KB_5}, + {SDLK_v,KB_6},{SDLK_w,KB_Sub},{SDLK_x,KB_Sto},{SDLK_y,KB_1},{SDLK_z,KB_2}, + /* Numbers */ + {SDLK_0,KB_0},{SDLK_1,KB_1},{SDLK_2,KB_2},{SDLK_3,KB_3},{SDLK_4,KB_4}, + {SDLK_5,KB_5},{SDLK_6,KB_6},{SDLK_7,KB_7},{SDLK_8,KB_8},{SDLK_9,KB_9}, + /* Keypad Numbers */ + {SDLK_KP_0,KB_0},{SDLK_KP_1,KB_1},{SDLK_KP_2,KB_2},{SDLK_KP_3,KB_3},{SDLK_KP_4,KB_4}, + {SDLK_KP_5,KB_5},{SDLK_KP_6,KB_6},{SDLK_KP_7,KB_7},{SDLK_KP_8,KB_8},{SDLK_KP_9,KB_9}, + /* Function */ + {SDLK_F1,KB_Yequ},{SDLK_F2,KB_Window},{SDLK_F3,KB_Zoom},{SDLK_F4,KB_Trace},{SDLK_F5,KB_Graph}, + /* Other */ + {SDLK_RETURN,KB_Enter},{SDLK_BACKSPACE,KB_Del},{SDLK_DELETE,KB_Del},{SDLK_CAPSLOCK,KB_Alpha},{SDLK_LSHIFT,KB_2nd}, + {SDLK_COMMA,KB_Comma},{SDLK_COLON,KB_DecPnt},{SDLK_SEMICOLON,KB_DecPnt},{SDLK_QUESTION,KB_Chs},{SDLK_CLEAR,KB_Clear}, + {SDLK_UNDERSCORE,KB_0},{SDLK_SPACE,KB_0},{SDLK_QUOTEDBL,KB_Add},{SDLK_QUOTE,KB_Add},{SDLK_PERIOD,KB_DecPnt}, + /* Math */ + {SDLK_PLUS,KB_Add},{SDLK_MINUS,KB_Sub},{SDLK_ASTERISK,KB_Mul}, + {SDLK_SLASH,KB_Div},{SDLK_CARET,KB_Power},{SDLK_EQUALS,KB_Enter}, + /* Parathesis */ + {SDLK_LEFTPAREN,KB_LParen},{SDLK_RIGHTPAREN,KB_RParen},{SDLK_LEFTBRACKET,KB_Mul},{SDLK_RIGHTBRACKET,KB_Div}, + /* Arrows */ + {SDLK_UP,KB_Up},{SDLK_DOWN,KB_Down},{SDLK_LEFT,KB_Left},{SDLK_RIGHT,KB_Right}, + /* Arbitrary */ + {SDLK_AT,KB_GraphVar},{SDLK_HASH,KB_Stat},{SDLK_DOLLAR,KB_Vars}, + {SDLK_ESCAPE,KB_Clear},{SDLK_HOME,KB_Mode},{SDLK_BACKQUOTE,KB_Mode},{SDLK_BACKQUOTE,KB_Mode} +}; + +struct keyBind keyBind1[] = { + /* Alpha Letters */ + {SDL_SCANCODE_A,KB_Math},{SDL_SCANCODE_B,KB_Apps},{SDL_SCANCODE_C,KB_Prgm},{SDL_SCANCODE_D,KB_Recip},{SDL_SCANCODE_E,KB_Sin}, + {SDL_SCANCODE_F,KB_Cos},{SDL_SCANCODE_G,KB_Tan},{SDL_SCANCODE_H,KB_Power},{SDL_SCANCODE_I,KB_Square},{SDL_SCANCODE_J,KB_Comma}, + {SDL_SCANCODE_K,KB_LParen},{SDL_SCANCODE_L,KB_RParen},{SDL_SCANCODE_M,KB_Div},{SDL_SCANCODE_N,KB_Log},{SDL_SCANCODE_O,KB_7}, + {SDL_SCANCODE_P,KB_8},{SDL_SCANCODE_Q,KB_9},{SDL_SCANCODE_R,KB_Mul},{SDL_SCANCODE_S,KB_Ln},{SDL_SCANCODE_T,KB_4},{SDL_SCANCODE_U,KB_5}, + {SDL_SCANCODE_V,KB_6},{SDL_SCANCODE_W,KB_Sub},{SDL_SCANCODE_X,KB_Sto},{SDL_SCANCODE_Y,KB_1},{SDL_SCANCODE_Z,KB_2}, + /* Numbers */ + {SDL_SCANCODE_0,KB_0},{SDL_SCANCODE_1,KB_1},{SDL_SCANCODE_2,KB_2},{SDL_SCANCODE_3,KB_3},{SDL_SCANCODE_4,KB_4}, + {SDL_SCANCODE_5,KB_5},{SDL_SCANCODE_6,KB_6},{SDL_SCANCODE_7,KB_7},{SDL_SCANCODE_8,KB_8},{SDL_SCANCODE_9,KB_9}, + /* Keypad Numbers */ + {SDL_SCANCODE_KP_0,KB_0},{SDL_SCANCODE_KP_1,KB_1},{SDL_SCANCODE_KP_2,KB_2},{SDL_SCANCODE_KP_3,KB_3},{SDL_SCANCODE_KP_4,KB_4}, + {SDL_SCANCODE_KP_5,KB_5},{SDL_SCANCODE_KP_6,KB_6},{SDL_SCANCODE_KP_7,KB_7},{SDL_SCANCODE_KP_8,KB_8},{SDL_SCANCODE_KP_9,KB_9}, + /* Function */ + {SDL_SCANCODE_F1,KB_Yequ},{SDL_SCANCODE_F2,KB_Window},{SDL_SCANCODE_F3,KB_Zoom},{SDL_SCANCODE_F4,KB_Trace},{SDL_SCANCODE_F5,KB_Graph}, + /* Other */ + {SDL_SCANCODE_RETURN,KB_Enter},{SDL_SCANCODE_BACKSPACE,KB_Del},{SDL_SCANCODE_DELETE,KB_Del},{SDL_SCANCODE_CAPSLOCK,KB_Alpha},{SDL_SCANCODE_LSHIFT,KB_2nd}, + {SDL_SCANCODE_COMMA,KB_Comma},{SDL_SCANCODE_SEMICOLON,KB_DecPnt}, + {SDL_SCANCODE_SPACE,KB_0},{SDL_SCANCODE_APOSTROPHE,KB_Add},{SDL_SCANCODE_PERIOD,KB_DecPnt}, + /* Math */ + {SDL_SCANCODE_EQUALS,KB_Enter},{SDL_SCANCODE_KP_ENTER,KB_Enter}, + {SDL_SCANCODE_KP_PLUS,KB_Add},{SDL_SCANCODE_KP_MINUS,KB_Sub},{SDL_SCANCODE_KP_MULTIPLY,KB_Mul},{SDL_SCANCODE_KP_DIVIDE,KB_Div},{SDL_SCANCODE_KP_DECIMAL,KB_DecPnt}, + /* Parathesis */ + {SDL_SCANCODE_LEFTBRACKET,KB_Mul},{SDL_SCANCODE_RIGHTBRACKET,KB_Div}, + /* Arrows */ + {SDL_SCANCODE_UP,KB_Up},{SDL_SCANCODE_DOWN,KB_Down},{SDL_SCANCODE_LEFT,KB_Left},{SDL_SCANCODE_RIGHT,KB_Right}, + /* Arbitrary */ + {SDL_SCANCODE_ESCAPE,KB_Clear},{SDL_SCANCODE_HOME,KB_Mode},{SDL_SCANCODE_GRAVE,KB_Mode} +}; +struct keyBind keyBind2[] = { //WASD + /* Keypad Numbers */ + {SDL_SCANCODE_KP_0,KB_0},{SDL_SCANCODE_KP_1,KB_1},{SDL_SCANCODE_KP_2,KB_2},{SDL_SCANCODE_KP_3,KB_3},{SDL_SCANCODE_KP_4,KB_4}, + {SDL_SCANCODE_KP_5,KB_5},{SDL_SCANCODE_KP_6,KB_6},{SDL_SCANCODE_KP_7,KB_7},{SDL_SCANCODE_KP_8,KB_8},{SDL_SCANCODE_KP_9,KB_9}, + /* Arrows */ + {SDL_SCANCODE_W,KB_Up},{SDL_SCANCODE_S,KB_Down},{SDL_SCANCODE_A,KB_Left},{SDL_SCANCODE_D,KB_Right}, + {SDL_SCANCODE_UP,KB_Up},{SDL_SCANCODE_DOWN,KB_Down},{SDL_SCANCODE_LEFT,KB_Left},{SDL_SCANCODE_RIGHT,KB_Right}, + /* Primary */ + {SDL_SCANCODE_E,KB_Alpha},{SDL_SCANCODE_Q,KB_2nd},{SDL_SCANCODE_RETURN,KB_Enter}, + /* Other */ + {SDL_SCANCODE_Z,KB_Yequ}, + {SDL_SCANCODE_LSHIFT,KB_GraphVar}, + {SDL_SCANCODE_X,KB_Mode}, + {SDL_SCANCODE_C,KB_Power}, + {SDL_SCANCODE_P,KB_Del}, +}; + +void kb_Reset() { + for (uint8_t i = 0; i < 7; i++) { + kb_Data[i] = 0; + } +} + + + +/* Replacement Libary Functions */ +uint8_t tempKey[56]; //Allows for the same key to be binded to more than one thing +void kb_Scan() { + SDL_PollEvent(&event); + KEYS = SDL_GetKeyboardState(&KEYCOUNT); + uint32_t length = sizeof(keyBindSelection)/sizeof(keyBindSelection[0]); + for (uint32_t i = 0; i < length; i++) { + if (KEYS[keyBindSelection[i].SDL] == 1) { + //printf("%s\n",SDL_GetKeyName(keyBindSelection[i].SDL)); + //printf("%d %d,",q,keyBindSelection[i].CE); fflush(stdout); + setKey(keyBindSelection[i].CE); + tempKey[keyBindSelection[i].CE] = 1; + } + } + for (uint8_t i = 0; i < 56; i++) { + if (tempKey[i] == 0) { + resetKey(i); + } + tempKey[i] = 0; + } +} + +void panFrame() { + uint32_t lcdBase = 0xD00000 | (*frameBase & 0x7FFF8); + if (lcdBase > 0xD65800 || lcdBase < 0xD40000 - (resX * resY)) { + for (u32 r = 0; r < 153600; r++) { + videoCopy[r] = 0x00; + } + return; + } + if (lcdBase == 0xD40000) { //Fast Case + for (u32 r = 0; r < 153600; r++) { + videoCopy[r] = _VRAM[r]; + } + } else if (lcdBase < 0xD40000) { //Above + u32 dif = 0xD40000 - lcdBase; + for (u32 r = 0; r < dif; r++) { + videoCopy[r] = 0x00; + } + for (u32 r = 0; r < 153600 - dif; r++) { + if (r + dif >= 0 && r + dif < 153600 - 1) { + videoCopy[r + dif] = _VRAM[r]; + } else { + videoCopy[r + dif] = 0x00; + } + } + } else if (lcdBase > 0xD40000) { //Below + u32 dif = lcdBase - 0xD40000; + for (u32 r = 0; r < 153600 - dif; r++) { + if (r + dif >= 0 && r + dif < 153600 - 1) { + videoCopy[r] = _VRAM[r + dif]; + } else { + videoCopy[r] = 0x00; + } + } + for (u32 r = 153600 - dif; r < 153600; r++) { + videoCopy[r] = 0x00; + } + } +} + +void outputVRAM() { + if (SDL_PollEvent(&event) && event.type == SDL_QUIT) { + exit(0); + } + + //printf("%X,%X,%X\n",*frameBase,0xD40000,dif); fflush(stdout); + panFrame(); + + for (u16 s = 0; s < 256; s++) { + color16[s] = _paletteRAM[s]; + } + + displayFrame(); +} + +void initLCDcontroller() { + SDL_Init(SDL_INIT_VIDEO); + window = SDL_CreateWindow("Super-Sweeper Windows Edition", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, resX * scale, resY * scale,0); + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderClear(renderer); + buffer = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGB24,SDL_TEXTUREACCESS_STREAMING, resX * scale, resY * scale); +} +//#define videoCopyArray uint8_t c = ((uint8_t*)VRAM)[z] +#define videoCopyArray uint8_t c = videoCopy[z] + +void blit16bpp(uint8_t* data) { + return; //Real time conversion will be painful +} +void blit8bpp(uint8_t* data) { + if (scale == 1) { + uint32_t w = 0; + uint32_t z = 0; + for (uint32_t y = 0; y < resY; y++) { + for (uint32_t x = 0; x < resX; x++) { + videoCopyArray; + data[w] = colorR[c]; w++; + data[w] = colorG[c]; w++; + data[w] = colorB[c]; w++; + z++; + } + } + } else { + uint32_t w = 0; + uint32_t z = 0; + for (uint32_t y = 0; y < resY; y++) { + for (uint8_t v = 0; v < scale; v++) { + for (uint32_t x = 0; x < resX; x++) { + videoCopyArray; + for (uint8_t u = 0; u < scale; u++) { + data[w] = colorR[c]; w++; + data[w] = colorG[c]; w++; + data[w] = colorB[c]; w++; + } + z++; + } + z -= 320; + } + z += 320; + } + } +} +void blit4bpp(uint8_t* data) { + if (scale == 1) { + uint32_t w = 0; + uint32_t z = 0; + for (uint32_t y = 0; y < resY; y++) { + for (uint32_t x = 0; x < resX / 2; x++) { + videoCopyArray; + data[w] = colorR[c & 15]; w++; + data[w] = colorG[c & 15]; w++; + data[w] = colorB[c & 15]; w++; + data[w] = colorR[(c >> 4) & 15]; w++; + data[w] = colorG[(c >> 4) & 15]; w++; + data[w] = colorB[(c >> 4) & 15]; w++; + z++; + } + } + } else { + uint32_t w = 0; + uint32_t z = 0; + for (uint32_t y = 0; y < resY; y++) { + for (uint8_t v = 0; v < scale; v++) { + for (uint32_t x = 0; x < resX / 2; x++) { + videoCopyArray; + for (uint8_t u = 0; u < scale; u++) { + data[w] = colorR[c & 15]; w++; + data[w] = colorG[c & 15]; w++; + data[w] = colorB[c & 15]; w++; + data[w] = colorR[(c >> 4) & 15]; w++; + data[w] = colorG[(c >> 4) & 15]; w++; + data[w] = colorB[(c >> 4) & 15]; w++; + } + z++; + } + z -= 160; + } + z += 160; + } + } +} + +uint8_t darkMode = 0; +void copyFrame(uint8_t* data) { + if (data == NULL) { + printf("ERROR | Buffer Pointer is Void \n"); fflush(stdout); + } + + if (_videoMode & 0x100) { + //Converts 1555 to 888 Color + for (uint32_t i = 0; i < 256; i++) { + uint16_t col = paletteRAM[i]; + colorB[i] = (col & 31) << 3; + col >>= 5; + colorG[i] = col & 1024 ? 4 : 0; + colorG[i] += (col & 31) << 3; + col >>= 5; + colorR[i] = (col & 31) << 3; + } + //Scales color (Otherwise white is 248,252,248) + for (uint32_t i = 0; i < 256; i++) { //Magic Numbers: 35,84 Floor 32,64 Round + colorB[i] += (colorB[i] / 32); + colorG[i] += (colorG[i] / 64); + colorR[i] += (colorR[i] / 32); + } + } else { + //Converts 1555 to 888 Color + for (uint32_t i = 0; i < 256; i++) { + uint16_t col = paletteRAM[i]; + colorR[i] = (col & 31) << 3; + col >>= 5; + colorG[i] = col & 1024 ? 4 : 0; + colorG[i] += (col & 31) << 3; + col >>= 5; + colorB[i] = (col & 31) << 3; + } + //Scales color (Otherwise white is 248,252,248) + for (uint32_t i = 0; i < 256; i++) { //Magic Numbers: 35,84 Floor 32,64 Round + colorR[i] += (colorB[i] / 32); + colorG[i] += (colorG[i] / 64); + colorB[i] += (colorR[i] / 32); + } + } + if (darkMode) { + for (uint32_t i = 0; i < 256; i++) { + colorB[i] ^= 0xFF; + colorG[i] ^= 0xFF; + colorR[i] ^= 0xFF; + } + } + if ((*videoMode & 0xF) == 0x5) { + blit4bpp(data); + } + if ((*videoMode & 0xF) == 0x7) { + blit8bpp(data); + } + if ((*videoMode & 0xF) == 0xD) { + blit16bpp(data); + } +} + +int terminateLCDcontroller() { + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return EXIT_SUCCESS; +} + +void displayFrame() { + if (SDL_PollEvent(&event) && event.type == SDL_QUIT) { + terminateLCDcontroller(); + exit(0); + } + + uint8_t *frame = NULL; + + SDL_LockTexture(buffer,NULL,(void **) &frame,&pitch); + + copyFrame(frame); + + SDL_UnlockTexture(buffer); + SDL_RenderCopy(renderer, buffer, NULL, NULL); + + SDL_RenderPresent(renderer); +} + +#endif /* X86RENDER_H */ \ No newline at end of file