From 162146659796aef3d1473610e27b881db74bbbad Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 3 Jun 2024 19:28:57 +0100 Subject: [PATCH 01/48] fix: some UI tweaks and text align corrections --- common/src/UI.c | 8 +++----- ee_frontend/base3d/src/Renderer.c | 3 --- ee_frontend/base3d/src/es/RendererRasterization.c | 4 ++-- gl_frontend/GL1Common/Renderer.c | 3 --- mx_frontend/base3d/src/Renderer.c | 2 -- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/common/src/UI.c b/common/src/UI.c index 4ed32a59a..8a85a3bd7 100644 --- a/common/src/UI.c +++ b/common/src/UI.c @@ -157,9 +157,8 @@ void redrawHUD(void) { struct ObjectNode *head; int c; struct Item *itemPtr; - drawTextAtWithMargin(1, 1, XRES, thisMissionName, getPaletteEntry(0xFFFFFFFF)); - drawTextAt(1 + (XRES / 8), 1, " Map:", getPaletteEntry(0xFFFFFFFF)); + drawTextAt((XRES / 8), 0, thisMissionName, getPaletteEntry(0xFFFFFFFF)); #ifndef TILED_BITMAPS if (mapTopLevel != NULL) { @@ -188,9 +187,8 @@ void redrawHUD(void) { drawBitmapRaw(XRES + 8, 199 - 32 - 16 - 16, 32, 32, itemSprites[itemPtr->index]->rotations[0], 1); */ - drawTextAtWithMarginWithFiltering(2 + ((XRES) / 8), 23, XRES_FRAMEBUFFER, itemPtr->name, - itemPtr->active ? getPaletteEntry(0xFFAAAAAA) : getPaletteEntry( - 0xFFFFFFFF), '\n'); + drawTextAtWithMarginWithFiltering(((XRES) / 8), 22, XRES_FRAMEBUFFER, itemPtr->name, + itemPtr->active ? getPaletteEntry(0xFFAAAAAA) : getPaletteEntry(0xFFFFFFFF), '\n'); } ++line; } diff --git a/ee_frontend/base3d/src/Renderer.c b/ee_frontend/base3d/src/Renderer.c index 4ba3ab95c..8f15594c5 100644 --- a/ee_frontend/base3d/src/Renderer.c +++ b/ee_frontend/base3d/src/Renderer.c @@ -190,9 +190,6 @@ void renderRoomTransition(void) { enter2D(); - drawTextAtWithMargin(((XRES / 8) / 2) - (thisMissionNameLen / 2), 1, XRES, thisMissionName, - getPaletteEntry(0xFFFFFFFF)); - zCameraOffset -= Div(intToFix(1), intToFix(32)); if (zCameraOffset == 0) { diff --git a/ee_frontend/base3d/src/es/RendererRasterization.c b/ee_frontend/base3d/src/es/RendererRasterization.c index 8cf184b10..c79c075e4 100644 --- a/ee_frontend/base3d/src/es/RendererRasterization.c +++ b/ee_frontend/base3d/src/es/RendererRasterization.c @@ -134,7 +134,7 @@ void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int margin, const uint8_t colour, char charToReplaceHifenWith) { - if (defaultFont == NULL) { + if (defaultFont == NULL) { defaultFont = loadBitmap("font.img"); } @@ -159,7 +159,7 @@ void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int margin, } if (currentChar == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (_x - 1) * 8; + dstX = (_x) * 8; dstY += 8; continue; } diff --git a/gl_frontend/GL1Common/Renderer.c b/gl_frontend/GL1Common/Renderer.c index 2e2f13a83..d639595e6 100644 --- a/gl_frontend/GL1Common/Renderer.c +++ b/gl_frontend/GL1Common/Renderer.c @@ -398,9 +398,6 @@ void renderRoomTransition(void) { #endif enter2D(); - drawTextAtWithMargin(((XRES / 8) / 2) - (thisMissionNameLen / 2), 1, XRES, thisMissionName, - getPaletteEntry(0xFFFFFFFF)); - zCameraOffset -= Div(intToFix(1), intToFix(32)); if (zCameraOffset == 0) { diff --git a/mx_frontend/base3d/src/Renderer.c b/mx_frontend/base3d/src/Renderer.c index 4c5893801..4d046f74c 100644 --- a/mx_frontend/base3d/src/Renderer.c +++ b/mx_frontend/base3d/src/Renderer.c @@ -230,8 +230,6 @@ void renderRoomTransition(void) { center.mZ = intToFix(3); drawCeilingAt(center, nativeTextures[0], kNorth); - drawTextAtWithMargin(((XRES / 8) / 2) - (thisMissionNameLen / 2), 1, XRES, thisMissionName, getPaletteEntry(0xFFFFFFFF)); - zCameraOffset -= Div(intToFix(1), intToFix(4)); if (zCameraOffset == 0) { From 10e37d2097044bb54b7ce913348feb6ba2dbfa73 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 3 Jun 2024 22:45:08 +0100 Subject: [PATCH 02/48] [EE] Fix floor map position for ES --- common/src/UI.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/UI.c b/common/src/UI.c index 8a85a3bd7..b38081d48 100644 --- a/common/src/UI.c +++ b/common/src/UI.c @@ -167,7 +167,7 @@ void redrawHUD(void) { #else if (mapTopLevel[0] != NULL) { for (c = 0; c < 8; ++c) { - drawBitmap(((c & 3) * 32), 8 + (c >> 2) * 32, mapTopLevel[c], 1); + drawBitmap(XRES + ((c & 3) * 32), 72 + (c >> 2) * 32, mapTopLevel[c], 1); } } #endif From 3eed3aeaa71b7aa6883384a36e3a9881127282f0 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 3 Jun 2024 23:27:03 +0100 Subject: [PATCH 03/48] [GL] Handle margins when printing text --- gl_frontend/GL1Common/RendererRasterization.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gl_frontend/GL1Common/RendererRasterization.c b/gl_frontend/GL1Common/RendererRasterization.c index 1cd435637..ca8f72116 100644 --- a/gl_frontend/GL1Common/RendererRasterization.c +++ b/gl_frontend/GL1Common/RendererRasterization.c @@ -414,7 +414,7 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con if (currentChar == '-') { currentChar = charToReplaceHifenWith; } - if (currentChar == '\n' || dstX >= XRES_FRAMEBUFFER) { + if (currentChar == '\n' || (dstX >= XRES_FRAMEBUFFER) || (dstX >= ((margin - 1) * 8)) ) { dstX = (x - 1) * 8; dstY += 8; continue; From 6d628f7c653292e5ead1e1a2ece8d4616f235e27 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 3 Jun 2024 23:27:35 +0100 Subject: [PATCH 04/48] [GL] Properly indent text when breaking a line --- gl_frontend/GL1Common/RendererRasterization.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gl_frontend/GL1Common/RendererRasterization.c b/gl_frontend/GL1Common/RendererRasterization.c index ca8f72116..b88831260 100644 --- a/gl_frontend/GL1Common/RendererRasterization.c +++ b/gl_frontend/GL1Common/RendererRasterization.c @@ -415,7 +415,7 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con currentChar = charToReplaceHifenWith; } if (currentChar == '\n' || (dstX >= XRES_FRAMEBUFFER) || (dstX >= ((margin - 1) * 8)) ) { - dstX = (x - 1) * 8; + dstX = (x) * 8; dstY += 8; continue; } From 15b5dfe3a53ce26a7b0df96e08b48ce35a09edf2 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 3 Jun 2024 23:28:07 +0100 Subject: [PATCH 05/48] [GL] Properly position text when breaking lines in N64 --- gl_frontend/GL1Common/RendererRasterization.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gl_frontend/GL1Common/RendererRasterization.c b/gl_frontend/GL1Common/RendererRasterization.c index b88831260..319747f67 100644 --- a/gl_frontend/GL1Common/RendererRasterization.c +++ b/gl_frontend/GL1Common/RendererRasterization.c @@ -416,7 +416,11 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con } if (currentChar == '\n' || (dstX >= XRES_FRAMEBUFFER) || (dstX >= ((margin - 1) * 8)) ) { dstX = (x) * 8; +#ifndef N64 dstY += 8; +#else + dstY += 9; +#endif continue; } From bae8c2f21a55ece8a4f30ee6ab3dba124615983d Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 3 Jun 2024 23:41:40 +0100 Subject: [PATCH 06/48] fix: window drawing positioning Turns out the whole UI was compensating for a bug --- common/src/Crawler.c | 4 ++-- common/src/CreditsScreen.c | 4 ++-- common/src/GameMenu.c | 4 ++-- common/src/HelpScreen.c | 4 ++-- common/src/MainMenu.c | 4 ++-- common/src/UI.c | 24 +++++++++++++++--------- 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/common/src/Crawler.c b/common/src/Crawler.c index a94162814..e526e70e7 100644 --- a/common/src/Crawler.c +++ b/common/src/Crawler.c @@ -131,8 +131,8 @@ void Crawler_repaintCallback(void) { /* The dithered filter on top of the 3D rendering*/ fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF000000), TRUE); - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 3, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 4, biggestOption + 2, (optionsHeight / 8) + 2, AbandonMission_Title, diff --git a/common/src/CreditsScreen.c b/common/src/CreditsScreen.c index 7bb58279b..54cca6978 100644 --- a/common/src/CreditsScreen.c +++ b/common/src/CreditsScreen.c @@ -35,8 +35,8 @@ void CreditsScreen_repaintCallback(void) { - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 7 - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - (1) - 4, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 7 - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - (1) - 5, 7 + 2, 3, "Credits", CreditsScreen_options, 1, cursorPosition); } diff --git a/common/src/GameMenu.c b/common/src/GameMenu.c index 01a23de49..d28a4c5af 100644 --- a/common/src/GameMenu.c +++ b/common/src/GameMenu.c @@ -137,8 +137,8 @@ void GameMenu_repaintCallback(void) { drawTextWindow(1, 1, (XRES_FRAMEBUFFER / 8) - 2, (YRES_FRAMEBUFFER / 8) - 5, GameMenu_StateTitle, textBuffer); } - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 3, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 4, biggestOption + 2, (optionsHeight / 8) + 2, GameMenu_StateTitle, diff --git a/common/src/HelpScreen.c b/common/src/HelpScreen.c index d1a7ecda8..41a938818 100644 --- a/common/src/HelpScreen.c +++ b/common/src/HelpScreen.c @@ -34,8 +34,8 @@ void HelpScreen_repaintCallback(void) { } } - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 4 - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - 1 - 4, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 4 - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - 1 - 5, 4 + 2, 1 + 2, "Help", HelpScreen_options, 1, cursorPosition); } diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index 308374960..8c7405314 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -2106,8 +2106,8 @@ void MainMenu_repaintCallback(void) { } drawWindowWithOptions( - (XRES_FRAMEBUFFER / 8) - (int) 9 - 3, - (YRES_FRAMEBUFFER / 8) - 3 - kMainMenuOptionsCount, + (XRES_FRAMEBUFFER / 8) - (int) 9 - 4, + (YRES_FRAMEBUFFER / 8) - 4 - kMainMenuOptionsCount, 9 + 2, kMainMenuOptionsCount + 2, "Episode 0", diff --git a/common/src/UI.c b/common/src/UI.c index b38081d48..c8cb714ec 100644 --- a/common/src/UI.c +++ b/common/src/UI.c @@ -51,16 +51,16 @@ drawWindowWithOptions(const int x, int isCursor = (selectedOption == c); if (isCursor) { - fillRect(x * 8 - 8, - (y + 2 + c) * 8 - 8, + fillRect((x) * 8, + (y + 2 + c) * 8, dx * 8, 8, getPaletteEntry(0xFF000000), FALSE); } - drawTextAt(x, - y + 1 + c, + drawTextAt(x + 1, + y + 2 + c, &options[c][0], isCursor ? getPaletteEntry(0xFFFFFFFF) : getPaletteEntry(0xFF000000)); } @@ -69,13 +69,19 @@ drawWindowWithOptions(const int x, void drawWindow(const int x, const int y, const unsigned int dx, const unsigned int dy, const char *title) { - fillRect((x) * 8, (y) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000), TRUE); - fillRect((x - 1) * 8, (y - 1) * 8, dx * 8, dy * 8, getPaletteEntry(0xFFFFFFFF), FALSE); - drawRect((x - 1) * 8, (y - 1) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000)); - fillRect((x - 1) * 8, (y - 1) * 8, dx * 8, 8, getPaletteEntry(0xFF000000), FALSE); + /* shadow */ + fillRect((x + 1) * 8, (y + 1) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000), TRUE); + + /* background */ + fillRect((x) * 8, (y) * 8, dx * 8, dy * 8, getPaletteEntry(0xFFFFFFFF), FALSE); + /* frame */ + drawRect((x) * 8, (y) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000)); + /* title tab */ + fillRect((x) * 8, (y) * 8, dx * 8, 8, getPaletteEntry(0xFF000000), FALSE); + /* title text */ if (title != NULL) { - drawTextAt(x, y - 1, title, getPaletteEntry(0xFFFFFFFF)); + drawTextAt(x + 1, y, title, getPaletteEntry(0xFFFFFFFF)); } } From 0e1d417a7f29d34b8aff72d3bb1d4b9e3e2ba62f Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 4 Jun 2024 20:10:53 +0100 Subject: [PATCH 07/48] [MY] fix in game UI (items display) for 320-wide resolution games --- my_frontend/src/Crawler.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/my_frontend/src/Crawler.c b/my_frontend/src/Crawler.c index 1ec6882de..95cac34b2 100644 --- a/my_frontend/src/Crawler.c +++ b/my_frontend/src/Crawler.c @@ -55,7 +55,7 @@ void HUD_refresh(void) { if (item->active) { writeStrWithLimit(1, YRES_TEXT - 6, "*", 16, 2, 0); } - writeStrWithLimit(2, YRES_TEXT - 6, item->name, 16, 2, 0); + writeStrWithLimit(2, YRES_TEXT - 6, item->name, (XRES_FRAMEBUFFER / 8) / 2, 2, 0); } else { writeStrWithLimit(2, YRES_TEXT - 6, "Nothing", 16, 2, 0); } @@ -66,7 +66,7 @@ void HUD_refresh(void) { if (item->active) { drawTextAt(1, YRES_TEXT - 3, "*", 1); } - writeStrWithLimit(2, YRES_TEXT - 3, item->name, 16, 2, 0); + writeStrWithLimit(2, YRES_TEXT - 3, item->name, (XRES_FRAMEBUFFER / 8) / 2, 2, 0); } else { writeStrWithLimit(2, YRES_TEXT - 3, "Nothing", 16, 2, 0); } From 4bfa02fe29da7464f325e8dc0e3cb6baed1b5390 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 4 Jun 2024 20:11:32 +0100 Subject: [PATCH 08/48] [MY] Fix ia16 string printing --- my_frontend/src/msdos.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/my_frontend/src/msdos.c b/my_frontend/src/msdos.c index b91a8ac94..689836f39 100644 --- a/my_frontend/src/msdos.c +++ b/my_frontend/src/msdos.c @@ -452,17 +452,17 @@ void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, const char *ptr = text; uint16_t c = 0; uint16_t chary = 0; - uint16_t x = _x - 1; + uint16_t x = _x; char cha = *ptr; for (; cha && y < 25; ++c) { - if (x == limitX) { + if (x >= limitX || x >= (XRES_TEXT)) { ++y; - x = _x - 1; + x = _x + 1; } else if (cha == '\n') { ++y; - x = _x - 1; + x = _x + 1; ++ptr; cha = *ptr; continue; @@ -470,6 +470,8 @@ void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, ++x; } + uint8_t biosX = x - 1; + asm volatile ( "movb $0x02, %%ah\n\t" "movb %0, %%dl\n\t" @@ -483,7 +485,7 @@ void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, "movb $0x03, %%bl\n" "int $0x10\n\t" : - : "rm" (x), "rm" (y), "rm"(cha) + : "rm" (biosX), "rm" (y), "rm"(cha) : "ax", "bx", "cx", "dx" ); From 243211d5fda1bfb5fb880c4ebd857bce6ba7c225 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Wed, 5 Jun 2024 18:37:20 +0100 Subject: [PATCH 09/48] [MX] Reflow strings as it is printed, so it will break the sentence before the word that exceeds it --- mx_frontend/base3d/src/RendererRasterization.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/mx_frontend/base3d/src/RendererRasterization.c b/mx_frontend/base3d/src/RendererRasterization.c index 1e214c7a5..9b61fcb7b 100644 --- a/mx_frontend/base3d/src/RendererRasterization.c +++ b/mx_frontend/base3d/src/RendererRasterization.c @@ -1676,7 +1676,9 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con size_t fontWidth = defaultFont->width; BitmapPixelFormat *fontPixelData = defaultFont->data; size_t c; + size_t d; int32_t srcX, srcY; + uint8_t lastSpacePos = 0xFF; for (c = 0; c < len; ++c) { uint8_t ascii; @@ -1695,9 +1697,8 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con col = ascii & 31; letter = fontPixelData + (col * 8) + (fontWidth * (line * 8)); - - if (currentChar == '\n' || dstX >= margin) { - dstX = (x - 1) * 8; + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } @@ -1707,8 +1708,19 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con } if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } for (srcY = 0; srcY < 8; ++srcY) { From d500006152519a41b7f8408c3270f648ab552b27 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Wed, 5 Jun 2024 18:38:17 +0100 Subject: [PATCH 10/48] feat: add basic background colour for screens that support it Those that don't will keep their natual background colour. Also notice that I've removed the forced line breaks on the strings. --- common/src/CreditsScreen.c | 17 +++++++++++++++-- common/src/HelpScreen.c | 14 +++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/common/src/CreditsScreen.c b/common/src/CreditsScreen.c index 54cca6978..2de9c9ec2 100644 --- a/common/src/CreditsScreen.c +++ b/common/src/CreditsScreen.c @@ -11,6 +11,14 @@ #include "UI.h" #include "Engine.h" +#ifndef MONOCHROME_VECTORS +#include "FixP.h" +#include "Vec.h" +#include "Mesh.h" +#include "CActor.h" +#include "Renderer.h" +#endif + extern int8_t cursorPosition; extern const char *mainText; const char *CreditsScreen_options[1] = {"Back"}; @@ -21,13 +29,18 @@ enum EGameMenuState CreditsScreen_nextStateNavigation[1] = { void CreditsScreen_initStateCallback(enum EGameMenuState tag) { (void)tag; - mainText = "Made by Daniel \n\"MontyOnTheRun\" Monteiro, with the help of many\npeople. Please check\nCREDITS.TXT" - " on the source code tree for further\nacknowledgements."; + mainText = "Made by Daniel \"MontyOnTheRun\" Monteiro, with the help of many people. Please check CREDITS.TXT" + " on the source code tree for further acknowledgements."; } void CreditsScreen_repaintCallback(void) { if (firstFrameOnCurrentState) { clearScreen(); + +#ifndef MONOCHROME_VECTORS + fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); +#endif + if (mainText != NULL) { drawTextWindow(1, 1, (XRES_FRAMEBUFFER / 8) - 4, 10, "Credits", mainText); } diff --git a/common/src/HelpScreen.c b/common/src/HelpScreen.c index 41a938818..25afe8001 100644 --- a/common/src/HelpScreen.c +++ b/common/src/HelpScreen.c @@ -11,6 +11,14 @@ #include "UI.h" #include "Engine.h" +#ifndef MONOCHROME_VECTORS +#include "FixP.h" +#include "Vec.h" +#include "Mesh.h" +#include "CActor.h" +#include "Renderer.h" +#endif + extern const char *mainText; extern int8_t cursorPosition; @@ -22,13 +30,17 @@ const enum EGameMenuState HelpScreen_nextStateNavigation[1] = { void HelpScreen_initStateCallback(enum EGameMenuState tag) { (void)tag; - mainText = "You must gain access to the reactor, place the EMP\ndevice and, from a safe\ndistance, activate it."; + mainText = "You must gain access to the reactor, place the EMP device and, from a safe distance, activate it."; } void HelpScreen_repaintCallback(void) { if (firstFrameOnCurrentState) { clearScreen(); +#ifndef MONOCHROME_VECTORS + fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); +#endif + if (mainText != NULL) { drawTextWindow(1, 1, (XRES_FRAMEBUFFER / 8) - 2, 1 + 6, "Help", mainText); } From c614bfe1eec5e980cc1d538dcc84767fc3dca760 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Wed, 5 Jun 2024 20:41:57 +0100 Subject: [PATCH 11/48] [EE] Replicate text reflowing from MX to EE --- .../base3d/src/ee/RendererRasterization.c | 78 +++++++++++------ .../base3d/src/es/RendererRasterization.c | 63 +++++++++----- .../base3d/src/gx/RendererRasterization.c | 83 ++++++++++++------- 3 files changed, 148 insertions(+), 76 deletions(-) diff --git a/ee_frontend/base3d/src/ee/RendererRasterization.c b/ee_frontend/base3d/src/ee/RendererRasterization.c index 9174b73fe..399e4e1c9 100644 --- a/ee_frontend/base3d/src/ee/RendererRasterization.c +++ b/ee_frontend/base3d/src/ee/RendererRasterization.c @@ -347,7 +347,21 @@ void drawRepeatBitmap( } } -void drawTextAt(const int _x, const int _y, const char *text, const FramebufferPixelFormat colour) { +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + +void drawTextAt(const int x, const int y, const char *text, const FramebufferPixelFormat colour) { + + drawTextAtWithMargin(x, y, (XRES_FRAMEBUFFER - 1), text, colour); +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, + const uint8_t colour, char charToReplaceHifenWith) { if (defaultFont == NULL) { defaultFont = loadBitmap("font.img"); @@ -358,50 +372,62 @@ void drawTextAt(const int _x, const int _y, const char *text, const FramebufferP } size_t len = strlen(text); - int32_t dstX = (_x) * 8; - int32_t dstY = (_y) * 8; - size_t c; - uint32_t ascii; - float line; - float col; - + int32_t dstX = x * 8; + int32_t dstY = y * 8; float fontWidth = defaultFont->width; float fontHeight = defaultFont->height; float blockWidth = (8.0f / fontWidth) * 0.999f; float blockHeight = (8.0f / fontHeight) * 0.999f; + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + for (c = 0; c < len; ++c) { - if (text[c] == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (_x - 1) * 8; + uint8_t ascii; + float line; + float col; + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } - if (text[c] == ' ' || text[c] == '\r') { + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } - ascii = text[c] - ' '; + ascii = currentChar - ' '; line = (((float) ((ascii >> 5))) * blockHeight); col = (((ascii & 31)) * blockWidth); - drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, line + blockHeight); + drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, + line + blockHeight); dstX += 8; } } - -void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { - -} - -void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, - const uint8_t colour, char charToReplaceHifenWith) { - drawTextAt(x, y, text, colour); -} - -void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { - drawTextAt(x, y, text, colour); -} \ No newline at end of file diff --git a/ee_frontend/base3d/src/es/RendererRasterization.c b/ee_frontend/base3d/src/es/RendererRasterization.c index c79c075e4..a5ba1e5bf 100644 --- a/ee_frontend/base3d/src/es/RendererRasterization.c +++ b/ee_frontend/base3d/src/es/RendererRasterization.c @@ -125,48 +125,74 @@ void drawRepeatBitmap( } } +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + void drawTextAt(const int x, const int y, const char *text, const FramebufferPixelFormat colour) { - drawTextAtWithMargin(x, y, XRES_FRAMEBUFFER / 8, text, colour); + + drawTextAtWithMargin(x, y, (XRES_FRAMEBUFFER - 1), text, colour); } -void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int margin, +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, const uint8_t colour, char charToReplaceHifenWith) { - if (defaultFont == NULL) { defaultFont = loadBitmap("font.img"); } - size_t len = strlen(text); - int32_t dstX = (_x) * 8; - int32_t dstY = (_y) * 8; - size_t c; - uint32_t ascii; - float line; - float col; + if (defaultFont->uploadId == -1) { + submitBitmapToGPU(defaultFont); + } + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; float fontWidth = defaultFont->width; float fontHeight = defaultFont->height; float blockWidth = (8.0f / fontWidth) * 0.999f; float blockHeight = (8.0f / fontHeight) * 0.999f; + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + for (c = 0; c < len; ++c) { + uint8_t ascii; + float line; + float col; + char currentChar = text[c]; - if (currentChar == '-') { - currentChar = charToReplaceHifenWith; - } + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } - if (currentChar == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (_x) * 8; + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } - if (currentChar == ' ' || currentChar == '\r') { + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } ascii = currentChar - ' '; @@ -184,8 +210,3 @@ void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int margin, void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { } - -void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, - const FramebufferPixelFormat colour) { - drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); -} diff --git a/ee_frontend/base3d/src/gx/RendererRasterization.c b/ee_frontend/base3d/src/gx/RendererRasterization.c index 2339574b8..81ceac826 100644 --- a/ee_frontend/base3d/src/gx/RendererRasterization.c +++ b/ee_frontend/base3d/src/gx/RendererRasterization.c @@ -161,62 +161,87 @@ void drawRepeatBitmap( } } -void drawTextAt(const int _x, const int _y, const char *text, const FramebufferPixelFormat colour) { +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + +void drawTextAt(const int x, const int y, const char *text, const FramebufferPixelFormat colour) { + + drawTextAtWithMargin(x, y, (XRES_FRAMEBUFFER - 1), text, colour); +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, + const uint8_t colour, char charToReplaceHifenWith) { if (defaultFont == NULL) { defaultFont = loadBitmap("font.img"); } - if (defaultFont->nativeBuffer == NULL || defaultFont->uploadId == -1) { + if (defaultFont->uploadId == -1) { submitBitmapToGPU(defaultFont); } - bindTexture(defaultFont); size_t len = strlen(text); - int32_t dstX = (_x) * 8; - int32_t dstY = (_y) * 8; - size_t c; - uint32_t ascii; - float line; - float col; - + int32_t dstX = x * 8; + int32_t dstY = y * 8; float fontWidth = defaultFont->width; - float fontHeight = 32.0f; //defaultFont->height; + float fontHeight = defaultFont->height; float blockWidth = (8.0f / fontWidth) * 0.999f; float blockHeight = (8.0f / fontHeight) * 0.999f; + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + for (c = 0; c < len; ++c) { - if (text[c] == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (_x - 1) * 8; + uint8_t ascii; + float line; + float col; + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } - if (text[c] == ' ' || text[c] == '\r') { + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } - ascii = text[c] - ' '; + ascii = currentChar - ' '; line = (((float) ((ascii >> 5))) * blockHeight); col = (((ascii & 31)) * blockWidth); - drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, line + blockHeight); + drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, + line + blockHeight); dstX += 8; } -} - -void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { - -} - -void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, - const uint8_t colour, char charToReplaceHifenWith) { - drawTextAt(x, y, text, colour); -} - -void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { - drawTextAt(x, y, text, colour); } \ No newline at end of file From ec1a3a4e3339cf4076037cdee00942e492b7a415 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sat, 8 Jun 2024 14:46:17 +0100 Subject: [PATCH 12/48] [MY] Add text reflowing to TMS9918 and SDL 2 ports CPC got compilation fixed, but no text reflowing yet --- my_frontend/include/Renderer.h | 5 +- my_frontend/src/Crawler.c | 14 +++--- my_frontend/src/TMS9918.c | 80 +++++++++++++++++++++----------- my_frontend/src/UI.c | 10 ++-- my_frontend/src/cpc.c | 9 ++-- my_frontend/src/sdl2.c | 83 +++++++++++++++++++++------------- 6 files changed, 129 insertions(+), 72 deletions(-) diff --git a/my_frontend/include/Renderer.h b/my_frontend/include/Renderer.h index f19a15252..bad54b2ef 100644 --- a/my_frontend/include/Renderer.h +++ b/my_frontend/include/Renderer.h @@ -111,7 +111,10 @@ void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple); void flush3DBuffer(void); -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg); +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour); + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t colour, + char charToReplaceHifenWith); uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr); diff --git a/my_frontend/src/Crawler.c b/my_frontend/src/Crawler.c index 95cac34b2..7a8ca8094 100644 --- a/my_frontend/src/Crawler.c +++ b/my_frontend/src/Crawler.c @@ -44,8 +44,8 @@ void HUD_refresh(void) { (YRES_FRAMEBUFFER / 8) - 17, "Status"); - writeStrWithLimit(1, YRES_TEXT - 7, "In room:", 16, 2, 0); - writeStrWithLimit(1, YRES_TEXT - 4, "In hand:", 16, 2, 0); + drawTextAt(1, YRES_TEXT - 7, "In room:", 2); + drawTextAt(1, YRES_TEXT - 4, "In hand:", 2); struct Item *item; @@ -53,11 +53,11 @@ void HUD_refresh(void) { if (roomItem != NULL) { item = getItem(roomItem->item); if (item->active) { - writeStrWithLimit(1, YRES_TEXT - 6, "*", 16, 2, 0); + drawTextAt(1, YRES_TEXT - 6, "*", 2); } - writeStrWithLimit(2, YRES_TEXT - 6, item->name, (XRES_FRAMEBUFFER / 8) / 2, 2, 0); + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); } else { - writeStrWithLimit(2, YRES_TEXT - 6, "Nothing", 16, 2, 0); + drawTextAt(2, YRES_TEXT - 6, "Nothing", 2); } /* Display "In hand" item */ @@ -66,9 +66,9 @@ void HUD_refresh(void) { if (item->active) { drawTextAt(1, YRES_TEXT - 3, "*", 1); } - writeStrWithLimit(2, YRES_TEXT - 3, item->name, (XRES_FRAMEBUFFER / 8) / 2, 2, 0); + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 3, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); } else { - writeStrWithLimit(2, YRES_TEXT - 3, "Nothing", 16, 2, 0); + drawTextAt(2, YRES_TEXT - 3, "Nothing", 2); } } diff --git a/my_frontend/src/TMS9918.c b/my_frontend/src/TMS9918.c index 8d9e4a2a6..b0c5259bd 100644 --- a/my_frontend/src/TMS9918.c +++ b/my_frontend/src/TMS9918.c @@ -211,37 +211,63 @@ void shutdownGraphics(void) { } #endif -void writeStrWithLimit(uint8_t _x, uint8_t y, char *text, uint8_t limitX) { - uint8_t x = _x; - char *ptr = text; - char lastChar = 0xFF; - uint8_t *fontTop; - - while (*ptr && y < (YRES_FRAMEBUFFER / 8)) { - char cha = *ptr; - - if (x == limitX || cha == '\n') { - ++y; - x = _x; - if (cha == '\n') { - ++ptr; - continue; - } + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; } - if (cha >= 'a' && cha <= 'z') { - cha -= ('a' - 'A'); - } else if (cha > 'z') { - cha -= ('z' - 'a'); + if (dstY >= YRES_FRAMEBUFFER) { + return; } - if (cha != lastChar) { - fontTop = &font[((cha - 32) << 3)]; - lastChar = cha; + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } - vwrite(fontTop, map_pixel(x << 3, y << 3), 8); - ++x; - ++ptr; + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + vwrite(fontTop, map_pixel(dstX, dstY), 8); + dstX += 8; } } @@ -249,7 +275,7 @@ void clearTextScreen(void) { uint8_t c, d; for (c = 16; c < 24; ++c) { for (d = 0; d < 32; ++d) { - writeStrWithLimit(d, c, " ", 256 / 8); + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); } } } diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 124082094..4a82cb805 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -44,7 +44,11 @@ void drawGraphic(const uint8_t *graphic) { } void drawTextAt(uint8_t _x, uint8_t y, const char *text, uint8_t colour) { - writeStrWithLimit(_x, y, text, (XRES_FRAMEBUFFER / 8), colour, 0); + drawTextAtWithMargin(_x, y, (XRES_FRAMEBUFFER), text, colour); +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); } void showMessage(const char *message) { @@ -127,7 +131,7 @@ void drawWindow(uint8_t tx, uint8_t ty, uint8_t tw, uint8_t th, const char *titl for (c = 0; c < th; ++c) { for (d = 0; d < tw; ++d) { - writeStrWithLimit( tx + d, ty + c, " ", 320 / 8, 2, 0); + drawTextAtWithMarginWithFiltering( tx + d, ty + c, XRES_FRAMEBUFFER, " ", 2, ' '); } } @@ -181,7 +185,7 @@ void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, const char *content) { drawWindow(x, y, dx, dy, title); - writeStrWithLimit(x + 1, y + 2, content, x + dx - 1, 1, 0); + drawTextAtWithMargin(x + 1, y + 2, (x + dx - 1) * 8, content, 1); } enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t optionsCount, const enum ECommand cmd, enum EGameMenuState backState) { diff --git a/my_frontend/src/cpc.c b/my_frontend/src/cpc.c index 96b68799e..c8379cdcf 100644 --- a/my_frontend/src/cpc.c +++ b/my_frontend/src/cpc.c @@ -104,13 +104,16 @@ void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { } } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { +void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int limitX, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { (void)fg; - (void)bg; uint8_t len = strlen(text); const char *ptr = text; uint8_t c = 0; + uint8_t d = 0; uint8_t x = _x; + uint8_t y = _y; + uint8_t lastSpacePos = 0xFF; uint8_t *lineBase = (unsigned char *) 0xC000 + ((((y * 8)) / 8) * 80) + ((((y * 8)) & 7) * 2048); @@ -195,7 +198,7 @@ void clearTextScreen(void) { uint8_t c, d; for (c = 16; c < 24; ++c) { for (d = 0; d < 40; ++d) { - writeStrWithLimit(d, c, " ", 320 / 8, 2, 0); + drawTextAtWithMarginWithFiltering(d, c, 320, " ", 2, ' '); } } } diff --git a/my_frontend/src/sdl2.c b/my_frontend/src/sdl2.c index f9f2c599a..6afd80360 100644 --- a/my_frontend/src/sdl2.c +++ b/my_frontend/src/sdl2.c @@ -276,60 +276,81 @@ enum ECommand getInput(void) { return kCommandNone; } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { - uint8_t len = strlen(text); - char *ptr = text; - uint8_t c = 0; - uint8_t x = _x; - - for (; c < len && y < 64; ++c) { - - char cha = *ptr; - - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++ptr; + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; continue; } - if (cha >= 'a') { - if (cha <= 'z') { - cha = (cha - 'a') + 'A'; - } else { - cha -= ('z' - 'a'); + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } } } - uint8_t *fontTop = &font[((cha - 32) << 3)]; + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; - for (int d = 0; d < 8; ++d) { + for (int f = 0; f < 8; ++f) { int e; uint8_t chunk = *fontTop; for (e = 0; e < 8; ++e) { if (chunk & 1) { - realPut(8 * x + (7 - e), 8 * y + (d), 1, NULL); + realPut(dstX + (7 - e), dstY + (f), 1, NULL); } else { - realPut(8 * x + (7 - e), 8 * y + (d), 0, NULL); + realPut(dstX + (7 - e), dstY + (f), 0, NULL); } chunk = chunk >> 1; } - fontTop++; } - - ++x; - ++ptr; + dstX += 8; } } -void initHW(int, char **pString) { +void initHW(int argc, char **pString) { initKeyboardUI(); SDL_Init(SDL_INIT_EVERYTHING); From f5b1872b3f45dbca6e4c7e3e9c23ec416905edee Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sun, 9 Jun 2024 21:30:25 +0100 Subject: [PATCH 13/48] [MZ] Very basic integration of the state machine into the enhanced engine Not working: Mega Drive version Not even touched: Xcode 2 version --- common/src/HackingMinigameRules.c | 16 +- common/src/MainMenu.c | 5 + mz_frontend/CMakeLists.txt | 49 +- mz_frontend/MSDOSVersion/msdos.c | 251 -- mz_frontend/Makefile.286 | 38 +- mz_frontend/Makefile.atari | 38 +- mz_frontend/Makefile.ocs | 34 +- mz_frontend/Makefile.sm4 | 32 +- mz_frontend/SDLVersion/sdl2.c | 401 --- mz_frontend/Xcode2/Derelict-Info.plist | 26 + .../Derelict8.xcodeproj/project.pbxproj | 440 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Derelict8.xcscheme | 78 + .../Xcode2/English.lproj/InfoPlist.strings | Bin 0 -> 202 bytes .../English.lproj/MainMenu.nib/classes.nib | 8 + .../English.lproj/MainMenu.nib/info.nib | 24 + .../MainMenu.nib/keyedobjects.nib | Bin 0 -> 5261 bytes .../English.lproj/MainMenu~.nib/classes.nib | 8 + .../English.lproj/MainMenu~.nib/info.nib | 24 + .../MainMenu~.nib/keyedobjects.nib | Bin 0 -> 5226 bytes mz_frontend/Xcode2/GameView.h | 23 + mz_frontend/Xcode2/GameView.m | 247 ++ mz_frontend/Xcode2/GameWindow.h | 16 + mz_frontend/Xcode2/GameWindow.m | 39 + mz_frontend/Xcode2/Info.plist | 30 + mz_frontend/Xcode2/OSXRenderer.h | 13 + mz_frontend/Xcode2/OSXRenderer.m | 307 ++ mz_frontend/Xcode2/main.m | 20 + mz_frontend/data/Makefile | 9 +- mz_frontend/include/GamepadUI.h | 8 + mz_frontend/include/HackingMinigame.h | 9 + mz_frontend/include/KeyboardUI.h | 10 + mz_frontend/include/Renderer.h | 139 + mz_frontend/include/UI.h | 48 + mz_frontend/include/basepfs.h | 2482 +++++++++++++++++ mz_frontend/include/font.h | 49 + mz_frontend/include/map.h | 6 + mz_frontend/{ => src}/AmigaVersion/AmigaInt.h | 0 .../{ => src}/AmigaVersion/AmigaRenderer.c | 443 ++- mz_frontend/{ => src}/AtariVersion/AtariInt.h | 0 .../{ => src}/AtariVersion/AtariRenderer.c | 306 +- mz_frontend/src/Crawler.c | 273 ++ mz_frontend/{ => src}/Engine3D/Engine3D.c | 4 +- mz_frontend/{ => src}/Engine3D/Engine3D.h | 0 .../{ => src}/Engine3D/HackingMinigame.c | 0 .../{ => src}/Engine3D/HackingMinigame.h | 0 mz_frontend/{ => src}/Engine3D/basepfs.h | 0 mz_frontend/{ => src}/Engine3D/map.h | 0 mz_frontend/src/Events.c | 210 ++ mz_frontend/src/GameMenu.c | 22 + mz_frontend/src/GamepadUI.c | 41 + mz_frontend/src/HackingMinigame.c | 150 + mz_frontend/src/KeyboardUI.c | 46 + mz_frontend/src/MSDOSVersion/msdos.c | 350 +++ mz_frontend/src/Main.c | 64 + .../{ => src}/MegaDriveVersion/megadrive.c | 301 +- mz_frontend/src/RendererRasterizer.c | 726 +++++ mz_frontend/src/RendererScene.c | 153 + mz_frontend/src/RendererTesselation.c | 207 ++ mz_frontend/src/SDLVersion/sdl2.c | 586 ++++ mz_frontend/src/UI.c | 183 ++ 61 files changed, 7898 insertions(+), 1101 deletions(-) delete mode 100644 mz_frontend/MSDOSVersion/msdos.c delete mode 100644 mz_frontend/SDLVersion/sdl2.c create mode 100644 mz_frontend/Xcode2/Derelict-Info.plist create mode 100644 mz_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj create mode 100644 mz_frontend/Xcode2/Derelict8.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mz_frontend/Xcode2/Derelict8.xcodeproj/xcshareddata/xcschemes/Derelict8.xcscheme create mode 100644 mz_frontend/Xcode2/English.lproj/InfoPlist.strings create mode 100644 mz_frontend/Xcode2/English.lproj/MainMenu.nib/classes.nib create mode 100644 mz_frontend/Xcode2/English.lproj/MainMenu.nib/info.nib create mode 100644 mz_frontend/Xcode2/English.lproj/MainMenu.nib/keyedobjects.nib create mode 100644 mz_frontend/Xcode2/English.lproj/MainMenu~.nib/classes.nib create mode 100644 mz_frontend/Xcode2/English.lproj/MainMenu~.nib/info.nib create mode 100644 mz_frontend/Xcode2/English.lproj/MainMenu~.nib/keyedobjects.nib create mode 100644 mz_frontend/Xcode2/GameView.h create mode 100644 mz_frontend/Xcode2/GameView.m create mode 100644 mz_frontend/Xcode2/GameWindow.h create mode 100644 mz_frontend/Xcode2/GameWindow.m create mode 100644 mz_frontend/Xcode2/Info.plist create mode 100644 mz_frontend/Xcode2/OSXRenderer.h create mode 100644 mz_frontend/Xcode2/OSXRenderer.m create mode 100644 mz_frontend/Xcode2/main.m create mode 100644 mz_frontend/include/GamepadUI.h create mode 100644 mz_frontend/include/HackingMinigame.h create mode 100644 mz_frontend/include/KeyboardUI.h create mode 100644 mz_frontend/include/Renderer.h create mode 100644 mz_frontend/include/UI.h create mode 100644 mz_frontend/include/basepfs.h create mode 100644 mz_frontend/include/font.h create mode 100755 mz_frontend/include/map.h rename mz_frontend/{ => src}/AmigaVersion/AmigaInt.h (100%) rename mz_frontend/{ => src}/AmigaVersion/AmigaRenderer.c (58%) rename mz_frontend/{ => src}/AtariVersion/AtariInt.h (100%) rename mz_frontend/{ => src}/AtariVersion/AtariRenderer.c (50%) create mode 100644 mz_frontend/src/Crawler.c rename mz_frontend/{ => src}/Engine3D/Engine3D.c (99%) rename mz_frontend/{ => src}/Engine3D/Engine3D.h (100%) rename mz_frontend/{ => src}/Engine3D/HackingMinigame.c (100%) rename mz_frontend/{ => src}/Engine3D/HackingMinigame.h (100%) rename mz_frontend/{ => src}/Engine3D/basepfs.h (100%) rename mz_frontend/{ => src}/Engine3D/map.h (100%) create mode 100755 mz_frontend/src/Events.c create mode 100644 mz_frontend/src/GameMenu.c create mode 100644 mz_frontend/src/GamepadUI.c create mode 100644 mz_frontend/src/HackingMinigame.c create mode 100644 mz_frontend/src/KeyboardUI.c create mode 100644 mz_frontend/src/MSDOSVersion/msdos.c create mode 100644 mz_frontend/src/Main.c rename mz_frontend/{ => src}/MegaDriveVersion/megadrive.c (60%) create mode 100755 mz_frontend/src/RendererRasterizer.c create mode 100755 mz_frontend/src/RendererScene.c create mode 100755 mz_frontend/src/RendererTesselation.c create mode 100644 mz_frontend/src/SDLVersion/sdl2.c create mode 100644 mz_frontend/src/UI.c diff --git a/common/src/HackingMinigameRules.c b/common/src/HackingMinigameRules.c index d00eeb90a..9089a0481 100644 --- a/common/src/HackingMinigameRules.c +++ b/common/src/HackingMinigameRules.c @@ -1,13 +1,17 @@ /* Created by Daniel Monteiro on 2023-11-04. */ -#ifdef WIN32 -#include "Win32Int.h" -#else - -#include - +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; #endif +#endif + #include #include "Common.h" diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index 8c7405314..8d17bed6c 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -1,7 +1,12 @@ #ifdef WIN32 #include "Win32Int.h" #else +#ifndef SMD #include +#else +#include +typedef unsigned long size_t; +#endif #endif #include "Common.h" diff --git a/mz_frontend/CMakeLists.txt b/mz_frontend/CMakeLists.txt index ac0998286..fe70eda13 100644 --- a/mz_frontend/CMakeLists.txt +++ b/mz_frontend/CMakeLists.txt @@ -1,31 +1,46 @@ cmake_minimum_required(VERSION 3.11) project(derelict16) -set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD 99) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake-sdl2") -include_directories( src ../core/src ../core/include ../common/include Engine3D - ${SDL2_INCLUDE_DIR} -) +include_directories(src ../core/src ../core/include include ../common/include + ${SDL2_INCLUDE_DIR} + ) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLSW -DRES128X128 -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") find_package(SDL2 REQUIRED) add_executable(derelict16 - Engine3D/Engine3D.c - Engine3D/HackingMinigame.c - SDLVersion/sdl2.c - ../core/src/Derelict.c - ../core/src/Core.c - ../common/src/Common.c - ../common/src/FixP.c - ../common/src/Globals.c - ../common/src/MapWithCharKey.c - ../common/src/CTile3DProperties.c - ../common/src/PackedFileReader.c - ) + src/RendererTesselation.c + src/Main.c + ../core/src/Derelict.c + ../core/src/Core.c + ../common/src/PackedFileReader.c + ../common/src/NullMusic.c + ../common/src/Common.c + ../common/src/Engine.c + ../common/src/CTile3DProperties.c + ../common/src/MapWithCharKey.c + src/HackingMinigame.c + include/HackingMinigame.h + src/SDLVersion/sdl2.c + src/UI.c + src/Events.c + src/RendererRasterizer.c + src/RendererTesselation.c + src/RendererScene.c + src/KeyboardUI.c + src/Crawler.c + src/GameMenu.c + ../common/src/HelpScreen.c + ../common/src/MainMenu.c + ../common/src/CreditsScreen.c + ../common/src/HackingMinigameRules.c + ../common/include/HackingMinigameRules.h + ) include(FindPkgConfig) diff --git a/mz_frontend/MSDOSVersion/msdos.c b/mz_frontend/MSDOSVersion/msdos.c deleted file mode 100644 index 0ad728cee..000000000 --- a/mz_frontend/MSDOSVersion/msdos.c +++ /dev/null @@ -1,251 +0,0 @@ -#include -#include -#include - -#include "Core.h" -#include "Derelict.h" -#include "Engine3D.h" - -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; - -void graphicsFlush(); - -void nextItemInHand(); - -void useItemInHand(); - -void nextItemInRoom(); - -void interactWithItemInRoom(); - -void pickOrDrop(); - -void dropItem(); - -void pickItem(); - -void clearGraphics(); - -unsigned char imageBuffer[128 * 128]; - -void shutdownGraphics(void) { -} - -void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { - - if (x0 < 0) { - return; - } - - int16_t y; - int16_t _y0 = y0; - int16_t _y1 = y1; - - if (y0 > y1) { - _y0 = y1; - _y1 = y0; - } - - if (_y0 < 0) { - _y0 = 0; - } - - if (_y1 >= 128) { - _y1 = 127; - } - - for (y = _y0; y <= _y1; ++y) { - imageBuffer[(128 * y) + x0] = colour; - } -} - - -void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { - if (y < 0) { - return; - } - - int16_t _x0 = x0; - int16_t _x1 = x1; - - if (x0 > x1) { - _x0 = x1; - _x1 = x0; - } - - if (_x0 < 0) { - _x0 = 0; - } - - if (_x1 >= 128) { - _x1 = 127; - } - - for (int x = _x0; x <= _x1; ++x) { - imageBuffer[(128 * y) + x] = colour; - } -} - -void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - if (x < 0) { - x = 0; - } - - if (x >= 128) { - x = 127; - } - - if (y < 0) { - y = 0; - } - - if (y >= 128) { - y = 127; - } - - imageBuffer[(128 * y) + x] = colour; -} - -void realPut(int x, int y, uint16_t value) { - - int pixel = value; - int px = x; - int py = y; - - asm volatile ("movb $0x0C, %%ah\n\t" - "movb %0, %%al\n\t" - "movb $0x0, %%bh\n\t" - "movw %1, %%cx\n\t" - "movw %2, %%dx\n\t" - "int $0x10\n\t" - : - :"rm" (pixel), "rm" (px), "rm" (py) - : "ax", "bx", "cx", "dx" - ); -} - -void clearGraphics(void) { - memset(imageBuffer, 0, 128 * 128); -} - -void init(void) { - - asm volatile("movb $0x0, %%ah\n\t" - "movb $0x0D, %%al\n\t" - "int $0x10\n\t" - : - : - : "ax" - ); -} - -void clearScreen(void) { - init(); -} - -uint8_t getKey(void) { - unsigned char toReturn = 255; - - - asm volatile ("movb $0x00, %%ah\n\t" - "movb $0x00, %%al\n\t" - "int $0x16 \n\t" - "movb %%al, %0\n\t" - : "=rm"(toReturn) - : - : "ax" - ); - - asm volatile("movb $0x0C, %%ah\n\t" - "movb $0x00, %%al\n\t" - "int $0x21\n\t" - : - : - : "ax" - ); - - return toReturn; -} - -void writeStrWithLimit(int _x, int y, const char *text, int limitX) { - - uint16_t len = strlen(text); - const char *ptr = text; - uint16_t c = 0; - uint16_t chary = 0; - uint16_t x = _x; - - for (; c < len && y < 25; ++c) { - - char cha = *ptr; - - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++ptr; - continue; - } else { - ++x; - } - - asm volatile ( - "movb $0x02, %%ah\n\t" - "movb %0, %%dl\n\t" - "movb %1, %%dh\n\t" - "movb $0x0, %%bh\n\t" - "int $0x10\n\t" - "movb $0x09, %%ah\n" - "movb %2, %%al\n" - "movw $0x01, %%cx\n" - "movb $0x0, %%bh\n" - "movb $0x03, %%bl\n" - "int $0x10\n\t" - : - : "rm" (x), "rm" (y), "rm"(cha) - : "ax", "bx", "cx", "dx" - ); - - ++ptr; - } -} - -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 40); -} - -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} - -void graphicsFlush(void) { - uint8_t *bufferPtr = &imageBuffer[0]; - - for (int y = 0; y < 128; ++y) { - for (int x = 0; x < 128; ++x) { - uint16_t index = *bufferPtr; - - realPut(16 + x, 36 + y, index); - bufferPtr++; - } - } -} - -void showMessage(const char *message) { - writeStr(1, 1, message, 2, 0); -} - -void titleScreen(void) { -} - -void HUD_initialPaint(void) { -} - -void sleepForMS(uint32_t ms) { - usleep(ms); -} - -void HUD_refresh(void) { -} diff --git a/mz_frontend/Makefile.286 b/mz_frontend/Makefile.286 index b53379aaf..46775826c 100644 --- a/mz_frontend/Makefile.286 +++ b/mz_frontend/Makefile.286 @@ -1,19 +1,37 @@ CFLAGS = -fomit-frame-pointer -fno-exceptions -ffast-math \ - -I../core/include -I../common/include -IEngine3D \ - -DMSDOS -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DUSE_FILLED_POLYS \ - -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE + -Iinclude -I../core/include -I../common/include -IEngine3D \ + -DMSDOS -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ + -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE \ + -Iinclude -I../common/include -I../core/include -I../common/include -IEngine3D -I../core/include \ + -I../common/include -I../core/include -Imenu/include -ISoundSystem -I../core/include -IEngine3D CC = i386-pc-msdosdjgpp-gcc -OBJS = Engine3D/Engine3D.o MSDOSVersion/msdos.o \ - ../core/src/Core.o \ +OBJS = \ + src/MSDOSVersion/msdos.o \ + src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/Main.o \ ../core/src/Derelict.o \ + ../core/src/Core.o \ ../common/src/PackedFileReader.o \ + ../common/src/NullMusic.o \ + ../common/src/Common.o \ + ../common/src/Engine.o \ ../common/src/CTile3DProperties.o \ ../common/src/MapWithCharKey.o \ - ../common/src/FixP.o \ - ../common/src/Globals.o \ - ../common/src/Common.o + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/KeyboardUI.o \ + src/Crawler.o \ + src/GameMenu.o TARGET = derelict.exe @@ -23,7 +41,7 @@ $(TARGET): $(OBJS) all: $(TARGET) clean: - rm -f Engine3D/*.o - rm -f MSDOSVersion/*.o + rm -f src/*.o + rm -f src/MSDOSVersion/*.o rm -f ../core/src/*.o rm -f ../common/src/*.o diff --git a/mz_frontend/Makefile.atari b/mz_frontend/Makefile.atari index 5d3c8c500..496b4e857 100644 --- a/mz_frontend/Makefile.atari +++ b/mz_frontend/Makefile.atari @@ -2,24 +2,38 @@ CXX = m68k-atari-mint-g++ CC = m68k-atari-mint-gcc STRIP=m68k-atari-mint-strip CFLAGS = -std=c99 -c -m68000 -s -fexpensive-optimizations -fomit-frame-pointer -Ofast \ - -DATARIST -DCLI_BUILD -DAGA5BPP -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE \ + -DATARIST -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ - -I../common/include -I../core/include -Imenu/include -ISoundSystem -IAtariVersion -I../core/include -IEngine3D \ - -I../common/include + -Iinclude -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AtariVersion \ + -I../common/include -I../core/include -Imenu/include -ISoundSystem -IAtariVersion -I../core/include -IEngine3D MENU_TARGET=game.prg MENU_OBJ= \ - Engine3D/Engine3D.o \ - AtariVersion/AtariRenderer.o \ - ../core/src/Core.o \ + src/AtariVersion/AtariRenderer.o \ + src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/Main.o \ ../core/src/Derelict.o \ - ../common/src/FixP.o \ - ../common/src/Globals.o \ + ../core/src/Core.o \ + ../common/src/PackedFileReader.o \ + ../common/src/NullMusic.o \ + ../common/src/Common.o \ + ../common/src/Engine.o \ ../common/src/CTile3DProperties.o \ ../common/src/MapWithCharKey.o \ - ../common/src/PackedFileReader.o \ - ../common/src/Common.o + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/KeyboardUI.o \ + src/Crawler.o \ + src/GameMenu.o $(MENU_TARGET): $(MENU_OBJ) $(CC) -o$(MENU_TARGET) $(MENU_OBJ) $(LDFLAGS) @@ -28,7 +42,7 @@ $(MENU_TARGET): $(MENU_OBJ) all: $(MENU_TARGET) clean: - rm -f Engine3D/*.o - rm -f AtariVersion/*.o + rm -f src/*.o + rm -f src/AtariVersion/*.o rm -f ../core/src/*.o rm -f ../common/src/*.o diff --git a/mz_frontend/Makefile.ocs b/mz_frontend/Makefile.ocs index a6686cd6a..2cfaf5cdc 100644 --- a/mz_frontend/Makefile.ocs +++ b/mz_frontend/Makefile.ocs @@ -4,8 +4,10 @@ STRIP=m68k-amigaos-strip AS = vasmm68k_mot CFLAGS = \ -c -m68000 -s -fexpensive-optimizations -fomit-frame-pointer -ffast-math -Ofast \ - -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include \ + -Isrc -I../core/src -I../core/include -Iinclude -I../common/include \ + -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AmigaVersion \ -Imenu/include -ISoundSystem \ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ -DCLI_BUILD -DINCLUDE_ITEM_DESCRIPTIONS -DAGA5BPP -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR \ -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DUSE_FILLED_POLYS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE @@ -16,15 +18,29 @@ ASFLAGS = -phxass -Fhunk -m68000 -chklabels -no-fpu -wfail -I/opt/amiga/m68k-ami MENU_TARGET=gameocs MENU_OBJ= \ - Engine3D/Engine3D.o \ - AmigaVersion/AmigaRenderer.o \ - ../core/src/Core.o \ + src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/AmigaVersion/AmigaRenderer.o \ + src/Main.o \ ../core/src/Derelict.o \ - ../common/src/MapWithCharKey.o \ + ../core/src/Core.o \ ../common/src/PackedFileReader.o \ - ../common/src/CTile3DProperties.o \ + ../common/src/NullMusic.o \ ../common/src/Common.o \ - ../common/src/Globals.o \ + ../common/src/Engine.o \ + ../common/src/CTile3DProperties.o \ + ../common/src/MapWithCharKey.o \ + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/KeyboardUI.o \ + src/Crawler.o \ + src/GameMenu.o \ ../common/src/c2p1x1_4_c5_bm.o $(MENU_TARGET): $(MENU_OBJ) @@ -39,7 +55,7 @@ adf: $(MENU_TARGET) xdftool Derelict3D_ocs.adf list clean: - rm -f Engine3D/*.o - rm -f AmigaVersion/*.o + rm -f src/*.o + rm -f src/AmigaVersion/*.o rm -f ../core/src/*.o rm -f ../common/src/*.o diff --git a/mz_frontend/Makefile.sm4 b/mz_frontend/Makefile.sm4 index 83fd8bb2f..230b51a2e 100644 --- a/mz_frontend/Makefile.sm4 +++ b/mz_frontend/Makefile.sm4 @@ -46,8 +46,13 @@ LIBS += -u __modsi3 -u __divsi3 -u __mulsi3 -u __umodsi3 -u __udivsi3 -u __um # Any C or C++ standard should be fine here as long as GCC support it CCFLAGS = -m68000 -Wall -Wextra -std=c99 -ffreestanding -fcommon -Ofast -Wno-unused-parameter -Wno-char-subscripts \ - -DSMD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR\ - -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE -DGAMEPAD -DUSE_FILLED_POLYS -DRLE_COMPRESSED_MAPS + -DSMD -fomit-frame-pointer -fno-exceptions -ffast-math \ + -Iinclude -I../core/include -I../common/include -IEngine3D \ + -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ + -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ + -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE \ + -Iinclude -I../common/include -I../core/include -I../common/include -IEngine3D -I../core/include \ + -I../common/include -I../core/include -Imenu/include -ISoundSystem -I../core/include -IEngine3D # Extra options set by debug or release target ASFLAGS = -m68000 --register-prefix-optional @@ -59,7 +64,28 @@ RESS = $(wildcard res/*.res) SS = $(wildcard src/*.s) OBJS = $(RESS:.res=.o) -OBJS += Engine3D/Engine3D.o ../common/src/FixP.o ../common/src/Globals.o ../common/src/CTile3DProperties.o ../common/src/MapWithCharKey.o MegaDriveVersion/megadrive.o Engine3D/HackingMinigame.o ../core/src/Core.o ../core/src/Derelict.o ../common/src/Common.o ../common/src/ArrayPackedFileReader.o +OBJS += src/MegaDriveVersion/megadrive.o src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/Main.o \ + ../core/src/Derelict.o \ + ../core/src/Core.o \ + ../common/src/ArrayPackedFileReader.o \ + ../common/src/NullMusic.o \ + ../common/src/Common.o \ + ../common/src/Engine.o \ + ../common/src/CTile3DProperties.o \ + ../common/src/MapWithCharKey.o \ + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/GamepadUI.o \ + src/Crawler.o \ + src/GameMenu.o OBJS += $(SS:.s=.o) ASMO = $(RESS:.res=.o) diff --git a/mz_frontend/SDLVersion/sdl2.c b/mz_frontend/SDLVersion/sdl2.c deleted file mode 100644 index ba551038e..000000000 --- a/mz_frontend/SDLVersion/sdl2.c +++ /dev/null @@ -1,401 +0,0 @@ -#include -#include -#include -#include -#include - - -#include "SDL.h" -#include "Engine3D.h" -#include "Common.h" -#include "Engine.h" - -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; -SDL_Window *window; -SDL_Renderer *renderer; - -#define TRANSPARENCY_COLOR 17 - -uint8_t mBufferedCommand; -uint32_t palette[16]; -uint8_t framebuffer[256 * 160]; - -void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - if (x < 0) { - x = 0; - } - - if (x >= 128) { - x = 127; - } - - if (y < 0) { - y = 0; - } - - if (y >= 128) { - y = 127; - } - - - framebuffer[(256 * y) + x] = colour; -#ifdef PUTAFLIP - graphicsFlush(); - SDL_Delay(100); -#endif -} - -void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { - if (y < 0) { - return; - } - - int16_t _x0 = x0; - int16_t _x1 = x1; - - if (x0 > x1) { - _x0 = x1; - _x1 = x0; - } - - if (_x0 < 0) { - _x0 = 0; - } - - if (_x1 >= 128) { - _x1 = 127; - } - - for (int x = _x0; x <= _x1; ++x) { - framebuffer[(256 * y) + x] = colour; - } -} - -void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { - - if (x0 < 0 || x0 > XRESMINUSONE) { - return; - } - - int16_t y; - int16_t _y0 = y0; - int16_t _y1 = y1; - - if (y0 > y1) { - _y0 = y1; - _y1 = y0; - } - - if (_y0 < 0) { - _y0 = 0; - } - - if (_y1 >= 128) { - _y1 = 127; - } - - for (y = _y0; y <= _y1; ++y) { - framebuffer[(256 * y) + x0] = colour; - } -} - -void shutdownGraphics(void) { - SDL_Quit(); -} - -void showMessage(const char *mesg) { - puts(mesg); -} - -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} - -void clearGraphics(void) { - memset(framebuffer, 0, 256 * 160); -} - -void writeStr(int16_t nColumn, int16_t nLine, const char *str, uint16_t fg, uint16_t bg) { - puts(str); -} - -void printSituation(void) { - struct ObjectNode *playerObjects = getPlayerItems(); - puts("---------------"); - puts("\nPlayer items:"); - - while (playerObjects != NULL) { - struct Item *item = getItem(playerObjects->item); - - printf("%c%c%s\n", (playerObjects == focusedItem) ? '>' : ' ', item->active ? '*' : '-', item->name); - - playerObjects = playerObjects->next; - } - - puts("\nItems in room:"); - - struct ObjectNode *roomItems = getRoom(getPlayerRoom())->itemsPresent->next; - - while (roomItems != NULL) { - struct Item *item = getItem(roomItems->item); - - printf("%c%c%s\n", (roomItems == roomItem) ? '>' : ' ', item->active ? '*' : '-', item->name); - - roomItems = roomItems->next; - } -} - -void dropItem(); - -void pickItem(); - -void clearScreen(void) {} - - -uint8_t getKey(void) { - SDL_Event event; - - mBufferedCommand = '.'; - - while (SDL_PollEvent(&event)) { - - if (event.type == SDL_QUIT) { - - mBufferedCommand = 'q'; - } - - if (event.type == SDL_KEYUP) { - - switch (event.key.keysym.sym) { - case SDLK_RETURN: - case SDLK_z: - mBufferedCommand = 'a'; - break; - - case SDLK_ESCAPE: - case SDLK_q: - mBufferedCommand = 'l'; - break; - - case SDLK_SPACE: - printSituation(); - break; - - case SDLK_KP_7: - case SDLK_7: - mBufferedCommand = '7'; - break; - - case SDLK_KP_8: - case SDLK_8: - mBufferedCommand = '8'; - break; - - case SDLK_KP_4: - case SDLK_4: - mBufferedCommand = '4'; - break; - - case SDLK_KP_5: - case SDLK_5: - mBufferedCommand = '5'; - break; - - case SDLK_KP_9: - case SDLK_9: - mBufferedCommand = '9'; - break; - - case SDLK_KP_6: - case SDLK_6: - mBufferedCommand = '6'; - break; - - case SDLK_s: - break; - case SDLK_d: - break; - case SDLK_v: - break; - case SDLK_b: - break; - case SDLK_j: - break; - case SDLK_k: - break; - case SDLK_x: - mBufferedCommand = 'd'; - break; - case SDLK_c: - break; - case SDLK_e: - break; - - case SDLK_LEFT: - mBufferedCommand = 'q'; - break; - case SDLK_RIGHT: - mBufferedCommand = 'e'; - break; - case SDLK_UP: - mBufferedCommand = 'w'; - break; - case SDLK_DOWN: - mBufferedCommand = 's'; - break; - - default: - return '.'; - } - } - } - - return mBufferedCommand; -} - -void sleepForMS(uint32_t unused) { -} - -void init(void) { - int r, g, b; - mBufferedCommand = '.'; - SDL_Init(SDL_INIT_EVERYTHING); - SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); - memset(framebuffer, 0, 256 * 160); - window = - SDL_CreateWindow("Derelict 16-bits SDL2 test", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, 512, 320, SDL_WINDOW_SHOWN); - - renderer = SDL_CreateRenderer(window, -1, 0); - - palette[0] = 0x000000; - palette[1] = 0x0000AA; - palette[2] = 0x00AA00; - palette[3] = 0x00AAAA; - palette[4] = 0xAA0000; - palette[5] = 0xAA00AA; - palette[6] = 0xAA5500; - palette[7] = 0xAAAAAA; - palette[8] = 0x555555; - palette[9] = 0x5555FF; - palette[10] = 0x55FF55; - palette[11] = 0x55FFFF; - palette[12] = 0xFF5555; - palette[13] = 0xFF55FF; - palette[14] = 0xFFFF55; - palette[15] = 0xFFFFFF; - -#ifdef __EMSCRIPTEN__ - enterFullScreenMode (); -#endif -} - - -void titleScreen(void) { - int keepGoing = 1; - clearGraphics(); - - writeStr(1, 1, "Space Mare Imperium:", 2, 0); - writeStr(1, 2, " Derelict", 2, 0); - writeStr(1, 4, "by Daniel Monteiro", 2, 0); - writeStr(1, 6, " Press B button ", 2, 0); - writeStr(1, 7, " to start", 2, 0); - - while (keepGoing) { - if (getKey() != '.') { - keepGoing = 0; - } - } - - clearScreen(); -} - -void flipRenderer(void) { - SDL_Rect rect; - uint32_t pixel; - int x, y; - - rect.x = 0; - rect.y = 0; - rect.w = 512; - rect.h = 320; - - SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); - SDL_RenderFillRect(renderer, &rect); - - for (y = 0; y < 128; ++y) { - for (x = 0; x < 128; ++x) { - rect.x = 2 * x; - rect.y = 2 * y; - rect.w = 2; - rect.h = 2; - int index = framebuffer[(256 * y) + x]; - assert( !(index < 0 || index >= 16)); - - pixel = palette[index]; - - int r = (pixel & 0x00FF0000) >> 16; - int g = ((pixel & 0x0000FF00) >> 8); - int b = ((pixel & 0x000000FF)); - - SDL_SetRenderDrawColor(renderer, r, - g, - b, 255); - SDL_RenderFillRect(renderer, &rect); - } - } - - SDL_RenderPresent(renderer); - -#ifndef __EMSCRIPTEN__ - SDL_Delay(1000 / 60); -#endif -} - -void graphicsFlush(void) { - flipRenderer(); -} - - -void HUD_initialPaint(void) { -} - -void HUD_refresh(void) { - - - for (uint16_t i = 0; i < 6; ++i) { - writeStr(16, 13 + i, (i == cursorPosition) ? ">" : " ", 2, 0); - } - - - writeStr(16, 5, "Object in hand:", 2, 0); - if (focusedItem != NULL) { - struct Item *item = getItem(focusedItem->item); - - - if (item->active) { - writeStr(16, 6, "*", 2, 0); - } - - writeStr(17, 6, item->name, 2, 0); - } else { - writeStr(16, 6, "Nothing", 2, 0); - } - - writeStr(16, 8, "Object in room:", 2, 0); - - if (roomItem != NULL) { - struct Item *item = getItem(roomItem->item); - - - if (item->active) { - writeStr(16, 9, "*", 2, 0); - } - - writeStr(17, 9, item->name, 2, 0); - } else { - writeStr(16, 9, "Nothing", 2, 0); - } -} - - diff --git a/mz_frontend/Xcode2/Derelict-Info.plist b/mz_frontend/Xcode2/Derelict-Info.plist new file mode 100644 index 000000000..d9a1182ed --- /dev/null +++ b/mz_frontend/Xcode2/Derelict-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + helmet + CFBundleIdentifier + pt.b13h.Derelict + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mz_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj new file mode 100644 index 000000000..86c313880 --- /dev/null +++ b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj @@ -0,0 +1,440 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + F13B51A22AA5F241006BE693 /* HackingMinigame.c in Sources */ = {isa = PBXBuildFile; fileRef = F13B519E2AA5F241006BE693 /* HackingMinigame.c */; }; + F13B51A32AA5F241006BE693 /* KeyboardUI.c in Sources */ = {isa = PBXBuildFile; fileRef = F13B519F2AA5F241006BE693 /* KeyboardUI.c */; }; + F13B51AD2AA613D4006BE693 /* Common.c in Sources */ = {isa = PBXBuildFile; fileRef = F13B51AC2AA613D4006BE693 /* Common.c */; }; + F14601D92AC82536007A09B5 /* UI.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D42AC82536007A09B5 /* UI.c */; }; + F14601DA2AC82536007A09B5 /* RendererRasterizer.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D52AC82536007A09B5 /* RendererRasterizer.c */; }; + F14601DB2AC82536007A09B5 /* RendererScene.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D62AC82536007A09B5 /* RendererScene.c */; }; + F14601DC2AC82536007A09B5 /* RendererTesselation.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D72AC82536007A09B5 /* RendererTesselation.c */; }; + F14601DD2AC82536007A09B5 /* Events.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D82AC82536007A09B5 /* Events.c */; }; + F149B82A263CB11700A3F597 /* Core.c in Sources */ = {isa = PBXBuildFile; fileRef = F149B829263CB11700A3F597 /* Core.c */; }; + F17ABEC62BFBDEEB00B69054 /* CreditsScreen.c in Sources */ = {isa = PBXBuildFile; fileRef = F17ABEC32BFBDEEB00B69054 /* CreditsScreen.c */; }; + F17ABEC72BFBDEEB00B69054 /* HelpScreen.c in Sources */ = {isa = PBXBuildFile; fileRef = F17ABEC42BFBDEEB00B69054 /* HelpScreen.c */; }; + F17ABEC82BFBDEEB00B69054 /* MainMenu.c in Sources */ = {isa = PBXBuildFile; fileRef = F17ABEC52BFBDEEB00B69054 /* MainMenu.c */; }; + F194EAD62610B51400E292ED /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; + F1CA76BB2610A8E200FD1E04 /* GameView.m in Sources */ = {isa = PBXBuildFile; fileRef = F1277A26236DE6DD00478B2C /* GameView.m */; }; + F1CA76BC2610A8ED00FD1E04 /* OSXRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = F1277A28236DE6DD00478B2C /* OSXRenderer.m */; }; + F1CA76BD2610A8EE00FD1E04 /* GameWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = F1B679BD24E4AAE400FCEF8E /* GameWindow.m */; }; + F1CA76C22610A91800FD1E04 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; + F1CA76D02610A93600FD1E04 /* Derelict.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D5B5D22531D2BF0094ED78 /* Derelict.c */; }; + F1CA76D62610A93B00FD1E04 /* Parser.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D5B5D32531D2BF0094ED78 /* Parser.c */; }; + F1CA76DD2610A98800FD1E04 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D1107310486CEB800E47090 /* Info.plist */; }; + F1CA76F22610A99900FD1E04 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + F1CA774E2610AFA000FD1E04 /* Derelict-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F1CA76B52610A8BF00FD1E04 /* Derelict-Info.plist */; }; + F1D4FFCD2AF8D85900F8A437 /* Engine.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFCC2AF8D85900F8A437 /* Engine.c */; }; + F1D4FFD62AF8D8C000F8A437 /* Crawler.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFD02AF8D8C000F8A437 /* Crawler.c */; }; + F1D4FFD82AF8D8C000F8A437 /* GameMenu.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFD22AF8D8C000F8A437 /* GameMenu.c */; }; + F1D4FFDD2AF8D8E000F8A437 /* HackingMinigameRules.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFDC2AF8D8E000F8A437 /* HackingMinigameRules.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + F1277A25236DE6DD00478B2C /* GameView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GameView.h; sourceTree = ""; }; + F1277A26236DE6DD00478B2C /* GameView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = GameView.m; sourceTree = ""; }; + F1277A27236DE6DD00478B2C /* OSXRenderer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OSXRenderer.h; sourceTree = ""; }; + F1277A28236DE6DD00478B2C /* OSXRenderer.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OSXRenderer.m; sourceTree = ""; }; + F13B519E2AA5F241006BE693 /* HackingMinigame.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = HackingMinigame.c; path = ../src/HackingMinigame.c; sourceTree = ""; }; + F13B519F2AA5F241006BE693 /* KeyboardUI.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = KeyboardUI.c; path = ../src/KeyboardUI.c; sourceTree = ""; }; + F13B51A62AA5F255006BE693 /* font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = font.h; path = ../include/font.h; sourceTree = ""; }; + F13B51A72AA5F255006BE693 /* HackingMinigame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HackingMinigame.h; path = ../include/HackingMinigame.h; sourceTree = ""; }; + F13B51A82AA5F255006BE693 /* KeyboardUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = KeyboardUI.h; path = ../include/KeyboardUI.h; sourceTree = ""; }; + F13B51A92AA5F255006BE693 /* map-data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "map-data.h"; path = "../include/map-data.h"; sourceTree = ""; }; + F13B51AA2AA5F255006BE693 /* map.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = map.h; path = ../include/map.h; sourceTree = ""; }; + F13B51AC2AA613D4006BE693 /* Common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Common.c; path = ../../common/src/Common.c; sourceTree = ""; }; + F14601D42AC82536007A09B5 /* UI.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = UI.c; path = ../src/UI.c; sourceTree = SOURCE_ROOT; }; + F14601D52AC82536007A09B5 /* RendererRasterizer.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = RendererRasterizer.c; path = ../src/RendererRasterizer.c; sourceTree = SOURCE_ROOT; }; + F14601D62AC82536007A09B5 /* RendererScene.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = RendererScene.c; path = ../src/RendererScene.c; sourceTree = SOURCE_ROOT; }; + F14601D72AC82536007A09B5 /* RendererTesselation.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = RendererTesselation.c; path = ../src/RendererTesselation.c; sourceTree = SOURCE_ROOT; }; + F14601D82AC82536007A09B5 /* Events.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = Events.c; path = ../src/Events.c; sourceTree = SOURCE_ROOT; }; + F14601E72AC82B5E007A09B5 /* Renderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Renderer.h; path = ../include/Renderer.h; sourceTree = SOURCE_ROOT; }; + F14601E82AC82B69007A09B5 /* UI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UI.h; path = ../include/UI.h; sourceTree = SOURCE_ROOT; }; + F149B829263CB11700A3F597 /* Core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Core.c; path = ../../core/src/Core.c; sourceTree = ""; }; + F149B82B263CB12B00A3F597 /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Core.h; path = ../../core/include/Core.h; sourceTree = ""; }; + F17ABEC32BFBDEEB00B69054 /* CreditsScreen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = CreditsScreen.c; path = ../../common/src/CreditsScreen.c; sourceTree = ""; }; + F17ABEC42BFBDEEB00B69054 /* HelpScreen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = HelpScreen.c; path = ../../common/src/HelpScreen.c; sourceTree = ""; }; + F17ABEC52BFBDEEB00B69054 /* MainMenu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = MainMenu.c; path = ../../common/src/MainMenu.c; sourceTree = ""; }; + F1B679BC24E4AAE400FCEF8E /* GameWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameWindow.h; sourceTree = ""; }; + F1B679BD24E4AAE400FCEF8E /* GameWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GameWindow.m; sourceTree = ""; }; + F1B8CB2F27CFCFE700C06E6F /* Common.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Common.h; path = ../../common/include/Common.h; sourceTree = SOURCE_ROOT; }; + F1BD0D30236EF697002329C6 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; + F1BD0D31236EF697002329C6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = ""; }; + F1CA76B32610A8BF00FD1E04 /* Derelict.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Derelict.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F1CA76B52610A8BF00FD1E04 /* Derelict-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Derelict-Info.plist"; sourceTree = ""; }; + F1CD08C62450E41C00D4794D /* base.pfs */ = {isa = PBXFileReference; lastKnownFileType = file; name = base.pfs; path = ../base.pfs; sourceTree = SOURCE_ROOT; }; + F1D4FFCA2AF8D82800F8A437 /* Engine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Engine.h; path = ../../common/include/Engine.h; sourceTree = ""; }; + F1D4FFCB2AF8D83600F8A437 /* HackingMinigameRules.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HackingMinigameRules.h; path = ../../common/include/HackingMinigameRules.h; sourceTree = ""; }; + F1D4FFCC2AF8D85900F8A437 /* Engine.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Engine.c; path = ../../common/src/Engine.c; sourceTree = ""; }; + F1D4FFCE2AF8D87600F8A437 /* Enums.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Enums.h; path = ../../common/include/Enums.h; sourceTree = ""; }; + F1D4FFCF2AF8D88800F8A437 /* SoundSystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SoundSystem.h; path = ../../common/include/SoundSystem.h; sourceTree = ""; }; + F1D4FFD02AF8D8C000F8A437 /* Crawler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Crawler.c; path = ../src/Crawler.c; sourceTree = ""; }; + F1D4FFD22AF8D8C000F8A437 /* GameMenu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = GameMenu.c; path = ../src/GameMenu.c; sourceTree = ""; }; + F1D4FFDC2AF8D8E000F8A437 /* HackingMinigameRules.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = HackingMinigameRules.c; path = ../../common/src/HackingMinigameRules.c; sourceTree = ""; }; + F1D5B5D22531D2BF0094ED78 /* Derelict.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Derelict.c; path = ../../core/src/Derelict.c; sourceTree = ""; }; + F1D5B5D32531D2BF0094ED78 /* Parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Parser.c; path = ../../core/src/Parser.c; sourceTree = ""; }; + F1D5B5D62531D2C90094ED78 /* Parser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Parser.h; path = ../../core/include/Parser.h; sourceTree = ""; }; + F1D5B5D72531D2CA0094ED78 /* Derelict.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Derelict.h; path = ../../core/include/Derelict.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F1CA76B12610A8BF00FD1E04 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F1CA76F22610A99900FD1E04 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + F1277A25236DE6DD00478B2C /* GameView.h */, + F1277A26236DE6DD00478B2C /* GameView.m */, + F1B679BC24E4AAE400FCEF8E /* GameWindow.h */, + F1B679BD24E4AAE400FCEF8E /* GameWindow.m */, + F1277A27236DE6DD00478B2C /* OSXRenderer.h */, + F1277A28236DE6DD00478B2C /* OSXRenderer.m */, + ); + name = Classes; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + F1BD0D30236EF697002329C6 /* Quartz.framework */, + F1BD0D31236EF697002329C6 /* QuartzCore.framework */, + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + F1CA76B32610A8BF00FD1E04 /* Derelict.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* The Mistral Report OSX */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + F1CA76B52610A8BF00FD1E04 /* Derelict-Info.plist */, + ); + name = "The Mistral Report OSX"; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + F14601D42AC82536007A09B5 /* UI.c */, + F14601D52AC82536007A09B5 /* RendererRasterizer.c */, + F14601D62AC82536007A09B5 /* RendererScene.c */, + F1D4FFCA2AF8D82800F8A437 /* Engine.h */, + F14601D72AC82536007A09B5 /* RendererTesselation.c */, + F14601D82AC82536007A09B5 /* Events.c */, + F1D4FFCB2AF8D83600F8A437 /* HackingMinigameRules.h */, + F13B519E2AA5F241006BE693 /* HackingMinigame.c */, + F17ABEC32BFBDEEB00B69054 /* CreditsScreen.c */, + F17ABEC42BFBDEEB00B69054 /* HelpScreen.c */, + F17ABEC52BFBDEEB00B69054 /* MainMenu.c */, + F14601E72AC82B5E007A09B5 /* Renderer.h */, + F1D4FFCE2AF8D87600F8A437 /* Enums.h */, + F1D4FFCF2AF8D88800F8A437 /* SoundSystem.h */, + F1D4FFD02AF8D8C000F8A437 /* Crawler.c */, + F1D4FFD22AF8D8C000F8A437 /* GameMenu.c */, + F1D4FFDC2AF8D8E000F8A437 /* HackingMinigameRules.c */, + F1D4FFCC2AF8D85900F8A437 /* Engine.c */, + F13B519F2AA5F241006BE693 /* KeyboardUI.c */, + F13B51A62AA5F255006BE693 /* font.h */, + F13B51A72AA5F255006BE693 /* HackingMinigame.h */, + F13B51A82AA5F255006BE693 /* KeyboardUI.h */, + F13B51A92AA5F255006BE693 /* map-data.h */, + F13B51AA2AA5F255006BE693 /* map.h */, + F14601E82AC82B69007A09B5 /* UI.h */, + F1B8CB2F27CFCFE700C06E6F /* Common.h */, + F13B51AC2AA613D4006BE693 /* Common.c */, + F149B82B263CB12B00A3F597 /* Core.h */, + F149B829263CB11700A3F597 /* Core.c */, + F1D5B5D22531D2BF0094ED78 /* Derelict.c */, + F1D5B5D72531D2CA0094ED78 /* Derelict.h */, + 29B97316FDCFA39411CA2CEA /* main.m */, + F1D5B5D32531D2BF0094ED78 /* Parser.c */, + F1D5B5D62531D2C90094ED78 /* Parser.h */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 8D1107310486CEB800E47090 /* Info.plist */, + F1CD08C62450E41C00D4794D /* base.pfs */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F1CA76B22610A8BF00FD1E04 /* Derelict8 */ = { + isa = PBXNativeTarget; + buildConfigurationList = F1CA76B62610A8C100FD1E04 /* Build configuration list for PBXNativeTarget "Derelict8" */; + buildPhases = ( + F1CA76AF2610A8BF00FD1E04 /* Resources */, + F1CA76B02610A8BF00FD1E04 /* Sources */, + F1CA76B12610A8BF00FD1E04 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Derelict8; + productName = Derelict; + productReference = F1CA76B32610A8BF00FD1E04 /* Derelict.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + }; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Derelict8" */; + compatibilityVersion = "Xcode 2.4"; + developmentRegion = en; + hasScannedForEncodings = 1; + knownRegions = ( + en, + Base, + English, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* The Mistral Report OSX */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F1CA76B22610A8BF00FD1E04 /* Derelict8 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F1CA76AF2610A8BF00FD1E04 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F1CA76DD2610A98800FD1E04 /* Info.plist in Resources */, + F1CA774E2610AFA000FD1E04 /* Derelict-Info.plist in Resources */, + F194EAD62610B51400E292ED /* MainMenu.nib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F1CA76B02610A8BF00FD1E04 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F149B82A263CB11700A3F597 /* Core.c in Sources */, + F1CA76BB2610A8E200FD1E04 /* GameView.m in Sources */, + F17ABEC72BFBDEEB00B69054 /* HelpScreen.c in Sources */, + F1CA76BC2610A8ED00FD1E04 /* OSXRenderer.m in Sources */, + F1CA76BD2610A8EE00FD1E04 /* GameWindow.m in Sources */, + F1CA76C22610A91800FD1E04 /* main.m in Sources */, + F1CA76D02610A93600FD1E04 /* Derelict.c in Sources */, + F1CA76D62610A93B00FD1E04 /* Parser.c in Sources */, + F13B51A22AA5F241006BE693 /* HackingMinigame.c in Sources */, + F13B51A32AA5F241006BE693 /* KeyboardUI.c in Sources */, + F13B51AD2AA613D4006BE693 /* Common.c in Sources */, + F14601D92AC82536007A09B5 /* UI.c in Sources */, + F14601DA2AC82536007A09B5 /* RendererRasterizer.c in Sources */, + F14601DB2AC82536007A09B5 /* RendererScene.c in Sources */, + F14601DC2AC82536007A09B5 /* RendererTesselation.c in Sources */, + F17ABEC62BFBDEEB00B69054 /* CreditsScreen.c in Sources */, + F14601DD2AC82536007A09B5 /* Events.c in Sources */, + F17ABEC82BFBDEEB00B69054 /* MainMenu.c in Sources */, + F1D4FFCD2AF8D85900F8A437 /* Engine.c in Sources */, + F1D4FFD62AF8D8C000F8A437 /* Crawler.c in Sources */, + F1D4FFD82AF8D8C000F8A437 /* GameMenu.c in Sources */, + F1D4FFDD2AF8D8E000F8A437 /* HackingMinigameRules.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { + isa = PBXVariantGroup; + children = ( + 29B97319FDCFA39411CA2CEA /* English */, + ); + name = MainMenu.nib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + "XRES_FRAMEBUFFER=256", + "YRES_FRAMEBUFFER=192", + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + SUPPORTS_HACKING_MINIGAME, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + RLE_COMPRESSED_MAPS, + DEMBEDDED_DATA, + ENDIANESS_AWARE, + EMIT_QUIT_OPTION, + MONOCHROME_VECTORS, + ); + MACOSX_DEPLOYMENT_TARGET = 10.4; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + "XRES_FRAMEBUFFER=256", + "YRES_FRAMEBUFFER=192", + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + SUPPORTS_HACKING_MINIGAME, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + RLE_COMPRESSED_MAPS, + DEMBEDDED_DATA, + ENDIANESS_AWARE, + EMIT_QUIT_OPTION, + MONOCHROME_VECTORS, + ); + MACOSX_DEPLOYMENT_TARGET = 10.4; + }; + name = Release; + }; + F1CA76B72610A8C100FD1E04 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + EMBEDDED_DATA, + RLE_COMPRESSED_MAPS, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + SUPPORTS_HACKING_MINIGAME, + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + "YRES_FRAMEBUFFER=192", + "XRES_FRAMEBUFFER=256", + MONOCHROME_VECTORS, + ); + INFOPLIST_FILE = "Derelict-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Derelict; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + F1CA76B82610A8C100FD1E04 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + EMBEDDED_DATA, + RLE_COMPRESSED_MAPS, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + SUPPORTS_HACKING_MINIGAME, + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + "YRES_FRAMEBUFFER=192", + "XRES_FRAMEBUFFER=256", + MONOCHROME_VECTORS, + ); + INFOPLIST_FILE = "Derelict-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Derelict; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Derelict8" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + F1CA76B62610A8C100FD1E04 /* Build configuration list for PBXNativeTarget "Derelict8" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F1CA76B72610A8C100FD1E04 /* Debug */, + F1CA76B82610A8C100FD1E04 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/mz_frontend/Xcode2/Derelict8.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..ca61a234e --- /dev/null +++ b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mz_frontend/Xcode2/Derelict8.xcodeproj/xcshareddata/xcschemes/Derelict8.xcscheme b/mz_frontend/Xcode2/Derelict8.xcodeproj/xcshareddata/xcschemes/Derelict8.xcscheme new file mode 100644 index 000000000..71af733ab --- /dev/null +++ b/mz_frontend/Xcode2/Derelict8.xcodeproj/xcshareddata/xcschemes/Derelict8.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mz_frontend/Xcode2/English.lproj/InfoPlist.strings b/mz_frontend/Xcode2/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..79a393bb7986e7e4c6f6bed8818e5c8728d127bc GIT binary patch literal 202 zcmW-Z%MQT+5Jk`0S2UK5cV?_w3%e?%-lQY`(r>zz>1tB z5qGYI;8)CC oLg7a#|IDRj%;a?W*!R|2w@Ibu8bU2Ga*JEHXKKul5fgu=e;T(V + + + + IBDocumentLocation + 47 69 589 354 0 0 1280 1002 + IBEditorPositions + + 29 + 700 917 238 44 0 0 1280 1002 + + IBFramework Version + 489.0 + IBOldestOS + 5 + IBOpenObjects + + 21 + 29 + + IBSystem Version + 8S165 + + diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu.nib/keyedobjects.nib b/mz_frontend/Xcode2/English.lproj/MainMenu.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..0e93d7015bf28f653f5a8ac2abb8658844e35fcd GIT binary patch literal 5261 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 + + + + IBDocumentLocation + 47 69 589 354 0 0 1280 1002 + IBEditorPositions + + 29 + 206 876 231 44 0 0 1280 1002 + + IBFramework Version + 489.0 + IBOldestOS + 5 + IBOpenObjects + + 21 + 29 + + IBSystem Version + 8S165 + + diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/keyedobjects.nib b/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..65ad1292628e5465b27417a07a3759c336ba850e GIT binary patch literal 5226 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 literal 0 HcmV?d00001 diff --git a/mz_frontend/Xcode2/GameView.h b/mz_frontend/Xcode2/GameView.h new file mode 100644 index 000000000..688d45941 --- /dev/null +++ b/mz_frontend/Xcode2/GameView.h @@ -0,0 +1,23 @@ +// +// GameView.h +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import + +@interface GameView : NSView { + NSTimer* timer; + int bufferedInput; +} +-(void) initTimer; +-(void) stopTimer; +- (void)drawRect:(NSRect)rect; +- (int) getInput; + +-(void)keyUp:(NSEvent*)event; +-(void)keyDown:(NSEvent*)event; +- (BOOL)acceptsFirstResponder; +@end diff --git a/mz_frontend/Xcode2/GameView.m b/mz_frontend/Xcode2/GameView.m new file mode 100644 index 000000000..8a39aa8b0 --- /dev/null +++ b/mz_frontend/Xcode2/GameView.m @@ -0,0 +1,247 @@ +// +// GameView.m +// Sub Mare Imperium: Derelict +// +// Created by Daniel Monteiro on 2023-09-04. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import "GameView.h" + +#include +#include +#include +#include + +#include "Enums.h" +#include "UI.h" +#include "Engine.h" +#include "SoundSystem.h" +#include "Core.h" +#include "Derelict.h" +#include "KeyboardUI.h" +#include "Renderer.h" + +const char *mainText; + +long timeUntilNextState; +enum EPresentationState currentPresentationState; +enum EGameMenuState currentGameMenuState; +int8_t cameraRotation = 0; +int8_t cursorPosition; +enum EGameMenuState nextNavigationSelection; +enum EGameMenuState menuStateToReturn; +enum ESoundDriver soundDriver = kNoSound; + +extern GameView* osxview; + +@implementation GameView + +uint32_t palette[16]; +uint32_t stretchedBuffer[ 256 * 192 ]; +uint8_t framebuffer[128 * 128]; +uint8_t vfb[256 * 192]; + +CGColorSpaceRef rgb; +CGDataProviderRef provider; +CGImageRef ref; +extern uint8_t mBufferedCommand; +float multiplier = 1.0f; +extern uint8_t updateDirection; +id delegate; + + +void graphicsFlush(void); + +void stopSounds(void) { + +} + +void soundTick(void) { + +} + +void startFrame(int x, int y, int width, int height) { + (void)x; + (void)y; + (void)width; + (void)height; +} + +void endFrame(void) { + if (needsToRedrawVisibleMeshes) { + graphicsFlush(); + } + flushVirtualFramebuffer(); +} + +void playSound(uint8_t unused) { + +} + +void handleSystemEvents(void) { + +} + +void initHW(int argc, char** argv) { + initKeyboardUI(); + updateDirection = 0; + + mBufferedCommand = '.'; + memset(framebuffer, 0, 128 * 128); +} + + +void shutdownGraphics(void) { +} + +- (void) repaintGame:(NSTimer *)timer +{ + startFrame(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER); + menuTick(10); + endFrame(); + + + [self setNeedsDisplay: YES ]; +} + +void setMultiplier(CGSize size) { + + if (((320.0f / 240.0f ) * size.height) < size.width ) { + multiplier = (((float)size.height) / 240.0f); + } else { + multiplier = (((float)size.width) / 320.0f); + } +} + +- (id)initWithFrame:(NSRect)frame +{ + int r, g, b; + + self = [super initWithFrame:frame]; + if (self) { + + bufferedInput = -1; + delegate = self; + rgb = CGColorSpaceCreateDeviceRGB(); + + + osxview = self; + palette[0] = 0xFF000099; + palette[1] = 0xFFFFFFBF; + palette[2] = 0xFFE0FFFF; + palette[3] = 0xFFFF0000; + palette[4] = 0xFFFFFFFF; + palette[5] = 0xFF000000; + palette[6] = 0xFF0000FF; + palette[7] = 0xFFFF00FF; + palette[8] = 0xFF00b7eb; + palette[9] = 0xFFFFFF00; + palette[10] = 0xFFAFEEEE; + palette[11] = 0xFFffc0cb; + palette[12] = 0xFF00FF00; + palette[13] = 0xFFAAFFAA; + palette[14] = 0xFF0000FF; + palette[15] = 0xFFAAAAFF; + + + initHW(0, NULL); + enterState(kMainMenu); + + + [self initTimer]; + } + + return self; +} + +-(void)keyDown:(NSEvent *)theEvent +{ +} + +-(void)keyUp:(NSEvent*)event +{ + + bufferedInput = [ event keyCode ]; +} + +- (BOOL)acceptsFirstResponder { + return YES; +} + +-(void) initTimer { + [NSTimer scheduledTimerWithTimeInterval:0.05f + target:self selector:@selector(repaintGame:) userInfo:nil repeats:YES]; + +} + +- (int) getInput { + int toReturn = bufferedInput; + + bufferedInput = -1; + + return toReturn; +} + +-(void) stopTimer { +} + +void shutdownHW(void) { + CGColorSpaceRelease(rgb); +} + +void flushVirtualFramebuffer() { + int x,y; + uint32_t pixel; + uint32_t *bufferPtr = &stretchedBuffer[0]; + for ( y = 0; y < 192; ++y ) { + for ( x = 0; x < 256; ++x ) { + int index = vfb[(256 * y) + x]; + + if (index < 0 || index >= 16) { + continue; + } + + pixel = palette[index]; + + *bufferPtr = pixel; + ++bufferPtr; + } + } +} + +- (void)drawRect:(NSRect)rect { + + CGRect bounds; + //NSRectToCGRect is not available on 10.4 + bounds.origin.x = rect.origin.x; + bounds.origin.y = rect.origin.y; + bounds.size.width = rect.size.width; + bounds.size.height = rect.size.height; + + float yMultiplier = ( (240.0f * multiplier) / 200.0f ); + + setMultiplier(bounds.size); + + /* MAC_OS_X_VERSION_10_10*/ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 + CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] CGContext]; +#else + CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; +#endif + + CGContextSaveGState(context); + + CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 1.0f); + CGContextFillRect(context, bounds); + + provider = CGDataProviderCreateWithData( NULL, &stretchedBuffer[0], 4 * XRES_FRAMEBUFFER * YRES_FRAMEBUFFER, NULL ); + ref = CGImageCreate( XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, 8, 32, 4 * XRES_FRAMEBUFFER, rgb, kCGBitmapByteOrder32Host | kCGImageAlphaNoneSkipLast, provider, NULL, 0, kCGRenderingIntentDefault ); + CGContextScaleCTM(context, multiplier, yMultiplier); + CGContextDrawImage(context, CGRectMake( ((bounds.size.width / multiplier) - XRES_FRAMEBUFFER) / 2, ((bounds.size.height / yMultiplier) - YRES_FRAMEBUFFER) / 2, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER), ref); + CGImageRelease(ref); + CGDataProviderRelease(provider); + + CGContextRestoreGState(context); +} +@end diff --git a/mz_frontend/Xcode2/GameWindow.h b/mz_frontend/Xcode2/GameWindow.h new file mode 100644 index 000000000..6ad06f724 --- /dev/null +++ b/mz_frontend/Xcode2/GameWindow.h @@ -0,0 +1,16 @@ +// +// GameWindow.h +// The Mistral Report OSX +// +// Created by Daniel Monteiro on 6/15/20. +// Copyright 2020 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface GameWindow : NSWindow { + +} + +@end diff --git a/mz_frontend/Xcode2/GameWindow.m b/mz_frontend/Xcode2/GameWindow.m new file mode 100644 index 000000000..22333ce89 --- /dev/null +++ b/mz_frontend/Xcode2/GameWindow.m @@ -0,0 +1,39 @@ +// +// GameWindow.m +// The Mistral Report OSX +// +// Created by Daniel Monteiro on 6/15/20. +// Copyright 2020 __MyCompanyName__. All rights reserved. +// + +#import "GameWindow.h" +#import "GameView.h" + +@implementation GameWindow + +-(BOOL)makeFirstResponder:(NSResponder *)aResponder { + + /* UGLY HACK */ + if ([self respondsToSelector:@selector(setCollectionBehavior:) ]) { + + //NSWindowCollectionBehaviorFullScreenPrimary is not available on 10.4 SDK + [self setCollectionBehavior: (1 << 7)]; + } + + return [super makeFirstResponder: aResponder]; +} + +/* UGLY HACK */ +- (void)zoom:(id)sender { + [super zoom: sender ]; + + NSView *view = [[[self contentView] subviews ] objectAtIndex: 0 ]; + + if ( [ view isKindOfClass: [GameView class] ]) { + GameView *gv = (GameView*)view; + [gv viewDidEndLiveResize]; + } +} + + +@end diff --git a/mz_frontend/Xcode2/Info.plist b/mz_frontend/Xcode2/Info.plist new file mode 100644 index 000000000..aef04efe8 --- /dev/null +++ b/mz_frontend/Xcode2/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mz_frontend/Xcode2/OSXRenderer.h b/mz_frontend/Xcode2/OSXRenderer.h new file mode 100644 index 000000000..241c9adb9 --- /dev/null +++ b/mz_frontend/Xcode2/OSXRenderer.h @@ -0,0 +1,13 @@ +// +// OSXRenderer.h +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#ifndef __The_Mistral_Report__OSXRenderer__ +#define __The_Mistral_Report__OSXRenderer__ + + +#endif /* defined(__The_Mistral_Report__OSXRenderer__) */ diff --git a/mz_frontend/Xcode2/OSXRenderer.m b/mz_frontend/Xcode2/OSXRenderer.m new file mode 100644 index 000000000..227851c9f --- /dev/null +++ b/mz_frontend/Xcode2/OSXRenderer.m @@ -0,0 +1,307 @@ +// +// OSXRenderer.cpp +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import + +#include +#include +#include +#include + +#include "Enums.h" +#include "OSXRenderer.h" +#include "GameView.h" + +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "KeyboardUI.h" +#include "font.h" + + +GameView* osxview; +uint8_t mPalette[256]; +struct Bitmap *mFont; +uint8_t mBufferedCommand = '.'; + +void performAction(); + +void flushVirtualFramebuffer(void); + +void graphicsInit() { +} + +void graphicsShutdown() { +} + +enum ECommand getInput(void) { + int code = [ osxview getInput ]; + + mBufferedCommand = kCommandNone; + + switch (code) { + case 0: //a + case 6: //z + case 36: //enter + mBufferedCommand = kCommandFire1; + break; + + case 7: //x + mBufferedCommand = kCommandFire2; + break; + + case 8: //c + mBufferedCommand = kCommandFire3; + break; + + case 9: //v + mBufferedCommand = kCommandFire4; + break; + + case 1: //s + mBufferedCommand = kCommandStrafeLeft; + break; + case 2: //d + mBufferedCommand = kCommandStrafeRight; + break; + +#ifdef EMIT_QUIT_OPTION + case 53: //esc + mBufferedCommand = kCommandQuit; + break; +#endif + + case 126: + mBufferedCommand = kCommandUp; + break; + case 125: + mBufferedCommand = kCommandDown; + break; + + case 123: + mBufferedCommand = kCommandLeft; + break; + + case 124: + mBufferedCommand = kCommandRight; + break; + case -1: + break; + default: + break; + } + + performAction(); + + return mBufferedCommand; +} + +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; +uint8_t updateDirection = 0; + +uint8_t mBufferedCommand; +uint32_t palette[16]; +uint8_t framebuffer[128 * 128]; +uint8_t vfb[256 * 192]; + +void graphicsPut(uint8_t x, uint8_t y) { + framebuffer[(128 * y) + x] = 1; +} + +void graphicsPutPointArray(uint8_t *y128Values) { + uint8_t *stencilPtr = y128Values; + int x; + + for (x = 0; x < XRES; ++x) { + graphicsPut(x, *stencilPtr); + ++stencilPtr; + } +} + +void clearTextScreen(void) { + fillRect(0, 129, 256, 192, 0, 0); +} + +void enterTextMode(void) { +} + +void exitTextMode(void) { +} + +void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple) { + int16_t y; + int16_t _y0 = y0; + int16_t _y1 = y1; + + if (y0 > y1) { + _y0 = y1; + _y1 = y0; + } + + + for (y = _y0; y <= _y1; ++y) { + if (!shouldStipple || (y & 1)) { + graphicsPut(x0, y); + } + } +} + +void clearGraphics(void) { + memset(framebuffer, 0, 128 * 128); +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour, NULL); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + +uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { + assert(y >= 0); + assert(x >= 0); + assert(x < 256); + assert(y < 192); + + vfb[(256 * y) + x] = colour; + + return NULL; +} + +void clearScreen(void) { + fillRect(0, 0, 255, 192, 0, 0); +} + +void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { + uint8_t len = strlen(text); + char *ptr = text; + uint8_t c = 0; + uint8_t x = _x; + int d; + + for (; c < len && y < 64; ++c) { + + char cha = *ptr; + + if (x == limitX) { + ++y; + x = _x; + } else if (cha == '\n') { + ++y; + x = _x; + ++ptr; + continue; + } + + if (cha >= 'a') { + if (cha <= 'z') { + cha = (cha - 'a') + 'A'; + } else { + cha -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((cha - 32) << 3)]; + + + for (d = 0; d < 8; ++d) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(8 * x + (7 - e), 8 * y + (d), 1, NULL); + } else { + realPut(8 * x + (7 - e), 8 * y + (d), 0, NULL); + } + chunk = chunk >> 1; + } + + + fontTop++; + } + + ++x; + ++ptr; + } +} + + +void flipRenderer(void) { + int x, y; + for (y = 0; y < 128; ++y) { + for (x = 0; x < 128; ++x) { + int index = framebuffer[(128 * y) + x]; + + if (index < 0 || index >= 16) { + continue; + } + + realPut(x, y, index, NULL); + } + } +} + +void graphicsFlush(void) { + if (updateDirection) { + updateDirection = 0; + switch (getPlayerDirection()) { + case 0: + writeStrWithLimit(12, 17, "N", 31, 2, 0); + break; + case 1: + writeStrWithLimit(12, 17, "E", 31, 2, 0); + break; + case 2: + writeStrWithLimit(12, 17, "S", 31, 2, 0); + break; + case 3: + writeStrWithLimit(12, 17, "W", 31, 2, 0); + break; + } + } + + if (needsToRedrawVisibleMeshes) { + flipRenderer(); + clearGraphics(); + } + flushVirtualFramebuffer(); +} + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + uint8_t x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + if (!stipple || ((x + y) & 1 )) { + realPut(x, y, colour, NULL); + } + } + } +} + + diff --git a/mz_frontend/Xcode2/main.m b/mz_frontend/Xcode2/main.m new file mode 100644 index 000000000..c470bd7a1 --- /dev/null +++ b/mz_frontend/Xcode2/main.m @@ -0,0 +1,20 @@ +// +// main.m +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/mz_frontend/data/Makefile b/mz_frontend/data/Makefile index fd5e01329..bb73b6a32 100644 --- a/mz_frontend/data/Makefile +++ b/mz_frontend/data/Makefile @@ -3,21 +3,14 @@ CRUNCHER=wobj-compiler/dist/wobj-compiler-1.0-SNAPSHOT-jar-with-dependencies.jar PACKAGER=packer -#$(CRUNCHER): -# mvn -q -f wobj-compiler/pom.xml clean compile package install -# mkdir -p wobj-compiler/dist -# cp wobj-compiler/target/wobj-compiler-1.0-SNAPSHOT-jar-with-dependencies.jar wobj-compiler/dist - $(PACKAGER): rm -f $(PACKAGER) $(CXX) -std=c++14 -o$(PACKAGER) packer.cpp -#data: $(PACKAGER) $(CRUNCHER) data: $(PACKAGER) rm -f ./base.pfs -# ls -r src/*.obj | xargs java -jar wobj-compiler/dist/wobj-compiler-1.0-SNAPSHOT-jar-with-dependencies.jar ls -r assets/*.* | xargs ./packer - bin2c ../base.pfs ../Engine3D/basepfs.h basepfs + bin2c ../base.pfs ../include/basepfs.h basepfs mv ./data.pfs ../base.pfs images: diff --git a/mz_frontend/include/GamepadUI.h b/mz_frontend/include/GamepadUI.h new file mode 100644 index 000000000..c86a6e074 --- /dev/null +++ b/mz_frontend/include/GamepadUI.h @@ -0,0 +1,8 @@ +#ifndef GAMEPADUI_H +#define GAMEPADUI_H + +enum ECommand performActionJoypad(void); + +void initGamepadUI(void); + +#endif \ No newline at end of file diff --git a/mz_frontend/include/HackingMinigame.h b/mz_frontend/include/HackingMinigame.h new file mode 100644 index 000000000..ee54fbc3e --- /dev/null +++ b/mz_frontend/include/HackingMinigame.h @@ -0,0 +1,9 @@ +/* + Created by Daniel Monteiro on 2021-11-01. +*/ + +#ifndef DERELICT8_HACKINGMINIGAME_H +#define DERELICT8_HACKINGMINIGAME_H + + +#endif /* DERELICT8_HACKINGMINIGAME_H */ diff --git a/mz_frontend/include/KeyboardUI.h b/mz_frontend/include/KeyboardUI.h new file mode 100644 index 000000000..ef0538a84 --- /dev/null +++ b/mz_frontend/include/KeyboardUI.h @@ -0,0 +1,10 @@ +/* + Created by Daniel Monteiro on 12/07/2023. +*/ + +#ifndef DERELICT8_KEYBOARDUI_H +#define DERELICT8_KEYBOARDUI_H + +void initKeyboardUI(void); + +#endif //DERELICT8_KEYBOARDUI_H diff --git a/mz_frontend/include/Renderer.h b/mz_frontend/include/Renderer.h new file mode 100644 index 000000000..8d84045ac --- /dev/null +++ b/mz_frontend/include/Renderer.h @@ -0,0 +1,139 @@ +/* + Created by Daniel Monteiro on 2021-10-22. +*/ + +#ifndef DERELICT8_RENDERER_H +#define DERELICT8_RENDERER_H + +#define XRES 127 +#define YRES 127 + +#define XRESMINUSONE (XRES - 1) +#define YRESMINUSONE (YRES - 1) + +#define CAMERA_HEIGHT 4 + +enum DIRECTION { + DIRECTION_N, + DIRECTION_E, + DIRECTION_S, + DIRECTION_W +}; + +#define IN_RANGE(V0, V1, V) ((V0) <= (V) && (V) <= (V1)) + +#define RLE_THRESHOLD 32 +#define MAP_SIZE_X 32 +#define MAP_SIZE_Y 32 +#define VISIBILITY_LIMIT_X (MAP_SIZE_X - 1) +#define VISIBILITY_LIMIT_Y (MAP_SIZE_Y - 1) +#define FAR_PLANE_Z 32 +#define NEAR_PLANE_Z 6 +#define RENDER_SCALE_X 1 +#define RENDER_SCALE_Z 1 + +/* Not rendered, but won't block visibility */ +#define NEUTRAL_CELL '.' + +#define STIPPLE_DISTANCE 13 + +#define STIPPLE_COLOUR_THRESHOLD 8 + + +/* not rendered and blocks visibility */ +#define BLOCK_CELL '#' + +struct CellPattern { + uint8_t ceiling: 4; + uint8_t elementsMask: 4; + uint8_t geometryType: 7; + uint8_t blockMovement: 1; +}; + +#define getPaletteEntry(c) (( (c) - 0xFF000000 ) % 3) + +void clearGraphics(void); + +void clearTextScreen(void); + +void dropItem(void); + +void initMap(void); + +#ifdef EMIT_QUIT_OPTION +void shutdownGraphics(void); +#endif + +enum ECommand getInput(void); + +void endFrame(void); + +void startFrame(int x, int y, int width, int height); + +void graphicsPut(int16_t x, int16_t y, uint16_t colour); + +void graphicsPutPointArray(uint8_t *y128Values); + +void HUD_initialPaint(void); + +void HUD_refresh(void); + +void initHW(int, char **pString); + +void interactWithItemInRoom(void); + +void nextItemInHand(void); + +void nextItemInRoom(void); + +void pickItem(void); + +void renderCameraNorth(void); + +void renderCameraEast(void); + +void renderCameraSouth(void); + +void renderCameraWest(void); + +void renderScene(void); + +void updateMapItems(void); + +void useItemInHand(void); + +void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour); + +void flush3DBuffer(void); + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour); + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t colour, + char charToReplaceHifenWith); + +void realPut(int x, int y, uint8_t value); + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour); + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple); + +void drawFloorAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dZ); + +void drawCubeAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ); + +void +drawWedge(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ, uint16_t elementMask, uint16_t type); + +void drawSquare(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, uint16_t elementMask); + +void drawObjectAt(int16_t x0, int16_t z0); + +void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour); + +void repaintMapItems(void); + +void drawPattern(uint16_t _pattern, int16_t x0, int16_t x1, int16_t z); + +extern uint8_t needsToRedrawVisibleMeshes; + +#endif /* DERELICT8_RENDERER_H */ diff --git a/mz_frontend/include/UI.h b/mz_frontend/include/UI.h new file mode 100644 index 000000000..8dac7f916 --- /dev/null +++ b/mz_frontend/include/UI.h @@ -0,0 +1,48 @@ +/* + Created by Daniel Monteiro on 14/07/2023. +*/ + +#ifndef DERELICT8_MENU_H +#define DERELICT8_MENU_H + +void drawTextAt(uint8_t _x, uint8_t y, const char *text, uint8_t colour); + +void showMessage(const char *message); + +void drawMap(void); + +void performAction(void); + +void drawWindow(uint8_t tx, uint8_t ty, uint8_t tw, uint8_t th, const char *title); + +void +drawWindowWithOptions(const uint8_t x, + const uint8_t y, + const uint8_t dx, + const uint8_t dy, + const char *title, + const char **options, + const uint8_t optionsCount, + const uint8_t selectedOption); + +void drawGraphic(const uint8_t *graphic); + +void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, + const char *content); + +enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t optionsCount, const enum ECommand cmd, enum EGameMenuState backState); + +void clearScreen(void); + +#define XRES_TEXT (XRES_FRAMEBUFFER / 8) +#define YRES_TEXT (YRES_FRAMEBUFFER / 8) + +extern uint8_t waitForKey; + +extern int8_t cursorPosition; + +extern uint8_t redrawMap; + +extern uint8_t needsToRedrawHUD; + +#endif //DERELICT8_MENU_H diff --git a/mz_frontend/include/basepfs.h b/mz_frontend/include/basepfs.h new file mode 100644 index 000000000..a225fd774 --- /dev/null +++ b/mz_frontend/include/basepfs.h @@ -0,0 +1,2482 @@ +#ifndef __basepfs__ +#define __basepfs__ + +unsigned int size_basepfs = 39577; +unsigned char basepfs[] __attribute__((aligned(16))) = { + 0x4d, 0x00, 0xcb, 0x04, 0x00, 0x00, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x2e, 0x74, + 0x78, 0x74, 0x00, 0x06, 0x05, 0x00, 0x00, 0x08, 0x48, 0x65, 0x6c, 0x70, 0x2e, 0x74, 0x78, 0x74, + 0x00, 0xb5, 0x06, 0x00, 0x00, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x2e, 0x74, + 0x78, 0x74, 0x00, 0xb7, 0x08, 0x00, 0x00, 0x09, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x2e, 0x74, 0x78, + 0x74, 0x00, 0xc4, 0x08, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x30, 0x2e, 0x74, 0x78, 0x74, 0x00, + 0xe8, 0x0c, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x0c, 0x11, + 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x30, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x30, 0x15, 0x00, + 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x54, 0x19, 0x00, 0x00, + 0x09, 0x6d, 0x61, 0x70, 0x31, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x78, 0x1d, 0x00, 0x00, 0x09, + 0x6d, 0x61, 0x70, 0x31, 0x33, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x9c, 0x21, 0x00, 0x00, 0x09, 0x6d, + 0x61, 0x70, 0x31, 0x34, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xc0, 0x25, 0x00, 0x00, 0x09, 0x6d, 0x61, + 0x70, 0x31, 0x35, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xe4, 0x29, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, + 0x31, 0x36, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x08, 0x2e, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, + 0x37, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2c, 0x32, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x38, + 0x2e, 0x74, 0x78, 0x74, 0x00, 0x50, 0x36, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x39, 0x2e, + 0x74, 0x78, 0x74, 0x00, 0x74, 0x3a, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x32, 0x2e, 0x74, 0x78, + 0x74, 0x00, 0x98, 0x3e, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x30, 0x2e, 0x74, 0x78, 0x74, + 0x00, 0xbc, 0x42, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x00, + 0xe0, 0x46, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x04, + 0x4b, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x33, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x28, 0x4f, + 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x33, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x4c, 0x53, 0x00, 0x00, + 0x08, 0x6d, 0x61, 0x70, 0x34, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x70, 0x57, 0x00, 0x00, 0x08, 0x6d, + 0x61, 0x70, 0x35, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x94, 0x5b, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, + 0x36, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xb8, 0x5f, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x37, 0x2e, + 0x74, 0x78, 0x74, 0x00, 0xdc, 0x63, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x38, 0x2e, 0x74, 0x78, + 0x74, 0x00, 0x00, 0x68, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x39, 0x2e, 0x74, 0x78, 0x74, 0x00, + 0x24, 0x6c, 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x30, 0x2e, 0x62, 0x69, 0x6e, 0x00, + 0x72, 0x6d, 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, + 0xf4, 0x6f, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x30, 0x2e, 0x62, 0x69, 0x6e, + 0x00, 0xbe, 0x70, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x31, 0x2e, 0x62, 0x69, + 0x6e, 0x00, 0xb4, 0x71, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x32, 0x2e, 0x62, + 0x69, 0x6e, 0x00, 0xaa, 0x72, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x33, 0x2e, + 0x62, 0x69, 0x6e, 0x00, 0x74, 0x73, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x34, + 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x30, 0x75, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, + 0x35, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x52, 0x76, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, + 0x31, 0x36, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xa0, 0x77, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, + 0x73, 0x31, 0x37, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x46, 0x79, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x31, 0x38, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x68, 0x7a, 0x00, 0x00, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x73, 0x31, 0x39, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x32, 0x7b, 0x00, 0x00, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x32, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x72, 0x7d, 0x00, 0x00, 0x0b, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x32, 0x30, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x18, 0x7f, 0x00, 0x00, 0x0b, + 0x70, 0x72, 0x6f, 0x70, 0x73, 0x32, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xd4, 0x80, 0x00, 0x00, + 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x32, 0x32, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x38, 0x82, 0x00, + 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x32, 0x33, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xb2, 0x83, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x33, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x58, 0x85, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x34, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x22, 0x86, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x35, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x86, 0x87, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x36, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xea, 0x88, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x37, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xb4, 0x89, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x38, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xaa, 0x8a, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x39, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x0e, 0x8c, + 0x00, 0x00, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x4c, 0x8c, 0x00, + 0x00, 0x0a, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x30, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xd0, 0x8c, 0x00, + 0x00, 0x0a, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x53, 0x8d, 0x00, + 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x30, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xe7, 0x8d, + 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x31, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x7b, + 0x8e, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x32, 0x2e, 0x6c, 0x73, 0x74, 0x00, + 0x0f, 0x8f, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x33, 0x2e, 0x6c, 0x73, 0x74, + 0x00, 0xbc, 0x8f, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x34, 0x2e, 0x6c, 0x73, + 0x74, 0x00, 0x57, 0x90, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x35, 0x2e, 0x6c, + 0x73, 0x74, 0x00, 0xeb, 0x90, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x36, 0x2e, + 0x6c, 0x73, 0x74, 0x00, 0x7f, 0x91, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x37, + 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x34, 0x92, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, + 0x38, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xd2, 0x92, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x31, 0x39, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x7f, 0x93, 0x00, 0x00, 0x0a, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x32, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xeb, 0x93, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x32, 0x30, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x86, 0x94, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x32, 0x31, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x25, 0x95, 0x00, 0x00, 0x0b, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x32, 0x32, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xc3, 0x95, 0x00, 0x00, 0x0b, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x32, 0x33, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x57, 0x96, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x33, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xf2, 0x96, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x34, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x9d, 0x97, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x35, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x38, 0x98, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x36, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xd6, 0x98, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x37, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x6a, 0x99, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x38, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xfe, 0x99, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x39, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x37, 0x00, 0x00, 0x00, 0x44, + 0x61, 0x6e, 0x69, 0x65, 0x6c, 0x20, 0x28, 0x4d, 0x6f, 0x6e, 0x74, 0x79, 0x4f, 0x6e, 0x54, 0x68, + 0x65, 0x52, 0x75, 0x6e, 0x29, 0x20, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x69, 0x72, 0x6f, 0x20, 0x2d, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0xab, 0x01, 0x00, 0x00, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x45, 0x4d, 0x50, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x0a, 0x76, + 0x61, 0x6c, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x66, 0x75, 0x65, 0x6c, 0x20, 0x72, 0x6f, + 0x64, 0x73, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x20, 0x28, 0x62, 0x65, + 0x73, 0x69, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x29, 0x3a, 0x0a, 0x0a, 0x5a, 0x3a, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, + 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x0a, 0x79, 0x6f, 0x75, + 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x77, 0x68, 0x61, 0x74, 0x27, 0x73, 0x20, 0x79, 0x6f, 0x75, + 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x74, 0x2e, 0x20, + 0x0a, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x77, 0x68, 0x61, + 0x74, 0x27, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x2e, 0x0a, 0x0a, 0x58, 0x3a, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, + 0x27, 0x74, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x0a, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x79, 0x6f, 0x75, 0x2c, 0x20, 0x64, 0x6f, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x79, + 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x2c, 0x20, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x61, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x27, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x0a, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x2e, 0x0a, + 0x0a, 0x43, 0x3a, 0x20, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x68, + 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x56, 0x3a, 0x20, 0x4e, 0x65, 0x78, 0x74, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x0a, 0xfe, 0x01, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2d, 0x20, 0x45, 0x70, 0x69, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x20, 0x2d, 0x20, 0x20, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x64, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x77, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x61, + 0x72, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x44, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x65, 0x65, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x72, 0x61, 0x67, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x61, 0x74, 0x65, 0x76, 0x65, 0x72, + 0x20, 0x73, 0x65, 0x74, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x2e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x61, 0x72, 0x6b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x44, 0x4f, 0x53, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x6f, 0x77, 0x2e, 0x0a, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x62, 0x6c, 0x61, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x45, 0x41, 0x42, 0x43, 0x44, 0x45, 0x5a, 0x57, 0x2e, 0x2e, 0x2e, 0x2e, 0x4a, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x49, + 0x49, 0x44, 0x44, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x3e, 0x49, 0x46, 0x46, 0x49, 0x3c, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x50, 0x5b, + 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x64, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x46, 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x64, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x46, 0x30, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x64, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x46, 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x50, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x5c, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x3c, 0x3e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x5c, + 0x2e, 0x2e, 0x2e, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x2e, 0x7b, 0x2e, 0x2e, 0x7d, 0x2e, 0x2e, 0x2e, + 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x7e, 0x54, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, + 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x5c, 0x53, 0x5a, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x2e, 0x54, 0x2e, 0x2e, 0x54, 0x2e, + 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x7c, 0x5a, 0x53, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x2e, 0x54, 0x2e, 0x2e, 0x54, + 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x73, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x32, 0x32, 0x32, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x49, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x6e, 0x5f, + 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x52, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x54, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, + 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x5c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x54, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x44, 0x55, + 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, + 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x46, 0x46, 0x73, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x32, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, + 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x46, + 0x46, 0x46, 0x46, 0x50, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x5a, 0x4c, 0x53, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, + 0x46, 0x46, 0x46, 0x46, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x5c, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, + 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, + 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, + 0x2e, 0x65, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x0a, 0x49, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x49, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x54, 0x54, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x42, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x54, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x54, 0x43, 0x2e, 0x2e, 0x54, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, + 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2f, 0x58, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, 0x54, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, + 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, 0x4d, 0x2e, + 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x65, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, 0x4d, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x58, 0x56, 0x56, + 0x0a, 0x49, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x49, 0x42, 0x42, 0x42, 0x42, 0x42, 0x49, 0x0a, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5f, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x53, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, 0x2e, + 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x44, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x5c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x0a, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x0a, 0x49, 0x2e, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x43, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x0a, 0x49, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x0a, 0x2c, 0x49, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x0a, 0x2c, + 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x0a, + 0x2c, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x50, 0x50, 0x50, 0x49, 0x2c, + 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x50, + 0x50, 0x50, 0x50, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x4d, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, + 0x49, 0x49, 0x53, 0x53, 0x53, 0x49, 0x54, 0x49, 0x49, 0x53, 0x53, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, + 0x49, 0x2e, 0x2e, 0x2e, 0x65, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x2f, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, + 0x53, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x0a, 0x42, 0x33, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x53, 0x53, 0x49, 0x53, 0x53, 0x49, 0x53, + 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x42, 0x33, 0x46, 0x46, 0x77, + 0x46, 0x46, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, 0x23, + 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x42, 0x33, 0x46, 0x46, + 0x73, 0x46, 0x46, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, + 0x23, 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x5c, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x49, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x4c, 0x45, 0x49, 0x53, + 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, + 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x6e, 0x73, 0x65, + 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x77, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x5c, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x44, 0x55, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x73, 0x46, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x32, 0x32, 0x32, 0x32, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x58, 0x58, 0x58, 0x58, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x49, + 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2f, 0x5c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x4d, 0x49, 0x2e, 0x2e, 0x2e, + 0x49, 0x30, 0x30, 0x30, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, 0x5c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x4d, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x3d, 0x3d, 0x3d, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, 0x2e, 0x7c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x3c, 0x4c, 0x52, 0x4c, 0x4c, + 0x4c, 0x49, 0x49, 0x46, 0x46, 0x46, 0x49, 0x50, 0x7c, 0x2c, 0x2c, 0x2f, 0x2e, 0x2e, 0x2e, 0x7c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, 0x4c, 0x5f, 0x5f, + 0x5f, 0x4c, 0x43, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, + 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, 0x4c, 0x5f, + 0x5f, 0x5f, 0x4c, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2d, 0x5c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, 0x4c, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, + 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x5c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x7c, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, + 0x0a, 0x7c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x43, + 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x2e, 0x2e, 0x5c, 0x2c, + 0x2c, 0x0a, 0x49, 0x49, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x43, 0x2e, 0x2e, 0x31, + 0x58, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x65, 0x2e, + 0x31, 0x58, 0x2c, 0x0a, 0x58, 0x32, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, + 0x2e, 0x31, 0x58, 0x2c, 0x0a, 0x58, 0x32, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, + 0x2e, 0x2e, 0x2f, 0x2c, 0x2c, 0x0a, 0x58, 0x32, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, + 0x43, 0x43, 0x43, 0x7c, 0x2c, 0x2c, 0x0a, 0x2d, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x4c, 0x4c, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x43, 0x43, 0x43, 0x43, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x43, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x43, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, + 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, + 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, + 0x2e, 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, + 0x2e, 0x2e, 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x5c, 0x2e, 0x2e, 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x5c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, + 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x46, 0x46, 0x46, 0x46, 0x50, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x49, 0x2e, 0x2e, 0x5a, 0x4c, 0x53, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, + 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x77, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, + 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x5c, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x65, 0x2e, 0x2e, + 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, + 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x2c, 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x50, + 0x50, 0x50, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x5c, 0x49, 0x50, 0x50, 0x50, 0x50, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x4c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x4c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, 0x4d, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, 0x5c, 0x2e, 0x65, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x2f, 0x50, + 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x58, 0x58, 0x58, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x0a, 0x42, 0x33, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x58, 0x58, 0x58, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x7d, 0x53, 0x53, 0x53, 0x7d, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x42, + 0x33, 0x46, 0x46, 0x77, 0x46, 0x46, 0x46, 0x49, 0x58, 0x58, 0x58, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x7d, 0x53, 0x53, 0x53, 0x7d, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x42, 0x33, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x53, 0x53, 0x53, 0x49, 0x23, 0x23, 0x23, + 0x49, 0x53, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x5c, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x53, 0x54, 0x53, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x53, 0x54, 0x53, 0x49, 0x53, 0x54, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x53, 0x52, 0x53, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x53, 0x52, 0x53, 0x49, 0x53, 0x52, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x53, 0x53, 0x53, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x53, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x6e, 0x73, 0x65, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x5c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x0a, 0x58, 0x33, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x0a, 0x58, 0x33, 0x2e, + 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x5d, 0x5b, 0x49, 0x0a, 0x58, 0x33, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x5b, 0x5d, 0x49, 0x0a, 0x58, + 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x0a, + 0x49, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x0a, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x7d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x7b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x5c, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x65, 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x6e, 0x73, 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x46, 0x46, 0x46, 0x46, 0x50, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x49, 0x2e, 0x2e, 0x5a, 0x4c, 0x53, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x33, 0x2e, 0x77, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, + 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, + 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x65, 0x2e, 0x2e, 0x2e, + 0x31, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x31, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x49, 0x49, 0x44, 0x55, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x73, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x32, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x30, 0x30, 0x30, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x6e, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x2f, 0x4c, 0x4c, 0x4c, 0x5c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x23, 0x33, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x46, 0x77, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x65, 0x46, 0x31, 0x23, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x4c, + 0x4c, 0x4c, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, + 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x49, 0x4c, 0x73, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x49, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x34, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x49, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7d, 0x7b, 0x2e, 0x28, 0x29, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, + 0x5c, 0x2e, 0x2e, 0x77, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, + 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x33, 0x33, 0x33, 0x33, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x73, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x32, 0x32, 0x32, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x49, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2e, + 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, + 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x6e, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x4c, 0x49, 0x52, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x54, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x30, 0x30, 0x30, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x6e, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x2f, 0x4c, 0x4c, 0x4c, 0x5c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x23, 0x33, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x46, 0x77, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x65, 0x46, 0x31, 0x23, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x4c, + 0x4c, 0x4c, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, + 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x49, 0x4c, 0x73, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x49, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x4a, 0x01, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0xff, 0x01, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0xff, 0x03, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x50, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x04, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0xff, 0x00, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x03, 0x02, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x04, + 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0x02, 0x03, 0x07, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0x02, 0x03, 0x05, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7b, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x07, 0x02, 0x07, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x03, 0x02, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x03, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x07, 0x03, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x07, 0xff, 0x07, 0x08, 0x03, 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x28, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0xff, 0x07, 0x06, 0x03, 0x07, 0x01, 0x01, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0xff, 0x03, 0x00, + 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0xff, 0xff, 0x00, 0xff, 0x07, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x02, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x03, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x09, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x06, 0x03, 0x0a, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x0b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0xff, 0x00, 0x02, 0x04, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf2, 0x00, + 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, + 0xff, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x08, + 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x07, 0xff, 0x00, + 0xff, 0x09, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x01, 0x00, 0x01, 0x05, 0x0b, + 0x0a, 0x06, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x0b, 0x0a, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, + 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xff, 0x00, 0x03, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x05, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x06, 0x01, 0x04, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x07, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0xb8, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x00, 0x05, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, + 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x01, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x02, 0x05, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x01, 0x02, 0x00, 0x02, 0x08, 0x00, 0x01, + 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x01, + 0xff, 0x00, 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x43, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, + 0x99, 0x99, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x02, + 0x00, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0x0a, 0x06, 0x02, 0x07, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0x0a, 0x01, 0x02, 0x07, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x07, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x07, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x01, 0xff, 0x00, + 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x43, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x99, 0x99, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa2, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x01, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x45, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, + 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x07, 0x09, 0x04, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0x09, 0x04, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x07, 0xff, 0xff, 0x00, 0xff, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x07, 0x09, 0xff, 0x00, 0x0a, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x04, 0x06, 0x02, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x01, 0x03, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x05, 0x03, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x05, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xff, 0x00, 0x05, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x03, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x05, 0x07, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x02, 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x02, 0x0a, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x02, 0x0b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x02, 0x02, 0x07, 0x01, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, + 0xcc, 0xcc, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0xff, 0x00, 0x02, 0x02, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x05, 0x06, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x06, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xff, 0x00, + 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x02, 0xff, 0x00, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0x06, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0xff, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x02, 0xff, 0x00, 0xff, 0x06, 0x00, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x04, 0x0a, 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x00, 0x05, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x03, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x00, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb8, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, + 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x07, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0xff, 0xff, 0x00, 0xff, 0x08, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x0c, 0xff, 0x00, 0xff, 0x08, + 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x66, 0x66, 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0xff, 0xff, 0x00, 0xff, 0x08, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x08, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0x08, 0xff, 0x02, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x0c, + 0xff, 0x00, 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x0b, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x0b, 0x02, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x02, 0x01, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x05, 0x03, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x76, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x03, 0x03, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x07, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7b, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x03, 0x02, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x03, 0x03, + 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0x03, 0x01, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0xa2, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x00, 0x05, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x03, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x01, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x03, 0x03, 0x01, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x03, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x05, 0x01, 0x06, 0x06, + 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x07, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, + 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, + 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x05, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0xff, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x09, + 0xff, 0x01, 0xff, 0x09, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x66, 0x66, 0x00, 0x00, 0x7d, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x09, 0xff, 0x01, 0xff, 0x09, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x01, 0x01, 0x01, 0x09, 0x09, 0x05, 0x01, 0x03, 0x09, + 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x09, 0x0b, 0xff, 0x01, 0x03, 0x09, 0x02, 0x01, 0x00, 0x00, 0x03, 0x00, 0xcc, 0xcc, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x02, + 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x52, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x02, + 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x08, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x05, 0x04, 0x03, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3a, 0x00, + 0x00, 0x00, 0x59, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, + 0x20, 0x6c, 0x75, 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x73, + 0x74, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x27, 0x72, 0x65, 0x20, 0x6f, 0x62, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x6c, 0x79, 0x20, 0x66, 0x75, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x0a, 0x80, 0x00, 0x00, 0x00, + 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, + 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x7f, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, + 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, + 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, + 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, + 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, + 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0xa9, + 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x31, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x75, 0x70, 0x6e, 0x6f, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x64, 0x6f, 0x77, + 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, + 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, 0x00, + 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x31, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, + 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, + 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, + 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, + 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0xb1, + 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x65, 0x6c, 0x6c, + 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x73, 0x74, 0x64, 0x6d, 0x61, 0x74, 0x74, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, + 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, + 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, + 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x9a, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x6c, 0x61, 0x73, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0xa9, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x33, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x75, 0x70, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x6e, 0x6f, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x68, + 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, + 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, 0x00, 0x61, + 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x33, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, + 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, + 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x9b, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, + 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, + 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x9a, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x6c, 0x61, 0x73, + 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, + 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, + 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x6c, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0xa7, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x75, 0x70, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, + 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, + 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, + 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, + 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x70, 0x31, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, + 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, + 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x9a, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, + 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, + 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, + 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, + 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, + 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, + 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, + 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, + 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, + 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x70, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, + 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, + 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, +}; + +#endif diff --git a/mz_frontend/include/font.h b/mz_frontend/include/font.h new file mode 100644 index 000000000..1d6c67427 --- /dev/null +++ b/mz_frontend/include/font.h @@ -0,0 +1,49 @@ +/* + Created by Daniel Monteiro on 11/07/2023. +*/ + +#ifndef DERELICT8_FONT_H +#define DERELICT8_FONT_H + +/* Adding const here actually doubles the ROM size! */ +static uint8_t font[] = { + /* ASCII table starting on SPACE. */ + /* Being on line 32 is no accident. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* space */ + , 0x10, 0x38, 0x38, 0x10, 0x10, 0x00, 0x10, 0x00, 0x6c, 0x6c, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x7c, 0x28, 0x28, 0x7c, 0x28, 0x00, 0x20, 0x38, 0x40, 0x30, 0x08, 0x70, 0x10, 0x00, 0x64, 0x64, 0x08, 0x10, + 0x20, 0x4c, 0x4c, 0x00, 0x20, 0x50, 0x50, 0x20, 0x54, 0x48, 0x34, 0x00, 0x30, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x00, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x00, + 0x00, 0x28, 0x38, 0x7c, 0x38, 0x28, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x30, 0x20, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x30, 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00 /* space - 15 */ + , 0x38, 0x44, 0x4c, 0x54, 0x64, 0x44, 0x38, 0x00 /* 0 */ + , 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x38, 0x44, 0x04, 0x18, 0x20, 0x40, 0x7c, 0x00, 0x38, 0x44, + 0x04, 0x38, 0x04, 0x44, 0x38, 0x00, 0x08, 0x18, 0x28, 0x48, 0x7c, 0x08, 0x08, 0x00, 0x7c, 0x40, 0x40, 0x78, + 0x04, 0x44, 0x38, 0x00, 0x18, 0x20, 0x40, 0x78, 0x44, 0x44, 0x38, 0x00, 0x7c, 0x04, 0x08, 0x10, 0x20, 0x20, + 0x20, 0x00, 0x38, 0x44, 0x44, 0x38, 0x44, 0x44, 0x38, 0x00, 0x38, 0x44, 0x44, 0x3c, 0x04, 0x08, 0x30, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x20, 0x08, 0x10, + 0x20, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, + 0x08, 0x10, 0x20, 0x00, 0x38, 0x44, 0x04, 0x18, 0x10, 0x00, 0x10, 0x00, 0x38, 0x44, 0x5c, 0x54, 0x5c, 0x40, + 0x38, 0x00 /* 0 */ + , 0x38, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x00 /* a */ + , 0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x78, 0x00, 0x38, 0x44, 0x40, 0x40, 0x40, 0x44, 0x38, 0x00, 0x78, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x78, 0x00, 0x7c, 0x40, 0x40, 0x78, 0x40, 0x40, 0x7c, 0x00, 0x7c, 0x40, 0x40, 0x78, + 0x40, 0x40, 0x40, 0x00, 0x38, 0x44, 0x40, 0x5c, 0x44, 0x44, 0x3c, 0x00, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, + 0x44, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x38, 0x00, + 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7c, 0x00, 0x44, 0x6c, + 0x54, 0x44, 0x44, 0x44, 0x44, 0x00, 0x44, 0x64, 0x54, 0x4c, 0x44, 0x44, 0x44, 0x00, 0x38, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x38, 0x00, 0x78, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00, 0x38, 0x44, 0x44, 0x44, 0x54, 0x48, + 0x34, 0x00, 0x78, 0x44, 0x44, 0x78, 0x48, 0x44, 0x44, 0x00, 0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x38, 0x00, + 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x28, 0x10, 0x00, 0x44, 0x44, 0x54, 0x54, 0x54, 0x54, 0x28, 0x00, 0x44, 0x44, 0x28, 0x10, + 0x28, 0x44, 0x44, 0x00, 0x44, 0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x00, 0x78, 0x08, 0x10, 0x20, 0x40, 0x40, + 0x78, 0x00, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, + 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x30, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x08, + 0x30, 0x40, 0x78, 0x00, 0x18, 0x20, 0x20, 0x60, 0x20, 0x20, 0x18, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, + 0x10, 0x00, 0x30, 0x08, 0x08, 0x0c, 0x08, 0x08, 0x30, 0x00, 0x28, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x38, 0x6c, 0x44, 0x44, 0x7c, 0x00, 0x00 +}; + +#endif /* DERELICT8_FONT_H */ diff --git a/mz_frontend/include/map.h b/mz_frontend/include/map.h new file mode 100755 index 000000000..257426c87 --- /dev/null +++ b/mz_frontend/include/map.h @@ -0,0 +1,6 @@ +#ifndef MAP_H +#define MAP_H + +extern int8_t map[32][32]; + +#endif diff --git a/mz_frontend/AmigaVersion/AmigaInt.h b/mz_frontend/src/AmigaVersion/AmigaInt.h similarity index 100% rename from mz_frontend/AmigaVersion/AmigaInt.h rename to mz_frontend/src/AmigaVersion/AmigaInt.h diff --git a/mz_frontend/AmigaVersion/AmigaRenderer.c b/mz_frontend/src/AmigaVersion/AmigaRenderer.c similarity index 58% rename from mz_frontend/AmigaVersion/AmigaRenderer.c rename to mz_frontend/src/AmigaVersion/AmigaRenderer.c index 22e3226c7..fd09c8bcf 100644 --- a/mz_frontend/AmigaVersion/AmigaRenderer.c +++ b/mz_frontend/src/AmigaVersion/AmigaRenderer.c @@ -1,9 +1,10 @@ +#include +#include +#include #include #include #include -#include #include -#include #include #include @@ -15,46 +16,20 @@ #include #include "AmigaInt.h" + +#include "Enums.h" #include "Core.h" #include "Derelict.h" -#include "Engine3D.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" +#include "font.h" #define REG(xn, parm) parm __asm(#xn) #define REGARGS __regargs #define NORMALIZE(x) (((x * 16) / 256)) -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; - -char *menuItems[] = { - "8) Use/Toggle", - "5) Use with...", - "9) Use/pick...", - "6) Drop", - "7) Next item", - "4) Next in room", -}; - -void graphicsFlush(void); - -void nextItemInHand(void); - -void useItemInHand(void); - -void nextItemInRoom(void); - -void interactWithItemInRoom(void); - -void pickOrDrop(void); - -void dropItem(void); - -void pickItem(void); - -void clearGraphics(void); - extern void REGARGS c2p1x1_4_c5_bm( REG(d0, UWORD chunky_x), @@ -75,6 +50,17 @@ struct Screen *screen; uint8_t *framebuffer; uint8_t bufferInput = '.'; +extern uint8_t firstFrameOnCurrentState; +extern enum EGameMenuState currentGameMenuState; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION +extern uint8_t roomTransitionAnimationStep; +#endif + +extern enum EDirection playerDirection; +extern int8_t cameraX; +extern int8_t cameraZ; + struct NewScreen xnewscreen = { 0, /* LeftEdge*/ 0, /* TopEdge */ @@ -115,8 +101,6 @@ struct NewWindow my_new_window = { CUSTOMSCREEN /* Type */ }; -long frame = 0; - /* * Code lifted (and heavily modified) from the Strife AGA port by Lantus * https://github.com/lantus/Strife/blob/master/i_video.c @@ -128,52 +112,6 @@ static UWORD emptypointer[] = { 0x0000, 0x0000 /* reserved, must be NULL */ }; -void init(void) { - - framebuffer = (uint8_t *) calloc(1, 128 * 128); - - IntuitionBase = - (struct IntuitionBase *) OpenLibrary("intuition.library", 0); - - if (IntuitionBase == NULL) { - puts("nope 1!"); - exit(0); - } - - if ((screen = OpenScreen(&xnewscreen)) == NULL) { - } - - my_new_window.Screen = screen; - - my_window = (struct Window *) OpenWindow(&my_new_window); - - if (my_window == NULL) { - puts("nope 2!"); - CloseLibrary((struct Library *) IntuitionBase); - exit(0); - } - - SetRGB4(&screen->ViewPort, 0, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 1, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 2, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 3, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 4, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 5, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 6, NORMALIZE(0xAA), NORMALIZE(0x55), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 7, NORMALIZE(0xAA), NORMALIZE(0xAA), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 8, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 9, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0xFF)); - SetRGB4(&screen->ViewPort, 10, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 11, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0xFF)); - SetRGB4(&screen->ViewPort, 12, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 13, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0xFF)); - SetRGB4(&screen->ViewPort, 14, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 15, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0xFF)); - - - SetPointer(my_window, emptypointer, 1, 16, 0, 0); -} - /* * Code lifted (and heavily modified) from the Strife AGA port by Lantus * https://github.com/lantus/Strife/blob/master/i_video.c @@ -264,6 +202,15 @@ void handleSystemEvents(void) { bufferInput = 'q'; break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + bufferInput = code; + break; + case '\n': case '\r': case 'i': @@ -316,18 +263,10 @@ void handleSystemEvents(void) { } } -uint8_t getKey(void) { - handleSystemEvents(); - uint8_t toReturn = bufferInput; - bufferInput = '.'; - return toReturn; -} - -void clear(void) {} void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - framebuffer[(128 * y) + x] = colour; + framebuffer[(256 * y) + x] = colour; } void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { @@ -356,11 +295,11 @@ void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { _y1 = 127; } - ptr = &framebuffer[(128 * _y0) + (x0)]; + ptr = &framebuffer[(256 * _y0) + (x0)]; for (int16_t y = _y0; y <= _y1; ++y) { *ptr = colour; - ptr += 128; + ptr += 256; } } @@ -385,7 +324,7 @@ void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { _x1 = 127; } - uint8_t *ptr = &framebuffer[(128 * y) + _x0]; + uint8_t *ptr = &framebuffer[(256 * y) + _x0]; for (int16_t x = _x0; x <= _x1; ++x) { *ptr++ = colour; } @@ -399,42 +338,334 @@ void shutdownGraphics(void) { } void realPut(int x, int y, uint8_t value) { + if (x < 0) { + x = 0; + } + + if (x >= 256) { + x = 255; + } + + if (y < 0) { + y = 0; + } + + if (y >= 160) { + y = 159; + } + framebuffer[(256 * y) + x] = value; } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memset(framebuffer, 0, 256 * 160); } void clearScreen(void) { } +void graphicsFlush(void) { + c2p1x1_4_c5_bm(256, 160, 0, 0, &framebuffer[0], my_window->RPort->BitMap); +} + +char playerPositionSprite[4][8]={ + { + 0b00011000, + 0b00111100, + 0b01111110, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00100000, + 0b01100000, + 0b11100000, + 0b11100000, + 0b01100000, + 0b00100000, + 0b00000000, + 0b00000000 + }, + { + 0b01111110, + 0b00111100, + 0b00011000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00000100, + 0b00000110, + 0b00000111, + 0b00000111, + 0b00000110, + 0b00000100, + 0b00000000, + 0b00000000 + }, +}; + +void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { -void writeStrWithLimit(int _x, int y, const char *text, int limitX) { + for(uint8_t c = 0; c < 8; ++c) { + uint8_t line = *sprite; + for (uint16_t d = 0; d < 8; ++d) { + if (line & 1) { + realPut( x + d, y + c, colour); + } + line = line >> 1; + } + ++sprite; + } } -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 40); +uint8_t *graphicsPutAddr(uint8_t x, uint8_t y, uint8_t colour, uint8_t *ptrToByte) { + } -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} +void graphicsPutPointArray(uint8_t *y128Values) { -void graphicsFlush(void) { - c2p1x1_4_c5_bm(128, 128, 0, 0, &framebuffer[0], my_window->RPort->BitMap); } -void showMessage(const char *message) { + +void initHW(int argc, char **argv) { + + framebuffer = (uint8_t *) calloc(1, 256 * 160); + + IntuitionBase = + (struct IntuitionBase *) OpenLibrary("intuition.library", 0); + + if (IntuitionBase == NULL) { + puts("nope 1!"); + exit(0); + } + + if ((screen = OpenScreen(&xnewscreen)) == NULL) { + } + + my_new_window.Screen = screen; + + my_window = (struct Window *) OpenWindow(&my_new_window); + + if (my_window == NULL) { + puts("nope 2!"); + CloseLibrary((struct Library *) IntuitionBase); + exit(0); + } + + SetRGB4(&screen->ViewPort, 0, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 1, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 2, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 3, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 4, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 5, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 6, NORMALIZE(0xAA), NORMALIZE(0x55), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 7, NORMALIZE(0xAA), NORMALIZE(0xAA), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 8, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 9, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0xFF)); + SetRGB4(&screen->ViewPort, 10, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 11, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0xFF)); + SetRGB4(&screen->ViewPort, 12, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 13, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0xFF)); + SetRGB4(&screen->ViewPort, 14, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 15, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0xFF)); + + + SetPointer(my_window, emptypointer, 1, 16, 0, 0); + + initKeyboardUI(); + clearGraphics(); +} + +enum ECommand getInput(void) { + + + switch(bufferInput) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } + + fontTop++; + } + dstX += 8; + } +} + + +void startFrame(int x, int y, int width, int height) { } -void titleScreen(void) { +void endFrame(void) { + + if (currentGameMenuState == kPlayGame) { + put_sprite_8( + (XRES_FRAMEBUFFER / 2) + ((cameraX + 6) * 3) - 1, + (cameraZ * 3) + 10, + &playerPositionSprite[playerDirection][0], + 1 + ); + } + graphicsFlush(); } -void HUD_initialPaint(void) { + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } } -void sleepForMS(uint32_t ms) { +void enterTextMode(void) {} + +void exitTextMode(void) { + clearScreen(); } -void HUD_refresh(void) { + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } } diff --git a/mz_frontend/AtariVersion/AtariInt.h b/mz_frontend/src/AtariVersion/AtariInt.h similarity index 100% rename from mz_frontend/AtariVersion/AtariInt.h rename to mz_frontend/src/AtariVersion/AtariInt.h diff --git a/mz_frontend/AtariVersion/AtariRenderer.c b/mz_frontend/src/AtariVersion/AtariRenderer.c similarity index 50% rename from mz_frontend/AtariVersion/AtariRenderer.c rename to mz_frontend/src/AtariVersion/AtariRenderer.c index 84cf13825..ebe98156e 100644 --- a/mz_frontend/AtariVersion/AtariRenderer.c +++ b/mz_frontend/src/AtariVersion/AtariRenderer.c @@ -6,57 +6,31 @@ #include #include #include - -#include "AtariInt.h" -#include "Core.h" -#include "Derelict.h" -#include "Engine3D.h" - #include -#include -#include -#include #include #include #include -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; - -char *menuItems[] = { - "8) Use/Toggle", - "5) Use with...", - "9) Use/pick...", - "6) Drop", - "7) Next item", - "4) Next in room", -}; - -void graphicsFlush(void); - -void nextItemInHand(void); - -void useItemInHand(void); - -void nextItemInRoom(void); - -void interactWithItemInRoom(void); - -void pickOrDrop(void); - -void dropItem(void); - -void pickItem(void); - -void clearGraphics(void); +#include "AtariInt.h" +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" +#include "font.h" uint16_t *physBase; uint16_t *logBase; +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; + uint8_t *framebuffer; uint8_t bufferInput = '.'; +extern uint8_t firstFrameOnCurrentState; #define NORMALIZE(x) (((x * 8) / 256)) @@ -64,8 +38,8 @@ void framebuffer_set_palette_entry(int index, int red, int green, int blue) { *(uint16_t *) (0xffff8240 + (index * 2)) = blue | (green << 4) | (red << 8); } -void init(void) { - framebuffer = (uint8_t *) calloc(1, 128 * 128); +void initHW(int argc, char** argv) { + framebuffer = (uint8_t *) calloc(1, 256 * 160); physBase = Physbase(); logBase = Logbase(); @@ -91,22 +65,116 @@ void init(void) { framebuffer_set_palette_entry(15, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0xFF)); } -/*Same as above*/ void handleSystemEvents(void) { bufferInput = Cnecin(); } -uint8_t getKey(void) { - handleSystemEvents(); - uint8_t toReturn = bufferInput; - bufferInput = '.'; - return toReturn; +void endFrame(void) { + + uint8_t *index = &framebuffer[0]; + uint16_t lineOffset = 0; + uint16_t *words = (uint16_t *) logBase; + + for (uint16_t y = 160; y; y--) { + memset(logBase + lineOffset, 0, 80); + for (uint16_t x = 0; x < 256; ++x) { + + uint8_t value = *index++; + uint16_t offset = lineOffset + ((x >> 4) << 2); + uint16_t bitPattern = (1 << (15 - (x & 15))); + uint16_t *ptr = &words[offset]; + + if (value & 1) { + *ptr |= bitPattern; + } + + ptr++; + + if (value & 2) { + *ptr |= bitPattern; + } + + ptr++; + + if (value & 4) { + *ptr |= bitPattern; + } + + ptr++; + + if (value & 8) { + *ptr |= bitPattern; + } + } + lineOffset += 80; + } + + uint16_t *tmp; + tmp = physBase; + physBase = logBase; + logBase = tmp; + Setscreen(logBase, physBase, -1); } -void clear(void) {} +enum ECommand getInput(void) { + + switch(bufferInput) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - framebuffer[(128 * y) + x] = colour; + framebuffer[(256 * y) + x] = colour; +} + +void realPut(int x, int y, uint8_t colour) { + framebuffer[(256 * y) + x] = colour; +} + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } } void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t pixel) { @@ -135,11 +203,11 @@ void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t pixel) { _y1 = 127; } - ptr = &framebuffer[(128 * _y0) + (x0)]; + ptr = &framebuffer[(256 * _y0) + (x0)]; for (int16_t y = _y0; y <= _y1; ++y) { *ptr = pixel; - ptr += 128; + ptr += 256; } } @@ -164,92 +232,118 @@ void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { _x1 = 127; } - uint8_t *ptr = &framebuffer[(128 * y) + _x0]; + uint8_t *ptr = &framebuffer[(256 * y) + _x0]; for (int16_t x = _x0; x <= _x1; ++x) { *ptr++ = colour; } } -void shutdownGraphics(void) { -} - -void realPut(int x, int y, uint8_t value) { +void clearScreen(void) { + memset(framebuffer, 0, 256 * 160); } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memset(framebuffer, 0, 256 * 160); } -void clearScreen(void) { -} +void startFrame(int x, int y, int width, int height) { -void writeStrWithLimit(int _x, int y, const char *text, int limitX) { } -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 40); -} +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} + if (x0 == x1 && y0 == y1) break; -void graphicsFlush(void) { + realPut(x0, y0, colour); - uint8_t *index = &framebuffer[0]; - uint16_t lineOffset = 0; - uint16_t *words = (uint16_t *) logBase; + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} - for (uint16_t y = 127; y; y--) { - memset(logBase + lineOffset, 0, 80); - for (uint16_t x = 0; x < 128; ++x) { +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { - uint8_t value = *index++; - uint16_t offset = lineOffset + ((x >> 4) << 2); - uint16_t bitPattern = (1 << (15 - (x & 15))); - uint16_t *ptr = &words[offset]; + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; - if (value & 1) { - *ptr |= bitPattern; - } + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; - ptr++; + for (c = 0; c < len; ++c) { - if (value & 2) { - *ptr |= bitPattern; - } + char currentChar = text[c]; - ptr++; + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } - if (value & 4) { - *ptr |= bitPattern; - } + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } - ptr++; + if (dstY >= YRES_FRAMEBUFFER) { + return; + } - if (value & 8) { - *ptr |= bitPattern; + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } } } - lineOffset += 80; - } - uint16_t *tmp; - tmp = physBase; - physBase = logBase; - logBase = tmp; - Setscreen(logBase, physBase, -1); -} -void showMessage(const char *message) { -} + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } -void titleScreen(void) { -} + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; -void HUD_initialPaint(void) { -} + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; -void sleepForMS(uint32_t ms) { -} + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } -void HUD_refresh(void) { + fontTop++; + } + dstX += 8; + } } diff --git a/mz_frontend/src/Crawler.c b/mz_frontend/src/Crawler.c new file mode 100644 index 000000000..cd107e452 --- /dev/null +++ b/mz_frontend/src/Crawler.c @@ -0,0 +1,273 @@ +/* + Created by monty on 01-10-2023. +*/ +#include +#include + +#include "Common.h" +#include "Enums.h" +#include "UI.h" +#include "Renderer.h" +#include "Core.h" +#include "Derelict.h" +#include "map.h" +#include "Engine.h" +#include "map.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" + + +int8_t map[32][32]; + +extern int8_t stencilHigh[XRES]; +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern uint8_t accessGrantedToSafe; +extern int8_t cameraX; +extern int8_t cameraZ; +extern int8_t cameraRotation; +extern uint8_t enteredFrom; +extern uint8_t playerLocation; +extern struct MapWithCharKey tileProperties; + +uint8_t needsToRedrawVisibleMeshes; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION +uint8_t roomTransitionAnimationStep = 0; +#endif + +void HUD_refresh(void) { + if (!needsToRedrawHUD) { + return; + } + + needsToRedrawHUD = 0; + + drawWindow(0, + (128 / 8), + (XRES_FRAMEBUFFER / 8) / 2, + (YRES_FRAMEBUFFER / 8) - 17, + "Status"); + + drawTextAt(1, YRES_TEXT - 7, "In room:", 2); + drawTextAt(1, YRES_TEXT - 4, "In hand:", 2); + + struct Item *item; + + /* Display "In room" item */ + if (roomItem != NULL) { + item = getItem(roomItem->item); + if (item->active) { + drawTextAt(1, YRES_TEXT - 6, "*", 2); + } + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); + } else { + drawTextAt(2, YRES_TEXT - 6, "Nothing", 2); + } + + /* Display "In hand" item */ + if (focusedItem != NULL) { + item = getItem(focusedItem->item); + if (item->active) { + drawTextAt(1, YRES_TEXT - 3, "*", 1); + } + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 3, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); + } else { + drawTextAt(2, YRES_TEXT - 3, "Nothing", 2); + } +} + +enum EGameMenuState Crawler_tickCallback(enum ECommand cmd, void* data) { + (void)data; + uint8_t prevX; + uint8_t prevZ; + struct WorldPosition *pos; + uint8_t previousLocation = playerLocation; + uint8_t newCell = 0; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION + if (roomTransitionAnimationStep) { + needsToRedrawVisibleMeshes = 1; + return kResumeCurrentState; + } +#endif + + prevX = cameraX; + prevZ = cameraZ; + + switch (cmd) { + case kCommandFire5: + nextItemInHand(); + break; + + case kCommandFire6: + nextItemInRoom(); + break; + + case kCommandFire1: + useItemInHand(); + break; + + case kCommandFire2: + interactWithItemInRoom(); + break; + + case kCommandFire3: + pickItem(); + break; + + case kCommandFire4: + dropItem(); + break; + default: + goto handle_directions; + } + updateMapItems(); + needsToRedrawVisibleMeshes = 1; + + if (!waitForKey) { + needsToRedrawHUD = 1; + } + + return kResumeCurrentState; +handle_directions: + switch (cmd) { + case kCommandLeft: + turnLeft(); + break; + + case kCommandRight: + turnRight(); + break; + + case kCommandStrafeLeft: + walkBy(3); + break; + case kCommandStrafeRight: + walkBy(1); + break; + case kCommandDown: + walkBy(2); + break; + case kCommandUp: + walkBy(0); + break; + case kCommandNone: + return kResumeCurrentState; + } + needsToRedrawVisibleMeshes = 1; + cameraRotation = getPlayerDirection(); + pos = getPlayerPosition(); + + cameraX = pos->x; + cameraZ = pos->y; + + switch (cameraRotation) { + case 0: + newCell = map[cameraZ - 2][cameraX]; + break; + case 1: + newCell = map[cameraZ][cameraX + 2]; + break; + case 2: + newCell = map[cameraZ + 2][cameraX]; + break; + case 3: + newCell = map[cameraZ][cameraX - 2]; + break; + } + + newCell = newCell & 127; + + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, newCell); + + + if (prop->mBlockMovement) { + pos->x = cameraX = prevX; + pos->y = cameraZ = prevZ; + setPlayerPosition(pos); + } + + /* unlike MX, we are signaling from the origin into the new room. MX allows for the movement and then searches where + * did the player came from - hence the "opposite direction" there */ + + if (newCell > ('0' - 1) && newCell < ('3' + 1)) { + enteredFrom = newCell - '0'; + moveBy(enteredFrom); + } + + if (playerLocation != previousLocation) { + initMap(); + + if (newCell == NEUTRAL_CELL) { + newCell = '0'; +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION + } else { + roomTransitionAnimationStep = 30; +#endif + } + setPlayerDirection(cameraRotation = (newCell - '0')); + } else { + enteredFrom = 0xFF; + } + return kResumeCurrentState; +} + +void Crawler_repaintCallback(void) { + + if (firstFrameOnCurrentState) { + clearScreen(); + redrawMap = needsToRedrawHUD = 1; + HUD_initialPaint(); + } + + HUD_refresh(); + drawMap(); + + if (!needsToRedrawVisibleMeshes) { + return; + } +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION + if (roomTransitionAnimationStep) { + roomTransitionAnimationStep = 0; + for (uint16_t y = 32; y >= 2; --y) { + clearGraphics(); + + vLine(y, y, 95 + (32 - y), 1); + vLine(95 + (32 - y), y, 95 + (32 - y), 1); + + for (uint16_t x = y; x < (95 + (32 - y)); ++x) { + graphicsPut(x, y, 7); + graphicsPut(x, 95 + (32 - y), 7); + + //door opening + vLine(x, y, 95 - 3 * (32 - y), 7); + } + } + } else +#endif + { + renderScene(); + } +} + +void Crawler_initStateCallback(enum EGameMenuState tag) { + (void)tag; + + enteredFrom = 0; + cameraRotation = 0; + initStation(); + focusedItem = getPlayerItems(); + setErrorHandlerCallback(showMessage); + setLoggerDelegate(showMessage); + initMap(); + needsToRedrawVisibleMeshes = 1; +} + +void Crawler_unloadStateCallback(enum EGameMenuState newState) { + (void)newState; + needsToRedrawVisibleMeshes = 0; +} + diff --git a/mz_frontend/Engine3D/Engine3D.c b/mz_frontend/src/Engine3D/Engine3D.c similarity index 99% rename from mz_frontend/Engine3D/Engine3D.c rename to mz_frontend/src/Engine3D/Engine3D.c index 522cd051e..1967c0602 100644 --- a/mz_frontend/Engine3D/Engine3D.c +++ b/mz_frontend/src/Engine3D/Engine3D.c @@ -14,12 +14,10 @@ #endif #ifndef SMD - #include #include #include #include - #else #include int puts( const char* str ); @@ -1470,7 +1468,7 @@ int main(int argc, char **argv) { initFileReader("base.pfs"); init(); - + Crawler_initStateCallback(0); diff --git a/mz_frontend/Engine3D/Engine3D.h b/mz_frontend/src/Engine3D/Engine3D.h similarity index 100% rename from mz_frontend/Engine3D/Engine3D.h rename to mz_frontend/src/Engine3D/Engine3D.h diff --git a/mz_frontend/Engine3D/HackingMinigame.c b/mz_frontend/src/Engine3D/HackingMinigame.c similarity index 100% rename from mz_frontend/Engine3D/HackingMinigame.c rename to mz_frontend/src/Engine3D/HackingMinigame.c diff --git a/mz_frontend/Engine3D/HackingMinigame.h b/mz_frontend/src/Engine3D/HackingMinigame.h similarity index 100% rename from mz_frontend/Engine3D/HackingMinigame.h rename to mz_frontend/src/Engine3D/HackingMinigame.h diff --git a/mz_frontend/Engine3D/basepfs.h b/mz_frontend/src/Engine3D/basepfs.h similarity index 100% rename from mz_frontend/Engine3D/basepfs.h rename to mz_frontend/src/Engine3D/basepfs.h diff --git a/mz_frontend/Engine3D/map.h b/mz_frontend/src/Engine3D/map.h similarity index 100% rename from mz_frontend/Engine3D/map.h rename to mz_frontend/src/Engine3D/map.h diff --git a/mz_frontend/src/Events.c b/mz_frontend/src/Events.c new file mode 100755 index 000000000..c548449ad --- /dev/null +++ b/mz_frontend/src/Events.c @@ -0,0 +1,210 @@ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include +#include + +#include "Common.h" +#include "FixP.h" +#include "Core.h" +#include "Enums.h" +#include "Renderer.h" +#include "Engine.h" +#include "PackedFileReader.h" +#include "CTile3DProperties.h" + +extern int8_t map[32][32]; + +extern int8_t stencilHigh[XRES]; + +struct ObjectNode *focusedItem = NULL; +struct ObjectNode *roomItem = NULL; + +extern uint8_t accessGrantedToSafe; + +extern struct MapWithCharKey tileProperties; +extern struct MapWithCharKey customMeshes; + + +int8_t cameraX = 33; +int8_t cameraZ = 22; +extern int8_t cameraRotation; + +uint8_t enteredFrom = 0xFF; + +extern uint8_t playerLocation; + +void pickItem(void) { + struct Room *room = getRoom(getPlayerRoom()); + + if (roomItem && roomItem->item) { + struct Item *itemToPick = getItem(roomItem->item); + if (itemToPick != NULL) { + + if (!strcmp(itemToPick->name, "digital-safe")) { + +#ifdef SUPPORTS_HACKING_MINIGAME + enterState(kHackingGame); +#else + accessGrantedToSafe = TRUE; +#endif + return; + } + + if (itemToPick->pickable) { + + uint8_t pattern = map[itemToPick->position.y][itemToPick->position.x]; + map[itemToPick->position.y][itemToPick->position.x] = pattern & 127; + + pickObject(itemToPick); + focusedItem = roomItem; + roomItem = room->itemsPresent->next; + + } else { + useObjectNamed(itemToPick->name); + } + } + } +} + +void dropItem(void) { + + struct Item *item = NULL; + + if (focusedItem != NULL) { + item = getItem(focusedItem->item); + } + + if (item != NULL) { + uint8_t pattern; + struct WorldPosition *pos = getPlayerPosition(); + + dropObjectToRoom(getPlayerRoom(), item); + + focusedItem = getPlayerItems(); + + roomItem = &objectNodes[item->index]; + + switch (cameraRotation) { + case 0: + item->position.x = pos->x; + item->position.y = pos->y - 3; + break; + + case 1: + item->position.x = pos->x + 3; + item->position.y = pos->y; + break; + + case 2: + item->position.x = pos->x; + item->position.y = pos->y + 3; + break; + + case 3: + item->position.x = pos->x - 3; + item->position.y = pos->y; + break; + } + pattern = map[item->position.y][item->position.x]; + map[item->position.y][item->position.x] = pattern | 128; + } +} + +void nextItemInRoom(void) { + struct Room *room = getRoom(getPlayerRoom()); + + if (roomItem == NULL) { + return; + } + + roomItem = roomItem->next; + + if (!roomItem) { + roomItem = room->itemsPresent; + } + + if (roomItem->item == 0) { + roomItem = roomItem->next; + } +} + +void interactWithItemInRoom(void) { + if (roomItem && focusedItem) { + struct Item *itemToPick = getItem(roomItem->item); + struct Item *item = getItem(focusedItem->item); + if (itemToPick && item && item->useWithCallback) { + item->useWithCallback(item, itemToPick); + } + } +} + +void useItemInHand(void) { + useObjectNamed(getItem(focusedItem->item)->name); +} + +void nextItemInHand(void) { + focusedItem = focusedItem->next; + + if (!focusedItem) { + focusedItem = getPlayerItems(); + } +} + +void initMap(void) { + int x, y; + const uint8_t *head; + char buffer[32]; + uint16_t current; + + roomItem = getRoom(getPlayerRoom())->itemsPresent->next; + + sprintf(&buffer[0], "map%d.txt", getPlayerRoom()); + + struct StaticBuffer datafile = loadBinaryFileFromPath(&buffer[0]); + head = datafile.data; + + for (y = 0; y < 32; ++y) { + for (x = 0; x < 32; ++x) { + + current = *head; + + + if ((current == 's' && enteredFrom == 0) || + (current == 'w' && enteredFrom == 1) || + (current == 'n' && enteredFrom == 2) || + (current == 'e' && enteredFrom == 3)) { + + struct WorldPosition newPos; + cameraX = x; + cameraZ = y; + newPos.x = x; + newPos.y = y; + setPlayerPosition(&newPos); + enteredFrom = 0xFF; + current = '.'; + } + + map[y][x] = current; + ++head; + } + ++head; // line break + } + + disposeDiskBuffer(datafile); + + sprintf(&buffer[0], "props%d.bin", getPlayerRoom()); + loadPropertyList(&buffer[0], &tileProperties, &customMeshes); + + //updateMapItems(); + HUD_initialPaint(); +} diff --git a/mz_frontend/src/GameMenu.c b/mz_frontend/src/GameMenu.c new file mode 100644 index 000000000..d050bf62e --- /dev/null +++ b/mz_frontend/src/GameMenu.c @@ -0,0 +1,22 @@ +/* + Created by monty on 01-10-2023. +*/ + +#include "Enums.h" + +void GameMenu_initStateCallback(enum EGameMenuState tag) { + (void)tag; +} + +void GameMenu_repaintCallback(void) {} + +enum EGameMenuState GameMenu_tickCallback(enum ECommand cmd, void* data) { + (void)cmd; + (void)data; + /* This never gets executed, so not a problem for not having the return value */ +} + +void GameMenu_unloadStateCallback(enum EGameMenuState newState) { + (void)newState; +} + diff --git a/mz_frontend/src/GamepadUI.c b/mz_frontend/src/GamepadUI.c new file mode 100644 index 000000000..3afc9545c --- /dev/null +++ b/mz_frontend/src/GamepadUI.c @@ -0,0 +1,41 @@ +/* + Created by monty on 18-07-2023. +*/ +#include + +#include "Enums.h" +#include "Renderer.h" +#include "UI.h" +#include "GamepadUI.h" + +extern uint8_t firstFrameOnCurrentState; + +const char *menuItems[] = { + "Use/Toggle", + "Use with", + "Use/pick", + "Drop", + "Next(item)", + "Next(room)", +}; + +void initGamepadUI(void) { + cursorPosition = 0; +} + +enum ECommand performActionJoypad(void) { + return kCommandFire1 + cursorPosition; +} + +void HUD_initialPaint(void) { + + drawWindowWithOptions( + 1 + (XRES_FRAMEBUFFER / 2) / 8, + (YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6, + (XRES_FRAMEBUFFER / 8) - (1 + (XRES_FRAMEBUFFER / 2) / 8) - 1, + (YRES_FRAMEBUFFER / 8) - ((YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6 - 1) - 2, + "Actions", + menuItems, + 6, + cursorPosition); +} diff --git a/mz_frontend/src/HackingMinigame.c b/mz_frontend/src/HackingMinigame.c new file mode 100644 index 000000000..f9b5a939a --- /dev/null +++ b/mz_frontend/src/HackingMinigame.c @@ -0,0 +1,150 @@ +/* + Created by Daniel Monteiro on 2021-11-01. +*/ + +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include + +#include "Common.h" +#include "Enums.h" +#include "UI.h" +#include "Derelict.h" +#include "Renderer.h" +#include "HackingMinigame.h" +#include "HackingMinigameRules.h" +#include "Engine.h" + +#ifdef PAGE_FLIP_ANIMATION +int wasSmoothMovementPreviouslyEnabled; +#endif + +const char *functionNames[5] = { + "???", + "writeB", + "snprintf", + "hackLogin", + "LoadDBReg" +}; + +void HackingScreen_initStateCallback(enum EGameMenuState tag) { + (void)tag; + cursorPosition = 1; + needsToRedrawVisibleMeshes = 0; + + initHackingMinigame(); +} + +void HackingScreen_repaintCallback(void) { + uint8_t pin; + uint8_t holdingDisk; + + if (firstFrameOnCurrentState) { + clearScreen(); + needsToRedrawVisibleMeshes = 0; + drawTextAt(1, 1, "Stack trace:", getPaletteEntry(0xFF999999)); + drawTextAt((12 * 0), 11, " CPU0 ", getPaletteEntry(0xFF999999)); + drawTextAt((12 * 1), 11, " CPU1 ", getPaletteEntry(0xFF999999)); + drawTextAt((12 * 2), 11, " CPU2 ", getPaletteEntry(0xFF999999)); + } + + drawTextAt((12 * cursorPosition), 11, ">", getPaletteEntry(0xFF999999)); + drawTextAt((12 * cursorPosition) + 5, 11, "<", getPaletteEntry(0xFF999999)); + + drawLine(0, 80, XRES_FRAMEBUFFER - 1, 80, 2); + + for (pin = 0; pin < 3; ++pin) { + uint8_t disk; + + if (pin != 0) { + uint8_t pinX = (10 * (pin) ) * 8; + drawLine(pinX, 40, pinX, 80, 2); + } + + for (disk = 0; disk < 5; ++disk) { + + uint8_t diskIndex = getPositionForPin(pin, disk); + + const char *funcName = (disk >= getDisksForPin(pin)) ? NULL + : functionNames[diskIndex]; + + if (funcName) { + drawTextAt( + 10 * (pin) + (pin == 0 ? 0 : 1), 4 + (4 - disk), + funcName, getPaletteEntry(0xFF999999)); + } + } + } + + drawTextAt(1, 2, "Pointer:", getPaletteEntry(0xFF999999)); + + holdingDisk = getHoldingDisk(); + + if (holdingDisk != 0xFF) { + drawTextAt(19, 2, functionNames[holdingDisk], getPaletteEntry(0xFF999999)); + } else { + drawTextAt(19, 2, "NULL", getPaletteEntry(0xFF999999)); + } +} + +void HackingScreen_unloadStateCallback(enum EGameMenuState newState) { + (void)newState; +#ifdef PAGE_FLIP_ANIMATION + enableSmoothMovement = wasSmoothMovementPreviouslyEnabled; +#endif +} + +enum EGameMenuState HackingScreen_tickCallback(enum ECommand cmd, void* data) { + (void)data; + uint8_t holdingDisk = getHoldingDisk(); + + if (isHackingMinigameCompleted()) { + grantAccessToSafe(); + } + + switch (cmd) { + case kCommandLeft: + if (cursorPosition > 0) { + cursorPosition--; + firstFrameOnCurrentState = 1; + } +#ifdef PAGE_FLIP_ANIMATION + turnTarget = turnStep; +#endif + break; + case kCommandRight: + if (cursorPosition < 2) { + cursorPosition++; + firstFrameOnCurrentState = 1; + } +#ifdef PAGE_FLIP_ANIMATION + turnTarget = turnStep; +#endif + break; + case kCommandBack: + case kCommandDown: + return kBackToGame; + case kCommandFire1: + if (holdingDisk == 0xFF) { + pickDisk(cursorPosition); + } else { + dropDisk(cursorPosition); + } + firstFrameOnCurrentState = 1; + break; + + default: + break; + } + + return kResumeCurrentState; +} diff --git a/mz_frontend/src/KeyboardUI.c b/mz_frontend/src/KeyboardUI.c new file mode 100644 index 000000000..492d4d948 --- /dev/null +++ b/mz_frontend/src/KeyboardUI.c @@ -0,0 +1,46 @@ +/* + Created by Daniel Monteiro on 11/07/2023. +*/ +#include +#include + +#include "Common.h" +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" + +extern struct ObjectNode *focusedItem; + +extern struct ObjectNode *roomItem; + +extern uint8_t firstFrameOnCurrentState; + +const char *menuItems[] = { + "1) Use", + "2) Use with", + "3) Pick", + "4) Drop", + "5) Next(hand)", + "6) Next(room)", +}; + +void initKeyboardUI(void) { +} + + +void HUD_initialPaint(void) { + + drawWindowWithOptions( + 1 + (XRES_FRAMEBUFFER / 2) / 8, + (YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6, + (XRES_FRAMEBUFFER / 8) - (1 + (XRES_FRAMEBUFFER / 2) / 8) - 1, + (YRES_FRAMEBUFFER / 8) - ((YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6 - 1) - 2, + "Actions", + menuItems, + 6, + 0xFF); +} + diff --git a/mz_frontend/src/MSDOSVersion/msdos.c b/mz_frontend/src/MSDOSVersion/msdos.c new file mode 100644 index 000000000..70d307b78 --- /dev/null +++ b/mz_frontend/src/MSDOSVersion/msdos.c @@ -0,0 +1,350 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" +#include "font.h" + +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; + +uint8_t *framebuffer; +uint8_t bufferInput = '.'; +extern uint8_t firstFrameOnCurrentState; + +unsigned char imageBuffer[XRES_FRAMEBUFFER * YRES_FRAMEBUFFER]; + +void shutdownGraphics(void) { +} + +void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { + + if (x0 < 0) { + return; + } + + int16_t y; + int16_t _y0 = y0; + int16_t _y1 = y1; + + if (y0 > y1) { + _y0 = y1; + _y1 = y0; + } + + if (_y0 < 0) { + _y0 = 0; + } + + if (_y1 >= 128) { + _y1 = 127; + } + + for (y = _y0; y <= _y1; ++y) { + imageBuffer[(256 * y) + x0] = colour; + } +} + + +void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { + if (y < 0) { + return; + } + + int16_t _x0 = x0; + int16_t _x1 = x1; + + if (x0 > x1) { + _x0 = x1; + _x1 = x0; + } + + if (_x0 < 0) { + _x0 = 0; + } + + if (_x1 >= 128) { + _x1 = 127; + } + + for (int x = _x0; x <= _x1; ++x) { + imageBuffer[(256 * y) + x] = colour; + } +} + +void graphicsPut(int16_t x, int16_t y, uint16_t colour) { + if (x < 0) { + x = 0; + } + + if (x >= 128) { + x = 127; + } + + if (y < 0) { + y = 0; + } + + if (y >= 128) { + y = 127; + } + + imageBuffer[(256 * y) + x] = colour; +} + +void realPut(int x, int y, uint8_t value) { + if (x < 0) { + x = 0; + } + + if (x >= 256) { + x = 255; + } + + if (y < 0) { + y = 0; + } + + if (y >= 160) { + y = 159; + } + + imageBuffer[(256 * y) + x] = value; + +} + +void clearGraphics(void) { + memset(imageBuffer, 0, 256 * 160); +} + +void initHW(int argc, char** argv) { + clearScreen(); +} + +void clearScreen(void) { + asm volatile("movb $0x0, %%ah\n\t" + "movb $0x0D, %%al\n\t" + "int $0x10\n\t" + : + : + : "ax" + ); +} + +void handleSystemEvents(void) { + unsigned char toReturn = 255; + + + asm volatile ("movb $0x00, %%ah\n\t" + "movb $0x00, %%al\n\t" + "int $0x16 \n\t" + "movb %%al, %0\n\t" + : "=rm"(toReturn) + : + : "ax" + ); + + asm volatile("movb $0x0C, %%ah\n\t" + "movb $0x00, %%al\n\t" + "int $0x21\n\t" + : + : + : "ax" + ); + + bufferInput = toReturn; +} + +enum ECommand getInput(void) { + + switch(bufferInput) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } + + fontTop++; + } + dstX += 8; + } +} + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } +} + +void startFrame(int x, int y, int width, int height) { + +} + +void endFrame(void) { + + uint8_t *bufferPtr = &imageBuffer[0]; + + for (int y = 0; y < 160; ++y) { + for (int x = 0; x < 256; ++x) { + uint16_t index = *bufferPtr; + + int pixel = index; + int px = x; + int py = y; + + asm volatile ("movb $0x0C, %%ah\n\t" + "movb %0, %%al\n\t" + "movb $0x0, %%bh\n\t" + "movw %1, %%cx\n\t" + "movw %2, %%dx\n\t" + "int $0x10\n\t" + : + :"rm" (pixel), "rm" (px), "rm" (py) + : "ax", "bx", "cx", "dx" + ); + bufferPtr++; + } + } +} diff --git a/mz_frontend/src/Main.c b/mz_frontend/src/Main.c new file mode 100644 index 000000000..0a1c22de3 --- /dev/null +++ b/mz_frontend/src/Main.c @@ -0,0 +1,64 @@ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#ifdef ATARIST +#include +#include +#include +#include +#include +#include +#endif + +#include "Common.h" +#include "Enums.h" +#include "Renderer.h" +#include "Engine.h" +#include "Core.h" +#include "UI.h" + +int8_t cameraRotation = 0; + +#ifdef ATARIST +int doMain(void); + +int main(int argc, char **argv) { + Supexec(&doMain); + return 0; +} + +int doMain(void) { + int argc = 0; + char **argv = NULL; +#else +int main(int argc, char **argv) { +#endif + initFileReader("base.pfs"); + initHW(argc, argv); + + + enterState(kMainMenu); + +#ifdef EMIT_QUIT_OPTION + while (isRunning) { +#else + while (1) { +#endif + startFrame(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER); + menuTick(10); + endFrame(); + } + +#ifdef EMIT_QUIT_OPTION + unloadStateCallback(1); + return 0; +#endif +} diff --git a/mz_frontend/MegaDriveVersion/megadrive.c b/mz_frontend/src/MegaDriveVersion/megadrive.c similarity index 60% rename from mz_frontend/MegaDriveVersion/megadrive.c rename to mz_frontend/src/MegaDriveVersion/megadrive.c index be9c3d89e..22f25fcc5 100644 --- a/mz_frontend/MegaDriveVersion/megadrive.c +++ b/mz_frontend/src/MegaDriveVersion/megadrive.c @@ -3,41 +3,16 @@ #include "Enums.h" #include "Core.h" #include "Derelict.h" -#include "Engine3D.h" -#include "Engine.h" - -void graphicsFlush(void); - -void nextItemInHand(void); - -void useItemInHand(void); - -void nextItemInRoom(void); - -void interactWithItemInRoom(void); - -void pickOrDrop(void); - -void dropItem(void); - -void pickItem(void); - -void clearGraphics(void); - -void renderScene(void); - -void enterTextMode(void); - -void exitTextMode(void); - - -extern int8_t map[32][32]; +#include "Renderer.h" +#include "UI.h" +#include "GamepadUI.h" +#include "font.h" extern struct ObjectNode *focusedItem; - extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; -extern uint8_t accessGrantedToSafe; +extern uint8_t firstFrameOnCurrentState; #define COOLDOWN_MAX 0x2EF @@ -45,24 +20,7 @@ int16_t buffered = '.'; uint16_t cooldown; uint16_t movementCooldown = 0; - -void refreshJustGraphics(void) { - renderScene(); - graphicsFlush(); -} - -void backToGraphics(void) { - clearScreen(); - HUD_initialPaint(); - refreshJustGraphics(); -} - -void performAction(void) { - -} - - -static void handleInput(void) { +void handleSystemEvents(void) { u16 value; buffered = '.'; @@ -74,7 +32,7 @@ static void handleInput(void) { movementCooldown--; } - // need to call it manually as we don't use SYS_doVBlankProcess() here + /* need to call it manually as we don't use SYS_doVBlankProcess() here */ JOY_update(); value = JOY_readJoypad(JOY_1); @@ -107,81 +65,40 @@ static void handleInput(void) { buffered = 'k'; } - if ((value & BUTTON_B) && !cooldown) { - performAction(); - HUD_refresh(); + if ((value & BUTTON_A) && !cooldown) { cooldown = COOLDOWN_MAX; - buffered = 'p'; + buffered = '1'; } - if ((value & BUTTON_C) && !cooldown) { - cursorPosition = (cursorPosition + 1); - - if (cursorPosition >= 6) { - cursorPosition = 0; - } - - HUD_refresh(); + if ((value & BUTTON_B) && !cooldown) { cooldown = COOLDOWN_MAX; - buffered = 'p'; + buffered = '2'; } - } -} - -void shutdownGraphics(void) { -} - - -void writeStrWithLimit(int16_t _x, int16_t y, char *str, int16_t limitX) { - - char textBuffer[2]; - char *charPtr = &textBuffer[0]; - - int16_t len = strlen(str); - int16_t x = _x; - textBuffer[1] = 0; - for (int16_t c = 0; c < len && y < 19; ++c) { - - char cha = *str; - - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++str; - continue; + if ((value & BUTTON_C) && !cooldown) { + cooldown = COOLDOWN_MAX; + buffered = '3'; } - - *charPtr = ' '; - VDP_drawText(charPtr, x, y); - *charPtr = cha; - VDP_drawText(charPtr, x, y); - ++x; - ++str; } } -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 31); +void graphicsPut(int16_t x, int16_t y, uint16_t colour) { + BMP_setPixelFast(x, y, colour); } -void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - BMP_setPixelFast(x, 16 + y, colour); +void realPut(int x, int y, uint8_t colour) { + BMP_setPixelFast(x, y, colour); } void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { - if (y0 > y1) { int16_t tmp = y0; y0 = y1; y1 = tmp; } - colour += (colour << 4); //double the pixel + colour += (colour << 4); /* double the pixel */ for (int16_t y = y0; y < y1; ++y) { BMP_setPixelFast(x0, 16 + y, colour); } @@ -209,7 +126,7 @@ void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { _x1 = 127; } - colour += (colour << 4); //double the pixel + colour += (colour << 4); /* double the pixel */ for (int16_t x = _x0; x <= _x1; ++x) { BMP_setPixelFast(x, 16 + y, colour); @@ -220,40 +137,15 @@ static void joyEvent(u16 joy, u16 changed, u16 state) { } -void showMessage(const char *message) { - enterTextMode(); - int16_t keepGoing = 1; - - for (int16_t i = 0; i < 19; ++i) { - VDP_clearText(16, i, 16); - } - - writeStrWithLimit(1, 5, message, 31); - writeStrWithLimit(6, 17, "Press Start to continue", 31); - - while (keepGoing) { - if (getKey() == 'k') { - keepGoing = 0; - } - } - - clearScreen(); - - for (int16_t i = 0; i < 19; ++i) { - VDP_clearText(16, i, 16); - } - - exitTextMode(); - backToGraphics(); +void clearGraphics(void) { + BMP_clear(); } void clearScreen(void) { -} - -void clearGraphics(void) { BMP_clear(); } + void clearTextScreen(void) { for (int16_t c = 0; c < 23; ++c) { VDP_clearText(0, c, 256 / 8); @@ -262,40 +154,7 @@ void clearTextScreen(void) { movementCooldown = COOLDOWN_MAX; } -void enterTextMode(void) { - clearGraphics(); - BMP_flip(1); - clearTextScreen(); -} - -void exitTextMode(void) { - clearTextScreen(); -} - -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} - -uint8_t getKey(void) { - handleInput(); - return buffered; -} - -void sleepForMS(uint32_t ms) { - //we cant afford to sleep -} - -void titleScreen(void) { - -} - -void puts(char *unused) { - -} - -void assert(int unused) { - -} - -void init(void) { +void initHW(int argc, char** argv) { JOY_setEventHandler(joyEvent); VDP_setScreenWidth256(); VDP_setHInterrupt(0); @@ -322,15 +181,119 @@ void init(void) { PAL_setColor(13, RGB24_TO_VDPCOLOR(0xFF55FF)); PAL_setColor(14, RGB24_TO_VDPCOLOR(0xFFFF55)); PAL_setColor(15, RGB24_TO_VDPCOLOR(0xFFFFFF)); + + firstFrameOnCurrentState = 1; + + initGamepadUI(); } -void graphicsFlush(void) { +void endFrame(void) { BMP_flip(1); } -void HUD_initialPaint(void) { +enum ECommand getInput(void) { + + switch(buffered) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + } + + return kCommandNone; } -void HUD_refresh(void) { +void startFrame(int x, int y, int width, int height) { + +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + +void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int limitX, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + char textBuffer[2]; + char *charPtr = &textBuffer[0]; + + int16_t len = strlen(text); + int16_t x = _x; + int16_t y = _y; + textBuffer[1] = 0; + char* str= text; + + for (int16_t c = 0; c < len && y < 19; ++c) { + + char cha = *str; + + if (x == limitX) { + ++y; + x = _x; + } else if (cha == '\n') { + ++y; + x = _x; + ++str; + continue; + } + + *charPtr = ' '; + VDP_drawText(charPtr, x, y); + *charPtr = cha; + VDP_drawText(charPtr, x, y); + ++x; + ++str; + } } diff --git a/mz_frontend/src/RendererRasterizer.c b/mz_frontend/src/RendererRasterizer.c new file mode 100755 index 000000000..62be469d5 --- /dev/null +++ b/mz_frontend/src/RendererRasterizer.c @@ -0,0 +1,726 @@ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "FixP.h" +#include "CTile3DProperties.h" + +#ifdef MSDOS +#include "Common.h" +#endif + +extern int16_t cameraHeight; + +struct Projection { + uint8_t px; + uint8_t py; + int8_t dx; +}; + +const struct Projection projections[32] = + { + {0, 128, -128}, // 1 + {0, 127, -64}, // 2 + {20, 105, -42}, // 3 + {31, 95, -32}, // 4 + {37, 88, -25}, // 5 + {41, 84, -21}, // 6 + {44, 81, -18}, // 7 + {47, 79, -16}, // 8 + {48, 77, -14}, // 9 + {50, 75, -12}, // 10 + {51, 74, -11}, // 11 + {52, 73, -10}, // 12 + {53, 72, -9}, // 13 + {53, 72, -9}, // 14 + {54, 71, -8}, // 15 + {55, 71, -8}, // 16 + {55, 70, -7}, // 17 + {55, 70, -7}, // 18 + {56, 69, -6}, // 19 + {56, 69, -6}, // 20 + {56, 69, -6}, // 21 + {57, 68, -5}, // 22 + {57, 68, -5}, // 23 + {57, 68, -5}, // 24 + {57, 68, -5}, // 25 + {58, 67, -4}, // 26 + {58, 67, -4}, // 27 + {58, 67, -4}, // 28 + {58, 67, -4}, // 29 + {58, 67, -4}, // 30 + {58, 67, -4}, // 31 + }; + +#ifdef USE_OWN_MIN_MAX +int8_t max(int8_t x1, int8_t x2); + +int8_t min(int8_t x1, int8_t x2); +#endif + +void +drawWedge(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ, uint16_t elementMask, uint16_t type) { + + int16_t z1; + + int16_t z0px; + int16_t z1px; + int16_t z0py; + int16_t z1py; + int16_t z0dx; + int16_t z1dx; + + int16_t px0z0; + int16_t py0z0; + int16_t py0z1; + int16_t py1z0; + int16_t py1z1; + int16_t px1z1; + + uint16_t shouldStippleFill = (z0 >= STIPPLE_DISTANCE) ? 6 : (6 + STIPPLE_COLOUR_THRESHOLD); + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + + if (z0 >= 32) { + return; + } + + z1 = z0 + dZ; + + if (z0 <= 2) { + return; + } + + if (z1 <= 2) { + return; + } + + if (z1 >= 32) { + return; + } + + + if (type == kRightNearWall) { + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + px0z0 = z0px - (x0 * z0dx); + px1z1 = z1px - ((dX + x0) * z1dx); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + + py1z0 = z0py + ((y0 + dY) * z0dx); + py1z1 = z1py + ((y0 + dY) * z1dx); + + } else { + z0px = (projections[z1].px); + z1px = (projections[z0].px); + z0dx = ((projections[z1].dx)); + z1dx = ((projections[z0].dx)); + + px0z0 = z0px - ((x0) * z0dx); + px1z1 = z1px - ((x0 + dX) * z1dx); //extra operations to avoid overflow + + z1py = (projections[z0].py); + z0py = (projections[z1].py); + + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + + py1z0 = z0py + ((y0 + dY) * z0dx); + py1z1 = z1py + ((y0 + dY) * z1dx); + } + + + int16_t lineX0, lineX1; + + if (py1z0 < 0) { + py1z0 = 0; + } + + if (py0z0 < 0) { + py0z0 = 0; + } + + if (py1z0 >= YRES) { + py1z0 = YRESMINUSONE; + } + + if (py0z0 >= YRES) { + py0z0 = YRESMINUSONE; + } + + + if (py1z1 < 0) { + py1z1 = 0; + } + + if (py0z1 < 0) { + py0z1 = 0; + } + + if (py1z1 >= YRES) { + py1z1 = YRESMINUSONE; + } + + if (py0z1 >= YRES) { + py0z1 = YRESMINUSONE; + } + + /* The upper segment */ + lineX0 = px0z0; + lineX1 = px1z1; + + if (lineX0 != lineX1) { + int16_t upperY0 = py1z0; + int16_t upperY1 = py1z1; + int16_t upperDx = abs(lineX1 - lineX0); + int16_t upperDy = -abs(upperY1 - upperY0); + int16_t upperSy = upperY0 < upperY1 ? 1 : -1; + int16_t upperErr = upperDx + upperDy; /* error value e_xy */ + int16_t upperErr2; + int16_t lowerY0 = py0z0; + int16_t lowerY1 = py0z1; + int16_t lowerDx = abs(lineX1 - lineX0); + int16_t lowerSx = lineX0 < lineX1 ? 1 : -1; + int16_t lowerDy = -abs(lowerY1 - lowerY0); + int16_t lowerSy = lowerY0 < lowerY1 ? 1 : -1; + int16_t lowerErr = lowerDx + lowerDy; /* error value e_xy */ + int16_t lowerErr2 = 0; + + while (lineX0 != lineX1) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + vLine(lineX0, upperY0, lowerY0, shouldStippleFill); + graphicsPut(lineX0, upperY0, shouldStippleBorder); + } + + /* loop */ + upperErr2 = upperErr * 2; + + if (upperErr2 >= upperDy || lowerErr2 >= lowerDy) { + upperErr += upperDy; /* e_xy+e_x > 0 */ + lowerErr += lowerDy; /* e_xy+e_x > 0 */ + lineX0 += lowerSx; + } + + if (lineX0 >= XRES) { + return; + } + + if (upperErr2 <= upperDx) { + /* e_xy+e_y < 0 */ + upperErr += upperDx; + upperY0 += upperSy; + } + + /* loop */ + lowerErr2 = lowerErr * 2; + + if (lowerErr2 <= lowerDx) { + /* e_xy+e_y < 0 */ + lowerErr += lowerDx; + lowerY0 += lowerSy; + } + } + } + + + if (elementMask & 2) { + if (IN_RANGE(0, XRESMINUSONE, px0z0)) { + vLine(px0z0, py0z0, py1z0, shouldStippleBorder); + } + } + + if (elementMask & 1) { + if (IN_RANGE(0, XRESMINUSONE, px1z1)) { + vLine(px1z1, py0z1, py1z1, shouldStippleBorder); + } + } +} + +void drawSquare(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, uint16_t elementMask) { + + int16_t z0px; + int16_t z0py; + int16_t z0dx; + + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t py1z0; + + int16_t x; + + uint16_t drawContour; + + if (z0 >= 32) { + return; + } + + z0px = (projections[z0].px); + z0dx = ((projections[z0].dx)); + + px0z0 = z0px - ((x0) * z0dx); + px1z0 = px0z0 - (dX * z0dx); + + z0py = (projections[z0].py); + + py0z0 = z0py + ((y0) * z0dx); + py1z0 = py0z0 + (dY * z0dx); + + if (px1z0 < 0 || px0z0 > XRESMINUSONE) { + return; + } + + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + uint16_t shouldStippleFill = (z0 >= STIPPLE_DISTANCE) ? 4: (4 + STIPPLE_COLOUR_THRESHOLD); + + drawContour = (dY); + + /* Draw the horizontal outlines of z0 and z1 */ + /* Ceiling is lower than camera */ + if (drawContour) { + if (elementMask & 2) { + if ((elementMask != 255) && IN_RANGE(0, XRESMINUSONE, px0z0)) { + vLine(px0z0, py0z0, py1z0, shouldStippleBorder); + } + + if ((elementMask != 127) && IN_RANGE(0, XRESMINUSONE, px1z0)) { + vLine(px1z0, py0z0, py1z0, shouldStippleBorder); + } + } + + for (x = px0z0; x < px1z0; ++x) { + if ( x < 0 ) { + continue; + } + + if (x >= XRES ) { + return; + } + + vLine(x, py0z0, py1z0, shouldStippleFill); + } + } +} + +void drawObjectAt(int16_t x0, int16_t z0) { + + int16_t z1; + uint16_t z0px; + uint16_t z0py; + uint16_t z1px; + uint16_t z1py; + int16_t z0dx; + int16_t z1dx; + + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t px0z1; + int16_t py0z1; + int16_t px1z1; + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + + if (z0 >= 32 || z0 <= 4) { + return; + } + + z1 = z0 + 1; + + if (z1 >= 32) { + return; + } + + + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + px0z0 = z0px - ((x0) * z0dx); + px0z1 = z1px - ((x0) * z1dx); + + px1z0 = px0z0 - (1 * z0dx); + px1z1 = px0z1 - (1 * z1dx); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + py0z0 = z0py + ((-cameraHeight) * z0dx); + py0z1 = z1py + ((-cameraHeight) * z1dx); + + + int16_t lineX0, lineX1; + + /* Draw the horizontal outlines of z0 and z1 */ + for (lineX0 = px0z0; lineX0 <= px1z0; ++lineX0) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, py0z0, shouldStippleBorder); + } + } + + for (lineX0 = px0z1; lineX0 <= px1z1; ++lineX0) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, py0z1, shouldStippleBorder); + } + } + + /* The left segment */ + lineX0 = px0z0; + lineX1 = px0z1; + + if (lineX0 != lineX1) { + int16_t y0 = py0z0; + int16_t y1 = py0z1; + int16_t dx = abs(lineX1 - lineX0); + int16_t sx = lineX0 < lineX1 ? 1 : -1; + int16_t dy = -abs(y1 - y0); + int16_t sy = y0 < y1 ? 1 : -1; + int16_t err = dx + dy; /* error value e_xy */ + int16_t e2; + + while ((lineX0 != lineX1 || y0 != y1)) { + + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, y0, shouldStippleBorder); + } + + /* loop */ + e2 = err << 2; + + if (e2 >= dy) { + err += dy; /* e_xy+e_x > 0 */ + lineX0 += sx; + } + + if (lineX0 >= XRES) { + goto right_stroke; + } + + if (e2 <= dx) { + /* e_xy+e_y < 0 */ + err += dx; + y0 += sy; + } + } + } + + right_stroke: + + lineX0 = px1z0; + lineX1 = px1z1; + + if (lineX0 != lineX1) { + int16_t y0 = py0z0; + int16_t y1 = py0z1; + int16_t dx = abs(lineX1 - lineX0); + int16_t sx = lineX0 < lineX1 ? 1 : -1; + int16_t dy = -abs(y1 - y0); + int16_t sy = y0 < y1 ? 1 : -1; + int16_t err = dx + dy; /* error value e_xy */ + int16_t e2; + + while ((lineX0 != lineX1 || y0 != y1)) { + + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, y0, shouldStippleBorder); + } + + e2 = err << 2; + + if (e2 >= dy) { + err += dy; /* e_xy+e_x > 0 */ + lineX0 += sx; + } + + if (lineX0 >= XRES) { + return; + } + + if (e2 <= dx) { + /* e_xy+e_y < 0 */ + err += dx; + y0 += sy; + } + } + } +} + + + +void drawCubeAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ) { + + int16_t y1 = y0 + dY; + int16_t z1; + + int16_t z0px; + int16_t z0py; + int16_t z1px; + int16_t z1py; + int16_t z0dx; + int16_t z1dx; + int16_t py1z0; + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t px0z1; + int16_t py0z1; + int16_t px1z1; + + uint16_t shouldStippleFill = (z0 >= STIPPLE_DISTANCE) ? 7 : (7 + STIPPLE_COLOUR_THRESHOLD); + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + + uint16_t drawContour; + + if (z0 >= 32 || z0 <= 4) { + return; + } + + z1 = z0 + dZ; + + if (z1 >= 32) { + return; + } + + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + px0z0 = z0px - ((x0) * z0dx); + px0z1 = z1px - ((x0) * z1dx); + px1z0 = px0z0 - (dX * z0dx); + px1z1 = px0z1 - (dX * z1dx); + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + py1z0 = z0py + ((y1) * z0dx); + drawContour = (dY); + + + int16_t x, lineX0, lineX1; + + lineX0 = px0z0; + lineX1 = px0z1; + + if (lineX0 != lineX1) { + int16_t lineY0 = py0z0; + int16_t lineY1 = py0z1; + int16_t lineDx = abs(lineX1 - lineX0); + int16_t lineSx = lineX0 < lineX1 ? 1 : -1; + int16_t lineDy = -abs(lineY1 - lineY0); + int16_t lineSy = lineY0 < lineY1 ? 1 : -1; + int16_t lineErr = lineDx + lineDy; + int16_t lineE2; + + while ((lineX0 != lineX1 || lineY0 != lineY1)) { + + if (drawContour) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + vLine(lineX0, lineY0, py1z0, shouldStippleFill); + graphicsPut(lineX0, lineY0, shouldStippleBorder); + } + } + + lineE2 = lineErr << 2; + + if (lineE2 >= lineDy) { + lineErr += lineDy; + lineX0 += lineSx; + } + + if (lineX0 >= XRES) { + goto right_stroke; + } + + if (lineE2 <= lineDx) { + lineErr += lineDx; + lineY0 += lineSy; + } + } + } + + right_stroke: + + lineX0 = px1z0; + lineX1 = px1z1; + + if (lineX0 != lineX1) { + int16_t lineY0 = py0z0; + int16_t lineY1 = py0z1; + int16_t lineDx = abs(lineX1 - lineX0); + int16_t lineSx = lineX0 < lineX1 ? 1 : -1; + int16_t lineDy = -abs(lineY1 - lineY0); + int16_t lineSy = lineY0 < lineY1 ? 1 : -1; + int16_t lineErr = lineDx + lineDy; + int16_t lineE2; + + while ((lineX0 != lineX1 || lineY0 != lineY1)) { + + if (drawContour) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + vLine(lineX0, lineY0, py1z0, shouldStippleFill); + graphicsPut(lineX0, lineY0, shouldStippleBorder); + } + } + + lineE2 = lineErr << 2; + + if (lineE2 >= lineDy) { + lineErr += lineDy; + lineX0 += lineSx; + } + + if (lineX0 >= XRES) { + goto final_stroke; + } + + if (lineE2 <= lineDx) { + + lineErr += lineDx; + lineY0 += lineSy; + } + } + } + + final_stroke: + + if (drawContour) { + for (x = px0z0; x <= px1z0; ++x) { + if (IN_RANGE(0, XRESMINUSONE, x)) { + vLine(x, py0z0, py1z0, shouldStippleFill); + graphicsPut(x, py0z0, shouldStippleBorder); + } + } + } + + if (IN_RANGE(0, XRESMINUSONE, px0z0)) { + vLine(px0z0, py0z0, py1z0, shouldStippleBorder); + } + + if (IN_RANGE(0, XRESMINUSONE, px1z0)) { + vLine(px1z0, py0z0, py1z0, shouldStippleBorder); + } +} + + + +void drawFloorAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dZ) { + + int16_t z1; + + int16_t z0px; + int16_t z0py; + int16_t z1px; + int16_t z1py; + int16_t z0dx; + int16_t z1dx; + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t px0z1; + int16_t py0z1; + int16_t px1z1; + + uint16_t shouldStipple = (z0 >= STIPPLE_DISTANCE) ? 2 : (2 + STIPPLE_COLOUR_THRESHOLD); + + if (z0 >= 32 || z0 < 1) { + return; + } + + z1 = z0 + dZ; + + if (z1 >= 32) { + return; + } + + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + px0z0 = z0px - ((x0) * z0dx); + px0z1 = z1px - ((x0) * z1dx); + px1z0 = px0z0 - (dX * z0dx); + px1z1 = px0z1 - (dX * z1dx); + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + + + int16_t leftX0, leftX1, rightX0, rightX1; + + leftX0 = px0z0; + leftX1 = px0z1; + rightX0 = px1z0; + rightX1 = px1z1; + int16_t dy = -abs(py0z1 - py0z0); + int16_t sy = py0z0 < py0z1 ? 1 : -1; + + int16_t currentY0 = py0z0; + int16_t leftDx = abs(leftX1 - leftX0); + int16_t leftSx = leftX0 < leftX1 ? 1 : -1; + int16_t leftErr = leftDx + dy; + int16_t leftE2; + + int16_t rightDx = abs(rightX1 - rightX0); + int16_t rightSx = rightX0 < rightX1 ? 1 : -1; + int16_t rightErr = rightDx + dy; + int16_t rightE2; + + while (currentY0 != py0z1) { + if (leftX0 >= XRES) { + return; + } + + if (rightX1 < 0) { + return; + } + + if (IN_RANGE(0, XRESMINUSONE, leftX0) || IN_RANGE(0, XRESMINUSONE, rightX0)) { + hLine(leftX0, rightX0, currentY0, shouldStipple); + } + + leftE2 = leftErr << 2; + + if (leftE2 >= dy) { + leftErr += dy; + leftX0 += leftSx; + } + + rightE2 = rightErr << 2; + + if (rightE2 >= dy) { + rightErr += dy; + rightX0 += rightSx; + } + + if (rightE2 <= rightDx || leftE2 <= leftDx) { + rightErr += rightDx; + leftErr += leftDx; + currentY0 += sy; + } + } +} + diff --git a/mz_frontend/src/RendererScene.c b/mz_frontend/src/RendererScene.c new file mode 100755 index 000000000..403c8b6d0 --- /dev/null +++ b/mz_frontend/src/RendererScene.c @@ -0,0 +1,153 @@ +#ifndef SMD +#include +#include +#include +#include +#else +#include +typedef unsigned long size_t; +#endif + +#include "Common.h" +#include "Renderer.h" +#include "map.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" +#include "PackedFileReader.h" + +extern int8_t cameraX; +extern int8_t cameraZ; +extern int8_t cameraRotation; +extern int16_t cameraHeight; +extern struct MapWithCharKey tileProperties; +extern struct MapWithCharKey customMeshes; + +extern uint8_t playerLocation; + +#ifdef USE_OWN_MIN_MAX +int8_t max(int8_t x1, int8_t x2) { + return x1 > x2 ? x1 : x2; +} + +int8_t min(int8_t x1, int8_t x2) { + return x1 < x2 ? x1 : x2; +} +#endif + +void renderScene(void) { + + uint16_t pattern = map[cameraZ][cameraX]; + + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, pattern); + + cameraHeight = fixToInt(prop->mFloorHeight) + 1; + + + switch (cameraRotation) { + case DIRECTION_N: + renderCameraNorth(); + break; + + case DIRECTION_E: + renderCameraEast(); + break; + + case DIRECTION_S: + renderCameraSouth(); + break; + + case DIRECTION_W: + default: + renderCameraWest(); + break; + } + return; + repaintMapItems(); +} + +void renderCameraWest(void) { + int16_t x; + int16_t y; + + for (x = 0; x < cameraX; ++x) { + + int16_t minZ = max(cameraZ - ((cameraX) - x) - 2, 0); + int16_t maxZ = min(cameraZ + ((cameraX) - x) + 1, 31); + + for (y = minZ; y < cameraZ; ++y) { + drawPattern(map[y][x], -(y - cameraZ) + 1, -(y - cameraZ) + 2, cameraX - x); + } + + for (y = maxZ; y >= cameraZ; --y) { + drawPattern(map[y][x], -(y - cameraZ) + 1, -(y - cameraZ) + 2, cameraX - x); + } + } +} + +void +renderCameraSouth(void) { + int16_t y; + int16_t x; + + for (y = 31; y > cameraZ; --y) { + + int16_t maxX = min(cameraX + (y - cameraZ) + 1, 31); + int16_t minX = max(cameraX - (y - cameraZ) - 3, 0); + + for (x = minX; x < cameraX - 1; ++x) { + drawPattern(map[y][x], cameraX - x, cameraX - x + 1, y - cameraZ); + } + + + for (x = maxX - 1; x >= cameraX - 1; --x) { + drawPattern(map[y][x], cameraX - x, cameraX - x + 1, y - cameraZ); + } + + } +} + +void renderCameraEast(void) { + int16_t x; + + int16_t y; + + + for (x = 31; x > cameraX; --x) { + + int16_t maxZ = min(cameraZ + (x - cameraX) + 2, 31); + int16_t minZ = max(cameraZ - (x - cameraX) - 2, 0); + + for (y = minZ; y < cameraZ; ++y) { + drawPattern(map[y][x], (y - cameraZ) + 2, (y - cameraZ) + 3, x - cameraX); + } + + for (y = maxZ - 1; y >= cameraZ; --y) { + drawPattern(map[y][x], (y - cameraZ) + 2, (y - cameraZ) + 3, x - cameraX); + } + } +} + +void loadMesh(struct Mesh *mesh, char *filename) { + /* Dummy, just to satisfy the linker */ +} + +void renderCameraNorth(void) { + + int16_t y; + int16_t x; + + for (y = 0; y < cameraZ; ++y) { + int16_t maxX = min(cameraX + ((cameraZ) - y + 3), 31); + int16_t minX = max(cameraX - ((cameraZ) - y), 0); + + for (x = maxX; x > cameraX - 1; --x) { + drawPattern(map[y][x], x - cameraX, x - cameraX + 1, cameraZ - y); + } + + for (x = minX; x <= cameraX + 1; ++x) { + drawPattern(map[y][x], x - cameraX, x - cameraX + 1, cameraZ - y); + } + } +} diff --git a/mz_frontend/src/RendererTesselation.c b/mz_frontend/src/RendererTesselation.c new file mode 100755 index 000000000..1cace95fb --- /dev/null +++ b/mz_frontend/src/RendererTesselation.c @@ -0,0 +1,207 @@ +#include +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include "Common.h" +#include "Core.h" +#include "Renderer.h" +#include "map.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" +#include "PackedFileReader.h" + +#include "map.h" + +extern int8_t cameraX; +extern int8_t cameraZ; +extern int8_t cameraRotation; +extern uint8_t playerLocation; +struct MapWithCharKey tileProperties; +struct MapWithCharKey customMeshes; +int16_t cameraHeight = 1; + +void drawPattern(uint16_t _pattern, int16_t x0, int16_t x1, int16_t z) { + int16_t diff; + uint16_t pattern = (_pattern) & 127; + uint16_t type; + + /* 127 = 01111111 - the first bit is used for indicating the presence of an object. + * And since there are only 127 patterns anyway... + * */ + if (_pattern & 128) { + drawObjectAt(x0 - 1, z + 2); + } + + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, pattern); + + int ceilingHeight = fixToInt(prop->mCeilingHeight); + int floorHeight = fixToInt(prop->mFloorHeight); + + + diff = ceilingHeight - floorHeight; + + type = prop->mGeometryType; + + if (prop->mCeilingRepeatedTextureIndex != 0xFF && prop->mCeilingRepetitions > 0) { + drawCubeAt(x0 - 1, ceilingHeight - cameraHeight, z + 2, x1 - x0, + prop->mCeilingRepetitions, 1); + } + + if (prop->mFloorRepeatedTextureIndex != 0xFF && prop->mFloorRepetitions > 0) { + drawCubeAt(x0 - 1, floorHeight - prop->mFloorRepetitions - cameraHeight, z + 2, x1 - x0, + prop->mFloorRepetitions, 1); + } + + + if (prop->mCeilingTextureIndex != 0xFF) { + drawFloorAt(x0 - 1, ceilingHeight - cameraHeight, z + 2, x1 - x0, 1); + } + + if (prop->mFloorTextureIndex != 0xFF) { + drawFloorAt(x0 - 1, floorHeight - cameraHeight, z + 2, x1 - x0, 1); + } + + + if (type == kCube) { + drawCubeAt(x0 - 1, floorHeight - cameraHeight, z + 2, x1 - x0, + diff, 1); + } else if (type == kRightNearWall || type == kLeftNearWall) { + + if (cameraRotation == 0 || cameraRotation == 2) { + + if (type == kRightNearWall) { + type = kLeftNearWall; + } else { + type = kRightNearWall; + } + } + + drawWedge(x0 - 1, floorHeight - cameraHeight, z + 2, x1 - x0, + diff, 1, 0xFF, type); + + } else if (type == kWallWest) { + + switch (cameraRotation) { + case 0: + case 2: + drawWedge(x0 - (cameraRotation == 0 ? 1 : 0), floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + break; + case 1: + case 3: + default: + drawSquare(x0 - 1, floorHeight - cameraHeight, + z + (cameraRotation == 3 ? 1 : 0) + 2, + x1 - x0, diff, 0xFF); + } + } else if (type == kWallNorth) { + + + switch (cameraRotation) { + case 0: + case 2: + drawSquare(x0 - 1, floorHeight - cameraHeight, + z + (cameraRotation == 0 ? 1 : 0) + 2, + x1 - x0, diff, 0xFF); + break; + case 1: + case 3: + default: + drawWedge(x0 - (cameraRotation == 1 ? 1 : 0), + floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + break; + } + } else if (type == kWallCorner) { + + switch (cameraRotation) { + + case 3: + case 0: + drawWedge(x0 - (cameraRotation == 3 ? 0 : 1), + floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + + drawSquare(x0 - 1, floorHeight - cameraHeight, z + 1 + 2, + x1 - x0, diff, 0xFF); + break; + + case 1: + case 2: + default: + drawSquare(x0 - 1, floorHeight - cameraHeight, z + 2, + x1 - x0, diff, 0xFF); + + drawWedge(x0 - (cameraRotation == 1 ? 1 : 0), floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + + break; + } + } +} + +void repaintMapItems(void) { + struct ObjectNode *node; + + /* ignore header node */ + node = getRoom(playerLocation)->itemsPresent->next; + + switch (cameraRotation) { + case 0: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt(item->position.x - cameraX + 2 - 1, cameraZ - item->position.y + 2); + node = node->next; + } + break; + + case 1: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt((item->position.y - cameraZ) + 1, (item->position.x - cameraX) + 2); + node = node->next; + } + break; + + case 2: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt(-(item->position.x - cameraX) + 1, (item->position.y - cameraZ) + 2); + node = node->next; + } + break; + + case 3: + default: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt(-(item->position.y - cameraZ) + 1, (cameraX - item->position.x) + 2); + node = node->next; + } + break; + } +} + +void updateMapItems(void) { + struct ObjectNode *node; + + /* ignore header node */ + node = getRoom(playerLocation)->itemsPresent->next; + + while (node != NULL) { + struct Item *item = getItem(node->item); + uint16_t pattern = map[item->position.y][item->position.x]; + map[item->position.y][item->position.x] = pattern; + node = node->next; + } +} diff --git a/mz_frontend/src/SDLVersion/sdl2.c b/mz_frontend/src/SDLVersion/sdl2.c new file mode 100644 index 000000000..ec796acab --- /dev/null +++ b/mz_frontend/src/SDLVersion/sdl2.c @@ -0,0 +1,586 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "Common.h" +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" + +#include "SDL.h" +#include "font.h" + +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; +SDL_Window *window; +SDL_Renderer *renderer; + +#define TRANSPARENCY_COLOR 17 + +uint8_t mBufferedCommand; +uint32_t palette[16]; +uint8_t framebuffer[256 * 160]; + +extern uint8_t firstFrameOnCurrentState; +extern enum EGameMenuState currentGameMenuState; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION +extern uint8_t roomTransitionAnimationStep; +#endif + +extern enum EDirection playerDirection; +extern int8_t cameraX; +extern int8_t cameraZ; + +char playerPositionSprite[4][8]={ + { + 0b00011000, + 0b00111100, + 0b01111110, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00100000, + 0b01100000, + 0b11100000, + 0b11100000, + 0b01100000, + 0b00100000, + 0b00000000, + 0b00000000 + }, + { + 0b01111110, + 0b00111100, + 0b00011000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00000100, + 0b00000110, + 0b00000111, + 0b00000111, + 0b00000110, + 0b00000100, + 0b00000000, + 0b00000000 + }, +}; + +void graphicsPut(int16_t x, int16_t y, uint16_t colour) { + if (x < 0) { + x = 0; + } + + if (x >= 128) { + x = 127; + } + + if (y < 0) { + y = 0; + } + + if (y >= 128) { + y = 127; + } + + assert( !(colour < 0 || colour >= 16)); + framebuffer[(256 * y) + x] = colour; +#ifdef PUTAFLIP + graphicsFlush(); + SDL_Delay(100); +#endif +} + +void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { + if (y < 0) { + return; + } + + int16_t _x0 = x0; + int16_t _x1 = x1; + + if (x0 > x1) { + _x0 = x1; + _x1 = x0; + } + + if (_x0 < 0) { + _x0 = 0; + } + + if (_x1 >= 128) { + _x1 = 127; + } + + for (int x = _x0; x <= _x1; ++x) { + framebuffer[(256 * y) + x] = colour; + } +} + +void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { + + if (x0 < 0 || x0 > XRESMINUSONE) { + return; + } + + int16_t y; + int16_t _y0 = y0; + int16_t _y1 = y1; + + if (y0 > y1) { + _y0 = y1; + _y1 = y0; + } + + if (_y0 < 0) { + _y0 = 0; + } + + if (_y1 >= 128) { + _y1 = 127; + } + + for (y = _y0; y <= _y1; ++y) { + framebuffer[(256 * y) + x0] = colour; + } +} + +void shutdownGraphics(void) { + SDL_Quit(); +} + +void realPut(int x, int y, uint8_t value) { + if (x < 0) { + x = 0; + } + + if (x >= 256) { + x = 255; + } + + if (y < 0) { + y = 0; + } + + if (y >= 160) { + y = 159; + } + assert( !(value < 0 || value >= 16)); + framebuffer[(256 * y) + x] = value; +} + +void clearGraphics(void) { + memset(framebuffer, 0, 256 * 160); +} + +void clearScreen(void) {} + +void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { + + for(uint8_t c = 0; c < 8; ++c) { + uint8_t line = *sprite; + for (uint16_t d = 0; d < 8; ++d) { + if (line & 1) { + realPut( x + d, y + c, colour); + } + line = line >> 1; + } + ++sprite; + } +} + +void handleSystemEvents(void) { + SDL_Event event; + + mBufferedCommand = '.'; + + while (SDL_PollEvent(&event)) { + + if (event.type == SDL_QUIT) { + + mBufferedCommand = 'q'; + } + + if (event.type == SDL_KEYUP) { + + switch (event.key.keysym.sym) { + case SDLK_RETURN: + case SDLK_z: + mBufferedCommand = 'a'; + break; + + case SDLK_ESCAPE: + case SDLK_q: + mBufferedCommand = 'l'; + break; + + case SDLK_SPACE: + break; + + case SDLK_KP_7: + case SDLK_7: + mBufferedCommand = '7'; + break; + + case SDLK_KP_8: + case SDLK_8: + mBufferedCommand = '8'; + break; + + + case SDLK_KP_9: + case SDLK_9: + mBufferedCommand = '9'; + break; + + + case SDLK_s: + break; + case SDLK_d: + break; + case SDLK_v: + break; + case SDLK_b: + break; + case SDLK_j: + break; + case SDLK_k: + break; + case SDLK_x: + mBufferedCommand = 'd'; + break; + case SDLK_c: + break; + case SDLK_e: + break; + + case SDLK_1: + mBufferedCommand = '1'; + break; + + case SDLK_2: + mBufferedCommand = '2'; + break; + + case SDLK_3: + mBufferedCommand = '3'; + break; + + case SDLK_4: + mBufferedCommand = '4'; + break; + + case SDLK_5: + mBufferedCommand = '5'; + break; + + case SDLK_6: + mBufferedCommand = '6'; + break; + + + case SDLK_LEFT: + mBufferedCommand = 'q'; + break; + case SDLK_RIGHT: + mBufferedCommand = 'e'; + break; + case SDLK_UP: + mBufferedCommand = 'w'; + break; + case SDLK_DOWN: + mBufferedCommand = 's'; + break; + default: + mBufferedCommand = '.'; + } + } + } +} + +enum ECommand getInput(void) { + + if (currentGameMenuState == kPlayGame) { + put_sprite_8( + (XRES_FRAMEBUFFER / 2) + ((cameraX + 6) * 3) - 1, + (cameraZ * 3) + 10, + &playerPositionSprite[playerDirection][0], + 0 + ); + } + + switch(mBufferedCommand) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} + +void initHW(int argc, char **argv) { + renderer = NULL; + int r, g, b; + mBufferedCommand = '.'; + SDL_Init(SDL_INIT_EVERYTHING); + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); + memset(framebuffer, 0, 256 * 160); + window = + SDL_CreateWindow("Derelict 16-bits SDL2 test", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, 512, 320, SDL_WINDOW_SHOWN); + + renderer = SDL_CreateRenderer(window, -1, 0); + + palette[0] = 0x000000; + palette[1] = 0x0000AA; + palette[2] = 0x00AA00; + palette[3] = 0x00AAAA; + palette[4] = 0xAA0000; + palette[5] = 0xAA00AA; + palette[6] = 0xAA5500; + palette[7] = 0xAAAAAA; + palette[8] = 0x555555; + palette[9] = 0x5555FF; + palette[10] = 0x55FF55; + palette[11] = 0x55FFFF; + palette[12] = 0xFF5555; + palette[13] = 0xFF55FF; + palette[14] = 0xFFFF55; + palette[15] = 0xFFFFFF; + +#ifdef __EMSCRIPTEN__ + enterFullScreenMode (); +#endif + + initKeyboardUI(); + clearGraphics(); +} + + +void flipRenderer(void) { + SDL_Rect rect; + uint32_t pixel; + int x, y; + + rect.x = 0; + rect.y = 0; + rect.w = 512; + rect.h = 320; + + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderFillRect(renderer, &rect); + + for (y = 0; y < 160; ++y) { + for (x = 0; x < 255; ++x) { + rect.x = 2 * x; + rect.y = 2 * y; + rect.w = 2; + rect.h = 2; + int index = framebuffer[(256 * y) + x]; + assert( !(index < 0 || index >= 16)); + + pixel = palette[index]; + + int r = (pixel & 0x00FF0000) >> 16; + int g = ((pixel & 0x0000FF00) >> 8); + int b = ((pixel & 0x000000FF)); + + SDL_SetRenderDrawColor(renderer, r, + g, + b, 255); + SDL_RenderFillRect(renderer, &rect); + } + } + + SDL_RenderPresent(renderer); + +#ifndef __EMSCRIPTEN__ + SDL_Delay(1000 / 60); +#endif +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } + + fontTop++; + } + dstX += 8; + } +} + +void startFrame(int x, int y, int width, int height) { + +} + +void endFrame(void) { + if (currentGameMenuState == kPlayGame) { + put_sprite_8( + (XRES_FRAMEBUFFER / 2) + ((cameraX + 6) * 3) - 1, + (cameraZ * 3) + 10, + &playerPositionSprite[playerDirection][0], + 1 + ); + } + flipRenderer(); +} + + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } +} + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + diff --git a/mz_frontend/src/UI.c b/mz_frontend/src/UI.c new file mode 100644 index 000000000..52df06510 --- /dev/null +++ b/mz_frontend/src/UI.c @@ -0,0 +1,183 @@ +/* + Created by Daniel Monteiro on 11/07/2023. +*/ +#include + +#include "Enums.h" +#include "UI.h" +#include "Core.h" +#include "Renderer.h" +#include "Engine.h" +#include "SoundSystem.h" + +extern uint8_t playerLocation; + +extern int8_t cursorPosition; + +extern const struct CellPattern patterns[127]; + +extern int8_t map[32][32]; + +uint8_t waitForKey = 0; + +uint8_t redrawMap; + +uint8_t needsToRedrawHUD; + +void drawGraphic(const uint8_t *graphic) { + const uint8_t *ptr = graphic; + + while (*ptr) { + uint8_t c; + const uint8_t npoints = *ptr++; +#ifndef MONOCHROME_VECTORS + ptr += 3; /* skip colours */ +#endif + const uint8_t *shape = ptr; + + for (c = 0; c < npoints - 1; ++c) { + drawLine(shape[2 * c], shape[(2 * c) + 1], shape[(2 * c) + 2], shape[(2 * c) + 3], 2); + } + drawLine(shape[2 * npoints - 2], shape[2 * npoints - 1], shape[0], shape[1], 2); + ptr += 2 * npoints; + } +} + +void drawTextAt(uint8_t _x, uint8_t y, const char *text, uint8_t colour) { + drawTextAtWithMargin(_x, y, (XRES_FRAMEBUFFER), text, colour); +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + +void showMessage(const char *message) { + clearTextScreen(); + drawTextWindow(1, 16, (XRES_FRAMEBUFFER / 8) - 3, (YRES_FRAMEBUFFER / 8) - 18, "", message); + waitForKey = 1; +} + +void drawMap(void) { + +} + +void performAction(void) { + switch (getGameStatus()) { + case kBadVictory: + showMessage("Victory! Too bad you didn't survive"); + while (1); + + case kBadGameOver: + showMessage("You're dead! And so are the\n" + "other people on the path of\n" + "destruction faulty reactor"); + while (1); + + case kGoodVictory: + showMessage("Victory! You managed to destroy the\nship and get out alive"); + while (1); + + case kGoodGameOver: + showMessage("You failed! While you're alive\n" + "you failed to prevent the worst\n" + "scenario and now EVERYBODY is\n" + "dead!)"); + while (1); + } +} + +void drawWindow(uint8_t tx, uint8_t ty, uint8_t tw, uint8_t th, const char *title) { + uint16_t x0 = tx * 8; + uint16_t x1 = (tx + tw) * 8; + uint8_t y0 = ty * 8; + uint8_t y1 = (ty + th) * 8; + uint8_t c, d; + + for (c = 0; c < th; ++c) { + for (d = 0; d < tw; ++d) { + drawTextAtWithMarginWithFiltering( tx + d, ty + c, XRES_FRAMEBUFFER, " ", 2, ' '); + } + } + + drawLine(x0, y0, x1, y0, 2); + + drawLine(x0, y1, x1, y1, 2); + + drawLine(x0, y0, x0, y1, 2); + + drawLine(x1, y0, x1, y1, 2); + + drawTextAt(tx + 1, ty, title, 1); +} + + +void +drawWindowWithOptions(const uint8_t x, + const uint8_t y, + const uint8_t dx, + const uint8_t dy, + const char *title, + const char **options, + const uint8_t optionsCount, + const uint8_t selectedOption) { + uint8_t c; + + if (firstFrameOnCurrentState || selectedOption == 0xFF) { + drawWindow(x - 1, + y - 1, + dx + 1, + dy + 1, + title); + } + + for (c = 0; c < optionsCount; ++c) { + drawTextAt(x, + y + 1 + c, + (selectedOption == c) ? ">" : " ", + 1); + + if (firstFrameOnCurrentState || selectedOption == 0xFF) { + drawTextAt(x + 1, + y + 1 + c, + &options[c][0], + 1); + } + } +} + +void +drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, + const char *content) { + drawWindow(x, y, dx, dy, title); + drawTextAtWithMargin(x + 1, y + 2, (x + dx - 1) * 8, content, 1); +} + +enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t optionsCount, const enum ECommand cmd, enum EGameMenuState backState) { + + switch (cmd) { + case kCommandBack: + return backState; + case kCommandUp: + playSound(2); + --cursorPosition; + break; + case kCommandDown: + playSound(2); + ++cursorPosition; + break; + case kCommandFire1: + case kCommandFire2: + case kCommandFire3: + return options[cursorPosition]; + } + + if (cursorPosition >= optionsCount) { + cursorPosition = optionsCount - 1; + } + + if (cursorPosition < 0) { + cursorPosition = 0; + } + + return kResumeCurrentState; +} From 2b9a7e4b835656299aa5601c7c267ddd2a08806f Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 10 Jun 2024 22:12:37 +0100 Subject: [PATCH 14/48] [MY] Filter elevator text to only display "go up" or "go down" --- my_frontend/src/Crawler.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/my_frontend/src/Crawler.c b/my_frontend/src/Crawler.c index 7a8ca8094..c5a6c42be 100644 --- a/my_frontend/src/Crawler.c +++ b/my_frontend/src/Crawler.c @@ -3,6 +3,7 @@ */ #include #include +#include #include "Common.h" #include "Enums.h" @@ -52,10 +53,19 @@ void HUD_refresh(void) { /* Display "In room" item */ if (roomItem != NULL) { item = getItem(roomItem->item); - if (item->active) { - drawTextAt(1, YRES_TEXT - 6, "*", 2); + + if (strstr(item->name, "go-down")) { + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go down", 2, ' '); + } else { + if (strstr(item->name, "go-up")) { + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go up", 2, ' '); + } else { + if (item->active) { + drawTextAt(1, YRES_TEXT - 6, "*", 2); + } + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); + } } - drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); } else { drawTextAt(2, YRES_TEXT - 6, "Nothing", 2); } From c471b2da128bb04237a346536e4159191bacfde1 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 11 Jun 2024 09:36:47 +0100 Subject: [PATCH 15/48] [MY] Fix ia16 port --- my_frontend/src/msdos.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/my_frontend/src/msdos.c b/my_frontend/src/msdos.c index 689836f39..cf5c11fee 100644 --- a/my_frontend/src/msdos.c +++ b/my_frontend/src/msdos.c @@ -447,17 +447,23 @@ enum ECommand getInput(void) { return kCommandNone; } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { +void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int limitX, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { const char *ptr = text; uint16_t c = 0; uint16_t chary = 0; uint16_t x = _x; + uint8_t y = _y; char cha = *ptr; for (; cha && y < 25; ++c) { - if (x >= limitX || x >= (XRES_TEXT)) { + if (cha == '-') { + cha = charToReplaceHifenWith; + } + + if (x >= (limitX / 8) || x >= (XRES_TEXT)) { ++y; x = _x + 1; } else if (cha == '\n') { @@ -494,7 +500,6 @@ void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, } } - void startFrame(int x, int y, int width, int height) { } @@ -580,7 +585,7 @@ void clearTextScreen(void) { int c, d; for (c = 16; c < 24; ++c) { for (d = 0; d < 40; ++d) { - writeStrWithLimit(d, c, " ", 320 / 8, 2, 0); + drawTextAtWithMarginWithFiltering(d, c, 320, " ", 2, ' '); } } } From 4094850f270dfc0bd9b861aae252c0760760f39c Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 11 Jun 2024 14:07:04 +0100 Subject: [PATCH 16/48] [MY] Fix CPC port, with text reflowing It's SLOWER, but works, at least --- my_frontend/Makefile.464 | 2 + my_frontend/src/cpc.c | 110 ++++++++++++++++----------------------- 2 files changed, 46 insertions(+), 66 deletions(-) diff --git a/my_frontend/Makefile.464 b/my_frontend/Makefile.464 index 6dac9f6d1..ed472a36e 100644 --- a/my_frontend/Makefile.464 +++ b/my_frontend/Makefile.464 @@ -18,6 +18,8 @@ CFLAGS = \ -pragma-export:CLIB_GENCON_CAPS=0 \ -pragma-define:CLIB_FIRMWARE_KEYBOARD_CLICK=0 \ -pragma-define:CRT_DISABLELOADER=1 \ + -pragma-define:CLIB_DISABLE_MODE0=1 \ + -pragma-define:CLIB_DISABLE_MODE2=1 \ -Iinclude \ -I../core/include \ -I../common/include \ diff --git a/my_frontend/src/cpc.c b/my_frontend/src/cpc.c index c8379cdcf..7930d2dda 100644 --- a/my_frontend/src/cpc.c +++ b/my_frontend/src/cpc.c @@ -104,78 +104,72 @@ void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { } } -void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int limitX, const char *text, const uint8_t fg, +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, char charToReplaceHifenWith) { - (void)fg; - uint8_t len = strlen(text); - const char *ptr = text; - uint8_t c = 0; - uint8_t d = 0; - uint8_t x = _x; - uint8_t y = _y; + size_t len = strlen(text); + uint16_t dstX = x * 8; + int8_t dstY = y * 8; + + uint8_t c; + uint8_t d; uint8_t lastSpacePos = 0xFF; - uint8_t *lineBase = (unsigned char *) 0xC000 + ((((y * 8)) / 8) * 80) + ((((y * 8)) & 7) * 2048); + for (c = 0; c < len; ++c) { - for (; c < len && y < 64; ++c) { + char currentChar = text[c]; - char cha = *ptr; + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } - if (x == limitX) { - ++y; - lineBase = (unsigned char *) 0xC000 + ((((y * 8)) / 8) * 80) + ((((y * 8)) & 7) * 2048); - x = _x; - } else if (cha == '\n') { - ++y; - lineBase = (unsigned char *) 0xC000 + ((((y * 8)) / 8) * 80) + ((((y * 8)) & 7) * 2048); - x = _x; - ++ptr; + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; continue; } - if (cha >= 'a') { - if (cha <= 'z') { - cha = (cha - 'a') + 'A'; - } else { - cha -= ('z' - 'a'); - } + if (dstY >= YRES_FRAMEBUFFER) { + return; } - uint8_t *fontTop = &font[((cha - 32) << 3)]; - - uint8_t *line = lineBase + 2 * x + 1; + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; - for (uint8_t d = 0; d < 8; ++d) { - uint8_t e; - uint8_t chunk = *fontTop; - uint8_t *pixel = line; + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } - *pixel = 0; - for (e = 0; e < 4; ++e) { - if (chunk & 1) { - *pixel |= (16 << e); - } - chunk = chunk >> 1; + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); } + } - --pixel; + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; - *pixel = 0; + for (uint8_t f = 0; f < 8; ++f) { + uint8_t e; + uint8_t chunk = *fontTop; - for (e = 0; e < 4; ++e) { - if (chunk & 1) { - *pixel |= (16 << e); - } + for (e = 0; e < 8; ++e) { + realPut(dstX + (7 - e), dstY + (f), (chunk & 1), NULL); chunk = chunk >> 1; } fontTop++; - line += 2048; } - ++x; - ++ptr; + dstX += 8; } } @@ -195,12 +189,7 @@ uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { } void clearTextScreen(void) { - uint8_t c, d; - for (c = 16; c < 24; ++c) { - for (d = 0; d < 40; ++d) { - drawTextAtWithMarginWithFiltering(d, c, 320, " ", 2, ' '); - } - } + fillRect(8, YRES + 8, XRES_FRAMEBUFFER - 8, YRES_FRAMEBUFFER -8, 0, 0); } void handleSystemEvents(void) {} @@ -287,7 +276,7 @@ void endFrame(void) { uint8_t *line = (unsigned char *) 0xC000 + ((y >> 3) * 80) + ((y & 7) * 2048); memcpy(line, buffer + (y * BUFFER_SIZEX), BUFFER_SIZEX); } - memset(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); + clearGraphics(); #ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION if (roomTransitionAnimationStep) { @@ -335,17 +324,6 @@ void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple) { } } -uint8_t *graphicsPutAddr(uint8_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { - (void)colour; - if (ptr == NULL) { - ptr = &buffer[(y * (BUFFER_SIZEX)) + (x / 4)]; /* skip to the line in pattern */ - } - - *ptr |= (8 >> (x & 3)); - - return ptr; -} - void graphicsPutPointArray(uint8_t *y128Values) { uint8_t *stencilPtr = y128Values; uint16_t x; From 78a70f94db7deaf0577d56b63f62581b6a6cccbd Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 13 Jun 2024 21:43:41 +0100 Subject: [PATCH 17/48] feat: add very basic, temporary, logo for the main menu It looks OK-ish for MY and kind of glitched on others - but it's a matter of proving the concept --- art/logo.svg | 106 +++ common/include/UI.h | 2 +- common/src/MainMenu.c | 1384 +++++++++++++++++++++++++++++++++++++- common/src/UI.c | 30 +- my_frontend/include/UI.h | 2 +- my_frontend/src/UI.c | 6 +- my_frontend/src/cpc.c | 1 + 7 files changed, 1509 insertions(+), 22 deletions(-) create mode 100644 art/logo.svg diff --git a/art/logo.svg b/art/logo.svg new file mode 100644 index 000000000..181b4139f --- /dev/null +++ b/art/logo.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/include/UI.h b/common/include/UI.h index b7f6568a4..5710fb7d8 100644 --- a/common/include/UI.h +++ b/common/include/UI.h @@ -37,7 +37,7 @@ enum EGameMenuState handleCursor(const enum EGameMenuState* options, const enum ECommand cmd, enum EGameMenuState backState); -void drawGraphic(const uint8_t *shapes); +void drawGraphic(uint16_t x, uint8_t y, const uint8_t *shapes); extern int8_t cursorPosition; diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index 8d17bed6c..f86185a49 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -42,6 +42,1385 @@ const enum EGameMenuState MainMenu_nextStateNavigation[3] = { const uint8_t kMainMenuOptionsCount = 3; #endif +#ifndef MONOCHROME_VECTORS +static const uint8_t logoGraphics[] = { + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 14, + 0, 14, + 0, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 14, + 0, 14, + 0, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 0, + 0, 12, + 0, 12, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 0, + 0, 12, + 0, 12, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 13, + 0, 14, + 0, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 13, + 0, 14, + 0, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 0, + 0, 0, + 0, 12, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 0, + 0, 12, + 3, 10, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 11, + 0, 13, + 0, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 11, + 0, 14, + 3, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 4, + 10, 1, + 10, 0, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 4, + 10, 0, + 3, 0, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 10, + 10, 5, + 10, 5, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 10, + 10, 5, + 3, 11, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 14, + 10, 13, + 10, 3, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 14, + 10, 3, + 3, 4, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 10, 1, + 11, 0, + 11, 0, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 10, 1, + 11, 0, + 10, 0, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 10, 13, + 11, 13, + 11, 2, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 10, 13, + 11, 2, + 10, 3, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 11, 13, + 13, 13, + 13, 2, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 11, 13, + 13, 2, + 11, 2, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 16, 1, + 16, 14, + 16, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 16, 1, + 16, 14, + 16, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 9, + 16, 1, + 16, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 9, + 16, 14, + 21, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 14, + 28, 14, + 28, 0, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 14, + 28, 0, + 21, 9, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 28, 14, + 28, 14, + 28, 14, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 28, 14, + 28, 14, + 28, 0, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 66, 37, + 65, 50, + 65, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 66, 37, + 65, 50, + 66, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 71, 45, + 66, 37, + 66, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 71, 45, + 66, 50, + 71, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 71, 50, + 77, 50, + 77, 36, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 71, 50, + 77, 36, + 71, 45, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 77, 50, + 78, 50, + 78, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 77, 50, + 78, 50, + 77, 36, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 31, 2, + 31, 13, + 31, 13, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 31, 2, + 31, 13, + 31, 13, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 33, 3, + 31, 2, + 31, 13, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 33, 3, + 31, 13, + 33, 12, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 37, 4, + 33, 3, + 33, 12, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 37, 4, + 33, 12, + 37, 9, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 37, 9, + 33, 6, + 33, 6, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 37, 9, + 33, 6, + 37, 4, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 37, 9, + 37, 9, + 37, 9, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 37, 9, + 37, 9, + 37, 9, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 30, + 1, 17, + 1, 30, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 30, + 1, 30, + 0, 30, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 1, 17, + 3, 20, + 3, 29, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 1, 17, + 3, 29, + 1, 30, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 20, + 6, 23, + 6, 29, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 20, + 6, 29, + 3, 26, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 6, 23, + 6, 24, + 6, 28, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 6, 23, + 6, 28, + 6, 29, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 6, 24, + 9, 22, + 9, 25, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 6, 24, + 9, 25, + 6, 28, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 9, 22, + 13, 18, + 13, 30, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 9, 22, + 13, 30, + 9, 30, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 13, 18, + 13, 31, + 13, 31, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 13, 18, + 13, 31, + 13, 30, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 80, 50, + 81, 37, + 81, 49, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 80, 50, + 81, 49, + 80, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 81, 37, + 83, 40, + 83, 49, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 81, 37, + 83, 49, + 81, 49, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 83, 40, + 86, 43, + 86, 48, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 83, 40, + 86, 48, + 83, 45, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 86, 43, + 87, 44, + 87, 48, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 86, 43, + 87, 48, + 86, 48, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 87, 44, + 89, 41, + 89, 45, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 87, 44, + 89, 45, + 87, 48, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 89, 41, + 93, 38, + 93, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 89, 41, + 93, 50, + 89, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 93, 38, + 93, 50, + 93, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 93, 38, + 93, 50, + 93, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 8, 47, + 9, 35, + 9, 47, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 8, 47, + 9, 47, + 8, 47, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 9, 35, + 12, 38, + 12, 47, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 9, 35, + 12, 47, + 9, 47, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 12, 38, + 14, 41, + 14, 46, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 12, 38, + 14, 46, + 12, 43, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 14, 41, + 15, 42, + 15, 45, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 14, 41, + 15, 45, + 14, 46, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 15, 42, + 18, 39, + 18, 43, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 15, 42, + 18, 43, + 15, 45, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 18, 39, + 21, 35, + 21, 48, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 18, 39, + 21, 48, + 18, 47, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 35, + 22, 48, + 22, 48, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 35, + 22, 48, + 21, 48, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 16, 30, + 16, 19, + 16, 19, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 16, 30, + 16, 19, + 16, 19, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 27, + 16, 30, + 16, 19, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 27, + 16, 19, + 21, 19, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 19, + 27, 19, + 27, 32, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 21, 19, + 27, 32, + 21, 27, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 32, 31, + 31, 17, + 31, 17, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 32, 31, + 31, 17, + 32, 18, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 36, 31, + 32, 31, + 32, 18, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 36, 31, + 32, 18, + 36, 20, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 41, 32, + 36, 31, + 36, 20, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 41, 32, + 36, 20, + 41, 22, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 41, 23, + 36, 24, + 36, 24, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 41, 23, + 36, 24, + 41, 32, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 41, 22, + 42, 22, + 42, 22, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 41, 22, + 42, 22, + 41, 23, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 46, 48, + 45, 34, + 45, 34, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 46, 48, + 45, 34, + 46, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 50, 48, + 46, 48, + 46, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 50, 48, + 46, 35, + 50, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 55, 49, + 50, 48, + 50, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 55, 49, + 50, 37, + 55, 39, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 55, 40, + 50, 42, + 50, 42, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 55, 40, + 50, 42, + 55, 49, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 55, 39, + 57, 39, + 57, 39, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 55, 39, + 57, 39, + 55, 40, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 44, 32, + 43, 17, + 43, 17, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 44, 32, + 43, 17, + 44, 17, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 48, 32, + 44, 32, + 44, 17, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 48, 32, + 44, 17, + 48, 17, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 48, 26, + 49, 27, + 49, 32, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 48, 26, + 49, 32, + 48, 32, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 48, 17, + 49, 17, + 49, 26, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 48, 17, + 49, 26, + 48, 26, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 49, 27, + 51, 32, + 51, 32, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 49, 27, + 51, 32, + 49, 32, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 49, 17, + 51, 18, + 51, 20, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 49, 17, + 51, 20, + 49, 22, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 49, 22, + 51, 24, + 51, 25, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 49, 22, + 51, 25, + 49, 26, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 51, 18, + 52, 18, + 52, 19, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 51, 18, + 52, 19, + 51, 20, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 51, 24, + 52, 24, + 52, 24, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 51, 24, + 52, 24, + 51, 25, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 52, 18, + 54, 18, + 54, 18, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 52, 18, + 54, 18, + 52, 19, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 34, 50, + 34, 35, + 34, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 34, 50, + 34, 35, + 34, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 50, + 34, 50, + 34, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 50, + 34, 35, + 39, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 44, + 39, 45, + 39, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 44, + 39, 50, + 39, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 35, + 39, 35, + 39, 44, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 35, + 39, 44, + 39, 44, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 45, + 42, 50, + 42, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 45, + 42, 50, + 39, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 35, + 42, 35, + 42, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 35, + 42, 37, + 39, 40, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 40, + 42, 42, + 42, 43, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 39, 40, + 42, 43, + 39, 44, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 42, 35, + 43, 35, + 43, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 42, 35, + 43, 37, + 42, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 42, 42, + 43, 42, + 43, 42, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 42, 42, + 43, 42, + 42, 43, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 43, 35, + 45, 35, + 45, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 43, 35, + 45, 35, + 43, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 35, + 0, 46, + 0, 46, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 3, 35, + 0, 46, + 3, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 4, 47, + 1, 46, + 1, 46, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 4, 47, + 1, 46, + 4, 34, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 8, 47, + 4, 47, + 4, 34, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 8, 47, + 4, 34, + 8, 47, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 60, 50, + 57, 49, + 57, 49, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 60, 50, + 57, 49, + 60, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 64, 50, + 60, 50, + 60, 37, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 64, 50, + 60, 37, + 64, 50, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 25, 46, + 24, 35, + 24, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 25, 46, + 24, 35, + 25, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 27, 42, + 25, 46, + 25, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 27, 42, + 25, 35, + 27, 36, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 27, 36, + 33, 40, + 33, 40, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 27, 36, + 33, 40, + 27, 42, + 0}; + + + +#else +static const uint8_t logoGraphics[] = { + 8, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 11, 0, + 0, 0, + 0, 12, + 10, 5, + 0, 14, + 13, 13, + 13, 2, + 3, 4, + 5, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 16, 1, + 16, 14, + 28, 14, + 28, 0, + 21, 9, + 5, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 66, 37, + 65, 50, + 78, 50, + 77, 36, + 71, 45, + 5, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 31, 2, + 31, 13, + 37, 9, + 33, 6, + 37, 4, + 10, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 1, 17, + 6, 24, + 13, 18, + 13, 31, + 9, 30, + 9, 25, + 6, 29, + 3, 26, + 3, 29, + 0, 30, + 10, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 81, 37, + 87, 44, + 93, 38, + 93, 50, + 89, 50, + 89, 45, + 86, 48, + 83, 45, + 83, 49, + 80, 50, + 10, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 9, 35, + 15, 42, + 21, 35, + 22, 48, + 18, 47, + 18, 43, + 14, 46, + 12, 43, + 12, 47, + 8, 47, + 5, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 16, 30, + 16, 19, + 27, 19, + 27, 32, + 21, 27, + 5, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 32, 31, + 31, 17, + 42, 22, + 36, 24, + 41, 32, + 5, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 46, 48, + 45, 34, + 57, 39, + 50, 42, + 55, 49, + 7, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 51, 32, + 44, 32, + 43, 17, + 54, 18, + 49, 22, + 52, 24, + 48, 26, + 7, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 42, 50, + 34, 50, + 34, 35, + 45, 35, + 39, 40, + 43, 42, + 39, 44, + 2, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 0, 46, + 3, 35, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 1, 46, + 4, 34, + 8, 47, + 3, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 57, 49, + 60, 37, + 64, 50, + 4, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 25, 46, + 24, 35, + 33, 40, + 27, 42, + 0}; + + + + +#endif + + + static const uint8_t splashGraphics[] = { #ifdef MONOCHROME_VECTORS 5, @@ -2106,7 +3485,8 @@ void MainMenu_repaintCallback(void) { #ifndef MONOCHROME_VECTORS fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); #endif - drawGraphic(splashGraphics); + drawGraphic(0, 0, splashGraphics); + drawGraphic(XRES_FRAMEBUFFER / 2, 0, logoGraphics); playSound(MAIN_MENU_THEME); } @@ -2115,7 +3495,7 @@ void MainMenu_repaintCallback(void) { (YRES_FRAMEBUFFER / 8) - 4 - kMainMenuOptionsCount, 9 + 2, kMainMenuOptionsCount + 2, - "Episode 0", + "Derelict", MainMenu_options, kMainMenuOptionsCount, cursorPosition); diff --git a/common/src/UI.c b/common/src/UI.c index c8cb714ec..8112980c4 100644 --- a/common/src/UI.c +++ b/common/src/UI.c @@ -232,7 +232,7 @@ enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t opt return kResumeCurrentState; } -void drawGraphic(const uint8_t *graphic) { +void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic) { const uint8_t *ptr = graphic; int buffer[6]; @@ -256,35 +256,35 @@ void drawGraphic(const uint8_t *graphic) { centerX /= npoints; centerY /= npoints; - buffer[4] = centerX; - buffer[5] = centerY; + buffer[4] = x + centerX; + buffer[5] = y + centerY; for (c = 0; c < npoints - 1; ++c) { - buffer[0] = shape[(2 * c) + 0]; - buffer[1] = shape[(2 * c) + 1]; - buffer[2] = shape[(2 * c) + 2]; - buffer[3] = shape[(2 * c) + 3]; + buffer[0] = x + shape[(2 * c) + 0]; + buffer[1] = y + shape[(2 * c) + 1]; + buffer[2] = x + shape[(2 * c) + 2]; + buffer[3] = y + shape[(2 * c) + 3]; fillTriangle(&buffer[0], colour); } ptr += 2 * npoints; } else if (npoints == 3) { - buffer[0] = shape[0]; - buffer[1] = shape[1]; - buffer[2] = shape[2]; - buffer[3] = shape[3]; - buffer[4] = shape[4]; - buffer[5] = shape[5]; + buffer[0] = x + shape[0]; + buffer[1] = y + shape[1]; + buffer[2] = x + shape[2]; + buffer[3] = y + shape[3]; + buffer[4] = x + shape[4]; + buffer[5] = y + shape[5]; fillTriangle(&buffer[0], colour); ptr += 2 * npoints; } else if (npoints == 2) { - drawLine(shape[0], shape[1], shape[2], shape[3], colour); + drawLine(x + shape[0], y + shape[1], x + shape[2], y + shape[3], colour); ptr += 2 * npoints; } else if (npoints == 1) { - fillRect(shape[0], shape[1], 1, 1, colour, FALSE); + fillRect(x + shape[0], y + shape[1], 1, 1, colour, FALSE); ptr += 2 * npoints; } } diff --git a/my_frontend/include/UI.h b/my_frontend/include/UI.h index 8dac7f916..21d1c9e20 100644 --- a/my_frontend/include/UI.h +++ b/my_frontend/include/UI.h @@ -25,7 +25,7 @@ drawWindowWithOptions(const uint8_t x, const uint8_t optionsCount, const uint8_t selectedOption); -void drawGraphic(const uint8_t *graphic); +void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic); void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, const char *content); diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 4a82cb805..28cda6150 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -24,7 +24,7 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; -void drawGraphic(const uint8_t *graphic) { +void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic) { const uint8_t *ptr = graphic; while (*ptr) { @@ -36,9 +36,9 @@ void drawGraphic(const uint8_t *graphic) { const uint8_t *shape = ptr; for (c = 0; c < npoints - 1; ++c) { - drawLine(shape[2 * c], shape[(2 * c) + 1], shape[(2 * c) + 2], shape[(2 * c) + 3], 2); + drawLine(x + shape[2 * c], y + shape[(2 * c) + 1], x + shape[(2 * c) + 2], y + shape[(2 * c) + 3], 2); } - drawLine(shape[2 * npoints - 2], shape[2 * npoints - 1], shape[0], shape[1], 2); + drawLine(x + shape[2 * npoints - 2], y + shape[2 * npoints - 1], x + shape[0], y + shape[1], 2); ptr += 2 * npoints; } } diff --git a/my_frontend/src/cpc.c b/my_frontend/src/cpc.c index 7930d2dda..814c63b66 100644 --- a/my_frontend/src/cpc.c +++ b/my_frontend/src/cpc.c @@ -88,6 +88,7 @@ void initHW(int argc, char **argv) { initAY38910(); initKeyboardUI(); needsToRedrawVisibleMeshes = 0; + waitForKey = 0; } void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { From dec659f10598cf3698bb5b85406d2314811ee212 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 13 Jun 2024 22:09:50 +0100 Subject: [PATCH 18/48] [MY] Fix Xcode2 builds --- my_frontend/Xcode2/OSXRenderer.m | 111 ++++++++++++++++--------------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/my_frontend/Xcode2/OSXRenderer.m b/my_frontend/Xcode2/OSXRenderer.m index 227851c9f..aeea547fa 100644 --- a/my_frontend/Xcode2/OSXRenderer.m +++ b/my_frontend/Xcode2/OSXRenderer.m @@ -197,57 +197,76 @@ void clearScreen(void) { fillRect(0, 0, 255, 192, 0, 0); } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { - uint8_t len = strlen(text); - char *ptr = text; - uint8_t c = 0; - uint8_t x = _x; - int d; - - for (; c < len && y < 64; ++c) { - - char cha = *ptr; - - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++ptr; +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; continue; } - - if (cha >= 'a') { - if (cha <= 'z') { - cha = (cha - 'a') + 'A'; + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; } else { - cha -= ('z' - 'a'); + currentChar -= ('z' - 'a'); } } - - uint8_t *fontTop = &font[((cha - 32) << 3)]; - - - for (d = 0; d < 8; ++d) { + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { int e; uint8_t chunk = *fontTop; - + for (e = 0; e < 8; ++e) { if (chunk & 1) { - realPut(8 * x + (7 - e), 8 * y + (d), 1, NULL); + realPut(dstX + (7 - e), dstY + (f), 1, NULL); } else { - realPut(8 * x + (7 - e), 8 * y + (d), 0, NULL); + realPut(dstX + (7 - e), dstY + (f), 0, NULL); } chunk = chunk >> 1; } - - + fontTop++; } - - ++x; - ++ptr; + dstX += 8; } } @@ -267,25 +286,7 @@ void flipRenderer(void) { } } -void graphicsFlush(void) { - if (updateDirection) { - updateDirection = 0; - switch (getPlayerDirection()) { - case 0: - writeStrWithLimit(12, 17, "N", 31, 2, 0); - break; - case 1: - writeStrWithLimit(12, 17, "E", 31, 2, 0); - break; - case 2: - writeStrWithLimit(12, 17, "S", 31, 2, 0); - break; - case 3: - writeStrWithLimit(12, 17, "W", 31, 2, 0); - break; - } - } - +void graphicsFlush(void) { if (needsToRedrawVisibleMeshes) { flipRenderer(); clearGraphics(); From 02b7ba5ca164edb28cd33157ea70a41a49be7a22 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Fri, 14 Jun 2024 18:10:43 +0100 Subject: [PATCH 19/48] [CORE] Fix being able to search the clogged flush twice and always producing the card https://github.com/TheFakeMontyOnTheRun/space-trashman-blues/issues/153 --- core/src/Derelict.c | 2 +- core/tests/TestDerelict.cpp | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/core/src/Derelict.c b/core/src/Derelict.c index 4c0608110..34c3ccaf6 100644 --- a/core/src/Derelict.c +++ b/core/src/Derelict.c @@ -193,7 +193,7 @@ void useCloggedFlush(struct Item *item) { struct Item *highRankKeycard = getItemNamed("high-rank-keycard"); (void)item; - if (highRankKeycard->roomId == 0) { + if (highRankKeycard->roomId == 0 && !playerHasObject("high-rank-keycard")) { defaultLogger("Found something among the\n...stuff..."); addToRoom("wc", highRankKeycard); } diff --git a/core/tests/TestDerelict.cpp b/core/tests/TestDerelict.cpp index 1d860e53c..f91743362 100644 --- a/core/tests/TestDerelict.cpp +++ b/core/tests/TestDerelict.cpp @@ -357,3 +357,25 @@ TEST_F(TestDerelict, cantUseKeyCard) { parseCommand("use", "hacked-keycard"); ASSERT_FALSE(getItemNamed("hacked-keycard")->active); } + +/* regression for https://github.com/TheFakeMontyOnTheRun/space-trashman-blues/issues/153 */ +TEST_F(TestDerelict, cantUseCloggedFlushTwice) { + setPlayerLocation(getRoomIdByName("wc")); + + ASSERT_FALSE(playerHasObject("high-rank-keycard")); + ASSERT_EQ(0, getItemNamed("high-rank-keycard")->roomId); + + parseCommand("use", "clogged-flush"); + ASSERT_NE(0, getItemNamed("high-rank-keycard")->roomId); + ASSERT_FALSE(playerHasObject("high-rank-keycard")); + + parseCommand("pick", "high-rank-keycard"); + + parseCommand("use", "clogged-flush"); + ASSERT_TRUE(playerHasObject("high-rank-keycard")); + ASSERT_EQ(0, getItemNamed("high-rank-keycard")->roomId); + + parseCommand("use", "clogged-flush"); + ASSERT_TRUE(playerHasObject("high-rank-keycard")); + ASSERT_EQ(0, getItemNamed("high-rank-keycard")->roomId); +} From 843ddc684e380d9360e96ef4428f2426609bcb5e Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sun, 16 Jun 2024 22:52:55 +0100 Subject: [PATCH 20/48] [MY] Fix elevator positioning when going up or down Fixes https://github.com/TheFakeMontyOnTheRun/space-trashman-blues/issues/154 --- core/src/Core.c | 10 +++++++--- my_frontend/src/Crawler.c | 6 ++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/Core.c b/core/src/Core.c index f94b0dd1d..5f88c23d6 100644 --- a/core/src/Core.c +++ b/core/src/Core.c @@ -356,10 +356,14 @@ void moveBy(uint8_t direction) { playerLocation = room->connections[direction]; room = &rooms[playerLocation]; - for (c = 0; c < 6; ++c) { - if (room->connections[c] == previousLocation) { - direction = c; + if (direction < 4) { + for (c = 0; c < 6; ++c) { + if (room->connections[c] == previousLocation) { + direction = c; + } } + } else { + return; } switch (direction) { diff --git a/my_frontend/src/Crawler.c b/my_frontend/src/Crawler.c index c5a6c42be..a239e3162 100644 --- a/my_frontend/src/Crawler.c +++ b/my_frontend/src/Crawler.c @@ -119,6 +119,12 @@ enum EGameMenuState Crawler_tickCallback(enum ECommand cmd, void* data) { case kCommandFire3: pickItem(); + + if (playerLocation != previousLocation) { + redrawMap = needsToRedrawHUD = needsToRedrawVisibleMeshes = 1; + initMap(); + } + break; case kCommandFire4: From bd81ec42cc1a691634ab893b08b9b042a4007532 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 18 Jun 2024 21:18:59 +0100 Subject: [PATCH 21/48] fix: title screen shapes going out of bounds --- common/src/MainMenu.c | 198 +++++++++++++--------------- tools/svg-triangulator/newtitle.svg | 116 ++++++++-------- 2 files changed, 147 insertions(+), 167 deletions(-) diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index f86185a49..d526d92da 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -1453,7 +1453,7 @@ static const uint8_t splashGraphics[] = { 42, 57, 4, #ifndef MONOCHROME_VECTORS -0, 0, 0, +68, 120, 33, #endif 42, 57, 39, 75, @@ -1477,13 +1477,13 @@ static const uint8_t splashGraphics[] = { 46, 35, 63, 37, 81, 38, -88, 35, -88, 21, +87, 35, +87, 21, 49, 18, 46, 35, 5, #ifndef MONOCHROME_VECTORS -0, 0, 0, +108, 103, 83, #endif 49, 18, 46, 35, @@ -1496,8 +1496,8 @@ static const uint8_t splashGraphics[] = { #endif 48, 18, 73, 22, -88, 21, -88, 1, +87, 21, +87, 1, 77, 1, 52, 15, 7, @@ -1539,11 +1539,10 @@ static const uint8_t splashGraphics[] = { 56, 124, 42, 123, 27, 98, -5, +4, #ifndef MONOCHROME_VECTORS 205, 222, 135, #endif -1, 108, 25, 106, 36, 125, 1, 125, @@ -1557,17 +1556,13 @@ static const uint8_t splashGraphics[] = { 61, 53, 45, 53, 46, 47, -8, +4, #ifndef MONOCHROME_VECTORS 147, 172, 147, #endif 59, 39, -59, 39, -88, 42, -88, 42, -88, 36, -88, 36, -59, 39, +87, 41, +87, 36, 59, 39, 8, #ifndef MONOCHROME_VECTORS @@ -1583,18 +1578,18 @@ static const uint8_t splashGraphics[] = { 59, 94, 7, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +0, 0, 111017082, #endif 27, 98, 36, 98, 49, 18, -78, 1, +77, 1, 68, 1, 43, 15, 27, 98, 5, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +0, 0, 111017082, #endif 1, 1, 1, 7, @@ -1603,14 +1598,14 @@ static const uint8_t splashGraphics[] = { 68, 1, 3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +0, 0, 111017082, #endif 43, 17, -46, 1, +45, 1, 68, 1, 4, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +0, 0, 111017082, #endif 49, 18, 43, 17, @@ -1618,11 +1613,11 @@ static const uint8_t splashGraphics[] = { 78, 1, 4, #ifndef MONOCHROME_VECTORS -36, 34, 28, +108, 93, 83, #endif 43, 17, 1, 9, -0, 1, +1, 1, 46, 1, 6, #ifndef MONOCHROME_VECTORS @@ -1643,17 +1638,16 @@ static const uint8_t splashGraphics[] = { 87, 107, 87, 125, 46, 125, -8, +7, #ifndef MONOCHROME_VECTORS 170, 0, 0, #endif -87, 32, 71, 33, 55, 36, 51, 57, 51, 86, 62, 98, -88, 92, +87, 92, 87, 32, 6, #ifndef MONOCHROME_VECTORS @@ -1719,25 +1713,23 @@ static const uint8_t splashGraphics[] = { 70, 125, 3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +0, 0, 111017082, #endif 62, 95, 58, 67, 53, 84, 3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +0, 0, 111017082, #endif 53, 84, 58, 67, 53, 59, -5, +3, #ifndef MONOCHROME_VECTORS 43, 0, 0, #endif 49, 99, -49, 99, -87, 101, 87, 101, 87, 98, 3, @@ -1762,6 +1754,8 @@ static const uint8_t splashGraphics[] = { 85, 61, 85, 88, 0}; + + #else 3, #ifndef MONOCHROME_VECTORS @@ -1905,28 +1899,28 @@ static const uint8_t splashGraphics[] = { 81, 124, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 68, 120, 33, #endif 42, 57, 39, 75, 39, 75, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 68, 120, 33, #endif 42, 57, 39, 75, 42, 73, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 68, 120, 33, #endif 42, 73, 71, 58, 71, 58, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 68, 120, 33, #endif 42, 73, 71, 58, @@ -2076,67 +2070,67 @@ static const uint8_t splashGraphics[] = { 183, 200, 183, #endif 81, 38, - 88, 35, - 88, 21, + 87, 35, + 87, 21, 3, #ifndef MONOCHROME_VECTORS 183, 200, 183, #endif 81, 38, - 88, 21, + 87, 21, 81, 21, 3, #ifndef MONOCHROME_VECTORS 183, 200, 183, #endif - 88, 35, - 88, 21, - 88, 21, + 87, 35, + 87, 35, + 87, 35, 3, #ifndef MONOCHROME_VECTORS 183, 200, 183, #endif - 88, 35, - 88, 21, - 88, 21, + 87, 35, + 87, 35, + 87, 21, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 108, 103, 83, #endif 49, 18, 46, 35, 46, 35, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 108, 103, 83, #endif 49, 18, 46, 35, 49, 35, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 108, 103, 83, #endif 49, 35, 72, 38, 72, 22, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 108, 103, 83, #endif 49, 35, 72, 22, 49, 18, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 108, 103, 83, #endif 72, 38, 73, 22, 73, 22, 3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 108, 103, 83, #endif 72, 38, 73, 22, @@ -2188,29 +2182,29 @@ static const uint8_t splashGraphics[] = { 138, 145, 111, #endif 77, 22, - 88, 21, - 88, 1, + 87, 21, + 87, 1, 3, #ifndef MONOCHROME_VECTORS 138, 145, 111, #endif 77, 22, - 88, 1, + 87, 1, 77, 1, 3, #ifndef MONOCHROME_VECTORS 138, 145, 111, #endif - 88, 21, - 88, 21, - 88, 21, + 87, 21, + 87, 1, + 87, 1, 3, #ifndef MONOCHROME_VECTORS 138, 145, 111, #endif - 88, 21, - 88, 21, - 88, 1, + 87, 21, + 87, 1, + 87, 1, 3, #ifndef MONOCHROME_VECTORS 196, 200, 183, @@ -2466,20 +2460,6 @@ static const uint8_t splashGraphics[] = { 3, #ifndef MONOCHROME_VECTORS 205, 222, 135, -#endif - 1, 108, - 1, 108, - 1, 125, - 3, -#ifndef MONOCHROME_VECTORS - 205, 222, 135, -#endif - 1, 108, - 1, 125, - 1, 125, - 3, -#ifndef MONOCHROME_VECTORS - 205, 222, 135, #endif 1, 108, 25, 106, @@ -2552,29 +2532,29 @@ static const uint8_t splashGraphics[] = { 147, 172, 147, #endif 59, 39, - 88, 42, - 88, 36, + 87, 41, + 87, 36, 3, #ifndef MONOCHROME_VECTORS 147, 172, 147, #endif 59, 39, - 88, 36, + 87, 36, 59, 39, 3, #ifndef MONOCHROME_VECTORS 147, 172, 147, #endif - 88, 42, - 88, 36, - 88, 36, + 87, 41, + 87, 41, + 87, 41, 3, #ifndef MONOCHROME_VECTORS 147, 172, 147, #endif - 88, 42, - 88, 36, - 88, 36, + 87, 41, + 87, 41, + 87, 36, 3, #ifndef MONOCHROME_VECTORS 170, 212, 0, @@ -2664,14 +2644,14 @@ static const uint8_t splashGraphics[] = { 227, 226, 219, #endif 68, 7, - 78, 1, - 78, 1, + 77, 1, + 77, 1, 3, #ifndef MONOCHROME_VECTORS 227, 226, 219, #endif 68, 7, - 78, 1, + 77, 1, 68, 1, 3, #ifndef MONOCHROME_VECTORS @@ -2686,20 +2666,20 @@ static const uint8_t splashGraphics[] = { #endif 1, 1, 1, 7, - 1, 21, + 1, 11, 3, #ifndef MONOCHROME_VECTORS 145, 138, 111, #endif 1, 1, 1, 1, - 1, 21, + 1, 11, 3, #ifndef MONOCHROME_VECTORS 145, 138, 111, #endif 1, 1, - 1, 21, + 1, 11, 1, 21, 3, #ifndef MONOCHROME_VECTORS @@ -2733,29 +2713,29 @@ static const uint8_t splashGraphics[] = { #ifndef MONOCHROME_VECTORS 72, 62, 55, #endif - 46, 15, + 45, 15, 43, 17, 43, 17, 3, #ifndef MONOCHROME_VECTORS 72, 62, 55, #endif - 46, 15, + 45, 15, 43, 17, - 46, 1, + 45, 1, 3, #ifndef MONOCHROME_VECTORS 72, 62, 55, #endif 68, 1, - 46, 15, - 46, 1, + 45, 15, + 45, 1, 3, #ifndef MONOCHROME_VECTORS 72, 62, 55, #endif 68, 1, - 46, 1, + 45, 1, 68, 1, 3, #ifndef MONOCHROME_VECTORS @@ -2801,42 +2781,42 @@ static const uint8_t splashGraphics[] = { 78, 1, 3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, + 108, 93, 83, #endif 1, 9, - 0, 1, - 0, 1, + 1, 9, + 1, 9, 3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, + 108, 93, 83, #endif 1, 9, - 0, 1, + 1, 9, 1, 1, 3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, + 108, 93, 83, #endif 43, 17, 1, 9, 1, 1, 3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, + 108, 93, 83, #endif 43, 17, 1, 1, 43, 1, 3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, + 108, 93, 83, #endif 46, 1, 43, 17, 43, 1, 3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, + 108, 93, 83, #endif 46, 1, 43, 1, @@ -3042,14 +3022,14 @@ static const uint8_t splashGraphics[] = { 170, 0, 0, #endif 87, 92, - 88, 92, - 88, 92, + 87, 92, + 87, 92, 3, #ifndef MONOCHROME_VECTORS 170, 0, 0, #endif 87, 92, - 88, 92, + 87, 92, 87, 32, 3, #ifndef MONOCHROME_VECTORS @@ -3377,14 +3357,14 @@ static const uint8_t splashGraphics[] = { #ifndef MONOCHROME_VECTORS 43, 0, 0, #endif - 87, 98, - 87, 98, + 87, 101, + 87, 101, 87, 101, 3, #ifndef MONOCHROME_VECTORS 43, 0, 0, #endif - 87, 98, + 87, 101, 87, 101, 87, 98, 3, diff --git a/tools/svg-triangulator/newtitle.svg b/tools/svg-triangulator/newtitle.svg index 24374f656..d4b027ae3 100644 --- a/tools/svg-triangulator/newtitle.svg +++ b/tools/svg-triangulator/newtitle.svg @@ -26,16 +26,16 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="2.375346" - inkscape:cx="23.575513" - inkscape:cy="62.306712" + inkscape:zoom="4.750692" + inkscape:cx="-10.735278" + inkscape:cy="48.834991" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" - inkscape:window-width="1312" - inkscape:window-height="449" - inkscape:window-x="75" - inkscape:window-y="25" + inkscape:window-width="1840" + inkscape:window-height="999" + inkscape:window-x="82" + inkscape:window-y="688" inkscape:window-maximized="0" showguides="true" inkscape:guide-bbox="true" @@ -114,93 +114,93 @@ inkscape:groupmode="layer" id="layer1"> + sodipodi:nodetypes="cccc" /> + d="M 27.0847 98.3902 L 36.0588 98.5545 L 49.9632 18.7464 L 77.9329 1.67845 L 68.1725 1.62535 L 43.5698 15.9488 L 27.0847 98.3897" + style="opacity:1;fill:#e3e2db;fill-opacity:1;stroke:none;stroke-width:0.117774" /> + d="M 1.35546 1.63706 L 1.31197 7.25884 L 1.44119 21.1627 L 43.3083 17.2753 L 68.1317 1.62351 Z" + style="opacity:1;fill:#918a6f;stroke:none;stroke-width:0.117774" /> + d="M 43.3026 17.2814 L 45.7697 1.72578 L 68.1258 1.62061 Z" + style="opacity:1;fill:#483e37;fill-opacity:1;stroke:none;stroke-width:0.117774" /> + sodipodi:nodetypes="ccccccc" /> + style="fill:#808000;stroke:none;stroke-width:0.485158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1" /> + style="fill:#969600;fill-opacity:1;stroke:none;stroke-width:0.485158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:1" /> Date: Tue, 18 Jun 2024 23:15:18 +0100 Subject: [PATCH 22/48] feat: add _FORTIFY_SOURCE to all CMake recipes --- core/CMakeLists.txt | 2 +- ee_frontend/CMakeLists.txt | 2 +- gl_frontend/CMakeLists.txt | 2 +- mx_frontend/CMakeLists.txt | 2 +- my_frontend/CMakeLists.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index d37cdc96e..d0ec27c83 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -9,7 +9,7 @@ SET(CMAKE_C_STANDARD_REQUIRED ON) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) -set(DERELICT_CORE_FEATURE_FLAGS "-DCLI_BUILD -DHAS_STDIO -DMOVE_TO_OBJECT_POSITION_WHEN_PICKING -DMORE_OBJECTS ") +set(DERELICT_CORE_FEATURE_FLAGS "-D_FORTIFY_SOURCE=3 -DCLI_BUILD -DHAS_STDIO -DMOVE_TO_OBJECT_POSITION_WHEN_PICKING -DMORE_OBJECTS ") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${DERELICT_CORE_FEATURE_FLAGS} -W -Wall -Wextra -Wno-unused-parameter") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DERELICT_CORE_FEATURE_FLAGS} -Wno-writable-strings ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_LANG_CXX11=0") diff --git a/ee_frontend/CMakeLists.txt b/ee_frontend/CMakeLists.txt index 53509ddb7..fd0b1a717 100644 --- a/ee_frontend/CMakeLists.txt +++ b/ee_frontend/CMakeLists.txt @@ -16,7 +16,7 @@ include_directories(common/include) include_directories(menu/include) include_directories(SoundSystem) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DINCLUDE_ITEM_DESCRIPTIONS -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DTILED_BITMAPS -DSDLGL -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200" ) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DINCLUDE_ITEM_DESCRIPTIONS -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DTILED_BITMAPS -DSDLGL -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200" ) find_package(SDL2 REQUIRED) find_package(OpenGL REQUIRED) diff --git a/gl_frontend/CMakeLists.txt b/gl_frontend/CMakeLists.txt index a9e3de780..0f399782b 100644 --- a/gl_frontend/CMakeLists.txt +++ b/gl_frontend/CMakeLists.txt @@ -16,7 +16,7 @@ include_directories(../common/include) include_directories(base3d/include) include_directories(menu/include) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DTILED_BITMAPS -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -Wno-unused-parameter -Wno-switch -Wno-unused-variable -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200 -DXRES_SCREEN=320 -DYRES_SCREEN=240") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DTILED_BITMAPS -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -Wno-unused-parameter -Wno-switch -Wno-unused-variable -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200 -DXRES_SCREEN=320 -DYRES_SCREEN=240") find_package(SDL2 REQUIRED) find_package(OpenGL REQUIRED) diff --git a/mx_frontend/CMakeLists.txt b/mx_frontend/CMakeLists.txt index 88df8afb2..c1080969d 100644 --- a/mx_frontend/CMakeLists.txt +++ b/mx_frontend/CMakeLists.txt @@ -15,7 +15,7 @@ include_directories(base3d/include) include_directories(common/include) include_directories(menu/include) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLSW -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DPAGE_FLIP_ANIMATION -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DSDLSW -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DPAGE_FLIP_ANIMATION -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200") find_package(SDL2 REQUIRED) diff --git a/my_frontend/CMakeLists.txt b/my_frontend/CMakeLists.txt index 78e75e35c..6bd6a1014 100644 --- a/my_frontend/CMakeLists.txt +++ b/my_frontend/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(src ../core/src ../core/include include ../common/include ${SDL2_INCLUDE_DIR} ) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") find_package(SDL2 REQUIRED) From 81344359793fbbf0046a0f40a9c5c8ee6bb0608b Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 18 Jun 2024 23:37:19 +0100 Subject: [PATCH 23/48] [MY] Improve handling of popup dismissal --- my_frontend/src/UI.c | 2 +- my_frontend/src/cpc.c | 25 +++++++++++++----------- my_frontend/src/msdos.c | 24 +++++++++++++---------- my_frontend/src/msx.c | 21 ++++++++++++--------- my_frontend/src/sdl2.c | 12 ++++++------ my_frontend/src/sms.c | 42 +++++++++++++++++++++++++++++------------ 6 files changed, 77 insertions(+), 49 deletions(-) diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 28cda6150..22dcacb20 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -53,7 +53,7 @@ void drawTextAtWithMargin(const int x, const int y, int margin, const char *text void showMessage(const char *message) { clearTextScreen(); - drawTextWindow(1, 16, (XRES_FRAMEBUFFER / 8) - 3, (YRES_FRAMEBUFFER / 8) - 18, "", message); + drawTextWindow(1, 16, (XRES_FRAMEBUFFER / 8) - 3, (YRES_FRAMEBUFFER / 8) - 18, "Press 2 to continue", message); waitForKey = 1; } diff --git a/my_frontend/src/cpc.c b/my_frontend/src/cpc.c index 814c63b66..a8d505b14 100644 --- a/my_frontend/src/cpc.c +++ b/my_frontend/src/cpc.c @@ -213,7 +213,20 @@ enum ECommand getInput(void) { performAction(); - switch (getch()) { + uint8_t toReturn = getch(); + + if (waitForKey) { + if (toReturn == '2') { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandNone; + } + + switch (toReturn) { case 30: case 'w': return kCommandUp; @@ -230,17 +243,7 @@ enum ECommand getInput(void) { return kCommandStrafeLeft; case 'x': return kCommandStrafeRight; - case 'm': - drawMap(); - return '.'; case '1': - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } - return kCommandFire1; case '2': return kCommandFire2; diff --git a/my_frontend/src/msdos.c b/my_frontend/src/msdos.c index cf5c11fee..911faa379 100644 --- a/my_frontend/src/msdos.c +++ b/my_frontend/src/msdos.c @@ -405,6 +405,18 @@ enum ECommand getInput(void) { ); } + if (waitForKey) { + if (toReturn == '2') { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandNone; + } + + switch(toReturn) { case 'q': return kCommandLeft; @@ -414,21 +426,13 @@ enum ECommand getInput(void) { return kCommandDown; case 'e': return kCommandRight; - case 'a': + case 'z': return kCommandStrafeLeft; - case 'd': + case 'x': return kCommandStrafeRight; case 'l': return kCommandBack; - case '1': - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } - return kCommandFire1; case '2': return kCommandFire2; diff --git a/my_frontend/src/msx.c b/my_frontend/src/msx.c index ca9dbceb0..dc64de43c 100644 --- a/my_frontend/src/msx.c +++ b/my_frontend/src/msx.c @@ -39,6 +39,16 @@ enum ECommand getInput(void) { performAction(); + if (waitForKey) { + if (input == '2') { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + return kCommandNone; + } + switch (input) { case 30: return kCommandUp; @@ -48,17 +58,11 @@ enum ECommand getInput(void) { return kCommandLeft; case 28: return kCommandRight; - case 'c': + case 'z': return kCommandStrafeLeft; - case 'v': + case 'x': return kCommandStrafeRight; case '1': - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } return kCommandFire1; case '2': return kCommandFire2; @@ -70,7 +74,6 @@ enum ECommand getInput(void) { return kCommandFire5; case '6': return kCommandFire6; - } return input; } diff --git a/my_frontend/src/sdl2.c b/my_frontend/src/sdl2.c index 6afd80360..bb8c4418a 100644 --- a/my_frontend/src/sdl2.c +++ b/my_frontend/src/sdl2.c @@ -209,12 +209,6 @@ enum ECommand getInput(void) { switch (event.key.keysym.sym) { case SDLK_RETURN: case SDLK_1: - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } return kCommandFire1; case SDLK_ESCAPE: @@ -225,6 +219,12 @@ enum ECommand getInput(void) { case SDLK_KP_7: case SDLK_2: + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } return kCommandFire2; case SDLK_KP_8: diff --git a/my_frontend/src/sms.c b/my_frontend/src/sms.c index fd2477d60..d669e7cb2 100755 --- a/my_frontend/src/sms.c +++ b/my_frontend/src/sms.c @@ -39,6 +39,7 @@ void initHW(int argc, char **argv) { initSN76489(); cooldown = COOLDOWN_MAX; needsToRedrawVisibleMeshes = 0; + waitForKey = 0; } void handleSystemEvents(void) {} @@ -51,11 +52,19 @@ enum ECommand getInput(void) { } if (key & JOY_UP && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; return kCommandUp; } if (key & JOY_LEFT && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; if (key & JOY_FIREB) { return kCommandStrafeLeft; @@ -65,6 +74,10 @@ enum ECommand getInput(void) { } if (key & JOY_RIGHT && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; if (key & JOY_FIREB) { return kCommandStrafeRight; @@ -74,20 +87,24 @@ enum ECommand getInput(void) { } if (key & JOY_DOWN && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; return kCommandDown; } if ((key & JOY_FIREA) && !cooldown ) { + + if (waitForKey) { + return kCommandNone; + } + if (currentGameMenuState == kPlayGame) { playSound(3); cooldown = COOLDOWN_MAX; - if (waitForKey) { - waitForKey = 0; - return kCommandNone; - } - return performActionJoypad(); } else { return kCommandFire1; @@ -95,14 +112,15 @@ enum ECommand getInput(void) { } if ((key & JOY_FIREB) && !cooldown ) { - if (currentGameMenuState == kPlayGame) { - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + if (currentGameMenuState == kPlayGame) { cursorPosition = (cursorPosition + 1); playSound(2); From a318d757d05e60b52f6aa2a03ad7413d13e7563a Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Wed, 19 Jun 2024 18:49:41 +0100 Subject: [PATCH 24/48] [MX] Fix polygon drawing boundaries It was causing crashes on MS-DOS and the logo to be trimmed to XRES --- .../base3d/src/RendererRasterization.c | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/mx_frontend/base3d/src/RendererRasterization.c b/mx_frontend/base3d/src/RendererRasterization.c index 9b61fcb7b..c09a4e493 100644 --- a/mx_frontend/base3d/src/RendererRasterization.c +++ b/mx_frontend/base3d/src/RendererRasterization.c @@ -35,7 +35,7 @@ #define FIXP_YRES intToFix(YRES) enum ECommand mTurnBuffer; -uint16_t clippingY1 = YRES_FRAMEBUFFER; +uint16_t clippingY1 = YRES_FRAMEBUFFER - 1; /* * /|x1y0 @@ -149,8 +149,8 @@ void maskWall( ix = 0; } - if (limit > XRES) { - limit = XRES; + if (limit >= XRES) { + limit = XRES - 1; } for (; ix < limit; ++ix) { @@ -172,7 +172,7 @@ void maskWall( } if (iY1 >= YRES) { - iY1 = YRES; + iY1 = YRES - 1; continue; } @@ -316,8 +316,8 @@ void drawWall(FixP_t x0, ix = 0; } - if (limit > XRES) { - limit = XRES; + if (limit >= XRES) { + limit = XRES - 1; } for (; ix < limit; ++ix) { @@ -352,7 +352,7 @@ void drawWall(FixP_t x0, iy = iY0; if (iY1 >= YRES) { - iY1 = YRES; + iY1 = YRES - 1; } if (iy < 0) { @@ -530,7 +530,7 @@ void drawFrontWall(FixP_t x0, } if (limit > YRES) { - limit = YRES; + limit = YRES - 1; } for (; iy < limit; ++iy) { @@ -570,7 +570,7 @@ void drawFrontWall(FixP_t x0, } if (iX1 >= XRES) { - iX1 = XRES; + iX1 = XRES - 1; } stipple = (((ix + iy) & 1)) ? 0xFFFFFFFF : 0; @@ -690,8 +690,8 @@ void maskFloor(FixP_t y0, FixP_t y1, FixP_t x0y0, FixP_t x1y0, FixP_t x0y1, FixP x1 = upperX1; iy = y; - if (limit > YRES) { - limit = YRES; + if (limit >= YRES) { + limit = YRES - 1; } if (iy < 0) { @@ -876,8 +876,8 @@ void drawFloor(FixP_t y0, iy = 0; } - if (limit > YRES) { - limit = YRES; + if (limit >= YRES) { + limit = YRES - 1; } for (; iy < limit; ++iy) { @@ -922,7 +922,7 @@ void drawFloor(FixP_t y0, stipple = ((iX0 + iy) & 1) ? 0xFFFFFFFF : 0; if (iX1 >= XRES) { - iX1 = XRES; + iX1 = XRES - 1; } if (farEnoughForStipple == 2 || ( farEnoughForStipple == 1 && iy & 1) || (farEnoughForStipple == 3) ) { @@ -1035,11 +1035,11 @@ void fillBottomFlat(const int *coords, FramebufferPixelFormat colour) { fX1 = x0; for (; y < yFinal; ++y) { - if (y >= YRES) { + if (y >= YRES_FRAMEBUFFER) { return; } else if (y >= 0) { - int iFX1 = max(min((XRES - 1), fixToInt(fX1)), 0); - int iFX0 = max(min((XRES - 1), fixToInt(fX0)), 0); + int iFX1 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX1)), 0); + int iFX0 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX0)), 0); FramebufferPixelFormat *destination = &framebuffer[(XRES_FRAMEBUFFER * y) + min(iFX0, iFX1)]; #ifdef RGBA32_FRAMEBUFFER @@ -1096,9 +1096,9 @@ void fillTopFlat(int *coords, FramebufferPixelFormat colour) { for (; y >= yFinal; --y) { if (y < 0) { return; - } else if (y < YRES) { - int iFX1 = max(min((XRES - 1), fixToInt(fX1)), 0); - int iFX0 = max(min((XRES - 1), fixToInt(fX0)), 0); + } else if (y < YRES_FRAMEBUFFER) { + int iFX1 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX1)), 0); + int iFX0 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX0)), 0); FramebufferPixelFormat *destination = &framebuffer[(XRES_FRAMEBUFFER * y) + min(iFX0, iFX1)]; #ifdef RGBA32_FRAMEBUFFER @@ -1306,7 +1306,7 @@ void drawTexturedBottomFlatTriangle(int *coords, uint8_t *uvCoords, struct Textu texelLineY = fV1; } - if (y >= 0 && y <= YRES) { + if (y >= 0 && y < YRES) { int xPos = iFX0; const int shouldStippleLine = (farEnoughForStipple == 2) || (farEnoughForStipple == 1 && y & 1) || (farEnoughForStipple == 3); stipple = ((xPos + y) & 1) ? 0xFFFFFFFF : 0; @@ -1317,7 +1317,7 @@ void drawTexturedBottomFlatTriangle(int *coords, uint8_t *uvCoords, struct Textu u = abs(fixToInt(texelLineX)) % NATIVE_TEXTURE_SIZE; v = abs(fixToInt(texelLineY)) % NATIVE_TEXTURE_SIZE; - if (xPos >= 0 && xPos <= XRES) { + if (xPos >= 0 && xPos < XRES) { if ((shouldStippleLine && stipple) || (farEnoughForStipple == 3 && (y & 1))) { *destination = 0; } else { @@ -1474,7 +1474,7 @@ void drawTexturedTopFlatTriangle(int *coords, uint8_t *uvCoords, struct Texture texelLineY = fV1; } - if (y >= 0 && y <= YRES) { + if (y >= 0 && y < YRES) { int xPos = iFX0; @@ -1484,7 +1484,7 @@ void drawTexturedTopFlatTriangle(int *coords, uint8_t *uvCoords, struct Texture u = abs(fixToInt(texelLineX)) % NATIVE_TEXTURE_SIZE; v = abs(fixToInt(texelLineY)) % NATIVE_TEXTURE_SIZE; - if (xPos >= 0 && xPos <= XRES) { + if (xPos >= 0 && xPos < XRES) { if ((shouldStippleLine && stipple) || (farEnoughForStipple == 3 && (y & 1))) { *destination = 0; } else { From 77ce19c231aae9b0ba52ad82832e06cf2e62f5b8 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 20 Jun 2024 22:24:43 +0100 Subject: [PATCH 25/48] refactor: rename dungeon_tick to be less Lua-like --- common/include/Dungeon.h | 2 +- common/src/Dungeon.c | 2 +- common/src/Events.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/include/Dungeon.h b/common/include/Dungeon.h index 840237d67..c184b7ca4 100644 --- a/common/include/Dungeon.h +++ b/common/include/Dungeon.h @@ -10,7 +10,7 @@ struct GameSnapshot { struct Vec2i playerTarget; }; -struct GameSnapshot dungeon_tick(const enum ECommand cmd); +struct GameSnapshot dungeonTick(const enum ECommand command); void dungeon_loadMap( const uint8_t *__restrict__ mapData, diff --git a/common/src/Dungeon.c b/common/src/Dungeon.c index 63f486a64..b63826266 100644 --- a/common/src/Dungeon.c +++ b/common/src/Dungeon.c @@ -46,7 +46,7 @@ uint8_t isPositionAllowed(int8_t x, int8_t y) { && collisionMap[LEVEL_MAP(x, y)] != '1'; } -struct GameSnapshot dungeon_tick(const enum ECommand command) { +struct GameSnapshot dungeonTick(const enum ECommand command) { int currentPlayerRoom; int cell; struct WorldPosition worldPos; diff --git a/common/src/Events.c b/common/src/Events.c index 768f2dbcd..2167b1c4d 100644 --- a/common/src/Events.c +++ b/common/src/Events.c @@ -66,7 +66,7 @@ void onLevelLoaded(int index) { void tickMission(enum ECommand cmd) { - struct GameSnapshot snapshot = dungeon_tick(cmd); + struct GameSnapshot snapshot = dungeonTick(cmd); x = snapshot.camera_x; z = snapshot.camera_z; From 969c80e1f8aced0955bc0f5c729cb0202d50f9eb Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 20 Jun 2024 22:28:19 +0100 Subject: [PATCH 26/48] [MY, MZ] Fix accessing the hacking mini game --- my_frontend/src/Events.c | 2 +- mz_frontend/src/Engine3D/Engine3D.c | 2 +- mz_frontend/src/Events.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/my_frontend/src/Events.c b/my_frontend/src/Events.c index 81d9d823f..2b23c75b7 100755 --- a/my_frontend/src/Events.c +++ b/my_frontend/src/Events.c @@ -40,7 +40,7 @@ void pickItem(void) { struct Item *itemToPick = getItem(roomItem->item); if (itemToPick != NULL) { - if (!strcmp(itemToPick->name, "digital-safe")) { + if (!strcmp(itemToPick->name, "computer-terminal")) { #ifdef SUPPORTS_HACKING_MINIGAME enterState(kHackingGame); diff --git a/mz_frontend/src/Engine3D/Engine3D.c b/mz_frontend/src/Engine3D/Engine3D.c index 1967c0602..b813d4767 100644 --- a/mz_frontend/src/Engine3D/Engine3D.c +++ b/mz_frontend/src/Engine3D/Engine3D.c @@ -1065,7 +1065,7 @@ void pickItem(void) { struct Item *itemToPick = getItem(roomItem->item); if (itemToPick != NULL) { - if (!strcmp(itemToPick->name, "digital-safe")) { + if (!strcmp(itemToPick->name, "computer-terminal")) { #ifdef SUPPORTS_HACKING_MINIGAME runHackingMinigame(); diff --git a/mz_frontend/src/Events.c b/mz_frontend/src/Events.c index c548449ad..5f72d7306 100755 --- a/mz_frontend/src/Events.c +++ b/mz_frontend/src/Events.c @@ -50,7 +50,7 @@ void pickItem(void) { struct Item *itemToPick = getItem(roomItem->item); if (itemToPick != NULL) { - if (!strcmp(itemToPick->name, "digital-safe")) { + if (!strcmp(itemToPick->name, "computer-terminal")) { #ifdef SUPPORTS_HACKING_MINIGAME enterState(kHackingGame); From b55101c74b90b94c21897872cc9fea5587a832e2 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 20 Jun 2024 22:28:58 +0100 Subject: [PATCH 27/48] [MY] Trade input latency with redraw for TMS9918 ports --- my_frontend/src/HackingMinigame.c | 50 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/my_frontend/src/HackingMinigame.c b/my_frontend/src/HackingMinigame.c index 98085c64c..2231ff755 100644 --- a/my_frontend/src/HackingMinigame.c +++ b/my_frontend/src/HackingMinigame.c @@ -49,44 +49,44 @@ void HackingScreen_repaintCallback(void) { drawTextAt((12 * 0), 11, " CPU0 ", getPaletteEntry(0xFF999999)); drawTextAt((12 * 1), 11, " CPU1 ", getPaletteEntry(0xFF999999)); drawTextAt((12 * 2), 11, " CPU2 ", getPaletteEntry(0xFF999999)); - } - drawTextAt((12 * cursorPosition), 11, ">", getPaletteEntry(0xFF999999)); - drawTextAt((12 * cursorPosition) + 5, 11, "<", getPaletteEntry(0xFF999999)); + drawTextAt((12 * cursorPosition), 11, ">", getPaletteEntry(0xFF999999)); + drawTextAt((12 * cursorPosition) + 5, 11, "<", getPaletteEntry(0xFF999999)); - drawLine(0, 80, XRES_FRAMEBUFFER - 1, 80, 2); + drawLine(0, 80, XRES_FRAMEBUFFER - 1, 80, 2); - for (pin = 0; pin < 3; ++pin) { - uint8_t disk; + for (pin = 0; pin < 3; ++pin) { + uint8_t disk; - if (pin != 0) { - uint8_t pinX = (10 * (pin) ) * 8; - drawLine(pinX, 40, pinX, 80, 2); - } + if (pin != 0) { + uint8_t pinX = (10 * (pin) ) * 8; + drawLine(pinX, 40, pinX, 80, 2); + } - for (disk = 0; disk < 5; ++disk) { + for (disk = 0; disk < 5; ++disk) { - uint8_t diskIndex = getPositionForPin(pin, disk); + uint8_t diskIndex = getPositionForPin(pin, disk); - const char *funcName = (disk >= getDisksForPin(pin)) ? NULL - : functionNames[diskIndex]; + const char *funcName = (disk >= getDisksForPin(pin)) ? NULL + : functionNames[diskIndex]; - if (funcName) { - drawTextAt( - 10 * (pin) + (pin == 0 ? 0 : 1), 4 + (4 - disk), - funcName, getPaletteEntry(0xFF999999)); + if (funcName) { + drawTextAt( + 10 * (pin) + (pin == 0 ? 0 : 1), 4 + (4 - disk), + funcName, getPaletteEntry(0xFF999999)); + } } } - } - drawTextAt(1, 2, "Pointer:", getPaletteEntry(0xFF999999)); + drawTextAt(1, 2, "Pointer:", getPaletteEntry(0xFF999999)); - holdingDisk = getHoldingDisk(); + holdingDisk = getHoldingDisk(); - if (holdingDisk != 0xFF) { - drawTextAt(19, 2, functionNames[holdingDisk], getPaletteEntry(0xFF999999)); - } else { - drawTextAt(19, 2, "NULL", getPaletteEntry(0xFF999999)); + if (holdingDisk != 0xFF) { + drawTextAt(19, 2, functionNames[holdingDisk], getPaletteEntry(0xFF999999)); + } else { + drawTextAt(19, 2, "NULL", getPaletteEntry(0xFF999999)); + } } } From ebba50d626a897a5fbdfd554daf34197705ada2b Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 20 Jun 2024 22:29:28 +0100 Subject: [PATCH 28/48] [MY] Fix switching room items for SDL2 port --- my_frontend/src/sdl2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/my_frontend/src/sdl2.c b/my_frontend/src/sdl2.c index bb8c4418a..82dcb662d 100644 --- a/my_frontend/src/sdl2.c +++ b/my_frontend/src/sdl2.c @@ -240,7 +240,7 @@ enum ECommand getInput(void) { return kCommandFire5; case SDLK_KP_9: - case SDLK_9: + case SDLK_6: return kCommandFire6; case SDLK_s: From d4700cb90a5e7a64c29dd27d90ea5ab8862f34a6 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 20 Jun 2024 22:33:50 +0100 Subject: [PATCH 29/48] fix: displaying focused item name on screen --- ee_frontend/base3d/src/Renderer.c | 2 +- ee_frontend/base3d/src/ee/Renderer.c | 2 +- gl_frontend/GL1Common/Renderer.c | 2 +- mx_frontend/base3d/src/Renderer.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ee_frontend/base3d/src/Renderer.c b/ee_frontend/base3d/src/Renderer.c index 8f15594c5..b5d3d8cbc 100644 --- a/ee_frontend/base3d/src/Renderer.c +++ b/ee_frontend/base3d/src/Renderer.c @@ -919,7 +919,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, 0, 1); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, 255, ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, 255, ' '); } diff --git a/ee_frontend/base3d/src/ee/Renderer.c b/ee_frontend/base3d/src/ee/Renderer.c index 107ace434..9f96b5e29 100644 --- a/ee_frontend/base3d/src/ee/Renderer.c +++ b/ee_frontend/base3d/src/ee/Renderer.c @@ -1045,7 +1045,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, 0, 1); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, 255, ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, 255, ' '); } diff --git a/gl_frontend/GL1Common/Renderer.c b/gl_frontend/GL1Common/Renderer.c index d639595e6..e300555fa 100644 --- a/gl_frontend/GL1Common/Renderer.c +++ b/gl_frontend/GL1Common/Renderer.c @@ -1003,7 +1003,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, getPaletteEntry(0xFF000000), TRUE); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, getPaletteEntry(0xFFFFFFFF), ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, getPaletteEntry(0xFFFFFFFF), ' '); } diff --git a/mx_frontend/base3d/src/Renderer.c b/mx_frontend/base3d/src/Renderer.c index 4d046f74c..4b4fb0567 100644 --- a/mx_frontend/base3d/src/Renderer.c +++ b/mx_frontend/base3d/src/Renderer.c @@ -853,7 +853,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, 0, 1); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, 255, ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, 255, ' '); } From 921eebc9f20e50d68df3a08f88861f0f3e0822c3 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Thu, 20 Jun 2024 22:52:17 +0100 Subject: [PATCH 30/48] [MY] Minor tweak to actions menu in keyboard ports --- my_frontend/src/KeyboardUI.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/my_frontend/src/KeyboardUI.c b/my_frontend/src/KeyboardUI.c index 492d4d948..46382ad19 100644 --- a/my_frontend/src/KeyboardUI.c +++ b/my_frontend/src/KeyboardUI.c @@ -19,12 +19,12 @@ extern struct ObjectNode *roomItem; extern uint8_t firstFrameOnCurrentState; const char *menuItems[] = { - "1) Use", - "2) Use with", - "3) Pick", - "4) Drop", - "5) Next(hand)", - "6) Next(room)", + "1)Use/Toggle", + "2)Use with", + "3)Pick/Use", + "4)Drop", + "5)Next(hand)", + "6)Next(room)", }; void initKeyboardUI(void) { From 19a98c6da22ea2e37673d156fbaf4e314376d019 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Fri, 21 Jun 2024 22:59:55 +0100 Subject: [PATCH 31/48] feat: scale geometric shapes when rendering it Either in vector lines or in filled coloured shapes --- common/include/UI.h | 2 +- common/src/MainMenu.c | 4 ++-- common/src/UI.c | 47 +++++++++++++++------------------------- my_frontend/include/UI.h | 2 +- my_frontend/src/UI.c | 14 +++++++++--- mz_frontend/include/UI.h | 2 +- mz_frontend/src/UI.c | 14 +++++++++--- 7 files changed, 45 insertions(+), 40 deletions(-) diff --git a/common/include/UI.h b/common/include/UI.h index 5710fb7d8..542634cba 100644 --- a/common/include/UI.h +++ b/common/include/UI.h @@ -37,7 +37,7 @@ enum EGameMenuState handleCursor(const enum EGameMenuState* options, const enum ECommand cmd, enum EGameMenuState backState); -void drawGraphic(uint16_t x, uint8_t y, const uint8_t *shapes); +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *shapes); extern int8_t cursorPosition; diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index d526d92da..f5b2cd6f2 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -3465,8 +3465,8 @@ void MainMenu_repaintCallback(void) { #ifndef MONOCHROME_VECTORS fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); #endif - drawGraphic(0, 0, splashGraphics); - drawGraphic(XRES_FRAMEBUFFER / 2, 0, logoGraphics); + drawGraphic(0, 0, YRES_FRAMEBUFFER, YRES_FRAMEBUFFER, splashGraphics); + drawGraphic(XRES_FRAMEBUFFER / 2, 0, 160, 160, logoGraphics); playSound(MAIN_MENU_THEME); } diff --git a/common/src/UI.c b/common/src/UI.c index 8112980c4..4a66d00c6 100644 --- a/common/src/UI.c +++ b/common/src/UI.c @@ -232,7 +232,7 @@ enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t opt return kResumeCurrentState; } -void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic) { +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *graphic) { const uint8_t *ptr = graphic; int buffer[6]; @@ -248,43 +248,32 @@ void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic) { int centerY = 0; if (npoints > 3) { - for (c = 0; c < npoints; ++c) { - centerX += shape[2 * c]; - centerY += shape[(2 * c) + 1]; - } - - centerX /= npoints; - centerY /= npoints; - - buffer[4] = x + centerX; - buffer[5] = y + centerY; - - for (c = 0; c < npoints - 1; ++c) { - - buffer[0] = x + shape[(2 * c) + 0]; - buffer[1] = y + shape[(2 * c) + 1]; - buffer[2] = x + shape[(2 * c) + 2]; - buffer[3] = y + shape[(2 * c) + 3]; - - fillTriangle(&buffer[0], colour); - } ptr += 2 * npoints; } else if (npoints == 3) { - buffer[0] = x + shape[0]; - buffer[1] = y + shape[1]; - buffer[2] = x + shape[2]; - buffer[3] = y + shape[3]; - buffer[4] = x + shape[4]; - buffer[5] = y + shape[5]; + buffer[0] = x + ((dx * shape[0]) / 128); + buffer[1] = y + ((dy * shape[1]) / 128); + buffer[2] = x + ((dx * shape[2]) / 128); + buffer[3] = y + ((dy * shape[3]) / 128); + buffer[4] = x + ((dx * shape[4]) / 128); + buffer[5] = y + ((dy * shape[5]) / 128); fillTriangle(&buffer[0], colour); ptr += 2 * npoints; } else if (npoints == 2) { - drawLine(x + shape[0], y + shape[1], x + shape[2], y + shape[3], colour); + drawLine(x + ((dx * shape[0]) / 128), + y + ((dy * shape[1]) / 128), + x + ((dx * shape[2]) / 128), + y + ((dy * shape[3]) / 128), + colour); ptr += 2 * npoints; } else if (npoints == 1) { - fillRect(x + shape[0], y + shape[1], 1, 1, colour, FALSE); + fillRect(x + ((dx * shape[0]) / 128), + y + ((dy * shape[1]) / 128), + 1, + 1, + colour, + FALSE); ptr += 2 * npoints; } } diff --git a/my_frontend/include/UI.h b/my_frontend/include/UI.h index 21d1c9e20..c0f6a0a99 100644 --- a/my_frontend/include/UI.h +++ b/my_frontend/include/UI.h @@ -25,7 +25,7 @@ drawWindowWithOptions(const uint8_t x, const uint8_t optionsCount, const uint8_t selectedOption); -void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic); +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *graphic); void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, const char *content); diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 22dcacb20..a634f2220 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -24,7 +24,7 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; -void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic) { +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *graphic) { const uint8_t *ptr = graphic; while (*ptr) { @@ -36,9 +36,17 @@ void drawGraphic(uint16_t x, uint8_t y, const uint8_t *graphic) { const uint8_t *shape = ptr; for (c = 0; c < npoints - 1; ++c) { - drawLine(x + shape[2 * c], y + shape[(2 * c) + 1], x + shape[(2 * c) + 2], y + shape[(2 * c) + 3], 2); + drawLine(x + ((dx * shape[(2 * c) + 0]) / 128), + y + ((dy * shape[(2 * c) + 1]) / 128), + x + ((dx * shape[(2 * c) + 2]) / 128), + y + ((dy * shape[(2 * c) + 3]) / 128), + 2); } - drawLine(x + shape[2 * npoints - 2], y + shape[2 * npoints - 1], x + shape[0], y + shape[1], 2); + drawLine(x + ((dx * shape[2 * npoints - 2]) / 128), + y + ((dy * shape[2 * npoints - 1]) / 128), + x + ((dx * shape[0]) / 128), + y + ((dy * shape[1]) / 128), + 2); ptr += 2 * npoints; } } diff --git a/mz_frontend/include/UI.h b/mz_frontend/include/UI.h index 8dac7f916..e5719c557 100644 --- a/mz_frontend/include/UI.h +++ b/mz_frontend/include/UI.h @@ -25,7 +25,7 @@ drawWindowWithOptions(const uint8_t x, const uint8_t optionsCount, const uint8_t selectedOption); -void drawGraphic(const uint8_t *graphic); +void drawGraphic(int x, int y, int dx, int dy, const uint8_t *graphic); void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, const char *content); diff --git a/mz_frontend/src/UI.c b/mz_frontend/src/UI.c index 52df06510..ecb263e29 100644 --- a/mz_frontend/src/UI.c +++ b/mz_frontend/src/UI.c @@ -24,7 +24,7 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; -void drawGraphic(const uint8_t *graphic) { +void drawGraphic(int x, int y, int dx, int dy, const uint8_t *graphic) { const uint8_t *ptr = graphic; while (*ptr) { @@ -36,9 +36,17 @@ void drawGraphic(const uint8_t *graphic) { const uint8_t *shape = ptr; for (c = 0; c < npoints - 1; ++c) { - drawLine(shape[2 * c], shape[(2 * c) + 1], shape[(2 * c) + 2], shape[(2 * c) + 3], 2); + drawLine(x + ((dx * shape[2 * c]) / 128), + y + ((dy * shape[(2 * c) + 1]) / 128), + x + ((dx * shape[(2 * c) + 2]) / 128), + y + ((dy * shape[(2 * c) + 3]) / 128), + 2); } - drawLine(shape[2 * npoints - 2], shape[2 * npoints - 1], shape[0], shape[1], 2); + drawLine(x + ((dx * shape[2 * npoints - 2]) / 128), + y + ((dy * shape[2 * npoints - 1]) / 128), + x + ((dx * shape[0]) / 128), + y + ((dy * shape[1]) / 128), + 2); ptr += 2 * npoints; } } From 656acdb1b00495a301a3910d1d4e3efd6c1eb250 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 24 Jun 2024 18:07:17 +0100 Subject: [PATCH 32/48] Trim memory usage and dead code --- common/include/Common.h | 13 ++++++- common/src/CTile3DProperties.c | 2 +- common/src/Common.c | 6 +-- common/src/CreditsScreen.c | 2 - common/src/HackingMinigameRules.c | 2 +- common/src/MainMenu.c | 19 +++++---- common/src/MusicAGA.c | 4 +- ee_frontend/base3d/src/ee/LoadBitmap.c | 8 ++-- .../base3d/src/ee/RendererTesselation.c | 2 +- ee_frontend/base3d/src/es/GLESCommon.c | 5 +-- ee_frontend/base3d/src/es/LoadBitmap.c | 6 +-- .../base3d/src/es/RendererTesselation.c | 10 ++--- ee_frontend/base3d/src/es/SDL2GL2Version.c | 2 +- ee_frontend/base3d/src/gx/GXRenderer.c | 4 +- ee_frontend/base3d/src/gx/LoadBitmap.c | 4 +- .../base3d/src/gx/RendererTesselation.c | 2 +- .../base3d/src/SDLVersion/CSDL2Renderer.c | 2 +- .../DerelictMacOSClassic/Derelict.xSYM | Bin 417792 -> 417792 bytes .../DerelictMacOSClassic/DerelictMacOSClassic | Bin 151480 -> 151480 bytes .../Derelict Debug/TargetDataMacOS.tdt | Bin 499186 -> 486484 bytes .../Derelict/TargetDataMacOS.tdt | Bin 107535 -> 107535 bytes .../DerelictMacOSClassic/MacFileReader.c | 8 ++-- .../DerelictMacOSClassic/MacRenderer.c | 2 +- .../NDK-version/app/src/main/cpp/native-lib.c | 2 +- mx_frontend/Xcode2/GameView.m | 22 +++++------ mx_frontend/Xcode2/OSXRenderer.m | 16 ++++---- .../Derelict32-ios/ViewController.m | 36 +++++++++--------- .../base3d/src/AGSVersion/AGSRenderer.c | 4 +- mx_frontend/base3d/src/LoadBitmap.c | 4 +- .../base3d/src/SDLVersion/CSDL2Renderer.c | 2 +- .../base3d/src/SDLVersion/SDL1Renderer.c | 2 +- .../base3d/src/Win32Version/CGDIRenderer.c | 18 ++++----- .../base3d/src/X11Version/X11Renderer.c | 2 +- mx_frontend/menu/src/Main.c | 2 +- my_frontend/CMakeLists.txt | 2 +- my_frontend/Makefile.464 | 4 +- my_frontend/Makefile.ia16 | 4 +- my_frontend/Makefile.msx | 4 +- my_frontend/Makefile.sm3 | 4 +- .../Derelict8.xcodeproj/project.pbxproj | 2 + my_frontend/Xcode2/GameView.m | 3 +- my_frontend/Xcode2/OSXRenderer.m | 7 +--- my_frontend/include/Renderer.h | 2 - my_frontend/src/Crawler.c | 26 ++++++------- my_frontend/src/Events.c | 6 +-- my_frontend/src/GamepadUI.c | 1 - my_frontend/src/HackingMinigame.c | 9 ++--- my_frontend/src/RendererRasterizer.c | 1 + my_frontend/src/RendererScene.c | 4 +- my_frontend/src/TMS9918.c | 12 +----- my_frontend/src/UI.c | 27 +++++++------ my_frontend/src/cpc.c | 11 ++---- my_frontend/src/msdos.c | 13 +------ my_frontend/src/sdl2.c | 11 +----- my_frontend/src/speccy.c | 4 -- mz_frontend/CMakeLists.txt | 2 +- mz_frontend/Makefile.286 | 2 +- mz_frontend/Makefile.atari | 2 +- mz_frontend/Makefile.ocs | 2 +- mz_frontend/Xcode2/GameView.m | 2 +- mz_frontend/Xcode2/OSXRenderer.m | 2 +- mz_frontend/src/AmigaVersion/AmigaRenderer.c | 5 ++- mz_frontend/src/AtariVersion/AtariRenderer.c | 13 ++++--- mz_frontend/src/Engine3D/HackingMinigame.c | 2 +- mz_frontend/src/MSDOSVersion/msdos.c | 2 +- mz_frontend/src/Main.c | 1 + mz_frontend/src/SDLVersion/sdl2.c | 7 ++-- 67 files changed, 202 insertions(+), 210 deletions(-) diff --git a/common/include/Common.h b/common/include/Common.h index 3979930ac..272b8dead 100644 --- a/common/include/Common.h +++ b/common/include/Common.h @@ -43,19 +43,23 @@ struct StaticBuffer { size_t size; }; +#ifndef USE_CUSTOM_MEMORY_HANDLER +#ifndef NO_DYNAMIC_MEMORY_ALLOC void *allocMem(size_t sizeInBytes, enum MemoryType type, uint8_t clearAfterAlloc); void disposeMem(void* ptr); +#endif void memCopyToFrom(void* dst, void* src, size_t sizeInBytes); void memFill(void* dst, uint8_t val, size_t sizeInBytes); +#endif +#ifdef ENDIANESS_AWARE uint8_t isBigEndian(void); -void initFileReader(const char * dataFilePath); - uint32_t toNativeEndianess(const uint32_t val); +#endif extern const char *mainText; @@ -70,6 +74,9 @@ extern size_t biggestOption; #define TEXT_BUFFER_SIZE (40 * 25) + +#ifndef USE_OWN_MIN_MAX + #ifndef SMD #ifndef WIN32 #ifndef LEAN_BUILD @@ -80,3 +87,5 @@ extern size_t biggestOption; #endif #endif + +#endif diff --git a/common/src/CTile3DProperties.c b/common/src/CTile3DProperties.c index 3fb6fafef..a9701c206 100644 --- a/common/src/CTile3DProperties.c +++ b/common/src/CTile3DProperties.c @@ -97,7 +97,7 @@ void loadPropertyList(const char *propertyFile, struct MapWithCharKey *map, stru uint8_t len = *(bufferHead++); char* meshName = (char*)allocMem(len + 1, GENERAL_MEMORY, 1); - memcpy(meshName, bufferHead, len); + memCopyToFrom(meshName, (char*)bufferHead, len); mesh = (struct Mesh*)allocMem(sizeof(struct Mesh), GENERAL_MEMORY, 1); sprintf(&meshNameWithExtension[0], "%s.mdl", meshName); loadMesh(mesh, &meshNameWithExtension[0]); diff --git a/common/src/Common.c b/common/src/Common.c index f98618489..edadb8363 100644 --- a/common/src/Common.c +++ b/common/src/Common.c @@ -43,7 +43,7 @@ #ifndef USE_CUSTOM_MEMORY_HANDLER - +#ifndef NO_DYNAMIC_MEMORY_ALLOC void *allocMem(size_t sizeInBytes, enum MemoryType type, uint8_t clearAfterAlloc) { /* For the general allocator, we're not worried about the type of memory. It all comes from the @@ -60,7 +60,7 @@ void *allocMem(size_t sizeInBytes, enum MemoryType type, uint8_t clearAfterAlloc if (clearAfterAlloc) { memset(ptr, 0, sizeInBytes); } - + (void)type; return ptr; @@ -74,7 +74,7 @@ void disposeMem(void *ptr) { #endif } - +#endif void memCopyToFrom(void *dst, void *src, size_t sizeInBytes) { memcpy(dst, src, sizeInBytes); } diff --git a/common/src/CreditsScreen.c b/common/src/CreditsScreen.c index 2de9c9ec2..b62fe36b9 100644 --- a/common/src/CreditsScreen.c +++ b/common/src/CreditsScreen.c @@ -46,8 +46,6 @@ void CreditsScreen_repaintCallback(void) { } } - - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 7 - 4, ((YRES_FRAMEBUFFER / 8) + 1) - (1) - 5, 7 + 2, diff --git a/common/src/HackingMinigameRules.c b/common/src/HackingMinigameRules.c index 9089a0481..998f084ca 100644 --- a/common/src/HackingMinigameRules.c +++ b/common/src/HackingMinigameRules.c @@ -23,7 +23,7 @@ uint8_t pinTop[3]; void initHackingMinigame(void) { - memset(&pins[0][0], 0xFF, sizeof(pins)); + memFill(&pins[0][0], 0xFF, sizeof(pins)); pins[0][0] = 4; pins[0][1] = 2; pins[0][2] = 1; diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index f5b2cd6f2..26fe712df 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -24,22 +24,26 @@ typedef unsigned long size_t; #endif #ifdef EMIT_QUIT_OPTION -const char *MainMenu_options[4] = { + +#define kMainMenuOptionsCount 4 + +const char *MainMenu_options[kMainMenuOptionsCount] = { "Play game", "Credits", "Help", "Quit"}; -const enum EGameMenuState MainMenu_nextStateNavigation[4] = { +const enum EGameMenuState MainMenu_nextStateNavigation[kMainMenuOptionsCount] = { kPlayGame, kCredits, kHelp, kQuit}; -const uint8_t kMainMenuOptionsCount = 4; #else -const char *MainMenu_options[3] = { + +#define kMainMenuOptionsCount 3 + +const char *MainMenu_options[kMainMenuOptionsCount] = { "Play game", "Credits", "Help"}; -const enum EGameMenuState MainMenu_nextStateNavigation[3] = { +const enum EGameMenuState MainMenu_nextStateNavigation[kMainMenuOptionsCount] = { kPlayGame, kCredits, kHelp}; -const uint8_t kMainMenuOptionsCount = 3; #endif #ifndef MONOCHROME_VECTORS @@ -3456,7 +3460,6 @@ static const uint8_t splashGraphics[] = { void MainMenu_initStateCallback(enum EGameMenuState tag) { (void)tag; - cursorPosition = 0; } void MainMenu_repaintCallback(void) { @@ -3466,7 +3469,7 @@ void MainMenu_repaintCallback(void) { fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); #endif drawGraphic(0, 0, YRES_FRAMEBUFFER, YRES_FRAMEBUFFER, splashGraphics); - drawGraphic(XRES_FRAMEBUFFER / 2, 0, 160, 160, logoGraphics); + drawGraphic((XRES_FRAMEBUFFER / 2) + 8, 8, (XRES_FRAMEBUFFER / 2) - 16, (XRES_FRAMEBUFFER / 2) - 16, logoGraphics); playSound(MAIN_MENU_THEME); } diff --git a/common/src/MusicAGA.c b/common/src/MusicAGA.c index 7591d1f1c..1b85c0fd4 100644 --- a/common/src/MusicAGA.c +++ b/common/src/MusicAGA.c @@ -122,8 +122,8 @@ void setupOPL2(int unused) { goto killaudio; } - memcpy(waveptr[c], audio.data, samples[c]); - free(audio.data); + memCopyToFrom(waveptr[c], audio.data, samples[c]); + disposeMem(audio.data); } return; diff --git a/ee_frontend/base3d/src/ee/LoadBitmap.c b/ee_frontend/base3d/src/ee/LoadBitmap.c index 619ddcaca..7a9730589 100644 --- a/ee_frontend/base3d/src/ee/LoadBitmap.c +++ b/ee_frontend/base3d/src/ee/LoadBitmap.c @@ -84,7 +84,7 @@ void bindTexture(struct Bitmap *bitmap) { int submitBitmapToGPU(struct Bitmap *bitmap) { - bitmap->nativeBuffer = (texbuffer_t *) calloc(1, sizeof(texbuffer_t)); + bitmap->nativeBuffer = (texbuffer_t *) allocMem(sizeof(texbuffer_t), BITMAP_MEMORY, TRUE); ((texbuffer_t *) bitmap->nativeBuffer)->width = bitmap->width; ((texbuffer_t *) bitmap->nativeBuffer)->psm = GS_PSM_32; ((texbuffer_t *) bitmap->nativeBuffer)->address = graph_vram_allocate(bitmap->width, bitmap->height, GS_PSM_32, @@ -119,7 +119,7 @@ struct Bitmap *loadBitmap(const char *filename) { struct StaticBuffer src = loadBinaryFileFromPath(filename); struct Bitmap *toReturn = - (struct Bitmap *) calloc(1, sizeof(struct Bitmap)); + (struct Bitmap *) allocMem(sizeof(struct Bitmap), BITMAP_MEMORY, TRUE); size_t sizeInDisk = src.size - 4; //total size minus the header @@ -138,11 +138,11 @@ struct Bitmap *loadBitmap(const char *filename) { size_t size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - uint8_t *buffer = (uint8_t *) calloc(1, sizeInDisk); + uint8_t *buffer = (uint8_t *) allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom(buffer, ptr, sizeInDisk); - toReturn->data = (TexturePixelFormat *) calloc(1, size); + toReturn->data = (TexturePixelFormat *) allocMem(size, BITMAP_MEMORY, TRUE); uint8_t repetitions; int pixelIndex = 0; diff --git a/ee_frontend/base3d/src/ee/RendererTesselation.c b/ee_frontend/base3d/src/ee/RendererTesselation.c index 15faa99b5..2534f9c1d 100644 --- a/ee_frontend/base3d/src/ee/RendererTesselation.c +++ b/ee_frontend/base3d/src/ee/RendererTesselation.c @@ -117,7 +117,7 @@ float clampf(float v0, float v1, float v) { struct Texture *makeTextureFrom(const char *filename) { struct Texture *toReturn = - (struct Texture *) calloc(1, sizeof(struct Texture)); + (struct Texture *) allocMem(sizeof(struct Texture), BITMAP_MEMORY, TRUE); toReturn->raw = loadBitmap(filename); submitBitmapToGPU(toReturn->raw); diff --git a/ee_frontend/base3d/src/es/GLESCommon.c b/ee_frontend/base3d/src/es/GLESCommon.c index f354a516f..ce61782eb 100644 --- a/ee_frontend/base3d/src/es/GLESCommon.c +++ b/ee_frontend/base3d/src/es/GLESCommon.c @@ -397,8 +397,7 @@ void initGL(void) { GLint maxLength = 0; glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &maxLength); - char *errorLog = (char *) malloc(maxLength); - memset(errorLog, 0, maxLength); + char *errorLog = (char *) allocMem(maxLength, GENERAL_MEMORY, TRUE); glGetShaderInfoLog(vs, maxLength, &maxLength, errorLog); @@ -417,7 +416,7 @@ void initGL(void) { glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &maxLength); char *errorLog = (char *) malloc(maxLength); - memset(errorLog, 0, maxLength); + memFill(errorLog, 0, maxLength); glGetShaderInfoLog(fs, maxLength, &maxLength, errorLog); diff --git a/ee_frontend/base3d/src/es/LoadBitmap.c b/ee_frontend/base3d/src/es/LoadBitmap.c index b8cc03f6c..ceb974763 100644 --- a/ee_frontend/base3d/src/es/LoadBitmap.c +++ b/ee_frontend/base3d/src/es/LoadBitmap.c @@ -28,7 +28,7 @@ struct Bitmap *loadBitmap(const char *filename) { struct StaticBuffer src = loadBinaryFileFromPath(filename); struct Bitmap *toReturn = - (struct Bitmap *) calloc(1, sizeof(struct Bitmap)); + (struct Bitmap *) allocMem(sizeof(struct Bitmap), BITMAP_MEMORY, TRUE); size_t sizeInDisk = src.size - 4; //total size minus the header @@ -47,11 +47,11 @@ struct Bitmap *loadBitmap(const char *filename) { size_t size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - uint8_t *buffer = (uint8_t *) calloc(1, sizeInDisk); + uint8_t *buffer = (uint8_t *) allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom(buffer, ptr, sizeInDisk); - toReturn->data = (TexturePixelFormat *) calloc(1, size); + toReturn->data = (TexturePixelFormat *) allocMem(size, BITMAP_MEMORY, TRUE); uint8_t repetitions; int pixelIndex = 0; diff --git a/ee_frontend/base3d/src/es/RendererTesselation.c b/ee_frontend/base3d/src/es/RendererTesselation.c index 2616a1c61..20887f1ea 100644 --- a/ee_frontend/base3d/src/es/RendererTesselation.c +++ b/ee_frontend/base3d/src/es/RendererTesselation.c @@ -423,7 +423,7 @@ float clampf(float v0, float v1, float v) { struct Texture *makeTextureFrom(const char *filename) { struct Texture *toReturn = - (struct Texture *) calloc(1, sizeof(struct Texture)); + (struct Texture *) allocMem(sizeof(struct Texture), BITMAP_MEMORY, TRUE); toReturn->raw = loadBitmap(filename); @@ -929,9 +929,9 @@ void drawMesh(struct Mesh *mesh, const struct Vec3 center, enum EDirection rotat if (mesh->nativeBuffer == NULL) { - mesh->nativeVertexBuffer = calloc( 3 * 3 * count, sizeof(float)); - mesh->nativeTexCoordBuffer = calloc( 2 * 3 * count, sizeof(float)); - mesh->nativeIndicesBuffer = calloc( 3 * count, sizeof(unsigned short)); + mesh->nativeVertexBuffer = allocMem( 3 * 3 * count * sizeof(float), GENERAL_MEMORY, TRUE); + mesh->nativeTexCoordBuffer = allocMem( 2 * 3 * count * sizeof(float), GENERAL_MEMORY, TRUE); + mesh->nativeIndicesBuffer = allocMem( 3 * count * sizeof(unsigned short), GENERAL_MEMORY, TRUE); float* vP = mesh->nativeVertexBuffer; float* tP = mesh->nativeTexCoordBuffer; @@ -985,7 +985,7 @@ void drawMesh(struct Mesh *mesh, const struct Vec3 center, enum EDirection rotat vertexData += 9; } - mesh->nativeBuffer = calloc(1, sizeof(struct VBORegister)); + mesh->nativeBuffer = allocMem(sizeof(struct VBORegister), GENERAL_MEMORY, TRUE); *((struct VBORegister*)mesh->nativeBuffer) = submitVBO((float *) mesh->nativeVertexBuffer, mesh->nativeTexCoordBuffer, count * 3, (unsigned short *) mesh->nativeIndicesBuffer, count * 3); diff --git a/ee_frontend/base3d/src/es/SDL2GL2Version.c b/ee_frontend/base3d/src/es/SDL2GL2Version.c index 0e364b8ed..e70ca0598 100644 --- a/ee_frontend/base3d/src/es/SDL2GL2Version.c +++ b/ee_frontend/base3d/src/es/SDL2GL2Version.c @@ -33,7 +33,7 @@ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/ee_frontend/base3d/src/gx/GXRenderer.c b/ee_frontend/base3d/src/gx/GXRenderer.c index 27d6df8c2..3aa1048ca 100644 --- a/ee_frontend/base3d/src/gx/GXRenderer.c +++ b/ee_frontend/base3d/src/gx/GXRenderer.c @@ -72,7 +72,7 @@ void graphicsInit(void) { rmode = VIDEO_GetPreferredMode(NULL); gpfifo = memalign(32, DEFAULT_FIFO_SIZE); - memset(gpfifo, 0, DEFAULT_FIFO_SIZE); + memFill(gpfifo, 0, DEFAULT_FIFO_SIZE); frameBuffer[0] = SYS_AllocateFramebuffer(rmode); frameBuffer[1] = SYS_AllocateFramebuffer(rmode); @@ -131,7 +131,7 @@ void graphicsInit(void) { GX_SetAlphaCompare(GX_GREATER, 0, GX_AOP_AND, GX_ALWAYS, 0); GX_SetZCompLoc(GX_FALSE); - memset(&whiteTextureData[0], 0xFF, 32 * 32 * 4); + memFill(&whiteTextureData[0], 0xFF, 32 * 32 * 4); GX_InitTexObj(&whiteTextureObj, &whiteTextureData[0], 32, 32, GX_TF_RGBA8, GX_REPEAT, GX_REPEAT, GX_FALSE); } diff --git a/ee_frontend/base3d/src/gx/LoadBitmap.c b/ee_frontend/base3d/src/gx/LoadBitmap.c index 5d37dd4a7..9ece35e79 100644 --- a/ee_frontend/base3d/src/gx/LoadBitmap.c +++ b/ee_frontend/base3d/src/gx/LoadBitmap.c @@ -60,7 +60,7 @@ struct Bitmap *loadBitmap(const char *filename) { struct StaticBuffer src = loadBinaryFileFromPath(filename); struct Bitmap *toReturn = - (struct Bitmap *) calloc(1, sizeof(struct Bitmap)); + (struct Bitmap *) allocMem(sizeof(struct Bitmap), BITMAP_MEMORY, TRUE); size_t sizeInDisk = src.size - 4; //total size minus the header @@ -79,7 +79,7 @@ struct Bitmap *loadBitmap(const char *filename) { size_t size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - uint8_t *buffer = (uint8_t *) calloc(1, sizeInDisk); + uint8_t *buffer = (uint8_t *) allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom(buffer, ptr, sizeInDisk); diff --git a/ee_frontend/base3d/src/gx/RendererTesselation.c b/ee_frontend/base3d/src/gx/RendererTesselation.c index b5e44dfe7..5dc9c35bc 100644 --- a/ee_frontend/base3d/src/gx/RendererTesselation.c +++ b/ee_frontend/base3d/src/gx/RendererTesselation.c @@ -103,7 +103,7 @@ float clampf(float v0, float v1, float v) { struct Texture *makeTextureFrom(const char *filename) { struct Texture *toReturn = - (struct Texture *) calloc(1, sizeof(struct Texture)); + (struct Texture *) allocMem(sizeof(struct Texture), BITMAP_MEMORY, TRUE); toReturn->raw = loadBitmap(filename); diff --git a/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c b/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c index 3099986a0..87b79e65b 100644 --- a/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c +++ b/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c @@ -27,7 +27,7 @@ #ifdef __EMSCRIPTEN__ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/mx_frontend/DerelictMacOSClassic/Derelict.xSYM b/mx_frontend/DerelictMacOSClassic/Derelict.xSYM index 2c3b9c3a05585909d2f084b51ec707b9db1c284d..f094bd5725f7417d5865342d93741321bf394bc0 100644 GIT binary patch delta 61517 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

XOJ!&eE=ES$1&ddr{?Uq%$ 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 u)Fe|Blxm)pTQLI06z1!3l#B=&-32C`@7m=6 delta 61311 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 U)BOAL`4sm_wC2*CTX#qP2ZEkZp8x;= diff --git a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic index db05bc95dcf69771b6fdd66817305e44f5f788cf..c493b961a83b6b0fbff868675052c23af83819d6 100644 GIT binary patch delta 79 zcmdlnpL552&JFg8iVQ66vw0Yx0LT`Av7xlgWXDk7&1)6C7}@7Lure_Cuy0pXVH9O* R7FKN+R%P5Stje@h3jlK&4@Cd~ delta 71 zcmV-N0J#6Sp9#3139vsQ85#gagOC75gm9A};oJZK01yBGAONE(>bR3RRaLXCAxZ%U dfbT;90BL-;AtV760)rDJhZ7|Mw-Y4-r7BT471aO$ diff --git a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict Debug/TargetDataMacOS.tdt b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict Debug/TargetDataMacOS.tdt index 6efc93602aeb2e195f8c1adf945e0fc03bcc10f3..a8f567f06326fe5e17e747582dc7b50e33df1636 100644 GIT binary patch delta 51014 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 O2GcMP2^Ct6{r>>%YxrdV diff --git a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict/TargetDataMacOS.tdt b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict/TargetDataMacOS.tdt index 7857b17a2aba3dbf24d2d998467ab717e4106be7..00df42ec9824b5c6a59e00c28b89a108b5afaacc 100644 GIT binary patch delta 847 zcmZ9~JxBs!0LF2z;%X?TaJ(T%nv8;^A%vD2ugyuctj<2K@9Xw=tH8cL$XwO%mS4SSG$bRF<@es$;AY z|31nj;sHt{H4-?)Xc6}jN+)$9A7iwM=LBUChbX5Q3q&$dNkbU#Hh)6*(?bvMlRdf5 zsLci$g5kVISn delta 847 zcmZ9~JxBs!0LF2y;%cay;)aGBf*c)!q)BMG@!A}JX;T&fUn5|vB-e?>8Rp0s%yJ;S9M@tvaz zM7%)hq)z-Pj71_{q72d?>J>(t$k!;7xJ0|b=ny51>M~V&P7AXmgVy&)r}Gtm{COMg KD^1)BpF@A%kW7;R diff --git a/mx_frontend/DerelictMacOSClassic/MacFileReader.c b/mx_frontend/DerelictMacOSClassic/MacFileReader.c index 236de48b6..9f4e514b8 100644 --- a/mx_frontend/DerelictMacOSClassic/MacFileReader.c +++ b/mx_frontend/DerelictMacOSClassic/MacFileReader.c @@ -99,7 +99,7 @@ uint8_t* readFully(char *filename) { assert(size); - resultBuffer = (uint8_t*)calloc(1, size); + resultBuffer = (uint8_t*)allocMem(size, BITMAP_MEMORY, TRUE); assert(resultBuffer); rewind( filePtr ); @@ -200,7 +200,7 @@ struct StaticBuffer loadBinaryFileFromPath(const char * __restrict__ path) { assert (fread(&size, 4, 1, mDataPack)); size = toNativeEndianess(size); toReturn.size = size; - toReturn.data = (uint8_t *) malloc(size); + toReturn.data = (uint8_t *) allocMem(size, GENERAL_MEMORY, 0); assert (fread((void*)toReturn.data, sizeof(uint8_t), size, mDataPack)); fclose(mDataPack); @@ -257,5 +257,5 @@ FILE *openBinaryFileFromPath(const char * __restrict__ path) { } void disposeDiskBuffer(struct StaticBuffer buffer) { - free((void*)buffer.data); -} \ No newline at end of file + disposeMem((void*)buffer.data); +} diff --git a/mx_frontend/DerelictMacOSClassic/MacRenderer.c b/mx_frontend/DerelictMacOSClassic/MacRenderer.c index 67338b9fe..221db4014 100644 --- a/mx_frontend/DerelictMacOSClassic/MacRenderer.c +++ b/mx_frontend/DerelictMacOSClassic/MacRenderer.c @@ -420,7 +420,7 @@ void flipRenderer(void) { rowBytes = ((*pixmap)->rowBytes & 0x3FFF); for (c = 0; c < YRES_FRAMEBUFFER; ++c ) { - memcpy( baseAddr + offset, &stretchedBuffer[XRES_FRAMEBUFFER * c], XRES_FRAMEBUFFER); + memCopyToFrom( baseAddr + offset, &stretchedBuffer[XRES_FRAMEBUFFER * c], XRES_FRAMEBUFFER); offset = offset + rowBytes; } diff --git a/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c b/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c index 350d034ab..7e6fea0f9 100644 --- a/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c +++ b/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c @@ -152,7 +152,7 @@ Java_pt_b13h_spacetrashmanblues_DerelictJNI_getPixelsFromNative(JNIEnv *env, jcl menuTick(33); flipRenderer(); jbyte *narr = (*env)->GetByteArrayElements(env, array, NULL); - memcpy(narr, &framebufferFinal[0], 320 * 240 * 4); + memCopyToFrom(narr, &framebufferFinal[0], 320 * 240 * 4); } int soundToPlay = -1; diff --git a/mx_frontend/Xcode2/GameView.m b/mx_frontend/Xcode2/GameView.m index 372fca1ab..2c277ae87 100644 --- a/mx_frontend/Xcode2/GameView.m +++ b/mx_frontend/Xcode2/GameView.m @@ -198,15 +198,15 @@ -(void) stopTimer { void shutdownHW(void) { CGColorSpaceRelease(rgb); - - free(textBuffer); - free(messageLogBuffer); - free(collisionMap); - free(visMap); - free(distances); - free(textures); - free(itemsInMap); - free(map); + + disposeMem(textBuffer); + disposeMem(messageLogBuffer); + disposeMem(collisionMap); + disposeMem(visMap); + disposeMem(distances); + disposeMem(textures); + disposeMem(itemsInMap); + disposeMem(map); } @@ -240,8 +240,8 @@ - (void)drawRect:(NSRect)rect { ++bufferPtr; } } - - memcpy( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + + memCopyToFrom( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); /* MAC_OS_X_VERSION_10_10*/ #if MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 diff --git a/mx_frontend/Xcode2/OSXRenderer.m b/mx_frontend/Xcode2/OSXRenderer.m index 991fa3cb4..042bc3227 100644 --- a/mx_frontend/Xcode2/OSXRenderer.m +++ b/mx_frontend/Xcode2/OSXRenderer.m @@ -39,14 +39,14 @@ extern struct Texture* textures; void initHW(int argc, char** argv) { - textBuffer = (char*)calloc(TEXT_BUFFER_SIZE, 1); - messageLogBuffer = (char*)calloc(256, 1); - collisionMap = (uint8_t*)calloc(256, 1); - visMap = (enum EVisibility*)calloc(MAP_SIZE * MAP_SIZE, sizeof(enum EVisibility)); - distances = (struct Vec2i*)calloc(2 * MAP_SIZE * MAP_SIZE, sizeof(struct Vec2i)); - textures = (struct Texture*)calloc(TOTAL_TEXTURES, sizeof(struct Texture)); - itemsInMap = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); - map = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); + textBuffer = (char*)allocMem(TEXT_BUFFER_SIZE, GENERAL_MEMORY, TRUE); + messageLogBuffer = (char*)allocMem(256, GENERAL_MEMORY, TRUE); + collisionMap = (uint8_t*)allocMem(256, GENERAL_MEMORY, TRUE); + visMap = (enum EVisibility*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(enum EVisibility), GENERAL_MEMORY, TRUE); + distances = (struct Vec2i*)allocMem(2 * MAP_SIZE * MAP_SIZE * sizeof(struct Vec2i), GENERAL_MEMORY, TRUE); + textures = (struct Texture*)allocMem(TOTAL_TEXTURES * sizeof(struct Texture), GENERAL_MEMORY, TRUE); + itemsInMap = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); + map = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"base.pfs"]; initFileReader([path UTF8String]); diff --git a/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m b/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m index ff6e0790c..101d4bfe8 100644 --- a/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m +++ b/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m @@ -60,14 +60,14 @@ uint8_t getPaletteEntry(const uint32_t origin) { void initHW(int argc, char** argv) { - textBuffer = (char*)calloc(TEXT_BUFFER_SIZE, 1); - messageLogBuffer = (char*)calloc(256, 1); - collisionMap = (uint8_t*)calloc(256, 1); - visMap = (enum EVisibility*)calloc(MAP_SIZE * MAP_SIZE, sizeof(enum EVisibility)); - distances = (struct Vec2i*)calloc(2 * MAP_SIZE * MAP_SIZE, sizeof(struct Vec2i)); - textures = (struct Texture*)calloc(TOTAL_TEXTURES, sizeof(struct Texture)); - itemsInMap = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); - map = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); + textBuffer = (char*)allocMem(TEXT_BUFFER_SIZE, GENERAL_MEMORY, TRUE); + messageLogBuffer = (char*)allocMem(256, GENERAL_MEMORY, TRUE); + collisionMap = (uint8_t*)allocMem(256, GENERAL_MEMORY, TRUE); + visMap = (enum EVisibility*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(enum EVisibility), GENERAL_MEMORY, TRUE); + distances = (struct Vec2i*)allocMem(2 * MAP_SIZE * MAP_SIZE * sizeof(struct Vec2i), GENERAL_MEMORY, TRUE); + textures = (struct Texture*)allocMem(TOTAL_TEXTURES * sizeof(struct Texture), GENERAL_MEMORY, TRUE); + itemsInMap = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); + map = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"base.pfs"]; initFileReader([path UTF8String]); @@ -160,14 +160,14 @@ -(void) stopTimer { } void shutdownHW(void) { - free(textBuffer); - free(messageLogBuffer); - free(collisionMap); - free(visMap); - free(distances); - free(textures); - free(itemsInMap); - free(map); + disposeMem(textBuffer); + disposeMem(messageLogBuffer); + disposeMem(collisionMap); + disposeMem(visMap); + disposeMem(distances); + disposeMem(textures); + disposeMem(itemsInMap); + disposeMem(map); CGColorSpaceRelease(rgb); } @@ -205,8 +205,8 @@ - ( void ) draw { ++bufferPtr; } } - - memcpy( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + + memCopyToFrom( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); CGContextRef context = UIGraphicsGetCurrentContext(); diff --git a/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c b/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c index f0ac28f5a..a5d6c3bdd 100644 --- a/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c +++ b/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c @@ -70,8 +70,8 @@ void graphicsInit(void) { SetMode( MODE_4 | BG2_ON ); // screen mode & background to display - framebuffer = (uint8_t*)malloc(XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); - memset(palette, 0, sizeof(uint16_t) * 256); + framebuffer = (uint8_t*)allocMem(XRES_FRAMEBUFFER * YRES_FRAMEBUFFER, GENERAL_MEMORY, FALSE); + memFill(palette, 0, sizeof(uint16_t) * 256); for (b = 0; b < 256; b += 16) { for (g = 0; g < 256; g += 8) { diff --git a/mx_frontend/base3d/src/LoadBitmap.c b/mx_frontend/base3d/src/LoadBitmap.c index ef2463ea0..8f362584e 100644 --- a/mx_frontend/base3d/src/LoadBitmap.c +++ b/mx_frontend/base3d/src/LoadBitmap.c @@ -201,13 +201,13 @@ struct Bitmap *loadBitmap(const char *__restrict__ filename) { tmp = *ptr++; toReturn->height += tmp & 0xFF; - uint8_t* buffer = (uint8_t*)calloc(1, sizeInDisk); + uint8_t* buffer = (uint8_t*)allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom((void*)buffer, (void*)ptr, sizeInDisk); size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - toReturn->data = (TexturePixelFormat*)calloc(1, size); + toReturn->data = (TexturePixelFormat*)allocMem(size, BITMAP_MEMORY, TRUE); int pixelIndex = 0; diff --git a/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c b/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c index aa6bace02..ba9588145 100644 --- a/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c +++ b/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c @@ -26,7 +26,7 @@ #ifdef __EMSCRIPTEN__ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c b/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c index 313ca353b..aaef0c972 100644 --- a/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c +++ b/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c @@ -23,7 +23,7 @@ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c b/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c index 40aae7c58..cb6f78f73 100644 --- a/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c +++ b/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c @@ -42,7 +42,7 @@ COLORREF transparencyRef; extern HWND HWnd; extern HINSTANCE hInst; float multiplier; -enum ESoundDriver soundDriver; +enum ESoundDriver soundDriver; void setupOPL2(int port) {} @@ -90,7 +90,7 @@ static HBITMAP Create8bppBitmap(HDC hdc, int width, int height, LPVOID pBits) uint32_t pixel; void *Pixels; HBITMAP hbmp; - BITMAPINFO *bmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); + BITMAPINFO *bmi = (BITMAPINFO *)allocMem(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256, GENERAL_MEMORY, 0); PBITMAPINFOHEADER bih; @@ -110,7 +110,7 @@ static HBITMAP Create8bppBitmap(HDC hdc, int width, int height, LPVOID pBits) - memcpy( &bmi->bmiColors[0], &paletteRef[0], 256 * sizeof(RGBQUAD)); + memCopyToFrom( &bmi->bmiColors[0], &paletteRef[0], 256 * sizeof(RGBQUAD)); Pixels = NULL; @@ -120,10 +120,10 @@ static HBITMAP Create8bppBitmap(HDC hdc, int width, int height, LPVOID pBits) { BYTE* pbBits = (BYTE*)pBits; BYTE *Pix = (BYTE *)Pixels; - memcpy(Pix, pbBits, width * height); + memCopyToFrom(Pix, pbBits, width * height); } - free(bmi); + disposeMem(bmi); return hbmp; } @@ -157,7 +157,7 @@ static HBITMAP CreateBitmapFromPixels( HDC hDC, UINT uWidth, UINT uHeight, UINT if ( !uWidth || !uHeight || !uBitsPerPixel ) return hBitmap; lBmpSize = uWidth * uHeight * (uBitsPerPixel/8) ; - memset(&bmpInfo, 0, sizeof(bmpInfo)); + memFill(&bmpInfo, 0, sizeof(bmpInfo)); bmpInfo.bmiHeader.biBitCount = uBitsPerPixel; bmpInfo.bmiHeader.biHeight = uHeight; bmpInfo.bmiHeader.biWidth = uWidth; @@ -172,7 +172,7 @@ static HBITMAP CreateBitmapFromPixels( HDC hDC, UINT uWidth, UINT uHeight, UINT if ( !hBitmap ) return hBitmap; - memcpy(pPixels, pBits, lBmpSize ); + memCopyToFrom(pPixels, pBits, lBmpSize ); return hBitmap; } @@ -356,8 +356,8 @@ WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { if ( !enableSmoothMovement || turnTarget == turnStep ) { - memcpy( slideBitmap, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); - memcpy( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + memCopyToFrom( slideBitmap, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + memCopyToFrom( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); } else if ( turnStep < turnTarget ) { for ( y = dirtyLineY0; y < dirtyLineY1; ++y ) { diff --git a/mx_frontend/base3d/src/X11Version/X11Renderer.c b/mx_frontend/base3d/src/X11Version/X11Renderer.c index b8924457b..bbb614c6a 100644 --- a/mx_frontend/base3d/src/X11Version/X11Renderer.c +++ b/mx_frontend/base3d/src/X11Version/X11Renderer.c @@ -38,7 +38,7 @@ void graphicsInit(void) { root = RootWindow(display, screen_num); visual = DefaultVisual(display, screen_num); - data = (char *) malloc(320 * 240 * 4); + data = (char *) allocMem(320 * 240 * 4, GENERAL_MEMORY, FALSE); img = XCreateImage(display, visual, DefaultDepth(display, screen_num), ZPixmap, 0, data, 320, 240, 32, 0); diff --git a/mx_frontend/menu/src/Main.c b/mx_frontend/menu/src/Main.c index 7accf9791..84ab4c0b5 100644 --- a/mx_frontend/menu/src/Main.c +++ b/mx_frontend/menu/src/Main.c @@ -135,7 +135,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - int argc = 0; + int argc = 0; char **argv = NULL; WNDCLASSEX WndCls; diff --git a/my_frontend/CMakeLists.txt b/my_frontend/CMakeLists.txt index 6bd6a1014..b810ca2e1 100644 --- a/my_frontend/CMakeLists.txt +++ b/my_frontend/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(src ../core/src ../core/include include ../common/include ${SDL2_INCLUDE_DIR} ) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DUSE_OWN_MIN_MAX -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") find_package(SDL2 REQUIRED) diff --git a/my_frontend/Makefile.464 b/my_frontend/Makefile.464 index ed472a36e..f6ac56ff3 100644 --- a/my_frontend/Makefile.464 +++ b/my_frontend/Makefile.464 @@ -31,7 +31,9 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DRLE_COMPRESSED_MAPS \ -DEMBEDDED_DATA \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DNO_DYNAMIC_MEMORY_ALLOC \ + -DUSE_OWN_MIN_MAX TARGET = derelict.dsk diff --git a/my_frontend/Makefile.ia16 b/my_frontend/Makefile.ia16 index 50c7f0ffc..08ea0c071 100644 --- a/my_frontend/Makefile.ia16 +++ b/my_frontend/Makefile.ia16 @@ -18,7 +18,9 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DSUPPORTS_HACKING_MINIGAME \ -DENDIANESS_AWARE \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DNO_DYNAMIC_MEMORY_ALLOC \ + -DUSE_OWN_MIN_MAX CC = ia16-elf-gcc STRIP = ia16-elf-strip diff --git a/my_frontend/Makefile.msx b/my_frontend/Makefile.msx index 8b1f2744c..6dbb62291 100644 --- a/my_frontend/Makefile.msx +++ b/my_frontend/Makefile.msx @@ -35,7 +35,9 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DRLE_COMPRESSED_MAPS \ -DEMBEDDED_DATA \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DNO_DYNAMIC_MEMORY_ALLOC \ + -DUSE_OWN_MIN_MAX TARGET = derelict.rom diff --git a/my_frontend/Makefile.sm3 b/my_frontend/Makefile.sm3 index 72929b847..2571e7647 100644 --- a/my_frontend/Makefile.sm3 +++ b/my_frontend/Makefile.sm3 @@ -34,7 +34,9 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DRLE_COMPRESSED_MAPS \ -DEMBEDDED_DATA \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DNO_DYNAMIC_MEMORY_ALLOC \ + -DUSE_OWN_MIN_MAX TARGET = derelict.sms diff --git a/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj b/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj index 86c313880..684c03724 100644 --- a/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj +++ b/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj @@ -383,6 +383,7 @@ "YRES_FRAMEBUFFER=192", "XRES_FRAMEBUFFER=256", MONOCHROME_VECTORS, + USE_OWN_MIN_MAX, ); INFOPLIST_FILE = "Derelict-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; @@ -405,6 +406,7 @@ "YRES_FRAMEBUFFER=192", "XRES_FRAMEBUFFER=256", MONOCHROME_VECTORS, + USE_OWN_MIN_MAX, ); INFOPLIST_FILE = "Derelict-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; diff --git a/my_frontend/Xcode2/GameView.m b/my_frontend/Xcode2/GameView.m index 8a39aa8b0..f945bdded 100644 --- a/my_frontend/Xcode2/GameView.m +++ b/my_frontend/Xcode2/GameView.m @@ -13,6 +13,7 @@ #include #include +#include "Common.h" #include "Enums.h" #include "UI.h" #include "Engine.h" @@ -88,7 +89,7 @@ void initHW(int argc, char** argv) { updateDirection = 0; mBufferedCommand = '.'; - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } diff --git a/my_frontend/Xcode2/OSXRenderer.m b/my_frontend/Xcode2/OSXRenderer.m index aeea547fa..a965619ee 100644 --- a/my_frontend/Xcode2/OSXRenderer.m +++ b/my_frontend/Xcode2/OSXRenderer.m @@ -13,6 +13,7 @@ #include #include +#include "Common.h" #include "Enums.h" #include "OSXRenderer.h" #include "GameView.h" @@ -125,10 +126,6 @@ void graphicsPutPointArray(uint8_t *y128Values) { } } -void clearTextScreen(void) { - fillRect(0, 129, 256, 192, 0, 0); -} - void enterTextMode(void) { } @@ -154,7 +151,7 @@ void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple) { } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { diff --git a/my_frontend/include/Renderer.h b/my_frontend/include/Renderer.h index bad54b2ef..326e8ffab 100644 --- a/my_frontend/include/Renderer.h +++ b/my_frontend/include/Renderer.h @@ -59,8 +59,6 @@ struct CellPattern { void clearGraphics(void); -void clearTextScreen(void); - void dropItem(void); void initMap(void); diff --git a/my_frontend/src/Crawler.c b/my_frontend/src/Crawler.c index a239e3162..644e89d26 100644 --- a/my_frontend/src/Crawler.c +++ b/my_frontend/src/Crawler.c @@ -55,15 +55,15 @@ void HUD_refresh(void) { item = getItem(roomItem->item); if (strstr(item->name, "go-down")) { - drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go down", 2, ' '); + drawTextAtWithMargin(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go down", 2); } else { if (strstr(item->name, "go-up")) { - drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go up", 2, ' '); + drawTextAtWithMargin(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go up", 2); } else { if (item->active) { drawTextAt(1, YRES_TEXT - 6, "*", 2); } - drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); + drawTextAtWithMargin(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2); } } } else { @@ -76,7 +76,7 @@ void HUD_refresh(void) { if (item->active) { drawTextAt(1, YRES_TEXT - 3, "*", 1); } - drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 3, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); + drawTextAtWithMargin(2, YRES_TEXT - 3, (XRES_FRAMEBUFFER) / 2, item->name, 2); } else { drawTextAt(2, YRES_TEXT - 3, "Nothing", 2); } @@ -101,14 +101,6 @@ enum EGameMenuState Crawler_tickCallback(enum ECommand cmd, void* data) { prevZ = cameraZ; switch (cmd) { - case kCommandFire5: - nextItemInHand(); - break; - - case kCommandFire6: - nextItemInRoom(); - break; - case kCommandFire1: useItemInHand(); break; @@ -124,12 +116,20 @@ enum EGameMenuState Crawler_tickCallback(enum ECommand cmd, void* data) { redrawMap = needsToRedrawHUD = needsToRedrawVisibleMeshes = 1; initMap(); } - break; case kCommandFire4: dropItem(); break; + + case kCommandFire5: + nextItemInHand(); + break; + + case kCommandFire6: + nextItemInRoom(); + break; + default: goto handle_directions; } diff --git a/my_frontend/src/Events.c b/my_frontend/src/Events.c index 2b23c75b7..cefddc935 100755 --- a/my_frontend/src/Events.c +++ b/my_frontend/src/Events.c @@ -16,7 +16,7 @@ #ifndef EMBEDDED_DATA #include "PackedFileReader.h" #endif -extern int8_t map[32][32]; +extern int8_t map[MAP_SIZE][MAP_SIZE]; extern int8_t stencilHigh[XRES]; @@ -182,9 +182,9 @@ void initMap(void) { roomItem = getRoom(playerLocation)->itemsPresent->next; #ifdef OPTIMIZATION_BLOCK_CELL - memset(map, BLOCK_CELL, MAP_SIZE_X * MAP_SIZE_Y); + memFill(map, BLOCK_CELL, MAP_SIZE_X * MAP_SIZE_Y); #else - memset(map, NEUTRAL_CELL, MAP_SIZE_X * MAP_SIZE_Y); + memFill(map, NEUTRAL_CELL, MAP_SIZE_X * MAP_SIZE_Y); #endif for (y = 0; y < MAP_SIZE_Y; ++y) { for (x = 0; x < MAP_SIZE_X; ++x) { diff --git a/my_frontend/src/GamepadUI.c b/my_frontend/src/GamepadUI.c index 3afc9545c..7422ce524 100644 --- a/my_frontend/src/GamepadUI.c +++ b/my_frontend/src/GamepadUI.c @@ -20,7 +20,6 @@ const char *menuItems[] = { }; void initGamepadUI(void) { - cursorPosition = 0; } enum ECommand performActionJoypad(void) { diff --git a/my_frontend/src/HackingMinigame.c b/my_frontend/src/HackingMinigame.c index 2231ff755..f9aa7f8c9 100644 --- a/my_frontend/src/HackingMinigame.c +++ b/my_frontend/src/HackingMinigame.c @@ -46,18 +46,17 @@ void HackingScreen_repaintCallback(void) { clearScreen(); needsToRedrawVisibleMeshes = 0; drawTextAt(1, 1, "Stack trace:", getPaletteEntry(0xFF999999)); - drawTextAt((12 * 0), 11, " CPU0 ", getPaletteEntry(0xFF999999)); - drawTextAt((12 * 1), 11, " CPU1 ", getPaletteEntry(0xFF999999)); - drawTextAt((12 * 2), 11, " CPU2 ", getPaletteEntry(0xFF999999)); - drawTextAt((12 * cursorPosition), 11, ">", getPaletteEntry(0xFF999999)); - drawTextAt((12 * cursorPosition) + 5, 11, "<", getPaletteEntry(0xFF999999)); + drawTextAt((12 * cursorPosition), 11, "> <", getPaletteEntry(0xFF999999)); drawLine(0, 80, XRES_FRAMEBUFFER - 1, 80, 2); for (pin = 0; pin < 3; ++pin) { uint8_t disk; + /* hack to save on some 30 bytes in the ROM size*/ + drawTextAtWithMarginWithFiltering((12 * pin) + 1, 11, XRES_FRAMEBUFFER, "CPU-", getPaletteEntry(0xFF999999), '0' + pin); + if (pin != 0) { uint8_t pinX = (10 * (pin) ) * 8; drawLine(pinX, 40, pinX, 80, 2); diff --git a/my_frontend/src/RendererRasterizer.c b/my_frontend/src/RendererRasterizer.c index 04922acd7..330257181 100755 --- a/my_frontend/src/RendererRasterizer.c +++ b/my_frontend/src/RendererRasterizer.c @@ -4,6 +4,7 @@ #include "Core.h" #include "Derelict.h" #include "Renderer.h" +#include "Common.h" #ifdef MSDOS #include "Common.h" diff --git a/my_frontend/src/RendererScene.c b/my_frontend/src/RendererScene.c index cd4cf74e8..5222f6d68 100755 --- a/my_frontend/src/RendererScene.c +++ b/my_frontend/src/RendererScene.c @@ -1,8 +1,8 @@ #include -#include #include "Renderer.h" #include "map.h" +#include "Common.h" #ifdef MSDOS #include "Common.h" @@ -30,7 +30,7 @@ int8_t min(int8_t x1, int8_t x2) { /* all those refactors are due to a SDCC bug with very long functions */ void renderScene(void) { - memset(stencilHigh, 0, XRES); + memFill(stencilHigh, 0, XRES); switch (cameraRotation) { case DIRECTION_N: diff --git a/my_frontend/src/TMS9918.c b/my_frontend/src/TMS9918.c index b0c5259bd..045643dd5 100644 --- a/my_frontend/src/TMS9918.c +++ b/my_frontend/src/TMS9918.c @@ -6,6 +6,7 @@ #include +#include "Common.h" #include "font.h" #include "Enums.h" @@ -73,7 +74,7 @@ void setColour(uint8_t colour) { } void clearGraphics(void) { - memset(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); + memFill(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); } void flush3DBuffer(void) { @@ -271,15 +272,6 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con } } -void clearTextScreen(void) { - uint8_t c, d; - for (c = 16; c < 24; ++c) { - for (d = 0; d < 32; ++d) { - drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); - } - } -} - void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { uint8_t x, y; diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index a634f2220..142dcd583 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -24,6 +24,10 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; +uint16_t scale2DVertex( uint16_t offset, uint16_t scale, const uint8_t *shape, uint16_t index) { + return offset + ((scale * shape[index]) / 128); +} + void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *graphic) { const uint8_t *ptr = graphic; @@ -36,17 +40,19 @@ void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t const uint8_t *shape = ptr; for (c = 0; c < npoints - 1; ++c) { - drawLine(x + ((dx * shape[(2 * c) + 0]) / 128), - y + ((dy * shape[(2 * c) + 1]) / 128), - x + ((dx * shape[(2 * c) + 2]) / 128), - y + ((dy * shape[(2 * c) + 3]) / 128), - 2); + drawLine(scale2DVertex( x, dx, shape, (2 * c) + 0), + scale2DVertex( y, dy, shape, (2 * c) + 1), + scale2DVertex( x, dx, shape, (2 * c) + 2), + scale2DVertex( y, dy, shape, (2 * c) + 3), + 2); } - drawLine(x + ((dx * shape[2 * npoints - 2]) / 128), - y + ((dy * shape[2 * npoints - 1]) / 128), - x + ((dx * shape[0]) / 128), - y + ((dy * shape[1]) / 128), - 2); + + drawLine(scale2DVertex( x, dx, shape, 2 * npoints - 2), + scale2DVertex( y, dy, shape, 2 * npoints - 1), + scale2DVertex( x, dx, shape, 0), + scale2DVertex( y, dy, shape, 1), + 2); + ptr += 2 * npoints; } } @@ -60,7 +66,6 @@ void drawTextAtWithMargin(const int x, const int y, int margin, const char *text } void showMessage(const char *message) { - clearTextScreen(); drawTextWindow(1, 16, (XRES_FRAMEBUFFER / 8) - 3, (YRES_FRAMEBUFFER / 8) - 18, "Press 2 to continue", message); waitForKey = 1; } diff --git a/my_frontend/src/cpc.c b/my_frontend/src/cpc.c index a8d505b14..80ac4c8ec 100644 --- a/my_frontend/src/cpc.c +++ b/my_frontend/src/cpc.c @@ -3,6 +3,7 @@ #include #include +#include "Common.h" #include "Enums.h" #include "Core.h" #include "Renderer.h" @@ -189,10 +190,6 @@ uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { return ptr; } -void clearTextScreen(void) { - fillRect(8, YRES + 8, XRES_FRAMEBUFFER - 8, YRES_FRAMEBUFFER -8, 0, 0); -} - void handleSystemEvents(void) {} enum ECommand getInput(void) { @@ -260,11 +257,11 @@ enum ECommand getInput(void) { } void clearScreen(void) { - memset((unsigned char *) 0xC000, 0, (320 / 4) * 200); + memFill((unsigned char *) 0xC000, 0, (320 / 4) * 200); } void clearGraphics(void) { - memset(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); + memFill(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); } void startFrame(int x, int y, int width, int height) { @@ -278,7 +275,7 @@ void endFrame(void) { if (needsToRedrawVisibleMeshes) { for (uint8_t y = 0; y < BUFFER_SIZEY; ++y) { uint8_t *line = (unsigned char *) 0xC000 + ((y >> 3) * 80) + ((y & 7) * 2048); - memcpy(line, buffer + (y * BUFFER_SIZEX), BUFFER_SIZEX); + memCopyToFrom(line, buffer + (y * BUFFER_SIZEX), BUFFER_SIZEX); } clearGraphics(); diff --git a/my_frontend/src/msdos.c b/my_frontend/src/msdos.c index 911faa379..49246ab1e 100644 --- a/my_frontend/src/msdos.c +++ b/my_frontend/src/msdos.c @@ -347,7 +347,7 @@ uint8_t *realPut(uint16_t x, uint8_t y, uint8_t value, uint8_t *ptr) { } void clearGraphics(void) { - memset(imageBuffer, 0, 128 * 32); + memFill(imageBuffer, 0, 128 * 32); } void initHW(int argc, char **argv) { @@ -581,19 +581,10 @@ void endFrame(void) { ); } - memset(imageBuffer, 0, 128 * 32); + memFill(imageBuffer, 0, 128 * 32); } -void clearTextScreen(void) { - int c, d; - for (c = 16; c < 24; ++c) { - for (d = 0; d < 40; ++d) { - drawTextAtWithMarginWithFiltering(d, c, 320, " ", 2, ' '); - } - } -} - void enterTextMode(void) {} void exitTextMode(void) { diff --git a/my_frontend/src/sdl2.c b/my_frontend/src/sdl2.c index 82dcb662d..c39d85a20 100644 --- a/my_frontend/src/sdl2.c +++ b/my_frontend/src/sdl2.c @@ -13,6 +13,7 @@ #include "font.h" #include "SDL.h" +#include "Common.h" extern uint8_t firstFrameOnCurrentState; extern struct ObjectNode *focusedItem; @@ -108,10 +109,6 @@ void graphicsPutPointArray(uint8_t *y128Values) { } } -void clearTextScreen(void) { - fillRect(0, 129, 256, 192, 0, 0); -} - void enterTextMode(void) { } @@ -143,7 +140,7 @@ void shutdownGraphics(void) { } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { @@ -243,10 +240,6 @@ enum ECommand getInput(void) { case SDLK_6: return kCommandFire6; - case SDLK_s: - clearTextScreen(); - break; - case SDLK_LEFT: return kCommandLeft; diff --git a/my_frontend/src/speccy.c b/my_frontend/src/speccy.c index 0d020fd7a..058305682 100644 --- a/my_frontend/src/speccy.c +++ b/my_frontend/src/speccy.c @@ -92,10 +92,6 @@ uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { return NULL; } -void clearTextScreen(void) { - clga(0, 128, 256, 192); -} - void handleSystemEvents(void) {} uint8_t inputCounter = 0; diff --git a/mz_frontend/CMakeLists.txt b/mz_frontend/CMakeLists.txt index fe70eda13..43613c2e3 100644 --- a/mz_frontend/CMakeLists.txt +++ b/mz_frontend/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(src ../core/src ../core/include include ../common/include ${SDL2_INCLUDE_DIR} ) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DUSE_OWN_MIN_MAX -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") find_package(SDL2 REQUIRED) diff --git a/mz_frontend/Makefile.286 b/mz_frontend/Makefile.286 index 46775826c..463b7bf20 100644 --- a/mz_frontend/Makefile.286 +++ b/mz_frontend/Makefile.286 @@ -2,7 +2,7 @@ CFLAGS = -fomit-frame-pointer -fno-exceptions -ffast-math \ -Iinclude -I../core/include -I../common/include -IEngine3D \ -DMSDOS -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ - -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE \ + -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE -DUSE_OWN_MIN_MAX \ -Iinclude -I../common/include -I../core/include -I../common/include -IEngine3D -I../core/include \ -I../common/include -I../core/include -Imenu/include -ISoundSystem -I../core/include -IEngine3D diff --git a/mz_frontend/Makefile.atari b/mz_frontend/Makefile.atari index 496b4e857..b441ed5a2 100644 --- a/mz_frontend/Makefile.atari +++ b/mz_frontend/Makefile.atari @@ -4,7 +4,7 @@ STRIP=m68k-atari-mint-strip CFLAGS = -std=c99 -c -m68000 -s -fexpensive-optimizations -fomit-frame-pointer -Ofast \ -DATARIST -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ - -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ + -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DUSE_OWN_MIN_MAX \ -Iinclude -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AtariVersion \ -I../common/include -I../core/include -Imenu/include -ISoundSystem -IAtariVersion -I../core/include -IEngine3D diff --git a/mz_frontend/Makefile.ocs b/mz_frontend/Makefile.ocs index 2cfaf5cdc..29e05c978 100644 --- a/mz_frontend/Makefile.ocs +++ b/mz_frontend/Makefile.ocs @@ -8,7 +8,7 @@ CFLAGS = \ -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AmigaVersion \ -Imenu/include -ISoundSystem \ -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ - -DCLI_BUILD -DINCLUDE_ITEM_DESCRIPTIONS -DAGA5BPP -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR \ + -DCLI_BUILD -DINCLUDE_ITEM_DESCRIPTIONS -DAGA5BPP -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR -DUSE_OWN_MIN_MAX \ -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DUSE_FILLED_POLYS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE diff --git a/mz_frontend/Xcode2/GameView.m b/mz_frontend/Xcode2/GameView.m index 8a39aa8b0..92bc679a0 100644 --- a/mz_frontend/Xcode2/GameView.m +++ b/mz_frontend/Xcode2/GameView.m @@ -88,7 +88,7 @@ void initHW(int argc, char** argv) { updateDirection = 0; mBufferedCommand = '.'; - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } diff --git a/mz_frontend/Xcode2/OSXRenderer.m b/mz_frontend/Xcode2/OSXRenderer.m index 227851c9f..af47b9acf 100644 --- a/mz_frontend/Xcode2/OSXRenderer.m +++ b/mz_frontend/Xcode2/OSXRenderer.m @@ -154,7 +154,7 @@ void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple) { } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { diff --git a/mz_frontend/src/AmigaVersion/AmigaRenderer.c b/mz_frontend/src/AmigaVersion/AmigaRenderer.c index fd09c8bcf..9ba03f481 100644 --- a/mz_frontend/src/AmigaVersion/AmigaRenderer.c +++ b/mz_frontend/src/AmigaVersion/AmigaRenderer.c @@ -15,6 +15,7 @@ #include #include +#include "Common.h" #include "AmigaInt.h" #include "Enums.h" @@ -358,7 +359,7 @@ void realPut(int x, int y, uint8_t value) { } void clearGraphics(void) { - memset(framebuffer, 0, 256 * 160); + memFill(framebuffer, 0, 256 * 160); } void clearScreen(void) { @@ -436,7 +437,7 @@ void graphicsPutPointArray(uint8_t *y128Values) { void initHW(int argc, char **argv) { - framebuffer = (uint8_t *) calloc(1, 256 * 160); + framebuffer = (uint8_t *) allocMem(256 * 160, GENERAL_MEMORY, TRUE); IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0); diff --git a/mz_frontend/src/AtariVersion/AtariRenderer.c b/mz_frontend/src/AtariVersion/AtariRenderer.c index ebe98156e..6cf1d42cb 100644 --- a/mz_frontend/src/AtariVersion/AtariRenderer.c +++ b/mz_frontend/src/AtariVersion/AtariRenderer.c @@ -12,6 +12,7 @@ #include #include +#include "Common.h" #include "AtariInt.h" #include "Enums.h" #include "Core.h" @@ -39,12 +40,12 @@ void framebuffer_set_palette_entry(int index, int red, int green, int blue) { } void initHW(int argc, char** argv) { - framebuffer = (uint8_t *) calloc(1, 256 * 160); + framebuffer = (uint8_t *) allocMem(256 * 160, GENERAL_MEMORY, TRUE); physBase = Physbase(); logBase = Logbase(); - memset(logBase, 0, 32000); - memset(physBase, 0, 32000); + memFill(logBase, 0, 32000); + memFill(physBase, 0, 32000); Setscreen(-1, -1, 0); framebuffer_set_palette_entry(0, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0x00)); @@ -76,7 +77,7 @@ void endFrame(void) { uint16_t *words = (uint16_t *) logBase; for (uint16_t y = 160; y; y--) { - memset(logBase + lineOffset, 0, 80); + memFill(logBase + lineOffset, 0, 80); for (uint16_t x = 0; x < 256; ++x) { uint8_t value = *index++; @@ -239,11 +240,11 @@ void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { } void clearScreen(void) { - memset(framebuffer, 0, 256 * 160); + memFill(framebuffer, 0, 256 * 160); } void clearGraphics(void) { - memset(framebuffer, 0, 256 * 160); + memFill(framebuffer, 0, 256 * 160); } void startFrame(int x, int y, int width, int height) { diff --git a/mz_frontend/src/Engine3D/HackingMinigame.c b/mz_frontend/src/Engine3D/HackingMinigame.c index 1b853d7b4..b77db9bdc 100644 --- a/mz_frontend/src/Engine3D/HackingMinigame.c +++ b/mz_frontend/src/Engine3D/HackingMinigame.c @@ -33,7 +33,7 @@ uint8_t pinTop[3]; void HackingScreen_initStateCallback(void) { cursorPosition = 1; - memset(&pins[0][0], 0xFF, sizeof(pins)); + memFill(&pins[0][0], 0xFF, sizeof(pins)); pins[0][0] = 4; pins[0][1] = 2; diff --git a/mz_frontend/src/MSDOSVersion/msdos.c b/mz_frontend/src/MSDOSVersion/msdos.c index 70d307b78..188c04deb 100644 --- a/mz_frontend/src/MSDOSVersion/msdos.c +++ b/mz_frontend/src/MSDOSVersion/msdos.c @@ -126,7 +126,7 @@ void realPut(int x, int y, uint8_t value) { } void clearGraphics(void) { - memset(imageBuffer, 0, 256 * 160); + memFill(imageBuffer, 0, 256 * 160); } void initHW(int argc, char** argv) { diff --git a/mz_frontend/src/Main.c b/mz_frontend/src/Main.c index 0a1c22de3..47ea47823 100644 --- a/mz_frontend/src/Main.c +++ b/mz_frontend/src/Main.c @@ -24,6 +24,7 @@ typedef unsigned long size_t; #include "Engine.h" #include "Core.h" #include "UI.h" +#include "PackedFileReader.h" int8_t cameraRotation = 0; diff --git a/mz_frontend/src/SDLVersion/sdl2.c b/mz_frontend/src/SDLVersion/sdl2.c index ec796acab..0d08ae739 100644 --- a/mz_frontend/src/SDLVersion/sdl2.c +++ b/mz_frontend/src/SDLVersion/sdl2.c @@ -189,7 +189,7 @@ void realPut(int x, int y, uint8_t value) { } void clearGraphics(void) { - memset(framebuffer, 0, 256 * 160); + memFill(framebuffer, 0, 256 * 160); } void clearScreen(void) {} @@ -230,7 +230,8 @@ void handleSystemEvents(void) { case SDLK_ESCAPE: case SDLK_q: - mBufferedCommand = 'l'; + SDL_Quit(); + exit(0); break; case SDLK_SPACE: @@ -376,7 +377,7 @@ void initHW(int argc, char **argv) { mBufferedCommand = '.'; SDL_Init(SDL_INIT_EVERYTHING); SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); - memset(framebuffer, 0, 256 * 160); + memFill(framebuffer, 0, 256 * 160); window = SDL_CreateWindow("Derelict 16-bits SDL2 test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 512, 320, SDL_WINDOW_SHOWN); From 429b84048b10b36421f0de7587777e96a374a906 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 24 Jun 2024 22:04:35 +0100 Subject: [PATCH 33/48] [MY] Fix ia16 builds --- my_frontend/Makefile.ia16 | 1 - 1 file changed, 1 deletion(-) diff --git a/my_frontend/Makefile.ia16 b/my_frontend/Makefile.ia16 index 08ea0c071..1b3feae24 100644 --- a/my_frontend/Makefile.ia16 +++ b/my_frontend/Makefile.ia16 @@ -19,7 +19,6 @@ CFLAGS = \ -DSUPPORTS_HACKING_MINIGAME \ -DENDIANESS_AWARE \ -DMONOCHROME_VECTORS \ - -DNO_DYNAMIC_MEMORY_ALLOC \ -DUSE_OWN_MIN_MAX CC = ia16-elf-gcc From 7370f90480de2f17f450f8dd9ee577bdd5c0920d Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 25 Jun 2024 20:18:13 +0100 Subject: [PATCH 34/48] Introduce new (final?) logo to the splash screen --- art/Blaec-gw22P.ttf | Bin 0 -> 121220 bytes art/logo.svg | 91 +- common/src/MainMenu.c | 2375 ++++++++++++++++++++++++----------------- 3 files changed, 1409 insertions(+), 1057 deletions(-) create mode 100644 art/Blaec-gw22P.ttf diff --git a/art/Blaec-gw22P.ttf b/art/Blaec-gw22P.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f2222e1c5fb6d55db8fe524e0b7898a78d610562 GIT binary patch literal 121220 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�KEhpc8O>tpZXY(C- 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 jzmix#%d&qw|nnqAe| literal 0 HcmV?d00001 diff --git a/art/logo.svg b/art/logo.svg index 181b4139f..b023d27f2 100644 --- a/art/logo.svg +++ b/art/logo.svg @@ -24,8 +24,8 @@ inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" inkscape:zoom="1.3275875" - inkscape:cx="172.86996" - inkscape:cy="152.53232" + inkscape:cx="242.54522" + inkscape:cy="51.597352" inkscape:window-width="1440" inkscape:window-height="872" inkscape:window-x="0" @@ -38,69 +38,28 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"> - - - - - - - - - - - - - - - - + + + + diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index 26fe712df..2b5583f59 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -48,1379 +48,1772 @@ const enum EGameMenuState MainMenu_nextStateNavigation[kMainMenuOptionsCount] = #ifndef MONOCHROME_VECTORS static const uint8_t logoGraphics[] = { - 3, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 14, - 0, 14, - 0, 14, - 3, +2, 11, +0, 11, +0, 9, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 14, - 0, 14, - 0, 14, - 3, +2, 11, +0, 9, +2, 9, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 0, - 0, 12, - 0, 12, - 3, +2, 7, +0, 7, +0, 3, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 0, - 0, 12, - 0, 12, - 3, +2, 7, +0, 3, +2, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 13, - 0, 14, - 0, 14, - 3, +6, 11, +2, 11, +2, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 13, - 0, 14, - 0, 14, - 3, +6, 11, +2, 0, +6, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 0, - 0, 0, - 0, 12, - 3, +9, 11, +6, 11, +6, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 0, - 0, 12, - 3, 10, - 3, +9, 11, +6, 0, +9, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 11, - 0, 13, - 0, 14, - 3, +9, 3, +6, 3, +6, 5, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 11, - 0, 14, - 3, 14, - 3, +9, 3, +6, 5, +9, 5, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 4, - 10, 1, - 10, 0, - 3, +11, 10, +9, 11, +9, 9, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 4, - 10, 0, - 3, 0, - 3, +11, 10, +9, 9, +11, 9, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 10, - 10, 5, - 10, 5, - 3, +13, 10, +11, 10, +11, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 10, - 10, 5, - 3, 11, - 3, +13, 10, +11, 0, +13, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 14, - 10, 13, - 10, 3, - 3, +15, 10, +13, 10, +13, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 14, - 10, 3, - 3, 4, - 3, +15, 10, +13, 0, +15, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 10, 1, - 11, 0, - 11, 0, - 3, +15, 11, +13, 11, +13, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 10, 1, - 11, 0, - 10, 0, - 3, +15, 11, +13, 11, +15, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 10, 13, - 11, 13, - 11, 2, - 3, +17, 10, +15, 10, +15, 3, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 10, 13, - 11, 2, - 10, 3, - 3, +17, 10, +15, 3, +17, 3, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 11, 13, - 13, 13, - 13, 2, - 3, +17, 11, +15, 11, +15, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 11, 13, - 13, 2, - 11, 2, - 3, +17, 11, +15, 11, +17, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 16, 1, - 16, 14, - 16, 14, - 3, +19, 10, +17, 10, +17, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 16, 1, - 16, 14, - 16, 14, - 3, +19, 10, +17, 0, +19, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 9, - 16, 1, - 16, 14, - 3, +19, 11, +17, 11, +17, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 9, - 16, 14, - 21, 14, - 3, +19, 11, +17, 11, +19, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 14, - 28, 14, - 28, 0, - 3, +21, 10, +19, 10, +19, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 14, - 28, 0, - 21, 9, - 3, +21, 10, +19, 0, +21, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 28, 14, - 28, 14, - 28, 14, - 3, +21, 9, +19, 11, +19, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 28, 14, - 28, 14, - 28, 0, - 3, +21, 9, +19, 11, +21, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 66, 37, - 65, 50, - 65, 50, - 3, +23, 9, +21, 10, +21, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 66, 37, - 65, 50, - 66, 50, - 3, +23, 9, +21, 11, +23, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 71, 45, - 66, 37, - 66, 50, - 3, +29, 9, +23, 9, +23, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 71, 45, - 66, 50, - 71, 50, - 3, +29, 9, +23, 11, +29, 11, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 71, 50, - 77, 50, - 77, 36, - 3, +29, 11, +23, 11, +23, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 71, 50, - 77, 36, - 71, 45, - 3, +29, 11, +23, 0, +29, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 77, 50, - 78, 50, - 78, 50, - 3, +31, 9, +29, 9, +29, 0, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 77, 50, - 78, 50, - 77, 36, - 3, +31, 9, +29, 0, +31, 3, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 31, 2, - 31, 13, - 31, 13, - 3, +31, 4, +29, 6, +29, 6, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 31, 2, - 31, 13, - 31, 13, - 3, +31, 4, +29, 6, +31, 8, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 33, 3, - 31, 2, - 31, 13, - 3, +3, 29, +0, 29, +0, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 33, 3, - 31, 13, - 33, 12, - 3, +3, 29, +0, 19, +3, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 37, 4, - 33, 3, - 33, 12, - 3, +4, 29, +3, 29, +3, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 37, 4, - 33, 12, - 37, 9, - 3, +4, 29, +3, 19, +4, 20, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 37, 9, - 33, 6, - 33, 6, - 3, +5, 27, +4, 27, +4, 20, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 37, 9, - 33, 6, - 37, 4, - 3, +5, 27, +4, 20, +5, 21, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 37, 9, - 37, 9, - 37, 9, - 3, +6, 27, +5, 27, +5, 21, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 37, 9, - 37, 9, - 37, 9, - 3, +6, 27, +5, 21, +6, 20, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 30, - 1, 17, - 1, 30, - 3, +7, 29, +6, 29, +6, 20, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 30, - 1, 30, - 0, 30, - 3, +7, 29, +6, 20, +7, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 1, 17, - 3, 20, - 3, 29, - 3, +11, 29, +7, 29, +7, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 1, 17, - 3, 29, - 1, 30, - 3, +11, 29, +7, 19, +11, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 20, - 6, 23, - 6, 29, - 3, +13, 29, +11, 29, +11, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 20, - 6, 29, - 3, 26, - 3, +13, 29, +11, 29, +13, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 6, 23, - 6, 24, - 6, 28, - 3, +15, 29, +13, 29, +13, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 6, 23, - 6, 28, - 6, 29, - 3, +15, 29, +13, 29, +15, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 6, 24, - 9, 22, - 9, 25, - 3, +15, 29, +13, 29, +13, 21, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 6, 24, - 9, 25, - 6, 28, - 3, +15, 29, +13, 21, +15, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 9, 22, - 13, 18, - 13, 30, - 3, +17, 28, +15, 29, +15, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 9, 22, - 13, 30, - 9, 30, - 3, +17, 28, +15, 29, +17, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 13, 18, - 13, 31, - 13, 31, - 3, +17, 29, +15, 29, +15, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 13, 18, - 13, 31, - 13, 30, - 3, +17, 29, +15, 19, +17, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 80, 50, - 81, 37, - 81, 49, - 3, +19, 28, +17, 28, +17, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 80, 50, - 81, 49, - 80, 50, - 3, +19, 28, +17, 19, +19, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 81, 37, - 83, 40, - 83, 49, - 3, +19, 27, +17, 27, +17, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 81, 37, - 83, 49, - 81, 49, - 3, +19, 27, +17, 27, +19, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 83, 40, - 86, 43, - 86, 48, - 3, +21, 28, +19, 28, +19, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 83, 40, - 86, 48, - 83, 45, - 3, +21, 28, +19, 19, +21, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 86, 43, - 87, 44, - 87, 48, - 3, +21, 29, +19, 29, +19, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 86, 43, - 87, 48, - 86, 48, - 3, +21, 29, +19, 27, +21, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 87, 44, - 89, 41, - 89, 45, - 3, +23, 28, +21, 28, +21, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 87, 44, - 89, 45, - 87, 48, - 3, +23, 28, +21, 19, +23, 21, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 89, 41, - 93, 38, - 93, 50, - 3, +23, 29, +21, 29, +21, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 89, 41, - 93, 50, - 89, 50, - 3, +23, 29, +21, 28, +23, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 93, 38, - 93, 50, - 93, 50, - 3, +25, 28, +23, 28, +23, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 93, 38, - 93, 50, - 93, 50, - 3, +25, 28, +23, 28, +25, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 8, 47, - 9, 35, - 9, 47, - 3, +29, 28, +25, 28, +25, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 8, 47, - 9, 47, - 8, 47, - 3, +29, 28, +25, 28, +29, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 9, 35, - 12, 38, - 12, 47, - 3, +29, 29, +25, 29, +25, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 9, 35, - 12, 47, - 9, 47, - 3, +29, 29, +25, 19, +29, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 12, 38, - 14, 41, - 14, 46, - 3, +31, 28, +29, 28, +29, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 12, 38, - 14, 46, - 12, 43, - 3, +31, 28, +29, 19, +31, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 14, 41, - 15, 42, - 15, 45, - 3, +31, 27, +29, 27, +29, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 14, 41, - 15, 45, - 14, 46, - 3, +31, 27, +29, 27, +31, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 15, 42, - 18, 39, - 18, 43, - 3, +33, 28, +31, 28, +31, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 15, 42, - 18, 43, - 15, 45, - 3, +33, 28, +31, 19, +33, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 18, 39, - 21, 35, - 21, 48, - 3, +33, 29, +31, 29, +31, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 18, 39, - 21, 48, - 18, 47, - 3, +33, 29, +31, 27, +33, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 35, - 22, 48, - 22, 48, - 3, +35, 27, +33, 28, +33, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 35, - 22, 48, - 21, 48, - 3, +35, 27, +33, 19, +35, 21, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 16, 30, - 16, 19, - 16, 19, - 3, +35, 23, +33, 25, +33, 25, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 16, 30, - 16, 19, - 16, 19, - 3, +35, 23, +33, 25, +35, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 27, - 16, 30, - 16, 19, - 3, +35, 29, +33, 29, +33, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 27, - 16, 19, - 21, 19, - 3, +35, 29, +33, 27, +35, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 19, - 27, 19, - 27, 32, - 3, +37, 27, +35, 27, +35, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 21, 19, - 27, 32, - 21, 27, - 3, +37, 27, +35, 28, +37, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 32, 31, - 31, 17, - 31, 17, - 3, +44, 27, +37, 27, +37, 28, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 32, 31, - 31, 17, - 32, 18, - 3, +44, 27, +37, 28, +44, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 36, 31, - 32, 31, - 32, 18, - 3, +44, 29, +37, 29, +37, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 36, 31, - 32, 18, - 36, 20, - 3, +44, 29, +37, 19, +44, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 41, 32, - 36, 31, - 36, 20, - 3, +46, 27, +44, 27, +44, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 41, 32, - 36, 20, - 41, 22, - 3, +46, 27, +44, 29, +46, 29, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 41, 23, - 36, 24, - 36, 24, - 3, +46, 29, +44, 29, +44, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 41, 23, - 36, 24, - 41, 32, - 3, +46, 29, +44, 19, +46, 19, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 41, 22, - 42, 22, - 42, 22, - 3, +46, 21, +44, 21, +44, 23, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 41, 22, - 42, 22, - 41, 23, - 3, +46, 21, +44, 23, +46, 23, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 46, 48, - 45, 34, - 45, 34, - 3, +46, 25, +44, 25, +44, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 46, 48, - 45, 34, - 46, 35, - 3, +46, 25, +44, 27, +46, 27, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 50, 48, - 46, 48, - 46, 35, - 3, +4, 47, +0, 47, +0, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 50, 48, - 46, 35, - 50, 37, - 3, +4, 47, +0, 37, +4, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 55, 49, - 50, 48, - 50, 37, - 3, +6, 47, +4, 47, +4, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 55, 49, - 50, 37, - 55, 39, - 3, +6, 47, +4, 37, +6, 39, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 55, 40, - 50, 42, - 50, 42, - 3, +10, 47, +6, 47, +6, 39, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 55, 40, - 50, 42, - 55, 49, - 3, +10, 47, +6, 39, +10, 43, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 55, 39, - 57, 39, - 57, 39, - 3, +10, 47, +6, 47, +6, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 55, 39, - 57, 39, - 55, 40, - 3, +10, 47, +6, 37, +10, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 44, 32, - 43, 17, - 43, 17, - 3, +11, 47, +10, 47, +10, 43, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 44, 32, - 43, 17, - 44, 17, - 3, +11, 47, +10, 43, +11, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 48, 32, - 44, 32, - 44, 17, - 3, +11, 47, +10, 47, +10, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 48, 32, - 44, 17, - 48, 17, - 3, +11, 47, +10, 37, +11, 38, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 48, 26, - 49, 27, - 49, 32, - 3, +12, 47, +11, 47, +11, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 48, 26, - 49, 32, - 48, 32, - 3, +12, 47, +11, 45, +12, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 48, 17, - 49, 17, - 49, 26, - 3, +12, 45, +11, 45, +11, 38, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 48, 17, - 49, 26, - 48, 26, - 3, +12, 45, +11, 38, +12, 39, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 49, 27, - 51, 32, - 51, 32, - 3, +13, 47, +12, 47, +12, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 49, 27, - 51, 32, - 49, 32, - 3, +13, 47, +12, 46, +13, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 49, 17, - 51, 18, - 51, 20, - 3, +13, 45, +12, 45, +12, 39, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 49, 17, - 51, 20, - 49, 22, - 3, +13, 45, +12, 39, +13, 38, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 49, 22, - 51, 24, - 51, 25, - 3, +14, 47, +13, 47, +13, 38, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 49, 22, - 51, 25, - 49, 26, - 3, +14, 47, +13, 38, +14, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 51, 18, - 52, 18, - 52, 19, - 3, +17, 47, +14, 47, +14, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 51, 18, - 52, 19, - 51, 20, - 3, +17, 47, +14, 37, +17, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 51, 24, - 52, 24, - 52, 24, - 3, +19, 47, +17, 47, +17, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 51, 24, - 52, 24, - 51, 25, - 3, +19, 47, +17, 47, +19, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 52, 18, - 54, 18, - 54, 18, - 3, +23, 47, +19, 47, +19, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 52, 18, - 54, 18, - 52, 19, - 3, +23, 47, +19, 47, +23, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 34, 50, - 34, 35, - 34, 35, - 3, +23, 47, +19, 47, +19, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 34, 50, - 34, 35, - 34, 35, - 3, +23, 47, +19, 37, +23, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 50, - 34, 50, - 34, 35, - 3, +25, 47, +23, 47, +23, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 50, - 34, 35, - 39, 35, - 3, +25, 47, +23, 37, +25, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 44, - 39, 45, - 39, 50, - 3, +25, 45, +23, 45, +23, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 44, - 39, 50, - 39, 50, - 3, +25, 45, +23, 45, +25, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 35, - 39, 35, - 39, 44, - 3, +27, 47, +25, 47, +25, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 35, - 39, 44, - 39, 44, - 3, +27, 47, +25, 37, +27, 39, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 45, - 42, 50, - 42, 50, - 3, +27, 43, +25, 45, +25, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 45, - 42, 50, - 39, 50, - 3, +27, 43, +25, 45, +27, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 35, - 42, 35, - 42, 37, - 3, +29, 47, +27, 47, +27, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 35, - 42, 37, - 39, 40, - 3, +29, 47, +27, 46, +29, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 40, - 42, 42, - 42, 43, - 3, +35, 47, +29, 47, +29, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 39, 40, - 42, 43, - 39, 44, - 3, +35, 47, +29, 46, +35, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 42, 35, - 43, 35, - 43, 37, - 3, +35, 47, +29, 47, +29, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 42, 35, - 43, 37, - 42, 37, - 3, +35, 47, +29, 37, +35, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 42, 42, - 43, 42, - 43, 42, - 3, +37, 47, +35, 47, +35, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 42, 42, - 43, 42, - 42, 43, - 3, +37, 47, +35, 47, +37, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 43, 35, - 45, 35, - 45, 35, - 3, +37, 47, +35, 47, +35, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 43, 35, - 45, 35, - 43, 37, - 3, +37, 47, +35, 37, +37, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 35, - 0, 46, - 0, 46, - 3, +37, 39, +35, 39, +35, 41, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 3, 35, - 0, 46, - 3, 35, - 3, +37, 39, +35, 41, +37, 41, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 4, 47, - 1, 46, - 1, 46, - 3, +37, 43, +35, 43, +35, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 4, 47, - 1, 46, - 4, 34, - 3, +37, 43, +35, 45, +37, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 8, 47, - 4, 47, - 4, 34, - 3, +40, 47, +37, 47, +37, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 8, 47, - 4, 34, - 8, 47, - 3, +40, 47, +37, 45, +40, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 60, 50, - 57, 49, - 57, 49, - 3, +44, 47, +40, 47, +40, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 60, 50, - 57, 49, - 60, 37, - 3, +44, 47, +40, 46, +44, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 64, 50, - 60, 50, - 60, 37, - 3, +44, 47, +40, 47, +40, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 64, 50, - 60, 37, - 64, 50, - 3, +44, 47, +40, 37, +44, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 25, 46, - 24, 35, - 24, 35, - 3, +46, 47, +44, 47, +44, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 25, 46, - 24, 35, - 25, 35, - 3, +46, 47, +44, 37, +46, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 27, 42, - 25, 46, - 25, 35, - 3, +46, 45, +44, 45, +44, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 27, 42, - 25, 35, - 27, 36, - 3, +46, 45, +44, 45, +46, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 27, 36, - 33, 40, - 33, 40, - 3, +48, 47, +46, 47, +46, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 27, 36, - 33, 40, - 27, 42, - 0}; - - - -#else -static const uint8_t logoGraphics[] = { - 8, +48, 47, +46, 37, +48, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 11, 0, - 0, 0, - 0, 12, - 10, 5, - 0, 14, - 13, 13, - 13, 2, - 3, 4, - 5, +48, 47, +46, 47, +46, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 16, 1, - 16, 14, - 28, 14, - 28, 0, - 21, 9, - 5, +48, 47, +46, 45, +48, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 66, 37, - 65, 50, - 78, 50, - 77, 36, - 71, 45, - 5, +50, 47, +48, 47, +48, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 31, 2, - 31, 13, - 37, 9, - 33, 6, - 37, 4, - 10, +50, 47, +48, 37, +50, 39, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 1, 17, - 6, 24, - 13, 18, - 13, 31, - 9, 30, - 9, 25, - 6, 29, - 3, 26, - 3, 29, - 0, 30, - 10, +50, 41, +48, 43, +48, 43, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 81, 37, - 87, 44, - 93, 38, - 93, 50, - 89, 50, - 89, 45, - 86, 48, - 83, 45, - 83, 49, - 80, 50, - 10, +50, 41, +48, 43, +50, 45, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 9, 35, - 15, 42, - 21, 35, - 22, 48, - 18, 47, - 18, 43, - 14, 46, - 12, 43, - 12, 47, - 8, 47, - 5, +50, 47, +48, 47, +48, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 16, 30, - 16, 19, - 27, 19, - 27, 32, - 21, 27, - 5, +50, 47, +48, 46, +50, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 32, 31, - 31, 17, - 42, 22, - 36, 24, - 41, 32, - 5, +52, 47, +50, 47, +50, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 46, 48, - 45, 34, - 57, 39, - 50, 42, - 55, 49, - 7, +52, 47, +50, 46, +52, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 51, 32, - 44, 32, - 43, 17, - 54, 18, - 49, 22, - 52, 24, - 48, 26, - 7, +56, 47, +52, 47, +52, 46, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 42, 50, - 34, 50, - 34, 35, - 45, 35, - 39, 40, - 43, 42, - 39, 44, - 2, +56, 47, +52, 46, +56, 47, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 0, 46, - 3, 35, - 3, +56, 47, +52, 47, +52, 37, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +128, 128, 0, #endif - 1, 46, - 4, 34, - 8, 47, - 3, +56, 47, +52, 37, +56, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +58, 47, +56, 47, +56, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +58, 47, +56, 37, +58, 45, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +60, 47, +58, 47, +58, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +60, 47, +58, 37, +60, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +62, 47, +60, 47, +60, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +62, 47, +60, 37, +62, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +62, 47, +60, 47, +60, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +62, 47, +60, 47, +62, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +64, 47, +62, 47, +62, 39, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +64, 47, +62, 39, +64, 39, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +64, 47, +62, 47, +62, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +64, 47, +62, 47, +64, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +66, 47, +64, 47, +64, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +66, 47, +64, 37, +66, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +66, 47, +64, 47, +64, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +66, 47, +64, 47, +66, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +68, 47, +66, 47, +66, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +68, 47, +66, 37, +68, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +68, 45, +66, 47, +66, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +68, 45, +66, 47, +68, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +71, 47, +68, 47, +68, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +71, 47, +68, 47, +71, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +74, 47, +71, 47, +71, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +74, 47, +71, 47, +74, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +74, 47, +71, 47, +71, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +74, 47, +71, 37, +74, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +75, 47, +74, 47, +74, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +75, 47, +74, 47, +75, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +75, 47, +74, 47, +74, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +75, 47, +74, 37, +75, 38, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +76, 47, +75, 47, +75, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +76, 47, +75, 47, +76, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +76, 45, +75, 45, +75, 38, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +76, 45, +75, 38, +76, 39, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +77, 47, +76, 47, +76, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +77, 47, +76, 47, +77, 47, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +77, 45, +76, 45, +76, 39, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +77, 45, +76, 39, +77, 38, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +78, 47, +77, 47, +77, 38, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +78, 47, +77, 38, +78, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +81, 47, +78, 47, +78, 37, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +81, 47, +78, 37, +81, 37, +0}; + +#else +static const uint8_t logoGraphics[] = { + 33, +#ifndef MONOCHROME_VECTORS + 128, 128, 0, +#endif + 6, 11, + 0, 11, + 0, 9, + 2, 9, + 2, 7, + 0, 7, + 0, 3, + 2, 0, + 9, 0, + 9, 3, + 6, 3, + 6, 5, + 9, 5, + 9, 9, + 11, 9, + 11, 0, + 15, 0, + 15, 3, + 17, 3, + 17, 0, + 21, 0, + 21, 9, + 19, 11, + 13, 11, + 29, 11, + 23, 11, + 23, 0, + 29, 0, + 31, 3, + 31, 4, + 29, 6, + 31, 8, + 31, 9, + 45, #ifndef MONOCHROME_VECTORS 128, 128, 0, #endif - 57, 49, - 60, 37, - 64, 50, - 4, + 6, 29, + 6, 27, + 4, 27, + 4, 29, + 0, 29, + 0, 19, + 3, 19, + 5, 21, + 7, 19, + 11, 19, + 11, 29, + 17, 29, + 13, 29, + 13, 21, + 15, 19, + 21, 19, + 23, 21, + 23, 29, + 19, 29, + 19, 27, + 17, 27, + 29, 29, + 25, 29, + 25, 19, + 33, 19, + 35, 21, + 35, 23, + 33, 25, + 35, 27, + 35, 29, + 31, 29, + 31, 27, + 29, 27, + 46, 29, + 37, 29, + 37, 19, + 46, 19, + 46, 21, + 44, 21, + 44, 23, + 46, 23, + 46, 25, + 44, 25, + 44, 27, + 46, 27, + 72, #ifndef MONOCHROME_VECTORS 128, 128, 0, #endif - 25, 46, - 24, 35, - 33, 40, - 27, 42, + 4, 47, + 0, 47, + 0, 37, + 4, 37, + 13, 47, + 13, 45, + 11, 45, + 11, 47, + 6, 47, + 6, 37, + 10, 37, + 12, 39, + 14, 37, + 17, 37, + 17, 47, + 23, 47, + 19, 47, + 19, 37, + 25, 37, + 27, 39, + 27, 43, + 25, 45, + 23, 45, + 37, 47, + 29, 47, + 29, 37, + 37, 37, + 37, 39, + 35, 39, + 35, 41, + 37, 41, + 37, 43, + 35, 43, + 35, 45, + 37, 45, + 44, 47, + 40, 47, + 40, 37, + 48, 37, + 50, 39, + 50, 41, + 48, 43, + 50, 45, + 50, 47, + 46, 47, + 46, 45, + 44, 45, + 56, 47, + 52, 47, + 52, 37, + 56, 37, + 58, 45, + 58, 37, + 62, 37, + 62, 39, + 64, 39, + 64, 37, + 68, 37, + 68, 45, + 66, 47, + 60, 47, + 77, 47, + 77, 45, + 75, 45, + 75, 47, + 71, 47, + 71, 37, + 74, 37, + 76, 39, + 78, 37, + 81, 37, + 81, 47, 0}; - #endif From 05ffdd766ad1aae9a507263ff3c421f6e1406bfe Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 25 Jun 2024 20:18:41 +0100 Subject: [PATCH 35/48] fix main menu background colour --- common/src/MainMenu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index 2b5583f59..7a362e36e 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -3859,7 +3859,7 @@ void MainMenu_repaintCallback(void) { if (firstFrameOnCurrentState) { clearScreen(); #ifndef MONOCHROME_VECTORS - fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); + fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF73ADA6), 0); #endif drawGraphic(0, 0, YRES_FRAMEBUFFER, YRES_FRAMEBUFFER, splashGraphics); drawGraphic((XRES_FRAMEBUFFER / 2) + 8, 8, (XRES_FRAMEBUFFER / 2) - 16, (XRES_FRAMEBUFFER / 2) - 16, logoGraphics); From 4b8714ad7b22579101f17d5a8b05b5b86dbdbb3a Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Tue, 25 Jun 2024 22:41:26 +0100 Subject: [PATCH 36/48] feat: some simplification to the splash art --- common/src/MainMenu.c | 2714 +++++++++++---------------- tools/svg-triangulator/newtitle.svg | 217 +-- 2 files changed, 1214 insertions(+), 1717 deletions(-) diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index 7a362e36e..02ce80afd 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -1820,2035 +1820,1565 @@ static const uint8_t logoGraphics[] = { static const uint8_t splashGraphics[] = { #ifdef MONOCHROME_VECTORS - 5, -#ifndef MONOCHROME_VECTORS -68, 85, 0, -#endif -40, 50, -41, 60, -70, 59, -69, 52, -40, 50, -5, -#ifndef MONOCHROME_VECTORS -80, 68, 22, -#endif -54, 33, -54, 51, -66, 55, -72, 31, -54, 33, -6, -#ifndef MONOCHROME_VECTORS -136, 170, 0, -#endif -54, 57, -81, 58, -81, 124, -32, 123, -42, 57, -42, 57, -4, -#ifndef MONOCHROME_VECTORS -68, 120, 33, -#endif -42, 57, -39, 75, -71, 58, -42, 57, -7, -#ifndef MONOCHROME_VECTORS -85, 34, 0, -#endif -45, 53, -61, 53, -59, 47, -59, 36, -43, 32, -42, 54, -45, 53, -7, -#ifndef MONOCHROME_VECTORS -183, 200, 183, -#endif -46, 35, -63, 37, -81, 38, -87, 35, -87, 21, -49, 18, -46, 35, -5, -#ifndef MONOCHROME_VECTORS -108, 103, 83, -#endif -49, 18, -46, 35, -72, 38, -73, 22, -49, 18, -6, -#ifndef MONOCHROME_VECTORS -138, 145, 111, -#endif -48, 18, -73, 22, -87, 21, -87, 1, -77, 1, -52, 15, -7, -#ifndef MONOCHROME_VECTORS -196, 200, 183, -#endif -27, 98, -27, 108, -25, 106, -1, 108, -1, 1, -68, 1, -43, 15, -6, -#ifndef MONOCHROME_VECTORS -108, 103, 83, -#endif -60, 57, -63, 37, -81, 36, -81, 59, -63, 60, -60, 57, -5, -#ifndef MONOCHROME_VECTORS -145, 124, 111, -#endif -26, 108, -36, 125, -43, 123, -27, 98, -25, 105, -5, -#ifndef MONOCHROME_VECTORS -188, 211, 95, -#endif -27, 98, -43, 98, -56, 124, -42, 123, -27, 98, -4, -#ifndef MONOCHROME_VECTORS -205, 222, 135, -#endif -25, 106, -36, 125, -1, 125, -1, 108, -5, -#ifndef MONOCHROME_VECTORS -85, 68, 0, -#endif -46, 47, -59, 47, -61, 53, -45, 53, -46, 47, -4, -#ifndef MONOCHROME_VECTORS -147, 172, 147, -#endif -59, 39, -87, 41, -87, 36, -59, 39, -8, -#ifndef MONOCHROME_VECTORS -170, 212, 0, -#endif -59, 94, -56, 90, -56, 90, -40, 104, -40, 104, -40, 104, -59, 94, -59, 94, -7, -#ifndef MONOCHROME_VECTORS -0, 0, 111017082, -#endif -27, 98, -36, 98, -49, 18, -77, 1, -68, 1, -43, 15, -27, 98, -5, -#ifndef MONOCHROME_VECTORS -0, 0, 111017082, -#endif -1, 1, -1, 7, -1, 21, -43, 17, -68, 1, -3, -#ifndef MONOCHROME_VECTORS -0, 0, 111017082, -#endif -43, 17, -45, 1, -68, 1, -4, -#ifndef MONOCHROME_VECTORS -0, 0, 111017082, -#endif -49, 18, -43, 17, -68, 1, -78, 1, -4, -#ifndef MONOCHROME_VECTORS -108, 93, 83, -#endif -43, 17, -1, 9, -1, 1, -46, 1, -6, -#ifndef MONOCHROME_VECTORS -85, 0, 0, -#endif -46, 91, -34, 108, -29, 125, -87, 125, -87, 86, -60, 84, -5, -#ifndef MONOCHROME_VECTORS -43, 0, 0, -#endif -50, 103, -74, 107, -87, 107, -87, 125, -46, 125, -7, -#ifndef MONOCHROME_VECTORS -170, 0, 0, -#endif -71, 33, -55, 36, -51, 57, -51, 86, -62, 98, -87, 92, -87, 32, -6, -#ifndef MONOCHROME_VECTORS -180, 0, 0, -#endif -56, 37, -69, 40, -87, 38, -87, 33, -71, 33, -56, 37, -5, -#ifndef MONOCHROME_VECTORS -190, 0, 0, -#endif -52, 56, -59, 67, -60, 47, -56, 37, -52, 56, -5, -#ifndef MONOCHROME_VECTORS -150, 0, 0, -#endif -74, 69, -78, 49, -87, 41, -86, 64, -74, 69, -4, -#ifndef MONOCHROME_VECTORS -170, 0, 0, -#endif -57, 93, -54, 89, -46, 92, -38, 104, -5, -#ifndef MONOCHROME_VECTORS -0, 0, 0, -#endif -54, 106, -54, 106, -52, 125, -52, 125, -87, 125, -5, -#ifndef MONOCHROME_VECTORS -128, 128, 0, -#endif -60, 125, -60, 125, -84, 125, -84, 125, -61, 125, -4, -#ifndef MONOCHROME_VECTORS -0, 0, 255, -#endif -64, 125, -64, 125, -70, 125, -70, 125, -3, -#ifndef MONOCHROME_VECTORS -0, 0, 111017082, -#endif -62, 95, -58, 67, -53, 84, -3, -#ifndef MONOCHROME_VECTORS -0, 0, 111017082, -#endif -53, 84, -58, 67, -53, 59, -3, -#ifndef MONOCHROME_VECTORS -43, 0, 0, -#endif -49, 99, -87, 101, -87, 98, -3, -#ifndef MONOCHROME_VECTORS -92, 92, 0, -#endif -62, 95, -74, 69, -86, 88, -3, -#ifndef MONOCHROME_VECTORS -100, 100, 0, -#endif -58, 67, -62, 96, -74, 69, -3, -#ifndef MONOCHROME_VECTORS -85, 68, 0, -#endif -74, 69, -85, 61, -85, 88, -0}; - - -#else - 3, -#ifndef MONOCHROME_VECTORS - 68, 85, 0, -#endif - 40, 50, - 41, 60, - 41, 51, - 3, -#ifndef MONOCHROME_VECTORS - 68, 85, 0, -#endif - 40, 50, - 41, 51, - 40, 50, - 3, -#ifndef MONOCHROME_VECTORS - 68, 85, 0, -#endif - 41, 60, - 69, 59, - 69, 52, - 3, -#ifndef MONOCHROME_VECTORS - 68, 85, 0, -#endif - 41, 60, - 69, 52, - 41, 51, - 3, -#ifndef MONOCHROME_VECTORS - 68, 85, 0, -#endif - 69, 59, - 70, 59, - 70, 59, - 3, -#ifndef MONOCHROME_VECTORS - 68, 85, 0, -#endif - 69, 59, - 70, 59, - 69, 52, - 3, -#ifndef MONOCHROME_VECTORS - 80, 68, 22, -#endif - 54, 51, - 66, 55, - 66, 32, - 3, -#ifndef MONOCHROME_VECTORS - 80, 68, 22, -#endif - 54, 51, - 66, 32, - 54, 33, - 3, -#ifndef MONOCHROME_VECTORS - 80, 68, 22, -#endif - 66, 55, - 72, 31, - 72, 31, - 3, -#ifndef MONOCHROME_VECTORS - 80, 68, 22, -#endif - 66, 55, - 72, 31, - 66, 32, - 3, + 4, #ifndef MONOCHROME_VECTORS 136, 170, 0, #endif - 42, 124, - 32, 123, - 32, 123, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 42, 124, - 32, 123, - 42, 57, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 42, 124, - 42, 124, - 42, 57, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 42, 124, - 42, 57, - 42, 57, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 42, 57, - 54, 57, - 54, 124, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 42, 57, - 54, 124, - 42, 124, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 54, 57, - 81, 58, - 81, 124, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 54, 57, - 81, 124, - 54, 124, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 81, 58, - 81, 124, - 81, 124, - 3, -#ifndef MONOCHROME_VECTORS - 136, 170, 0, -#endif - 81, 58, - 81, 124, - 81, 124, - 3, -#ifndef MONOCHROME_VECTORS - 68, 120, 33, -#endif - 42, 57, - 39, 75, - 39, 75, - 3, -#ifndef MONOCHROME_VECTORS - 68, 120, 33, -#endif - 42, 57, - 39, 75, - 42, 73, - 3, -#ifndef MONOCHROME_VECTORS - 68, 120, 33, -#endif - 42, 73, - 71, 58, - 71, 58, - 3, -#ifndef MONOCHROME_VECTORS - 68, 120, 33, -#endif - 42, 73, - 71, 58, - 42, 57, - 3, -#ifndef MONOCHROME_VECTORS - 85, 34, 0, -#endif - 43, 32, - 42, 54, - 42, 54, - 3, -#ifndef MONOCHROME_VECTORS - 85, 34, 0, -#endif - 43, 32, - 42, 54, - 43, 54, - 3, -#ifndef MONOCHROME_VECTORS - 85, 34, 0, -#endif - 45, 32, - 43, 32, - 43, 54, - 3, -#ifndef MONOCHROME_VECTORS - 85, 34, 0, -#endif - 45, 32, - 43, 54, - 45, 53, - 3, + 51, 77, + 54, 99, + 36, 98, + 38, 80, + 5, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 108, 103, 83, #endif - 45, 53, - 59, 53, - 59, 36, - 3, + 49, 18, + 40, 72, + 52, 74, + 71, 33, + 84, 18, + 5, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 138, 145, 111, #endif - 45, 53, - 59, 36, - 45, 32, - 3, + 49, 18, + 73, 22, + 87, 21, + 87, 1, + 77, 1, + 6, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 196, 200, 183, #endif - 59, 53, - 59, 53, - 59, 48, - 3, + 27, 98, + 26, 106, + 1, 108, + 1, 1, + 68, 1, + 43, 17, + 4, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 145, 124, 111, #endif - 59, 53, - 59, 48, - 59, 47, - 3, + 36, 125, + 43, 123, + 27, 98, + 26, 106, + 5, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 188, 211, 95, #endif - 59, 47, - 59, 36, - 59, 36, - 3, + 27, 98, + 43, 98, + 56, 124, + 42, 123, + 27, 98, + 4, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 205, 222, 135, #endif - 59, 47, - 59, 36, - 59, 36, - 3, + 26, 106, + 36, 125, + 1, 125, + 1, 108, + 7, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 0, 0, 188169338, #endif - 59, 53, - 61, 53, - 61, 53, + 27, 98, + 36, 98, + 49, 18, + 77, 1, + 68, 1, + 43, 15, + 27, 98, 3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, + 0, 0, 188169338, #endif - 59, 53, - 61, 53, - 59, 48, - 3, + 1, 9, + 1, 21, + 43, 17, + 4, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 108, 93, 83, #endif - 46, 35, - 46, 35, - 46, 33, - 3, + 43, 17, + 1, 9, + 1, 1, + 46, 1, + 6, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 85, 0, 0, #endif - 46, 35, - 46, 33, - 46, 35, - 3, + 46, 91, + 34, 108, + 29, 125, + 87, 125, + 87, 86, + 60, 84, + 5, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 43, 0, 0, #endif - 46, 35, - 49, 35, - 49, 18, - 3, + 50, 103, + 74, 107, + 87, 105, + 87, 125, + 46, 125, + 6, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 180, 0, 0, #endif - 46, 35, - 49, 18, - 46, 33, - 3, + 56, 37, + 69, 40, + 87, 38, + 87, 33, + 71, 33, + 56, 37, + 7, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 170, 0, 0, #endif - 49, 35, - 63, 37, - 63, 19, - 3, + 71, 33, + 55, 36, + 51, 57, + 51, 86, + 62, 98, + 87, 92, + 87, 32, + 5, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 190, 0, 0, #endif - 49, 35, - 63, 19, - 49, 18, - 3, + 52, 56, + 59, 67, + 60, 47, + 56, 37, + 52, 56, + 5, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 150, 0, 0, #endif - 63, 37, - 81, 38, - 81, 21, - 3, + 74, 69, + 78, 49, + 87, 41, + 86, 64, + 74, 69, + 6, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 128, 0, 0, #endif - 63, 37, - 81, 21, - 63, 19, - 3, + 52, 93, + 53, 89, + 46, 92, + 38, 104, + 50, 99, + 61, 101, + 4, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 0, 0, 0, #endif - 81, 38, - 87, 35, - 87, 21, - 3, + 54, 106, + 52, 125, + 87, 125, + 58, 124, + 5, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 128, 128, 0, #endif - 81, 38, - 87, 21, - 81, 21, - 3, + 60, 125, + 60, 125, + 84, 125, + 84, 125, + 61, 125, + 4, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 0, 0, 255, #endif - 87, 35, - 87, 35, - 87, 35, + 64, 125, + 64, 125, + 70, 125, + 70, 125, 3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, + 0, 0, 188169338, #endif - 87, 35, - 87, 35, - 87, 21, + 62, 95, + 58, 67, + 53, 84, 3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, + 0, 0, 188169338, #endif - 49, 18, - 46, 35, - 46, 35, + 53, 84, + 58, 67, + 53, 59, 3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, + 92, 92, 0, #endif - 49, 18, - 46, 35, - 49, 35, + 62, 95, + 74, 69, + 86, 88, 3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, + 100, 100, 0, #endif - 49, 35, - 72, 38, - 72, 22, + 58, 67, + 62, 95, + 74, 69, 3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, + 85, 68, 0, #endif - 49, 35, - 72, 22, - 49, 18, - 3, + 74, 69, + 86, 64, + 86, 88, + 4, #ifndef MONOCHROME_VECTORS - 108, 103, 83, + 68, 120, 33, #endif - 72, 38, - 73, 22, - 73, 22, - 3, + 39, 80, + 51, 77, + 51, 73, + 40, 72, + 4, #ifndef MONOCHROME_VECTORS - 108, 103, 83, + 183, 200, 183, #endif - 72, 38, + 70, 33, + 87, 33, + 87, 21, 73, 22, - 72, 22, - 3, + 4, #ifndef MONOCHROME_VECTORS - 138, 145, 111, -#endif - 52, 15, - 48, 18, - 48, 18, - 3, -#ifndef MONOCHROME_VECTORS - 138, 145, 111, + 0, 0, 188169338, #endif - 52, 15, - 48, 18, - 52, 19, + 49, 18, + 43, 17, + 68, 1, + 78, 1, 3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, + 0, 0, 188169338, #endif - 52, 19, - 73, 22, - 73, 4, - 3, + 43, 17, + 45, 1, + 68, 1, + 0}; + + + + +#else +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +136, 170, 0, #endif - 52, 19, - 73, 4, - 52, 15, - 3, +38, 98, +36, 98, +36, 98, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +136, 170, 0, #endif - 73, 22, - 77, 22, - 77, 1, - 3, +38, 98, +36, 98, +38, 80, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +136, 170, 0, #endif - 73, 22, - 77, 1, - 73, 4, - 3, +38, 80, +51, 77, +51, 99, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +136, 170, 0, #endif - 77, 22, - 87, 21, - 87, 1, - 3, +38, 80, +51, 99, +38, 98, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +136, 170, 0, #endif - 77, 22, - 87, 1, - 77, 1, - 3, +51, 77, +54, 99, +54, 99, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +136, 170, 0, #endif - 87, 21, - 87, 1, - 87, 1, - 3, +51, 77, +54, 99, +51, 99, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +108, 103, 83, #endif - 87, 21, - 87, 1, - 87, 1, - 3, +49, 18, +40, 72, +40, 72, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +108, 103, 83, #endif - 1, 108, - 1, 108, - 1, 108, - 3, +49, 18, +40, 72, +49, 74, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +108, 103, 83, #endif - 1, 108, - 1, 108, - 1, 1, - 3, +52, 18, +49, 18, +49, 74, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +108, 103, 83, #endif - 25, 106, - 1, 108, - 1, 1, - 3, +52, 18, +49, 74, +52, 74, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +108, 103, 83, #endif - 25, 106, - 1, 1, - 25, 1, - 3, +71, 18, +52, 18, +52, 74, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +108, 103, 83, #endif - 27, 108, - 25, 106, - 25, 1, - 3, +71, 18, +52, 74, +71, 33, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +108, 103, 83, #endif - 27, 108, - 25, 1, - 27, 1, - 3, +84, 18, +71, 18, +71, 33, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +108, 103, 83, #endif - 27, 98, - 27, 108, - 27, 1, - 3, +84, 18, +71, 33, +84, 18, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +138, 145, 111, #endif - 27, 98, - 27, 1, - 27, 1, - 3, +73, 4, +49, 18, +49, 18, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +138, 145, 111, #endif - 43, 15, - 27, 98, - 27, 1, - 3, +73, 4, +49, 18, +73, 22, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +138, 145, 111, #endif - 43, 15, - 27, 1, - 43, 1, - 3, +77, 1, +73, 4, +73, 22, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +138, 145, 111, #endif - 43, 1, - 68, 1, - 68, 1, - 3, +77, 1, +73, 22, +77, 22, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +138, 145, 111, #endif - 43, 1, - 68, 1, - 43, 15, - 3, +77, 22, +87, 21, +87, 1, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +138, 145, 111, #endif - 60, 57, - 63, 39, - 63, 60, - 3, +77, 22, +87, 1, +77, 1, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +138, 145, 111, #endif - 60, 57, - 63, 60, - 60, 57, - 3, +87, 21, +87, 1, +87, 1, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +138, 145, 111, #endif - 63, 39, - 63, 37, - 63, 60, - 3, +87, 21, +87, 1, +87, 1, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +196, 200, 183, #endif - 63, 39, - 63, 60, - 63, 60, - 3, +1, 108, +1, 108, +1, 108, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +196, 200, 183, #endif - 63, 37, - 81, 36, - 81, 59, - 3, +1, 108, +1, 108, +1, 1, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +196, 200, 183, #endif - 63, 37, - 81, 59, - 63, 60, - 3, +26, 106, +1, 108, +1, 1, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +196, 200, 183, #endif - 81, 36, - 81, 36, - 81, 36, - 3, +26, 106, +1, 1, +26, 1, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +196, 200, 183, #endif - 81, 36, - 81, 36, - 81, 59, - 3, +27, 98, +26, 106, +26, 1, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +196, 200, 183, #endif - 25, 105, - 26, 108, - 26, 99, - 3, +27, 98, +26, 1, +27, 1, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +196, 200, 183, #endif - 25, 105, - 26, 99, - 25, 105, - 3, +43, 17, +27, 98, +27, 1, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +196, 200, 183, #endif - 26, 108, - 27, 109, - 27, 98, - 3, +43, 17, +27, 1, +43, 1, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +196, 200, 183, #endif - 26, 108, - 27, 98, - 26, 99, - 3, +43, 1, +68, 1, +68, 1, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +196, 200, 183, #endif - 27, 109, - 36, 125, - 36, 112, - 3, +43, 1, +68, 1, +43, 17, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +145, 124, 111, #endif - 27, 109, - 36, 112, - 27, 98, - 3, +26, 106, +27, 108, +27, 98, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +145, 124, 111, #endif - 36, 125, - 43, 123, - 43, 123, - 3, +26, 106, +27, 98, +26, 106, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +145, 124, 111, #endif - 36, 125, - 43, 123, - 36, 112, - 3, +27, 108, +36, 125, +36, 112, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +145, 124, 111, #endif - 27, 98, - 42, 98, - 42, 123, - 3, +27, 108, +36, 112, +27, 98, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +145, 124, 111, #endif - 27, 98, - 42, 123, - 27, 98, - 3, +36, 125, +43, 123, +43, 123, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +145, 124, 111, #endif - 42, 98, - 43, 98, - 43, 123, - 3, +36, 125, +43, 123, +36, 112, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +188, 211, 95, #endif - 42, 98, - 43, 123, - 42, 123, - 3, +27, 98, +42, 98, +42, 123, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +188, 211, 95, #endif - 43, 98, - 56, 124, - 56, 124, - 3, +27, 98, +42, 123, +27, 98, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +188, 211, 95, #endif - 43, 98, - 56, 124, - 43, 123, - 3, +42, 98, +43, 98, +43, 123, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +188, 211, 95, #endif - 1, 125, - 1, 125, - 1, 125, - 3, +42, 98, +43, 123, +42, 123, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +188, 211, 95, #endif - 1, 125, - 1, 125, - 1, 108, - 3, +43, 98, +56, 124, +56, 124, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +188, 211, 95, #endif - 1, 108, - 25, 106, - 25, 125, - 3, +43, 98, +56, 124, +43, 123, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +205, 222, 135, #endif - 1, 108, - 25, 125, - 1, 125, - 3, +1, 125, +1, 125, +1, 125, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +205, 222, 135, #endif - 25, 106, - 36, 125, - 36, 125, - 3, +1, 125, +1, 125, +1, 108, +3, +#ifndef MONOCHROME_VECTORS +205, 222, 135, +#endif +1, 108, +26, 106, +26, 125, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +205, 222, 135, #endif - 25, 106, - 36, 125, - 25, 125, - 3, +1, 108, +26, 125, +1, 125, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +205, 222, 135, #endif - 46, 53, - 45, 53, - 45, 53, - 3, +26, 106, +36, 125, +36, 125, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +205, 222, 135, #endif - 46, 53, - 45, 53, - 46, 47, - 3, +26, 106, +36, 125, +26, 125, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +227, 226, 219, #endif - 46, 47, - 59, 47, - 59, 53, - 3, +27, 98, +36, 98, +36, 53, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +227, 226, 219, #endif - 46, 47, - 59, 53, - 46, 53, - 3, +27, 98, +36, 53, +27, 98, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +227, 226, 219, #endif - 59, 47, - 61, 53, - 61, 53, - 3, +36, 98, +43, 55, +43, 15, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +227, 226, 219, #endif - 59, 47, - 61, 53, - 59, 53, - 3, +36, 98, +43, 15, +36, 53, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +227, 226, 219, #endif - 59, 39, - 87, 41, - 87, 36, - 3, +43, 55, +49, 18, +49, 12, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +227, 226, 219, #endif - 59, 39, - 87, 36, - 59, 39, - 3, +43, 55, +49, 12, +43, 15, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +227, 226, 219, #endif - 87, 41, - 87, 41, - 87, 41, - 3, +49, 18, +68, 7, +68, 1, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +227, 226, 219, #endif - 87, 41, - 87, 41, - 87, 36, - 3, +49, 18, +68, 1, +49, 12, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +227, 226, 219, #endif - 56, 90, - 40, 104, - 40, 104, - 3, +68, 7, +77, 1, +77, 1, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +227, 226, 219, #endif - 56, 90, - 40, 104, - 56, 96, - 3, +68, 7, +77, 1, +68, 1, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +145, 138, 111, #endif - 59, 94, - 56, 90, - 56, 96, - 3, +1, 9, +1, 9, +1, 9, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +145, 138, 111, #endif - 59, 94, - 56, 96, - 59, 94, - 3, +1, 9, +1, 9, +1, 21, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +145, 138, 111, #endif - 27, 98, - 36, 98, - 36, 53, - 3, +43, 17, +1, 9, +1, 21, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +145, 138, 111, #endif - 27, 98, - 36, 53, - 27, 98, - 3, +43, 17, +1, 21, +43, 17, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +108, 93, 83, #endif - 36, 98, - 43, 55, - 43, 15, - 3, +1, 9, +1, 9, +1, 9, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +108, 93, 83, #endif - 36, 98, - 43, 15, - 36, 53, - 3, +1, 9, +1, 9, +1, 1, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +108, 93, 83, #endif - 43, 55, - 49, 18, - 49, 12, - 3, +43, 17, +1, 9, +1, 1, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +108, 93, 83, #endif - 43, 55, - 49, 12, - 43, 15, - 3, +43, 17, +1, 1, +43, 1, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +108, 93, 83, #endif - 49, 18, - 68, 7, - 68, 1, - 3, +46, 1, +43, 17, +43, 1, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +108, 93, 83, #endif - 49, 18, - 68, 1, - 49, 12, - 3, +46, 1, +43, 1, +46, 1, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +85, 0, 0, #endif - 68, 7, - 77, 1, - 77, 1, - 3, +34, 108, +29, 125, +29, 125, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +85, 0, 0, #endif - 68, 7, - 77, 1, - 68, 1, - 3, +34, 108, +29, 125, +34, 125, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 1, 1, - 1, 7, - 1, 7, - 3, +46, 91, +34, 108, +34, 125, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 1, 1, - 1, 7, - 1, 11, - 3, +46, 91, +34, 125, +46, 125, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 1, 1, - 1, 1, - 1, 11, - 3, +60, 84, +46, 91, +46, 125, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 1, 1, - 1, 11, - 1, 21, - 3, +60, 84, +46, 125, +60, 125, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 43, 1, - 1, 1, - 1, 21, - 3, +60, 125, +87, 125, +87, 86, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 43, 1, - 1, 21, - 43, 17, - 3, +60, 125, +87, 86, +60, 84, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 68, 1, - 43, 1, - 43, 17, - 3, +87, 125, +87, 125, +87, 125, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +85, 0, 0, #endif - 68, 1, - 43, 17, - 68, 1, - 3, +87, 125, +87, 125, +87, 86, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +43, 0, 0, #endif - 45, 15, - 43, 17, - 43, 17, - 3, +46, 125, +50, 103, +50, 125, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +43, 0, 0, #endif - 45, 15, - 43, 17, - 45, 1, - 3, +46, 125, +50, 125, +46, 125, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +43, 0, 0, #endif - 68, 1, - 45, 15, - 45, 1, - 3, +50, 103, +74, 107, +74, 125, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +43, 0, 0, #endif - 68, 1, - 45, 1, - 68, 1, - 3, +50, 103, +74, 125, +50, 125, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +43, 0, 0, #endif - 49, 18, - 43, 17, - 43, 17, - 3, +74, 107, +87, 105, +87, 125, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +43, 0, 0, #endif - 49, 18, - 43, 17, - 49, 13, - 3, +74, 107, +87, 125, +74, 125, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +43, 0, 0, #endif - 68, 7, - 49, 18, - 49, 13, - 3, +87, 105, +87, 125, +87, 125, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +43, 0, 0, #endif - 68, 7, - 49, 13, - 68, 1, - 3, +87, 105, +87, 125, +87, 125, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +180, 0, 0, #endif - 78, 1, - 68, 7, - 68, 1, - 3, +56, 37, +69, 40, +69, 34, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +180, 0, 0, #endif - 78, 1, - 68, 1, - 78, 1, - 3, +56, 37, +69, 34, +56, 37, +3, #ifndef MONOCHROME_VECTORS - 108, 93, 83, +180, 0, 0, #endif - 1, 9, - 1, 9, - 1, 9, - 3, +69, 40, +71, 40, +71, 33, +3, #ifndef MONOCHROME_VECTORS - 108, 93, 83, +180, 0, 0, #endif - 1, 9, - 1, 9, - 1, 1, - 3, +69, 40, +71, 33, +69, 34, +3, #ifndef MONOCHROME_VECTORS - 108, 93, 83, +180, 0, 0, #endif - 43, 17, - 1, 9, - 1, 1, - 3, +71, 40, +87, 38, +87, 33, +3, #ifndef MONOCHROME_VECTORS - 108, 93, 83, +180, 0, 0, #endif - 43, 17, - 1, 1, - 43, 1, - 3, +71, 40, +87, 33, +71, 33, +3, #ifndef MONOCHROME_VECTORS - 108, 93, 83, +180, 0, 0, #endif - 46, 1, - 43, 17, - 43, 1, - 3, +87, 38, +87, 33, +87, 33, +3, #ifndef MONOCHROME_VECTORS - 108, 93, 83, +180, 0, 0, #endif - 46, 1, - 43, 1, - 46, 1, - 3, +87, 38, +87, 33, +87, 33, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 34, 108, - 29, 125, - 29, 125, - 3, +51, 57, +51, 57, +51, 57, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 34, 108, - 29, 125, - 34, 125, - 3, +51, 57, +51, 57, +51, 86, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 46, 91, - 34, 108, - 34, 125, - 3, +55, 36, +51, 57, +51, 86, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 46, 91, - 34, 125, - 46, 125, - 3, +55, 36, +51, 86, +55, 91, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 60, 84, - 46, 91, - 46, 125, - 3, +62, 35, +55, 36, +55, 91, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 60, 84, - 46, 125, - 60, 125, - 3, +62, 35, +55, 91, +62, 98, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 60, 125, - 87, 125, - 87, 86, - 3, +71, 33, +62, 35, +62, 98, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 60, 125, - 87, 86, - 60, 84, - 3, +71, 33, +62, 98, +71, 96, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 87, 125, - 87, 125, - 87, 125, - 3, +87, 32, +71, 33, +71, 96, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +170, 0, 0, #endif - 87, 125, - 87, 125, - 87, 86, - 3, +87, 32, +71, 96, +87, 92, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +170, 0, 0, #endif - 46, 125, - 50, 103, - 50, 125, - 3, +87, 92, +87, 92, +87, 92, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +170, 0, 0, #endif - 46, 125, - 50, 125, - 46, 125, - 3, +87, 92, +87, 92, +87, 32, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +190, 0, 0, #endif - 50, 103, - 74, 107, - 74, 125, - 3, +52, 56, +56, 63, +56, 37, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +190, 0, 0, #endif - 50, 103, - 74, 125, - 50, 125, - 3, +52, 56, +56, 37, +52, 56, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +190, 0, 0, #endif - 74, 107, - 87, 107, - 87, 125, - 3, +56, 63, +59, 67, +59, 43, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +190, 0, 0, #endif - 74, 107, - 87, 125, - 74, 125, - 3, +56, 63, +59, 43, +56, 37, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +190, 0, 0, #endif - 87, 107, - 87, 125, - 87, 125, - 3, +59, 67, +60, 47, +60, 47, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +190, 0, 0, #endif - 87, 107, - 87, 125, - 87, 125, - 3, +59, 67, +60, 47, +59, 43, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 0, 0, #endif - 51, 57, - 51, 57, - 51, 57, - 3, +74, 69, +78, 49, +78, 68, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 0, 0, #endif - 51, 57, - 51, 57, - 51, 86, - 3, +74, 69, +78, 68, +74, 69, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 0, 0, #endif - 55, 36, - 51, 57, - 51, 86, - 3, +78, 49, +86, 41, +86, 64, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 0, 0, #endif - 55, 36, - 51, 86, - 55, 91, - 3, +78, 49, +86, 64, +78, 68, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 0, 0, #endif - 62, 35, - 55, 36, - 55, 91, - 3, +86, 41, +87, 41, +87, 41, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 0, 0, #endif - 62, 35, - 55, 91, - 62, 98, - 3, +86, 41, +87, 41, +86, 64, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 0, 0, #endif - 71, 33, - 62, 35, - 62, 98, - 3, +46, 92, +38, 104, +38, 104, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 0, 0, #endif - 71, 33, - 62, 98, - 71, 96, - 3, +46, 92, +38, 104, +46, 100, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 0, 0, #endif - 87, 32, - 71, 33, - 71, 96, - 3, +50, 91, +46, 92, +46, 100, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 0, 0, #endif - 87, 32, - 71, 96, - 87, 92, - 3, +50, 91, +46, 100, +50, 99, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 0, 0, #endif - 87, 92, - 87, 92, - 87, 92, - 3, +52, 89, +50, 91, +50, 99, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 0, 0, #endif - 87, 92, - 87, 92, - 87, 32, - 3, +52, 89, +50, 99, +52, 99, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 0, 0, #endif - 56, 37, - 69, 40, - 69, 34, - 3, +53, 93, +52, 93, +52, 93, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 0, 0, #endif - 56, 37, - 69, 34, - 56, 37, - 3, +53, 93, +52, 93, +53, 89, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 0, 0, #endif - 69, 40, - 71, 40, - 71, 33, - 3, +53, 89, +52, 89, +52, 99, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 0, 0, #endif - 69, 40, - 71, 33, - 69, 34, - 3, +53, 89, +52, 99, +53, 99, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 0, 0, #endif - 71, 40, - 87, 38, - 87, 33, - 3, +61, 101, +53, 93, +53, 99, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 0, 0, #endif - 71, 40, - 87, 33, - 71, 33, - 3, +61, 101, +53, 99, +61, 101, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +0, 0, 0, #endif - 87, 38, - 87, 33, - 87, 33, - 3, +54, 106, +52, 125, +52, 125, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +0, 0, 0, #endif - 87, 38, - 87, 33, - 87, 33, - 3, +54, 106, +52, 125, +54, 125, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +0, 0, 0, #endif - 52, 56, - 56, 63, - 56, 37, - 3, +58, 124, +54, 106, +54, 125, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +0, 0, 0, #endif - 52, 56, - 56, 37, - 52, 56, - 3, +58, 124, +54, 125, +58, 125, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +0, 0, 0, #endif - 56, 63, - 59, 67, - 59, 43, - 3, +58, 125, +87, 125, +87, 125, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +0, 0, 0, #endif - 56, 63, - 59, 43, - 56, 37, - 3, +58, 125, +87, 125, +58, 124, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +128, 128, 0, #endif - 59, 67, - 60, 47, - 60, 47, - 3, +61, 125, +60, 125, +60, 125, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +128, 128, 0, #endif - 59, 67, - 60, 47, - 59, 43, - 3, +61, 125, +60, 125, +61, 125, +3, #ifndef MONOCHROME_VECTORS - 150, 0, 0, +128, 128, 0, #endif - 74, 69, - 78, 49, - 78, 68, - 3, +61, 125, +84, 125, +84, 125, +3, #ifndef MONOCHROME_VECTORS - 150, 0, 0, +128, 128, 0, #endif - 74, 69, - 78, 68, - 74, 69, - 3, +61, 125, +84, 125, +61, 125, +3, #ifndef MONOCHROME_VECTORS - 150, 0, 0, +0, 0, 255, #endif - 78, 49, - 86, 41, - 86, 64, - 3, +70, 125, +64, 125, +64, 125, +3, #ifndef MONOCHROME_VECTORS - 150, 0, 0, +0, 0, 255, #endif - 78, 49, - 86, 64, - 78, 68, - 3, +70, 125, +64, 125, +70, 125, +3, #ifndef MONOCHROME_VECTORS - 150, 0, 0, +128, 128, 0, #endif - 86, 41, - 87, 41, - 87, 41, - 3, +53, 84, +58, 90, +58, 67, +3, #ifndef MONOCHROME_VECTORS - 150, 0, 0, +128, 128, 0, #endif - 86, 41, - 87, 41, - 86, 64, - 3, +53, 84, +58, 67, +53, 84, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 38, 104, - 46, 99, - 46, 92, - 3, +58, 90, +62, 95, +62, 95, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 38, 104, - 46, 92, - 38, 104, - 3, +58, 90, +62, 95, +58, 67, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 150, 0, #endif - 46, 99, - 54, 95, - 54, 89, - 3, +53, 59, +53, 84, +53, 59, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 150, 0, #endif - 46, 99, - 54, 89, - 46, 92, - 3, +53, 59, +53, 59, +53, 59, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 150, 0, #endif - 54, 95, - 57, 93, - 57, 93, - 3, +53, 84, +58, 67, +58, 67, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +150, 150, 0, #endif - 54, 95, - 57, 93, - 54, 89, - 3, +53, 84, +58, 67, +53, 59, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +92, 92, 0, #endif - 54, 106, - 52, 125, - 52, 125, - 3, +74, 92, +62, 95, +62, 95, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +92, 92, 0, #endif - 54, 106, - 52, 125, - 54, 125, - 3, +74, 92, +62, 95, +74, 69, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +92, 92, 0, #endif - 87, 125, - 54, 106, - 54, 125, - 3, +86, 88, +74, 92, +74, 69, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +92, 92, 0, #endif - 87, 125, - 54, 125, - 87, 125, - 3, +86, 88, +74, 69, +86, 88, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +100, 100, 0, #endif - 61, 125, - 60, 125, - 60, 125, - 3, +62, 67, +58, 67, +58, 67, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +100, 100, 0, #endif - 61, 125, - 60, 125, - 61, 125, - 3, +62, 67, +58, 67, +62, 95, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +100, 100, 0, #endif - 61, 125, - 84, 125, - 84, 125, - 3, +74, 69, +62, 67, +62, 95, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +100, 100, 0, #endif - 61, 125, - 84, 125, - 61, 125, - 3, +74, 69, +62, 95, +74, 69, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 255, +85, 68, 0, #endif - 70, 125, - 64, 125, - 64, 125, - 3, +86, 88, +74, 69, +74, 69, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 255, +85, 68, 0, #endif - 70, 125, - 64, 125, - 70, 125, - 3, +86, 88, +74, 69, +86, 64, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +85, 68, 0, #endif - 53, 84, - 58, 90, - 58, 67, - 3, +86, 64, +86, 64, +86, 64, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +85, 68, 0, #endif - 53, 84, - 58, 67, - 53, 84, - 3, +86, 64, +86, 64, +86, 88, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +68, 120, 33, #endif - 58, 90, - 62, 95, - 62, 95, - 3, +40, 72, +39, 80, +39, 80, +3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, +68, 120, 33, #endif - 58, 90, - 62, 95, - 58, 67, - 3, +40, 72, +39, 80, +40, 80, +3, #ifndef MONOCHROME_VECTORS - 150, 150, 0, +68, 120, 33, #endif - 53, 59, - 53, 84, - 53, 84, - 3, +40, 80, +51, 77, +51, 73, +3, #ifndef MONOCHROME_VECTORS - 150, 150, 0, +68, 120, 33, #endif - 53, 59, - 53, 84, - 53, 84, - 3, +40, 80, +51, 73, +40, 72, +3, #ifndef MONOCHROME_VECTORS - 150, 150, 0, +68, 120, 33, #endif - 53, 84, - 58, 67, - 58, 67, - 3, +51, 77, +51, 77, +51, 77, +3, #ifndef MONOCHROME_VECTORS - 150, 150, 0, +68, 120, 33, #endif - 53, 84, - 58, 67, - 53, 59, - 3, +51, 77, +51, 77, +51, 73, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +183, 200, 183, #endif - 87, 98, - 49, 99, - 49, 99, - 3, +73, 22, +70, 33, +70, 33, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +183, 200, 183, #endif - 87, 98, - 49, 99, - 87, 101, - 3, +73, 22, +70, 33, +73, 33, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +183, 200, 183, #endif - 87, 101, - 87, 101, - 87, 101, - 3, +73, 33, +87, 33, +87, 21, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +183, 200, 183, #endif - 87, 101, - 87, 101, - 87, 98, - 3, +73, 33, +87, 21, +73, 22, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +183, 200, 183, #endif - 74, 92, - 62, 95, - 62, 95, - 3, +87, 33, +87, 33, +87, 33, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +183, 200, 183, #endif - 74, 92, - 62, 95, - 74, 69, - 3, +87, 33, +87, 33, +87, 21, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +172, 157, 147, #endif - 86, 88, - 74, 92, - 74, 69, - 3, +49, 18, +43, 17, +43, 17, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +172, 157, 147, #endif - 86, 88, - 74, 69, - 86, 88, - 3, +49, 18, +43, 17, +49, 13, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +172, 157, 147, #endif - 62, 67, - 58, 67, - 58, 67, - 3, +68, 7, +49, 18, +49, 13, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +172, 157, 147, #endif - 62, 67, - 58, 67, - 62, 96, - 3, +68, 7, +49, 13, +68, 1, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +172, 157, 147, #endif - 74, 69, - 62, 67, - 62, 96, - 3, +78, 1, +68, 7, +68, 1, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +172, 157, 147, #endif - 74, 69, - 62, 96, - 74, 69, - 3, +78, 1, +68, 1, +78, 1, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +72, 62, 55, #endif - 85, 88, - 74, 69, - 74, 69, - 3, +45, 15, +43, 17, +43, 17, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +72, 62, 55, #endif - 85, 88, - 74, 69, - 85, 61, - 3, +45, 15, +43, 17, +45, 1, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +72, 62, 55, #endif - 85, 88, - 85, 88, - 85, 61, - 3, +68, 1, +45, 15, +45, 1, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +72, 62, 55, #endif - 85, 88, - 85, 61, - 85, 88, - 0}; +68, 1, +45, 1, +68, 1, +0}; + + + + #endif void MainMenu_initStateCallback(enum EGameMenuState tag) { diff --git a/tools/svg-triangulator/newtitle.svg b/tools/svg-triangulator/newtitle.svg index d4b027ae3..e0b6b2370 100644 --- a/tools/svg-triangulator/newtitle.svg +++ b/tools/svg-triangulator/newtitle.svg @@ -26,16 +26,16 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="4.750692" - inkscape:cx="-10.735278" - inkscape:cy="48.834991" + inkscape:zoom="4.0346656" + inkscape:cx="75.347013" + inkscape:cy="57.625594" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" - inkscape:window-width="1840" - inkscape:window-height="999" - inkscape:window-x="82" - inkscape:window-y="688" + inkscape:window-width="1440" + inkscape:window-height="872" + inkscape:window-x="0" + inkscape:window-y="28" inkscape:window-maximized="0" showguides="true" inkscape:guide-bbox="true" @@ -114,124 +114,67 @@ inkscape:groupmode="layer" id="layer1"> - - - - - + sodipodi:nodetypes="cccccc" /> - + sodipodi:nodetypes="cccccc" /> + sodipodi:nodetypes="cccc" /> - - - - - + + + - + id="path3031" + d="M 1.34075 9.69841 L 1.44119 21.1627 L 43.3161 17.2753 Z" + style="opacity:1;fill:#918a6f;stroke:none;stroke-width:0.117774;stroke-opacity:1" /> @@ -242,23 +185,23 @@ inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc" /> - + + sodipodi:nodetypes="ccccccc" /> + sodipodi:nodetypes="ccccc" /> + d="M 62.8037 95.7691 L 58.7016 67.3665 L 53.4743 84.92 Z" + style="opacity:1;fill:#808000;stroke:none;stroke-width:0.485158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - + d="M 53.5138 84.9797 L 58.7259 67.3832 L 53.4918 59.2398 Z" + style="opacity:1;fill:#969600;fill-opacity:1;stroke:none;stroke-width:0.485158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + + + + + From 86e9335b973cb6d680d1f07a656735d2d557211c Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Wed, 26 Jun 2024 23:18:10 +0100 Subject: [PATCH 37/48] [MY] Fix ending processing on Master System --- my_frontend/src/sms.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/my_frontend/src/sms.c b/my_frontend/src/sms.c index d669e7cb2..25afec712 100755 --- a/my_frontend/src/sms.c +++ b/my_frontend/src/sms.c @@ -47,6 +47,8 @@ void handleSystemEvents(void) {} enum ECommand getInput(void) { int key = read_joypad1(); + performAction(); + if (cooldown) { cooldown--; } From 62d68df3847364792ef59faf52485053a416272b Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Wed, 26 Jun 2024 23:32:38 +0100 Subject: [PATCH 38/48] [MY] Fix ending detection on ia16 --- my_frontend/src/msdos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/my_frontend/src/msdos.c b/my_frontend/src/msdos.c index 49246ab1e..e1d9cdbb6 100644 --- a/my_frontend/src/msdos.c +++ b/my_frontend/src/msdos.c @@ -416,6 +416,7 @@ enum ECommand getInput(void) { return kCommandNone; } + performAction(); switch(toReturn) { case 'q': From 7ba87acba2082a2da3a12d73d0b80475d8826c36 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Fri, 28 Jun 2024 23:22:48 +0100 Subject: [PATCH 39/48] [MY] Count lines of text for properly sizing the text popups --- common/include/Common.h | 1 + common/include/Engine.h | 2 -- my_frontend/src/UI.c | 4 +++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/common/include/Common.h b/common/include/Common.h index 272b8dead..97f6eb835 100644 --- a/common/include/Common.h +++ b/common/include/Common.h @@ -61,6 +61,7 @@ uint8_t isBigEndian(void); uint32_t toNativeEndianess(const uint32_t val); #endif +int countLines(const char* text); extern const char *mainText; extern char *textBuffer; diff --git a/common/include/Engine.h b/common/include/Engine.h index c3ee8c52e..b870bbeb8 100644 --- a/common/include/Engine.h +++ b/common/include/Engine.h @@ -63,8 +63,6 @@ enum EGameMenuState HackingScreen_tickCallback(enum ECommand, void* data); void HackingScreen_unloadStateCallback(enum EGameMenuState newState); -int countLines(void); - void enterState(enum EGameMenuState State); int loopTick(enum ECommand cmd); diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 142dcd583..6a36eb2a0 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -9,6 +9,7 @@ #include "Renderer.h" #include "Engine.h" #include "SoundSystem.h" +#include "Common.h" extern uint8_t playerLocation; @@ -66,7 +67,8 @@ void drawTextAtWithMargin(const int x, const int y, int margin, const char *text } void showMessage(const char *message) { - drawTextWindow(1, 16, (XRES_FRAMEBUFFER / 8) - 3, (YRES_FRAMEBUFFER / 8) - 18, "Press 2 to continue", message); + uint8_t lines = countLines(message) + 3; + drawTextWindow( 0, (YRES / 8) + 1, (XRES_FRAMEBUFFER / 8) - 1, lines + 1, "Press 2 to continue", message); waitForKey = 1; } From 64d69b4a6d137749fa64635fe0fcabcc45c7a338 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Fri, 28 Jun 2024 23:23:11 +0100 Subject: [PATCH 40/48] [MY] Add proper ending to the game, along with a simple image --- art/ending.svg | 160 ++++++++++++++++++++++++++++++ common/src/Common.c | 20 ++++ my_frontend/src/UI.c | 127 +++++++++++++++++++++--- tools/svg-triangulator/ending.svg | 115 +++++++++++++++++++++ 4 files changed, 409 insertions(+), 13 deletions(-) create mode 100644 art/ending.svg create mode 100644 tools/svg-triangulator/ending.svg diff --git a/art/ending.svg b/art/ending.svg new file mode 100644 index 000000000..784873f21 --- /dev/null +++ b/art/ending.svg @@ -0,0 +1,160 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/src/Common.c b/common/src/Common.c index edadb8363..27fefebf7 100644 --- a/common/src/Common.c +++ b/common/src/Common.c @@ -112,3 +112,23 @@ uint32_t toNativeEndianess(const uint32_t val) { return val2; } #endif + + +int countLines(const char* text) { + int lines = 1; + int chars = 0; + + while(*text) { + ++chars; + + if ( (chars >= (XRES_FRAMEBUFFER / 8)) || *text == '\n') { + ++lines; + chars = 0; + } + + ++text; + } + + + return lines; +} diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 6a36eb2a0..cf20de1cc 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -25,6 +25,96 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; +static const uint8_t ending[] = { + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 9, 41, + 21, 33, + 18, 66, + 10, 71, + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 10, 71, + 11, 74, + 20, 70, + 18, 66, + 5, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 21, 33, + 18, 66, + 20, 70, + 54, 79, + 54, 49, + 9, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 12, 74, + 20, 70, + 54, 79, + 69, 70, + 97, 81, + 69, 89, + 37, 86, + 45, 82, + 45, 80, + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 53, 49, + 61, 49, + 62, 75, + 54, 79, + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 61, 49, + 62, 74, + 69, 71, + 66, 45, + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 66, 45, + 92, 57, + 97, 81, + 69, 71, + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 37, 79, + 38, 86, + 45, 82, + 45, 80, + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 10, 43, + 18, 38, + 17, 57, + 11, 60, + 4, +#ifndef MONOCHROME_VECTORS + 0, 0, 55929978, +#endif + 22, 37, + 51, 51, + 51, 64, + 21, 56, + 0}; + + uint16_t scale2DVertex( uint16_t offset, uint16_t scale, const uint8_t *shape, uint16_t index) { return offset + ((scale * shape[index]) / 128); } @@ -113,27 +203,38 @@ void drawMap(void) { } void performAction(void) { + const char *msg = NULL; switch (getGameStatus()) { case kBadVictory: - showMessage("Victory! Too bad you didn't survive"); - while (1); + msg = "Victory! Too bad you didn't survive"; + break; + case kBadGameOver: - showMessage("You're dead! And so are the\n" - "other people on the path of\n" - "destruction faulty reactor"); - while (1); + msg = "You're dead! And so are the " + "other people on the path of " + "destruction faulty reactor"; + break; case kGoodVictory: - showMessage("Victory! You managed to destroy the\nship and get out alive"); - while (1); + msg = "Victory! You managed to destroy the ship and get out alive"; + break; case kGoodGameOver: - showMessage("You failed! While you're alive\n" - "you failed to prevent the worst\n" - "scenario and now EVERYBODY is\n" - "dead!)"); - while (1); + msg = "You failed! While you're alive " + "you failed to prevent the worst " + "scenario and now EVERYBODY is " + "dead!)"; + break; + } + + if (msg) { + uint8_t lines = countLines(msg) + 3; + clearScreen(); + drawGraphic(0, 0, YRES_FRAMEBUFFER, YRES_FRAMEBUFFER, ending); + drawTextWindow( 0, (YRES / 8) + 1, (XRES_FRAMEBUFFER / 8) - 1, lines + 1, "", msg); + + while (1); } } diff --git a/tools/svg-triangulator/ending.svg b/tools/svg-triangulator/ending.svg new file mode 100644 index 000000000..4e70196b4 --- /dev/null +++ b/tools/svg-triangulator/ending.svg @@ -0,0 +1,115 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + From 36dc1cd1fe5084a0aeec9bf03616b870c07492cf Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sat, 29 Jun 2024 23:18:10 +0100 Subject: [PATCH 41/48] fix: transitioning from the hacking screen back into the 3D view for MY, it would reset the game. For MX, it would cause the smooth movement to be disabled. --- common/src/Engine.c | 8 +++++++- common/src/HackingScreen.c | 3 +++ my_frontend/src/Crawler.c | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/common/src/Engine.c b/common/src/Engine.c index 69bc1b4b5..53fda09fb 100644 --- a/common/src/Engine.c +++ b/common/src/Engine.c @@ -97,8 +97,14 @@ void enterState(enum EGameMenuState newState) { #endif } - currentGameMenuState = newState; initStateCallback(newState); + + if (newState == kBackToGame) { + newState = kPlayGame; + } + + currentGameMenuState = newState; + firstFrameOnCurrentState = 1; } diff --git a/common/src/HackingScreen.c b/common/src/HackingScreen.c index ec6fc619d..c840064d0 100644 --- a/common/src/HackingScreen.c +++ b/common/src/HackingScreen.c @@ -37,6 +37,9 @@ void HackingScreen_initStateCallback(enum EGameMenuState tag) { (void)tag; cursorPosition = 1; needsToRedrawVisibleMeshes = 0; +#ifdef PAGE_FLIP_ANIMATION + wasSmoothMovementPreviouslyEnabled = enableSmoothMovement; +#endif initHackingMinigame(); } diff --git a/my_frontend/src/Crawler.c b/my_frontend/src/Crawler.c index 644e89d26..ca32dd93c 100644 --- a/my_frontend/src/Crawler.c +++ b/my_frontend/src/Crawler.c @@ -270,7 +270,11 @@ void Crawler_initStateCallback(enum EGameMenuState tag) { (void)tag; enteredFrom = 0; cameraRotation = 0; - initStation(); + + if (tag != kBackToGame) { + initStation(); + } + focusedItem = getPlayerItems(); setErrorHandlerCallback(showMessage); setLoggerDelegate(showMessage); From d157ef81a7a348c4b180cf95cb25ff47dd848456 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sun, 30 Jun 2024 10:33:45 +0100 Subject: [PATCH 42/48] [MY] fix the UI showing players focusing inventory items they no longer hold --- my_frontend/src/Events.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/my_frontend/src/Events.c b/my_frontend/src/Events.c index cefddc935..169792d2e 100755 --- a/my_frontend/src/Events.c +++ b/my_frontend/src/Events.c @@ -134,6 +134,10 @@ void interactWithItemInRoom(void) { struct Item *item = getItem(focusedItem->item); if (itemToPick && item && item->useWithCallback) { item->useWithCallback(item, itemToPick); + + if (!playerHasObject(item->name)) { + focusedItem = getPlayerItems(); + } } } } From da604b15d34073f63cbbf9e377a12620dffb2053 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sun, 30 Jun 2024 15:09:06 +0100 Subject: [PATCH 43/48] [MY] Remove eng game graphic Sadly, there's not enough ROM space for that --- my_frontend/src/UI.c | 91 ----------------------- tools/svg-triangulator/ending.svg | 115 ------------------------------ 2 files changed, 206 deletions(-) delete mode 100644 tools/svg-triangulator/ending.svg diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index cf20de1cc..88e2ded53 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -25,96 +25,6 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; -static const uint8_t ending[] = { - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 9, 41, - 21, 33, - 18, 66, - 10, 71, - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 10, 71, - 11, 74, - 20, 70, - 18, 66, - 5, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 21, 33, - 18, 66, - 20, 70, - 54, 79, - 54, 49, - 9, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 12, 74, - 20, 70, - 54, 79, - 69, 70, - 97, 81, - 69, 89, - 37, 86, - 45, 82, - 45, 80, - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 53, 49, - 61, 49, - 62, 75, - 54, 79, - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 61, 49, - 62, 74, - 69, 71, - 66, 45, - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 66, 45, - 92, 57, - 97, 81, - 69, 71, - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 37, 79, - 38, 86, - 45, 82, - 45, 80, - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 10, 43, - 18, 38, - 17, 57, - 11, 60, - 4, -#ifndef MONOCHROME_VECTORS - 0, 0, 55929978, -#endif - 22, 37, - 51, 51, - 51, 64, - 21, 56, - 0}; - - uint16_t scale2DVertex( uint16_t offset, uint16_t scale, const uint8_t *shape, uint16_t index) { return offset + ((scale * shape[index]) / 128); } @@ -231,7 +141,6 @@ void performAction(void) { if (msg) { uint8_t lines = countLines(msg) + 3; clearScreen(); - drawGraphic(0, 0, YRES_FRAMEBUFFER, YRES_FRAMEBUFFER, ending); drawTextWindow( 0, (YRES / 8) + 1, (XRES_FRAMEBUFFER / 8) - 1, lines + 1, "", msg); while (1); diff --git a/tools/svg-triangulator/ending.svg b/tools/svg-triangulator/ending.svg deleted file mode 100644 index 4e70196b4..000000000 --- a/tools/svg-triangulator/ending.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - From eb4df7cb42fce50187802e1d33e74754b9f7aa45 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sun, 30 Jun 2024 18:04:52 +0100 Subject: [PATCH 44/48] [MY] Avoid clearing map twice before redrawing --- my_frontend/src/UI.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 88e2ded53..55c061cbc 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -91,12 +91,6 @@ void drawMap(void) { (YRES_FRAMEBUFFER / 8) / 2 + 1, "Map"); - for (y = 0; y < 12; ++y) { - for (x = 0; x < 12; ++x) { - drawTextAt(((XRES_FRAMEBUFFER / 8) / 2) + x + 2, 1 + y, " ", 0); - } - } - for (y = 0; y < 32; ++y) { for (x = 0; x < 32; ++x) { From 4ab377b16dc80fb3be3e27ff2aa03e743b9dc6f4 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Sun, 30 Jun 2024 18:16:24 +0100 Subject: [PATCH 45/48] [MZ] Some tweaks to UI rendering --- mz_frontend/CMakeLists.txt | 2 +- mz_frontend/Makefile.286 | 2 +- mz_frontend/Makefile.atari | 2 +- mz_frontend/Makefile.ocs | 2 +- mz_frontend/Makefile.sm4 | 2 +- mz_frontend/include/Renderer.h | 11 ---- mz_frontend/src/AtariVersion/AtariRenderer.c | 10 ++++ mz_frontend/src/Crawler.c | 9 ++-- mz_frontend/src/KeyboardUI.c | 2 +- mz_frontend/src/MSDOSVersion/msdos.c | 10 ++++ mz_frontend/src/MegaDriveVersion/megadrive.c | 9 ++++ mz_frontend/src/UI.c | 57 +++++++++++++++++++- 12 files changed, 93 insertions(+), 25 deletions(-) diff --git a/mz_frontend/CMakeLists.txt b/mz_frontend/CMakeLists.txt index 43613c2e3..b8e36228f 100644 --- a/mz_frontend/CMakeLists.txt +++ b/mz_frontend/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(src ../core/src ../core/include include ../common/include ${SDL2_INCLUDE_DIR} ) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DUSE_OWN_MIN_MAX -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DUSE_OWN_MIN_MAX -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") find_package(SDL2 REQUIRED) diff --git a/mz_frontend/Makefile.286 b/mz_frontend/Makefile.286 index 463b7bf20..46e7dac83 100644 --- a/mz_frontend/Makefile.286 +++ b/mz_frontend/Makefile.286 @@ -1,7 +1,7 @@ CFLAGS = -fomit-frame-pointer -fno-exceptions -ffast-math \ -Iinclude -I../core/include -I../common/include -IEngine3D \ -DMSDOS -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ - -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE -DUSE_OWN_MIN_MAX \ -Iinclude -I../common/include -I../core/include -I../common/include -IEngine3D -I../core/include \ -I../common/include -I../core/include -Imenu/include -ISoundSystem -I../core/include -IEngine3D diff --git a/mz_frontend/Makefile.atari b/mz_frontend/Makefile.atari index b441ed5a2..64863bdfd 100644 --- a/mz_frontend/Makefile.atari +++ b/mz_frontend/Makefile.atari @@ -3,7 +3,7 @@ CC = m68k-atari-mint-gcc STRIP=m68k-atari-mint-strip CFLAGS = -std=c99 -c -m68000 -s -fexpensive-optimizations -fomit-frame-pointer -Ofast \ -DATARIST -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ - -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DUSE_OWN_MIN_MAX \ -Iinclude -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AtariVersion \ -I../common/include -I../core/include -Imenu/include -ISoundSystem -IAtariVersion -I../core/include -IEngine3D diff --git a/mz_frontend/Makefile.ocs b/mz_frontend/Makefile.ocs index 29e05c978..0de71b4c5 100644 --- a/mz_frontend/Makefile.ocs +++ b/mz_frontend/Makefile.ocs @@ -7,7 +7,7 @@ CFLAGS = \ -Isrc -I../core/src -I../core/include -Iinclude -I../common/include \ -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AmigaVersion \ -Imenu/include -ISoundSystem \ - -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ -DCLI_BUILD -DINCLUDE_ITEM_DESCRIPTIONS -DAGA5BPP -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR -DUSE_OWN_MIN_MAX \ -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DUSE_FILLED_POLYS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE diff --git a/mz_frontend/Makefile.sm4 b/mz_frontend/Makefile.sm4 index 230b51a2e..39b7b803f 100644 --- a/mz_frontend/Makefile.sm4 +++ b/mz_frontend/Makefile.sm4 @@ -49,7 +49,7 @@ CCFLAGS = -m68000 -Wall -Wextra -std=c99 -ffreestanding -fcommon -Ofast -Wno-un -DSMD -fomit-frame-pointer -fno-exceptions -ffast-math \ -Iinclude -I../core/include -I../common/include -IEngine3D \ -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ - -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -DENDIANESS_AWARE \ + -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE \ -Iinclude -I../common/include -I../core/include -I../common/include -IEngine3D -I../core/include \ -I../common/include -I../core/include -Imenu/include -ISoundSystem -I../core/include -IEngine3D diff --git a/mz_frontend/include/Renderer.h b/mz_frontend/include/Renderer.h index 8d84045ac..3de08007d 100644 --- a/mz_frontend/include/Renderer.h +++ b/mz_frontend/include/Renderer.h @@ -39,17 +39,6 @@ enum DIRECTION { #define STIPPLE_COLOUR_THRESHOLD 8 - -/* not rendered and blocks visibility */ -#define BLOCK_CELL '#' - -struct CellPattern { - uint8_t ceiling: 4; - uint8_t elementsMask: 4; - uint8_t geometryType: 7; - uint8_t blockMovement: 1; -}; - #define getPaletteEntry(c) (( (c) - 0xFF000000 ) % 3) void clearGraphics(void); diff --git a/mz_frontend/src/AtariVersion/AtariRenderer.c b/mz_frontend/src/AtariVersion/AtariRenderer.c index 6cf1d42cb..d912be8d7 100644 --- a/mz_frontend/src/AtariVersion/AtariRenderer.c +++ b/mz_frontend/src/AtariVersion/AtariRenderer.c @@ -276,6 +276,16 @@ void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) } } +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + + void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, char charToReplaceHifenWith) { diff --git a/mz_frontend/src/Crawler.c b/mz_frontend/src/Crawler.c index cd107e452..b96400479 100644 --- a/mz_frontend/src/Crawler.c +++ b/mz_frontend/src/Crawler.c @@ -45,13 +45,10 @@ void HUD_refresh(void) { needsToRedrawHUD = 0; drawWindow(0, - (128 / 8), + (YRES / 8) + 1, (XRES_FRAMEBUFFER / 8) / 2, - (YRES_FRAMEBUFFER / 8) - 17, - "Status"); - - drawTextAt(1, YRES_TEXT - 7, "In room:", 2); - drawTextAt(1, YRES_TEXT - 4, "In hand:", 2); + 5, + "In hand:"); struct Item *item; diff --git a/mz_frontend/src/KeyboardUI.c b/mz_frontend/src/KeyboardUI.c index 492d4d948..45164383a 100644 --- a/mz_frontend/src/KeyboardUI.c +++ b/mz_frontend/src/KeyboardUI.c @@ -35,7 +35,7 @@ void HUD_initialPaint(void) { drawWindowWithOptions( 1 + (XRES_FRAMEBUFFER / 2) / 8, - (YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6, + (YRES_FRAMEBUFFER / 8) - 3 - 5, (XRES_FRAMEBUFFER / 8) - (1 + (XRES_FRAMEBUFFER / 2) / 8) - 1, (YRES_FRAMEBUFFER / 8) - ((YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6 - 1) - 2, "Actions", diff --git a/mz_frontend/src/MSDOSVersion/msdos.c b/mz_frontend/src/MSDOSVersion/msdos.c index 188c04deb..118d5121f 100644 --- a/mz_frontend/src/MSDOSVersion/msdos.c +++ b/mz_frontend/src/MSDOSVersion/msdos.c @@ -322,6 +322,16 @@ void startFrame(int x, int y, int width, int height) { } +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + + void endFrame(void) { uint8_t *bufferPtr = &imageBuffer[0]; diff --git a/mz_frontend/src/MegaDriveVersion/megadrive.c b/mz_frontend/src/MegaDriveVersion/megadrive.c index 22f25fcc5..91d92aeab 100644 --- a/mz_frontend/src/MegaDriveVersion/megadrive.c +++ b/mz_frontend/src/MegaDriveVersion/megadrive.c @@ -90,6 +90,15 @@ void realPut(int x, int y, uint8_t colour) { BMP_setPixelFast(x, y, colour); } +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { if (y0 > y1) { diff --git a/mz_frontend/src/UI.c b/mz_frontend/src/UI.c index ecb263e29..06e6cdfee 100644 --- a/mz_frontend/src/UI.c +++ b/mz_frontend/src/UI.c @@ -1,7 +1,17 @@ /* Created by Daniel Monteiro on 11/07/2023. */ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD #include +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif #include "Enums.h" #include "UI.h" @@ -9,13 +19,15 @@ #include "Renderer.h" #include "Engine.h" #include "SoundSystem.h" +#include "Common.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" extern uint8_t playerLocation; extern int8_t cursorPosition; -extern const struct CellPattern patterns[127]; - extern int8_t map[32][32]; uint8_t waitForKey = 0; @@ -24,6 +36,8 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; +extern struct MapWithCharKey tileProperties; + void drawGraphic(int x, int y, int dx, int dy, const uint8_t *graphic) { const uint8_t *ptr = graphic; @@ -65,8 +79,47 @@ void showMessage(const char *message) { waitForKey = 1; } +uint8_t isPositionAllowed(int8_t x, int8_t y) { + uint8_t pattern = map[y][x]; + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, pattern); + + return prop->mBlockMovement; +} + + void drawMap(void) { + uint8_t x, y; + + if (!redrawMap) { + return; + } + if (playerLocation == 0) { + return; + } + + redrawMap = 0; + + drawWindow((XRES_FRAMEBUFFER / 8) / 2, + 0, + (XRES_FRAMEBUFFER / 8) / 2 - 1, + (YRES_FRAMEBUFFER / 8) / 2 + 1, + ""); + + for (y = 0; y < 32; ++y) { + for (x = 0; x < 32; ++x) { + + if (isPositionAllowed(x, y)) { + fillRect((XRES_FRAMEBUFFER / 2) + (x * 3), + (y * 3), + (XRES_FRAMEBUFFER / 2) + (x * 3) + 3, + (y * 3) + 3, + 2, + 0); + } + } + } } void performAction(void) { From a24763a70d0809d974d4c6de2bf3d1af0bed3e96 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 1 Jul 2024 22:11:28 +0100 Subject: [PATCH 46/48] [CORE] Fix unit test builds --- common/src/Common.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/Common.c b/common/src/Common.c index 27fefebf7..11b2a14a2 100644 --- a/common/src/Common.c +++ b/common/src/Common.c @@ -121,7 +121,11 @@ int countLines(const char* text) { while(*text) { ++chars; - if ( (chars >= (XRES_FRAMEBUFFER / 8)) || *text == '\n') { + if ( +#ifdef XRES_FRAMEBUFFER + (chars >= (XRES_FRAMEBUFFER / 8)) || +#endif + *text == '\n') { ++lines; chars = 0; } From e376830c295ace72e30402f4a0f8cc5bb96e84ca Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 1 Jul 2024 22:12:17 +0100 Subject: [PATCH 47/48] [MY] Fix annoying continuous beep when the game ends It still has a longish beep, but once the screen is finished with drawing, it stops. --- my_frontend/src/UI.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 55c061cbc..d25b239d9 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -137,7 +137,11 @@ void performAction(void) { clearScreen(); drawTextWindow( 0, (YRES / 8) + 1, (XRES_FRAMEBUFFER / 8) - 1, lines + 1, "", msg); - while (1); + while (1) { + if (soundDriver != kNoSound) { + soundTick(); + } + } } } From 01641081a40849079b565b7fbde494814c4b18d4 Mon Sep 17 00:00:00 2001 From: Daniel Monteiro Date: Mon, 1 Jul 2024 23:06:27 +0100 Subject: [PATCH 48/48] [MX, GL, EE] Fixes crash when completing the game or on game over --- common/include/Enums.h | 3 ++- common/src/Dungeon.c | 4 ++++ common/src/Events.c | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/common/include/Enums.h b/common/include/Enums.h index 49c2e81e3..bc33a8e70 100644 --- a/common/include/Enums.h +++ b/common/include/Enums.h @@ -12,7 +12,8 @@ enum EDirection { enum CrawlerState { kCrawlerGameOver = -1, kCrawlerQuit = 0, - kCrawlerGameInProgress = 1 + kCrawlerGameInProgress = 1, + kCrawlerGameFinished = 2 }; enum ECommand { diff --git a/common/src/Dungeon.c b/common/src/Dungeon.c index b63826266..6d58e4869 100644 --- a/common/src/Dungeon.c +++ b/common/src/Dungeon.c @@ -295,18 +295,22 @@ struct GameSnapshot dungeonTick(const enum ECommand command) { switch (getGameStatus()) { case kBadVictory: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kBadVictoryEpilogue); return gameSnapshot; case kBadGameOver: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kBadGameOverEpilogue); return gameSnapshot; case kGoodVictory: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kGoodVictoryEpilogue); return gameSnapshot; case kGoodGameOver: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kGoodGameOverEpilogue); return gameSnapshot; default: diff --git a/common/src/Events.c b/common/src/Events.c index 2167b1c4d..c78d2682b 100644 --- a/common/src/Events.c +++ b/common/src/Events.c @@ -147,6 +147,10 @@ int loopTick(enum ECommand command) { tickMission(command); + if (crawlerGameState == kCrawlerGameFinished) { + return kCrawlerGameFinished; + } + if (gameTicks != 0) { yCameraOffset = ((struct CTile3DProperties *) getFromMap(&tileProperties, LEVEL_MAP(x, z)))->mFloorHeight -