split shell operation abstraction from graphical window manager abstraction - do basic integration of common linux utilities for implementing shell operations - also add 'sh_install_or_uninstall_self' for doing shell-specific operations related to installing or uninstalling an application. hook up to config state in raddbg

This commit is contained in:
Ryan Fleury committed 2026-08-06 12:53:05 -06:00
1 parent 32ef9095e0
commit 867b64f7a2
26 files changed
+551 -201

No files matched your search

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

+1 -1
View File
@@ -68,7 +68,7 @@ commands =
// .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
//- rjf: running target //- rjf: running target
.f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, .f3 = { .win = "raddbg_stable --ipc run", .linux = "cd build && ./raddbg && cd ..", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
// .f3 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
// .f3 = { .win = "wsl ./build/raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "wsl ./build/raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
// .f3 = { .win = "pushd build && raddbg --user:dev.raddbg_user && popd", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "pushd build && raddbg --user:dev.raddbg_user && popd", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
+9 -9
View File
@@ -29,7 +29,7 @@ internal Arena *
arena_alloc_(ArenaParams *params) arena_alloc_(ArenaParams *params)
{ {
ProfBeginFunction(); ProfBeginFunction();
U64 reserve_size = params->reserve_size; U64 reserve_size = params->reserve_size;
U64 commit_size = params->commit_size; U64 commit_size = params->commit_size;
@@ -69,13 +69,13 @@ arena_alloc_(ArenaParams *params)
} }
// rjf: panic on arena creation failure // rjf: panic on arena creation failure
#if OS_FEATURE_GRAPHICAL
if(Unlikely(base == 0)) if(Unlikely(base == 0))
{ {
wm_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); #if defined(SHELL_H)
sh_message(1, s("Fatal Allocation Failure"), s("Unexpected memory allocation failure."));
#endif
abort_self(1); abort_self(1);
} }
#endif
// rjf: extract arena header & fill // rjf: extract arena header & fill
AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE);
@@ -143,7 +143,7 @@ internal void
arena_release(Arena *arena) arena_release(Arena *arena)
{ {
ProfBeginFunction(); ProfBeginFunction();
#if PROFILE_TELEMETRY #if PROFILE_TELEMETRY
{ {
Arena *base_arena = arena; Arena *base_arena = arena;
@@ -176,7 +176,7 @@ arena_release(Arena *arena)
AsanUnpoisonMemoryRegion(n, n->cmt); AsanUnpoisonMemoryRegion(n, n->cmt);
release_memory(n, n->res); release_memory(n, n->res);
} }
ProfEnd(); ProfEnd();
} }
@@ -295,13 +295,13 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero)
#endif #endif
// rjf: panic on failure // rjf: panic on failure
#if OS_FEATURE_GRAPHICAL
if(Unlikely(result == 0)) if(Unlikely(result == 0))
{ {
wm_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); #if defined(SHELL_H)
sh_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure."));
#endif
abort_self(1); abort_self(1);
} }
#endif
return result; return result;
} }
@@ -0,0 +1,5 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
//- GENERATED CODE
@@ -0,0 +1,129 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
//- GENERATED CODE
#ifndef LINUX_SHELL_META_H
#define LINUX_SHELL_META_H
C_LINKAGE_BEGIN
read_only global U8 lnx_sh_logo_file_bytes__data[] =
{
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x00,0x00,0x5c,0x72,0xa8,0x66,0x00,0x00,0x00,0x04,0x67,0x41,0x4d,0x41,0x00,0x00,0xb1,0x8f,0x0b,0xfc,0x61,0x05,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x01,0xd9,0xc9,0x2c,0x7f,0x00,0x00,
0x00,0x20,0x63,0x48,0x52,0x4d,0x00,0x00,0x7a,0x26,0x00,0x00,0x80,0x84,0x00,0x00,0xfa,0x00,0x00,0x00,0x80,0xe8,0x00,0x00,0x75,0x30,0x00,0x00,0xea,0x60,0x00,0x00,0x3a,0x98,0x00,0x00,0x17,0x70,0x9c,0xba,0x51,0x3c,0x00,0x00,0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,0x00,0x00,0x00,0x09,
0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x1a,0xec,0x49,0x44,0x41,0x54,0x78,0xda,0xed,0x9d,0x79,0x98,0x14,0xd5,0xb9,0xc6,0x7f,0xdd,0x3d,0xdd,0x3d,0x03,0x33,0x30,0x33,0x0c,0xab,0xa0,0x8e,0x48,0xa3,0xa0,0x2c,0x83,0x02,0xea,0xd5,0x28,0xa5,0xa2,0x46,0xdc,0x35,0xee,0x1a,
0xe5,0x46,0x13,0x13,0xd1,0x18,0xcd,0xd5,0xa8,0x31,0x06,0x90,0x5c,0x35,0x41,0x8d,0x7a,0xd5,0xa8,0xb8,0x80,0x5b,0xcc,0xe3,0x86,0xa2,0xa6,0x5d,0x40,0x0c,0x11,0x45,0x01,0x09,0x5a,0xa0,0xb8,0x81,0xc0,0x00,0x33,0xc0,0x30,0xd0,0xb3,0x74,0xdf,0x3f,0xba,0xd4,0x51,0x01,0xa7,0xe9,0xee,0x5a,0xba,0xde,0xdf,0xf3,0xcc,0x33,0x2c,0xd3,
0x53,0xa7,0xbe,0xf3,0xbd,0x6f,0x7d,0xe7,0x54,0xd5,0x39,0x20,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0xef,0x12,0x50,0x08,0x0a,0x9b,0x78,0x8c,0x32,0xa0,0x02,0x28,0x6f,0xf3,0xbd,0xed,0x9f,0x01,0xea,0x81,0x3a,0xeb,0x7b,0xdb,0x3f,0xd7,0x19,0x26,
0x1b,0x15,0x45,0x19,0x80,0x70,0x9f,0xb0,0xbb,0x02,0xc3,0x80,0xa1,0xc0,0x6e,0x5b,0x11,0x76,0x05,0xd0,0x19,0x08,0x65,0x79,0xa8,0x56,0x60,0x7d,0x5b,0x53,0x68,0x63,0x14,0x1f,0x03,0xef,0x02,0xef,0x18,0x26,0xb5,0xea,0x15,0x19,0x80,0xc8,0x8f,0xd8,0xfb,0x00,0x35,0x96,0xd8,0x6b,0xac,0xaf,0x9d,0x5c,0xd6,0xcc,0xe5,0xc0,0xbc,0xb6,
0x5f,0x86,0xc9,0x17,0xea,0x3d,0x19,0x80,0x68,0xbf,0xd0,0x03,0xd6,0xd5,0xbc,0xa6,0xcd,0xd7,0x50,0xa0,0xab,0x47,0x4f,0xa9,0xd6,0xaa,0x10,0xda,0x9a,0xc2,0x47,0xea,0x69,0x19,0x80,0xf8,0xbe,0xf8,0x9f,0x02,0x0e,0xb6,0xca,0xf6,0x42,0x66,0x3d,0xf0,0x9a,0x61,0x72,0x9c,0x7a,0x5d,0x06,0x20,0xd2,0xe2,0xaf,0xb6,0xc6,0xd3,0x7e,0xa2,
0xda,0x30,0xf9,0x44,0xbd,0xef,0x2c,0x41,0x85,0xc0,0x15,0x8c,0xd2,0x39,0x0b,0x19,0x80,0x0c,0x40,0xe7,0x2c,0x64,0x00,0x3e,0xe4,0x10,0x9d,0xb3,0x90,0x01,0xf8,0x73,0xfc,0xbf,0x07,0xd0,0xd3,0x87,0xa7,0xde,0x2b,0x1e,0xa3,0xbf,0x32,0x40,0x06,0xa0,0xf2,0x5f,0xe7,0x2e,0x64,0x00,0x12,0x81,0xce,0x5d,0xd8,0x8d,0x6e,0x03,0x3a,0x5b,
0xfe,0x07,0x48,0x3f,0x2c,0xd3,0xc5,0xa7,0x21,0x58,0x03,0x74,0x33,0x4c,0x52,0xca,0x06,0x55,0x00,0x7e,0x64,0x90,0x8f,0xc5,0x0f,0x50,0x05,0xec,0xad,0x34,0x90,0x01,0xa8,0x04,0x56,0x0c,0x84,0x0c,0x40,0xc9,0xaf,0x18,0x08,0xcd,0x01,0xf8,0x63,0xfc,0x1f,0x02,0xd6,0x01,0x9d,0x7c,0x1e,0x8a,0xf5,0x40,0x17,0xc3,0xa4,0x55,0x59,0xa1,
0x0a,0xc0,0x4f,0x0c,0x93,0xf8,0x81,0xf4,0xcb,0x4f,0x35,0x0a,0x83,0x0c,0x40,0xa5,0xaf,0x62,0x21,0x64,0x00,0x4a,0x7a,0xc5,0x42,0x68,0x0e,0xa0,0xb0,0xc7,0xff,0x11,0xd2,0x4b,0x6b,0x75,0x50,0x34,0x00,0x68,0x04,0xca,0x0d,0x93,0x66,0x85,0x42,0x15,0x80,0x1f,0x18,0x21,0xf1,0x7f,0x8b,0x0e,0x56,0x4c,0x84,0x0c,0x40,0x25,0xaf,0x62,
0x22,0x64,0x00,0x4a,0x76,0xc5,0x44,0x68,0x0e,0xa0,0x00,0xc7,0xff,0x25,0xa4,0x97,0xd4,0x8e,0x28,0x1a,0xdf,0x22,0x01,0x54,0x18,0x26,0x9b,0x15,0x0a,0x55,0x00,0x85,0xcc,0x01,0x12,0xff,0x56,0x89,0x02,0xfb,0x2b,0x0c,0x32,0x00,0x95,0xba,0x8a,0x8d,0x90,0x01,0x28,0xc9,0x15,0x1b,0xa1,0x39,0x80,0xc2,0x1a,0xff,0x77,0x22,0xfd,0xfc,
0x7f,0x48,0xd1,0xd8,0x2a,0x2d,0x40,0xa5,0xf6,0x23,0x54,0x05,0x50,0xa8,0x1c,0x28,0xf1,0x6f,0x97,0x22,0x2b,0x46,0x42,0x15,0x40,0x41,0x5d,0xf9,0x8b,0x81,0x9f,0x01,0xbf,0x05,0x7a,0x29,0x22,0xdb,0x65,0x05,0x30,0x09,0xb8,0xc7,0x30,0xd9,0xa2,0x70,0xc8,0x00,0xbc,0x2c,0xfc,0x12,0xe0,0x42,0xe0,0x0a,0xa0,0x87,0x22,0x92,0x11,0x5f,
0x02,0x37,0x02,0xff,0xa7,0x5b,0x83,0x32,0x00,0xaf,0x09,0xbf,0x23,0xf0,0x0b,0xe0,0x32,0xa0,0xbb,0x22,0x92,0x15,0xab,0x80,0x9b,0x80,0x3b,0x0d,0x93,0x4d,0x0a,0x87,0x0c,0xc0,0xcd,0xc2,0x2f,0x05,0x7e,0x09,0xfc,0x1a,0xef,0xee,0xe8,0xeb,0x56,0x6a,0x81,0x3f,0x03,0x7f,0x35,0x4c,0x1a,0x14,0x0e,0x19,0x80,0x9b,0x84,0xdf,0x09,0xb8,
0x18,0xb8,0x04,0x7f,0x2f,0xf2,0x69,0x07,0x6b,0x81,0xc9,0xc0,0xad,0x86,0xc9,0x06,0x85,0xc3,0x47,0x06,0x10,0x8f,0x11,0x04,0xfe,0x00,0x2c,0x03,0x66,0x18,0x26,0x2b,0x1c,0x6e,0x4f,0x04,0xb8,0x1c,0xf8,0x0d,0x50,0xae,0x74,0xb2,0x95,0x3a,0xe0,0x66,0xe0,0x46,0xc3,0xa4,0xc9,0xe1,0x3c,0xe8,0x05,0x1c,0x01,0xec,0x0a,0x5c,0x67,0x98,
0x24,0x65,0x00,0xf9,0x09,0xf4,0x64,0x60,0x5c,0x9b,0x7f,0x7a,0x1f,0x98,0x01,0xbc,0x08,0xcc,0x32,0x4c,0x12,0x36,0xb6,0xa5,0x06,0x98,0x82,0x96,0xb5,0x76,0x9a,0x85,0xc0,0x39,0x86,0xc9,0xbb,0x36,0xf6,0x7d,0x94,0xf4,0xed,0xca,0xd1,0x96,0xf0,0xf7,0x6a,0xf3,0xdf,0x93,0x0d,0x93,0x4b,0x65,0x00,0xb9,0x0f,0xfa,0x38,0xab,0xf4,0xdb,
0x16,0x8d,0xc0,0x6b,0x5f,0x19,0x82,0x61,0x62,0xe6,0xa9,0x1d,0x61,0xe0,0x1a,0xe0,0x4a,0xd2,0xf7,0xad,0x85,0xf3,0xb4,0x00,0x37,0x00,0x7f,0xcc,0xd7,0xa2,0x22,0xf1,0x18,0xb1,0x36,0x82,0x3f,0x98,0xed,0xaf,0xe7,0x30,0xce,0x30,0xb9,0x55,0x06,0x90,0xbb,0xe0,0x1f,0x07,0x3c,0x49,0x66,0x0f,0x2e,0x2d,0xb3,0x2a,0x83,0x19,0xc0,0x2b,
0xb9,0x78,0xba,0x2c,0x1e,0x63,0xa8,0x75,0xd5,0x1f,0x24,0xcd,0xb9,0x92,0x05,0xc0,0xb9,0xb9,0xa8,0x06,0xe2,0x31,0xca,0x00,0xc3,0x12,0xfd,0x68,0xa0,0x3a,0x83,0x8f,0x27,0x81,0x13,0x0c,0x93,0xa7,0x65,0x00,0xd9,0x77,0xc4,0x70,0xeb,0xca,0x5e,0x92,0xc5,0xaf,0x69,0x06,0xde,0x6c,0x63,0x08,0xef,0x65,0xb2,0x1d,0x95,0x75,0xd5,0xbf,
0x1a,0xb8,0x4a,0x57,0x7d,0xd7,0xd3,0x0c,0x4c,0x04,0x26,0x64,0x52,0x0d,0x58,0xdb,0xb4,0x0d,0x6d,0x73,0x95,0xdf,0x0f,0x08,0x67,0xd1,0x8e,0x46,0xe0,0x60,0xc3,0x64,0xae,0x0c,0x60,0xc7,0xc5,0x5f,0x0d,0xcc,0x01,0xba,0xe5,0xf8,0x57,0xaf,0x02,0x5e,0xb2,0x0c,0xe1,0x25,0xc3,0xa4,0x76,0x3b,0x6d,0x18,0x62,0x5d,0xf5,0x07,0x4b,0x5b,
0x9e,0x62,0xbe,0x35,0x37,0x30,0x7f,0x3b,0x7d,0xdb,0x15,0x38,0xdc,0x12,0xfc,0x61,0xe4,0xfe,0x99,0x8d,0xd5,0xc0,0x48,0xc3,0x64,0x99,0x0c,0x20,0x73,0xf1,0x57,0x58,0x57,0xed,0x3d,0xf2,0x7c,0xa8,0x14,0x30,0xaf,0x4d,0x75,0xf0,0x2f,0xc3,0xa4,0xc5,0xba,0xea,0xff,0xce,0xba,0xea,0x87,0xa5,0x27,0xcf,0x56,0x03,0x13,0x80,0x89,0x86,
0x49,0x73,0x3c,0x46,0x91,0x75,0x65,0x3f,0xc2,0xba,0xd2,0xd7,0xd8,0xa0,0x81,0x0f,0x80,0xfd,0x0d,0x93,0x3a,0x19,0x40,0xfb,0xc5,0x1f,0xb5,0xae,0xd0,0x07,0x39,0x70,0xf8,0x0d,0x40,0xdc,0x1a,0xf3,0x0d,0x91,0x86,0x0a,0x82,0xf7,0x48,0xcf,0x09,0x19,0x38,0xb3,0x19,0xcb,0x4c,0xe0,0x30,0xa7,0x6f,0x57,0x7a,0xc2,0x00,0xac,0xb1,0xd8,
0x54,0xe0,0x34,0xe5,0xad,0x28,0x20,0xa6,0x01,0x67,0xba,0x6d,0x2b,0x74,0x37,0xbe,0x0e,0x3c,0x5e,0xe2,0x17,0x05,0xc8,0xe9,0xc0,0x1f,0x55,0x01,0x6c,0xff,0xea,0x3f,0x16,0xb8,0x47,0xb9,0x22,0x0a,0x98,0xb1,0x86,0xc9,0xbd,0x32,0x80,0xef,0x8b,0xff,0x50,0xe0,0x05,0x74,0x9b,0x4d,0x14,0x36,0x2d,0xc0,0x91,0x86,0xc9,0x3f,0x65,0x00,
0xdf,0x88,0xbf,0x02,0x58,0x04,0xf4,0x54,0x7e,0x08,0x1f,0xf0,0x25,0x30,0xd0,0x0d,0x77,0x06,0xdc,0x32,0x07,0x70,0xab,0xc4,0x2f,0x7c,0x44,0x4f,0xe0,0x16,0x55,0x00,0xe9,0xab,0xff,0x18,0xe0,0x19,0xe5,0x84,0xf0,0x21,0x63,0x0c,0x93,0xe7,0x7c,0x6b,0x00,0x2a,0xfd,0x85,0x86,0x02,0xce,0x0e,0x05,0x9c,0x1e,0x02,0xdc,0x22,0xf1,0x0b,
0x9f,0x0f,0x05,0x26,0xfb,0xb2,0x02,0x50,0xe9,0x2f,0x84,0xf3,0x43,0x81,0x80,0x43,0xe2,0x57,0xe9,0x2f,0xc4,0x37,0xac,0xb0,0x86,0x02,0xf5,0x7e,0x19,0x02,0xa8,0xf4,0x17,0xe2,0x1b,0x7a,0xe1,0xd0,0x5d,0x01,0xdb,0x2b,0x00,0x95,0xfe,0x42,0xb8,0x67,0x28,0x10,0xb0,0x59,0xfc,0x2a,0xfd,0x85,0x70,0xd1,0x50,0xc0,0xee,0x21,0x80,0x4a,
0x7f,0x21,0x5c,0x34,0x14,0xb0,0xad,0x02,0x88,0xc7,0x38,0x1a,0x78,0x56,0x7d,0x2c,0x84,0x7b,0x86,0x02,0x01,0x9b,0xc4,0x1f,0x05,0x96,0x00,0x7d,0xd4,0xb7,0x42,0xfc,0x20,0x9f,0x03,0xbb,0xdb,0xb1,0x80,0x88,0x5d,0x43,0x80,0xf3,0x25,0x7e,0x21,0xda,0x4d,0x1f,0x4b,0x33,0xde,0xaf,0x00,0xac,0xdd,0x73,0x96,0xca,0x00,0x84,0xc8,0x88,
0xcf,0x80,0x7e,0xf9,0xae,0x02,0xec,0xa8,0x00,0x7e,0x2a,0xf1,0x0b,0x91,0x31,0x3b,0x03,0xe7,0x7a,0xba,0x02,0xb0,0x56,0xd6,0x5d,0x02,0xec,0xa2,0xfe,0x14,0x22,0x63,0x3e,0xb5,0xaa,0x80,0xe6,0x7c,0x1d,0x20,0xdf,0x15,0xc0,0x39,0x12,0xbf,0x10,0x3b,0xcc,0x2e,0xc0,0xd9,0x9e,0xac,0x00,0xac,0x35,0xd8,0x4d,0x32,0xdb,0x52,0x49,0x08,
0xf1,0x6d,0x96,0x01,0x31,0xc3,0xa4,0xc5,0x6b,0x15,0xc0,0xd9,0x12,0xbf,0x10,0x59,0x53,0x0d,0x9c,0xe5,0xa9,0x0a,0xc0,0xba,0xfa,0x7f,0x08,0xec,0xa6,0xfe,0x13,0x22,0x6b,0x3e,0x02,0xfa,0x1b,0x26,0xad,0x5e,0xa9,0x00,0xce,0x90,0xf8,0x85,0xc8,0x19,0x7d,0x2d,0x4d,0xb9,0xbf,0x02,0x88,0xc7,0x08,0x91,0xde,0x0f,0x6d,0x77,0xf5,0x9b,
0x10,0x39,0x63,0x09,0xb0,0x67,0xae,0xab,0x80,0x7c,0xac,0xc1,0x7f,0xba,0xc4,0xff,0x03,0x65,0x57,0x38,0x42,0x97,0x51,0x63,0xe8,0x75,0xf2,0x58,0x2a,0xf6,0xfd,0x11,0x00,0xa9,0x54,0x0a,0x48,0x41,0x32,0x99,0xfe,0xb3,0xf5,0x95,0x4a,0x25,0xbf,0xfe,0x33,0xa9,0x14,0xa9,0x64,0x32,0xfd,0x73,0xa9,0x54,0xfa,0xe7,0xda,0xfe,0x3c,0xd6,
0xff,0x6f,0xe3,0xf3,0x5f,0xfd,0x3c,0xa4,0xbe,0xf9,0xcc,0xb7,0x8e,0xf7,0x9d,0x63,0x6f,0xe5,0x58,0xa4,0x52,0xa4,0xd8,0xda,0x67,0xdb,0xd7,0xd6,0xb6,0x9f,0x5f,0xf9,0xf4,0xc3,0xac,0x79,0x45,0x6f,0x86,0xb7,0x93,0x7e,0xa4,0x77,0xcc,0x7a,0xd8,0xb5,0x15,0x40,0x3c,0x46,0x10,0x58,0x0c,0xc4,0xd4,0x5f,0xed,0xa3,0xc3,0x2e,0xfd,0xe8,
0x79,0xca,0x58,0x7a,0x1e,0x7f,0x2e,0x91,0x2e,0xdd,0x7c,0x75,0xee,0xa9,0x96,0x66,0x16,0x5c,0x78,0x0c,0x6b,0x67,0xcd,0x50,0x22,0xb4,0x8f,0x0f,0x81,0x01,0x86,0x49,0xd2,0xad,0x06,0x70,0x2a,0xf0,0x88,0xfa,0x69,0x07,0xab,0x82,0x43,0x8e,0x66,0xe7,0xf3,0x7e,0x43,0xe7,0xa1,0xfb,0xf9,0xe6,0xbc,0x93,0x89,0x2d,0xcc,0x1f,0x7b,0x24,
0x75,0x6f,0xbd,0xa6,0x24,0x68,0x1f,0xa7,0x19,0x26,0x8f,0xe6,0x2c,0xef,0x72,0xdc,0xb8,0xf3,0xd5,0x3f,0x3b,0x28,0x84,0xe6,0x26,0x6a,0x5f,0xfa,0x07,0xf3,0xce,0x38,0x90,0x25,0x37,0xfc,0x9a,0x64,0x62,0x8b,0x3f,0x8c,0x2f,0x5a,0xcc,0xa0,0xbb,0x9f,0xa3,0xd3,0x90,0x91,0x4a,0x82,0xf6,0x71,0x9e,0x2b,0x87,0x00,0xf1,0x18,0xdd,0x48,
0xaf,0x68,0x12,0x52,0x1f,0xe5,0x60,0x68,0xb0,0xdb,0x1e,0x0c,0x98,0x34,0x85,0x4e,0x83,0x47,0xf8,0xe2,0x7c,0x5b,0x36,0xd4,0x33,0xef,0xec,0x43,0x68,0x58,0xfc,0x9e,0x3a,0x7f,0xfb,0xb4,0x02,0x3d,0x0d,0x93,0x5a,0xb7,0x55,0x00,0x27,0x4b,0xfc,0xb9,0xa3,0xf1,0xe3,0x0f,0x78,0xe7,0xb4,0xff,0xe2,0xa3,0x9b,0xaf,0x24,0xd9,0xdc,0x54,
0xf0,0xe7,0x5b,0xd4,0xa9,0x9c,0xa1,0xf7,0xbf,0x4c,0xc7,0xdd,0x07,0xa8,0xf3,0xb7,0x4f,0xc8,0xd2,0x9a,0xeb,0x86,0x00,0xa7,0xaa,0x6f,0x72,0x4b,0xaa,0xb5,0x85,0x4f,0xef,0x9e,0xc4,0xdc,0xe3,0x87,0xd1,0xb8,0xec,0xc3,0x82,0x3f,0xdf,0x70,0x45,0x15,0x43,0xa7,0xfc,0x93,0x92,0x9d,0xfb,0xaa,0xf3,0x6d,0xd2,0x5a,0x4e,0x86,0x00,0xf1,
0x18,0xbd,0x49,0xbf,0xbf,0x1c,0x50,0xdf,0xe4,0x87,0x68,0xf7,0x9d,0xa8,0x99,0x36,0x8b,0x92,0xde,0x85,0xff,0x74,0xf5,0x96,0x15,0x9f,0x32,0xef,0x8c,0x83,0xd8,0xb2,0xe2,0x33,0x75,0xfc,0x36,0xae,0x0d,0x40,0x1f,0xc3,0x64,0xb9,0x5b,0x0c,0xe0,0x32,0xe0,0x26,0xbf,0xf5,0x42,0x51,0x69,0x80,0x8a,0xbd,0x22,0x14,0x77,0x0d,0x11,0xad,
0x08,0x12,0xa9,0x08,0x12,0xad,0x0c,0x12,0x0c,0x07,0x48,0xac,0x4b,0xd2,0xb4,0x2e,0x49,0xa2,0xae,0x95,0xc4,0xda,0x24,0xf5,0x8b,0x9b,0xd9,0x52,0x9b,0xdd,0x33,0x1c,0x25,0xbd,0xab,0xa9,0x99,0x36,0x8b,0x68,0xf7,0x9d,0x0a,0x7f,0x08,0xf4,0xe9,0x12,0xe6,0x9d,0x7e,0x10,0x4d,0x6b,0x56,0x4a,0xee,0x5b,0xe7,0x32,0xc3,0xe4,0xcf,0x6e,
0x31,0x80,0xb9,0xc0,0x3e,0x7e,0x88,0x7a,0x71,0x55,0x88,0xaa,0xe1,0x11,0xba,0x0e,0x8f,0x52,0x3e,0x20,0x42,0x20,0x83,0x59,0x8f,0x86,0x65,0x2d,0xd4,0xbe,0x95,0xa0,0x76,0x6e,0x82,0x86,0x4f,0x5a,0xd2,0x3e,0x9e,0x21,0x1d,0xaa,0xfb,0x53,0x33,0x75,0xa6,0x2f,0x9e,0x19,0xd8,0xb4,0x64,0x11,0xf3,0xce,0x3a,0x98,0xe6,0xba,0x35,0x92,
0xfb,0xf7,0x99,0x6b,0x98,0x0c,0x77,0xdc,0x00,0xe2,0x31,0xfa,0x92,0x5e,0xf2,0xab,0xa0,0xe9,0xd0,0x2b,0x44,0xdf,0x33,0x4b,0xe9,0x3a,0x22,0x9a,0x93,0xdf,0xb7,0xf1,0xa3,0x16,0x96,0x3e,0xd4,0x40,0xdd,0xc2,0xcc,0x27,0xf8,0x4a,0xfb,0x0f,0xa2,0xe6,0xe1,0xd7,0x28,0xea,0x54,0x51,0xf0,0x59,0xbe,0x71,0xd1,0x3c,0xde,0x3d,0x67,0x14,
0x2d,0x1b,0xd7,0x4b,0xf2,0xdf,0xa7,0xaf,0x61,0xf2,0x71,0x36,0xbf,0x20,0x17,0x93,0x80,0x05,0x3d,0xf9,0x17,0xa9,0x08,0xd2,0xff,0x82,0x32,0x46,0xdc,0xd2,0x25,0x67,0xe2,0x07,0x28,0xeb,0x5b,0xc4,0xd0,0xeb,0xca,0x19,0x72,0x4d,0x39,0xa5,0xbb,0x66,0xf6,0x44,0x76,0xc3,0x87,0x0b,0x78,0xef,0xfc,0x23,0x7c,0xf1,0xac,0x40,0xd9,0xc0,
0x1a,0x06,0xdf,0xf3,0x3c,0xa1,0x0e,0xa5,0x92,0x7b,0x1e,0xb4,0x97,0xf5,0x6d,0xbb,0x73,0xba,0x70,0x07,0x50,0x90,0xf5,0x68,0xf7,0xff,0x2a,0x66,0xe8,0x75,0xe5,0x74,0xee,0x1f,0x26,0x90,0xa7,0xe9,0xcd,0x92,0x1e,0x21,0x76,0x3a,0xbc,0x84,0x60,0x24,0x40,0xfd,0xfb,0x4d,0xed,0x1e,0x16,0x24,0x56,0x2d,0x87,0x40,0x80,0x8a,0x91,0xa3,
0x0a,0x7f,0xd8,0xd5,0xb3,0x0f,0x9d,0x87,0x8c,0x64,0xf5,0x8c,0x27,0x48,0xb5,0xb4,0x48,0xf6,0xdf,0xd0,0xed,0xc1,0xb5,0xdc,0xe9,0xd8,0x10,0x20,0x1e,0x63,0x20,0xf0,0x7e,0xa1,0x45,0x35,0x10,0x80,0xea,0xd3,0x3a,0xb2,0xeb,0x89,0x1d,0x6d,0x3d,0xee,0xda,0x77,0x9a,0x58,0xf4,0x97,0xf5,0xb4,0x6c,0x6e,0x9f,0x0b,0x04,0x23,0x51,0x86,
0x3f,0xb7,0x90,0x0e,0xbb,0xf4,0xf3,0x45,0xb6,0xaf,0x7d,0xfd,0x79,0x16,0x5e,0x74,0xbc,0x2f,0x9e,0x8b,0xc8,0x80,0x81,0x86,0xc9,0x7f,0x9c,0x1a,0x02,0x14,0x5c,0xf9,0x1f,0x2a,0x0e,0xb0,0xd7,0x15,0x9d,0x6d,0x17,0x3f,0x40,0x97,0x61,0x11,0x86,0x4d,0xaa,0xa0,0xa4,0x7b,0xfb,0x0a,0xb3,0x64,0x53,0x02,0xf3,0xfa,0x5f,0xfa,0x26,0xd3,
0xbb,0xfc,0xe8,0x28,0x06,0xdc,0x3c,0x95,0x40,0xa8,0x48,0xb2,0xcf,0x91,0x06,0xb3,0x35,0x80,0x9f,0x14,0xd4,0x95,0x3f,0x04,0x83,0xae,0xec,0x4c,0xd7,0xe1,0x51,0xc7,0xda,0xd0,0xb1,0x77,0x11,0x35,0xe3,0x2b,0x88,0x56,0xb6,0xaf,0x6b,0xd6,0xbd,0xf1,0x12,0xab,0x67,0x3c,0xe1,0x9f,0x9a,0x77,0xf4,0x49,0xec,0x79,0xc3,0x7d,0x04,0x82,
0x41,0x49,0x3f,0x07,0x1a,0xdc,0xe1,0x28,0xc6,0x63,0xd4,0x90,0x7e,0x47,0xb9,0x60,0x88,0x9d,0x5f,0x46,0xc5,0x5e,0x11,0xc7,0xdb,0x11,0xad,0x0c,0xb2,0xf7,0x6f,0x3b,0x13,0x8c,0xb4,0x6f,0x84,0xb6,0x64,0xe2,0xa5,0xb4,0x36,0x36,0xf8,0x26,0xe3,0x7b,0x1c,0x7b,0x16,0xb1,0x6b,0x6f,0x27,0x6f,0x13,0x33,0x1e,0x4b,0x5b,0x4b,0x8b,0x3b,
0x56,0xf1,0xee,0xe8,0x07,0xcf,0xe9,0x42,0x23,0x70,0x08,0xd0,0xbb,0x10,0xa2,0xb8,0xd3,0x11,0x25,0x54,0x9f,0xd2,0xd1,0x35,0xed,0x89,0x56,0x86,0x28,0xe9,0x1e,0xa2,0xf6,0xdf,0x89,0x1f,0xfc,0xd9,0xd6,0x4d,0x1b,0x69,0x5e,0xbb,0x9a,0x50,0x59,0x27,0x9a,0x56,0xaf,0xa0,0x79,0xed,0x2a,0x9a,0xeb,0xd6,0xd0,0xb2,0xa1,0x8e,0x96,0x86,
0x0d,0x24,0x37,0x6f,0x22,0x99,0xd8,0x42,0xaa,0xa5,0x99,0x54,0x32,0x49,0x20,0x18,0xf0,0xfc,0x15,0xb4,0xd3,0xde,0xfb,0x10,0xea,0x58,0xc6,0xba,0xd9,0x2f,0xfb,0xdd,0x00,0xe6,0x00,0xb7,0x3d,0xb8,0x96,0xc4,0x8e,0x7c,0x38,0xdb,0x49,0xc0,0x4e,0xc0,0x0b,0xc0,0xfe,0x9e,0x4e,0xa6,0x58,0x98,0x61,0x13,0x2a,0x08,0xb8,0x50,0x13,0x4b,
0xee,0x6b,0xe0,0xf3,0xe9,0x8d,0xb9,0x1f,0xee,0x04,0x83,0x04,0x8a,0xc2,0x04,0xc2,0x11,0x82,0xe1,0xc8,0xd7,0xdf,0x83,0xe1,0x08,0x81,0xc8,0xb7,0xff,0x6d,0x5b,0x3f,0x13,0x28,0x0a,0x7f,0xf3,0x77,0xeb,0x7b,0xb8,0xbc,0x0b,0x3b,0x9d,0x71,0x11,0x81,0x90,0x3d,0xef,0x85,0x2d,0xb8,0x70,0x0c,0x6b,0x5e,0x7d,0xce,0xaf,0xe2,0x9f,0x0d,
0x1c,0x69,0x98,0x6c,0xdc,0xd1,0x5f,0x90,0xd5,0x6c,0x8a,0x61,0xb2,0x21,0x1e,0x63,0x34,0x30,0x1d,0x38,0xc8,0x9b,0x03,0x7f,0xe8,0x77,0x6e,0xa9,0x2b,0xc5,0x0f,0x50,0x7d,0x6a,0x47,0x56,0xce,0xdc,0x42,0xf3,0xc6,0x64,0x4e,0x7f,0x6f,0x2a,0x99,0x24,0xd5,0x94,0x80,0xa6,0x44,0xce,0x16,0x99,0x8b,0x76,0xeb,0xc5,0xe0,0xbb,0xa7,0xdb,
0x26,0xfe,0x2f,0x1e,0xba,0x8d,0x35,0xaf,0x4d,0xf7,0xab,0xf8,0x5f,0x07,0x8e,0x36,0x4c,0xb2,0x1a,0xfb,0x65,0x9d,0xf6,0x56,0x03,0x8e,0x04,0x5e,0xf1,0x62,0x14,0xbb,0x0e,0x8f,0xd2,0xb9,0x7f,0xd8,0xb5,0xed,0x2b,0xea,0x10,0x60,0x97,0x13,0x3b,0xb8,0x3e,0x8e,0x1d,0xfb,0xed,0xc5,0xb0,0xc7,0xe7,0x50,0xba,0xe7,0x10,0xdb,0xc4,0x6f,
0x4e,0x18,0x67,0xad,0x85,0xe8,0x3b,0xe2,0xc0,0x51,0xd9,0x8a,0x3f,0x27,0x06,0x60,0x99,0x40,0x23,0x70,0x34,0xf0,0x92,0xa7,0x2e,0xfe,0x21,0xe8,0x7b,0xa6,0xfb,0x9f,0x30,0xeb,0x7d,0x64,0x09,0xc5,0xdd,0xdc,0xbb,0xd4,0x42,0xc5,0x7e,0x06,0xc3,0x1e,0x9d,0x4d,0x71,0xcf,0x3e,0x12,0x7f,0xfe,0x79,0x11,0x18,0x63,0x69,0x0e,0x57,0x18,
0x80,0x65,0x02,0x9b,0x81,0x63,0x80,0xe7,0xbd,0x12,0xc9,0xee,0x07,0x16,0xd3,0xa1,0x97,0xfb,0xd7,0x30,0x09,0x16,0x05,0xd8,0xf5,0x04,0x77,0x56,0x01,0x3d,0x8e,0x3b,0x9b,0x21,0xf7,0xce,0xa0,0xa8,0xb4,0x93,0xc4,0x9f,0x7f,0xa6,0x03,0xc7,0x5a,0x5a,0xc3,0x55,0x06,0x60,0x99,0x40,0x02,0x38,0x1e,0xf0,0xc4,0x5a,0xcf,0xdd,0xf6,0x8b,
0x7a,0xa6,0xe7,0xbb,0x8e,0x8c,0x66,0xf4,0xe6,0x61,0xfe,0xcb,0xa7,0x00,0xd5,0x17,0x5d,0xcb,0x80,0x3f,0x3d,0x60,0xdb,0x83,0x39,0x3e,0x17,0xff,0xd3,0xc0,0x09,0x96,0xc6,0x70,0xa5,0x01,0x58,0x26,0xd0,0x04,0x9c,0x04,0x3c,0xe9,0xe6,0x68,0x86,0x8a,0x03,0x54,0x0e,0x8e,0x78,0xa6,0xf7,0xc3,0x65,0x41,0xd7,0xcc,0x55,0x04,0x8a,0xc2,
0xec,0x39,0xe1,0x5e,0xaa,0x2f,0xfe,0x83,0x6d,0xc7,0xf4,0xb9,0xf8,0x9f,0x04,0x4e,0xb6,0xb4,0x85,0xab,0x0d,0xc0,0x32,0x81,0x66,0xd2,0x8f,0x28,0x3e,0xee,0xd6,0x88,0x56,0x0e,0x89,0x10,0x0c,0x7b,0xeb,0x41,0x12,0x27,0x9f,0x50,0xfc,0x8a,0xa2,0xd2,0x4e,0x0c,0xbe,0x7b,0x3a,0x3d,0x4f,0xfc,0xa9,0xc4,0x6f,0x0f,0x8f,0x01,0xa7,0x5a,
0x9a,0xc2,0x13,0x06,0x60,0x99,0x40,0x0b,0xe9,0x5d,0x82,0xa6,0xba,0x31,0xaa,0x55,0xfb,0x46,0x3d,0x97,0x09,0x55,0x0e,0x1b,0x40,0xb4,0x47,0x6f,0x6a,0xa6,0xcd,0xa2,0xf2,0x80,0xc3,0x24,0x7e,0x7b,0x78,0x18,0x38,0x23,0x5f,0x5b,0x83,0xe7,0xd5,0x00,0x2c,0x13,0x68,0x25,0xbd,0x4d,0xf8,0x14,0xb7,0x45,0xb6,0xb4,0x8f,0xf7,0x5e,0x28,
0x29,0xe9,0x1e,0x6a,0xf7,0xe3,0xc1,0x39,0x8f,0x57,0xff,0x41,0xec,0xf3,0xf8,0x1c,0x4a,0xfb,0x0f,0x92,0xf8,0xed,0xe1,0x7e,0xe0,0x9c,0x7c,0xec,0x08,0x6c,0x9b,0x01,0x58,0x26,0x90,0x24,0xbd,0x99,0xc1,0x3d,0x6e,0x8a,0x6e,0x7b,0x5f,0xb6,0x71,0x1b,0xd1,0x0a,0xfb,0xdb,0x5d,0x79,0xc0,0x61,0x0c,0x7b,0xe4,0x0d,0x5b,0xd7,0x22,0xf4,
0xb9,0xf8,0xef,0x01,0xce,0xcf,0xe5,0x16,0x60,0x8e,0x19,0x80,0x65,0x02,0x29,0xe0,0x02,0xe0,0x0e,0x37,0x44,0x37,0x10,0x82,0x70,0xb9,0x47,0x0d,0xc0,0x66,0xe3,0xea,0x79,0xe2,0x4f,0xd3,0x2b,0xf2,0x74,0x2c,0x93,0xf8,0xed,0xe1,0x0e,0xe0,0x02,0x4b,0x33,0x79,0xc7,0xb6,0x3a,0xd8,0x3a,0xa1,0x8b,0xe2,0x31,0x9a,0x81,0x71,0x4e,0x46,
0x38,0xd2,0x39,0xe8,0xd9,0x17,0xc9,0x22,0x76,0x55,0x00,0x81,0x00,0xd5,0xbf,0xba,0x8e,0xea,0x8b,0xae,0xb5,0xf5,0xfc,0x7c,0x2e,0xfe,0xc9,0x86,0xc9,0xa5,0x76,0x1e,0xd0,0xf6,0xcb,0xa0,0x61,0x72,0x09,0x0e,0x2f,0x21,0x1e,0x2e,0xf3,0xee,0x9b,0x70,0xe1,0x4e,0xf9,0x6f,0x7b,0x30,0x1c,0x61,0xc0,0xa4,0x29,0x12,0xbf,0xbd,0xdc,0x68,
0xb7,0xf8,0x1d,0x31,0x00,0xcb,0x04,0x2e,0x07,0x6e,0x70,0x2a,0xd2,0xb9,0x7e,0xb1,0xc6,0xd6,0xb6,0x6f,0xc8,0x6f,0xdb,0x8b,0xca,0x3a,0x33,0xf8,0x6f,0x2f,0xd0,0xe3,0xb8,0xb3,0x25,0x7e,0xfb,0x98,0x68,0x98,0x5c,0xe1,0xc4,0x81,0x1d,0xbb,0x14,0x1a,0x26,0x57,0x01,0xd7,0x3b,0x71,0xec,0xa6,0xf5,0x49,0xf0,0x68,0x9e,0x35,0xd5,0xe5,
0xcf,0x00,0x8a,0x7b,0xf6,0x61,0xd8,0x23,0x6f,0xd8,0xbe,0xd0,0xa8,0xcf,0xc5,0xff,0x07,0xc3,0xe4,0x77,0x4e,0x1d,0xdc,0xd1,0x5a,0xd8,0x30,0xf9,0x3d,0x70,0x8d,0xdd,0xc7,0x4d,0xb5,0x5a,0x26,0xe0,0x41,0x12,0x79,0x32,0x80,0xd2,0x3d,0x87,0x30,0xec,0xf1,0x39,0x74,0xec,0xb7,0x97,0xc4,0x6f,0x1f,0x57,0x1b,0x26,0xd7,0x39,0xd9,0x00,
0xc7,0x07,0xc3,0x86,0xc9,0x78,0xe0,0x16,0xdb,0x85,0xb4,0xce,0x9b,0x06,0x90,0x8f,0x0a,0xa0,0xcb,0x81,0x47,0x30,0x6c,0xda,0x2c,0xa2,0xdd,0x7a,0x49,0xfc,0xf6,0x31,0xd9,0x30,0x99,0xe0,0x74,0x23,0xdc,0x32,0x1b,0xf6,0xb9,0xdd,0x07,0xdc,0xf4,0x85,0xf7,0xd6,0x97,0xdf,0xb2,0xba,0x95,0xd6,0x44,0x6e,0xc5,0xd2,0xeb,0xe4,0xb1,0x0c,
0xba,0xeb,0x39,0xdb,0x37,0xde,0xf0,0xb9,0xf8,0x1d,0xc9,0x79,0x37,0x1b,0x40,0xb9,0xdd,0x07,0x5c,0x33,0x37,0xe1,0xb9,0x8c,0x59,0x33,0x37,0x87,0xef,0x82,0x04,0x02,0xec,0x76,0xc9,0x78,0xf6,0x18,0x7f,0x8f,0x6d,0x2b,0xf8,0x48,0xfc,0xce,0xe6,0xfc,0xd6,0x70,0xcb,0xf3,0xb0,0xb6,0x6f,0x72,0xb7,0xf6,0xdd,0x26,0x92,0x2d,0x29,0x82,
0x45,0xde,0x79,0x20,0xa0,0xf6,0xad,0xdc,0x98,0x56,0x30,0x1c,0x61,0x8f,0x89,0xf7,0xd2,0xe3,0x98,0x33,0x6d,0x3f,0x07,0x89,0xdf,0xb9,0x9c,0x77,0x73,0x05,0x60,0x7b,0x30,0x5a,0x37,0xa7,0xa8,0x5b,0xd0,0xec,0x99,0x6c,0x69,0x69,0x48,0x51,0xbf,0x38,0xfb,0x0a,0xa0,0xa8,0x53,0x39,0x83,0xef,0x9d,0x21,0xf1,0xcb,0x00,0xfc,0x6d,0x00,
0x00,0xab,0xff,0xe5,0x9d,0xcd,0x35,0x6b,0xdf,0x4a,0x90,0xca,0xf2,0xb5,0x90,0xe2,0x5e,0xbb,0x30,0xec,0x91,0xd9,0x54,0x8c,0x38,0x44,0xe2,0x97,0x01,0xf8,0x7b,0x0e,0x00,0x60,0xd5,0xcc,0x04,0x9b,0x57,0xb6,0xba,0x3e,0x53,0x52,0xad,0xf0,0xc9,0xdf,0x37,0x65,0xf5,0x3b,0xca,0x06,0xd6,0xb0,0xcf,0x13,0x73,0xe8,0xb8,0xfb,0x00,0x89,
0x5f,0x73,0x00,0xaa,0x00,0x00,0x92,0x2d,0x29,0x3e,0x9a,0xea,0xfe,0x1d,0x75,0x96,0xcf,0xd8,0xcc,0xe6,0x55,0x3b,0x6e,0x54,0x5d,0x7e,0x74,0x14,0x35,0x53,0x67,0x12,0xa9,0xea,0x21,0xf1,0xab,0x02,0x90,0x01,0x7c,0x7b,0x18,0x90,0x60,0xc3,0x52,0xf7,0xce,0x05,0xb4,0x6e,0x4e,0xb1,0x2c,0x8b,0xab,0x7f,0xaf,0x9f,0xfc,0x8c,0x41,0x77,
0x3e,0x43,0xa8,0xa4,0xa3,0xc4,0x2f,0x03,0xd0,0x10,0xe0,0xfb,0xf5,0x35,0x2c,0x9d,0xd2,0xe0,0xda,0x1c,0x5d,0xf6,0xc4,0xa6,0x1d,0x7a,0xfe,0x3f,0x10,0x0c,0xd2,0xf7,0xd7,0x13,0xd9,0xe3,0xfa,0xbb,0x6c,0xbf,0xcd,0x27,0xf1,0xcb,0x00,0xda,0x4d,0x3c,0x46,0x09,0xe0,0xe8,0x5a,0x57,0xf5,0x8b,0x9b,0x59,0x3a,0xc5,0x7d,0x43,0x81,0xd5,
0xff,0x4a,0xf0,0xf9,0x33,0x99,0x2f,0xff,0x1e,0x8c,0x44,0x19,0x70,0xe3,0xc3,0xec,0x72,0xc1,0x95,0x8e,0xb4,0x5b,0xe2,0x6f,0x17,0xd1,0x78,0x8c,0x62,0x55,0x00,0x2e,0x71,0xc2,0xcf,0xa7,0x37,0xf2,0xe5,0x2b,0xee,0xb9,0x2b,0xb0,0x71,0x59,0x0b,0x8b,0x6f,0xdb,0x90,0xb1,0x86,0xc2,0x9d,0x2b,0x19,0x72,0xdf,0x4b,0x74,0x3f,0xfa,0x34,
0x89,0x5f,0x55,0x80,0x0c,0x20,0x93,0xa1,0xc0,0x87,0x77,0x6f,0xa4,0x7e,0xb1,0xf3,0xf3,0x01,0x4d,0xf5,0x49,0x16,0x4e,0x5a,0x9f,0xf1,0x63,0xbf,0x25,0xbd,0xab,0x19,0xf6,0xe8,0x6c,0xca,0xf7,0x3d,0x48,0xe2,0x97,0x01,0x78,0x6a,0x0e,0xc0,0x15,0x24,0x9b,0x53,0x2c,0x98,0x58,0xcf,0xda,0x79,0x4d,0x8e,0xb5,0xa1,0xf1,0xcb,0x56,0xe6,
0x5d,0x5b,0xc7,0x96,0x35,0x99,0xcd,0xfa,0x97,0xed,0xb5,0x0f,0xc3,0x1e,0x9f,0x43,0x87,0xdd,0xf6,0x90,0xf8,0x85,0xa7,0x0c,0xa0,0xce,0x4d,0x01,0x69,0x69,0x4c,0xb1,0xe0,0x86,0x7a,0x3e,0x7b,0xa6,0xd1,0xf6,0x63,0xaf,0x9b,0xdf,0xc4,0xdb,0xff,0xb3,0x8e,0xc6,0xe5,0x99,0x89,0xbf,0x6a,0xd4,0x18,0x6a,0x1e,0x7e,0x9d,0x48,0x97,0x6e,
0x12,0xbf,0xb7,0xa8,0x93,0x01,0xb8,0xcc,0x00,0x00,0x52,0x49,0x58,0xfa,0x40,0x03,0x8b,0xff,0xba,0x81,0x64,0xb3,0x3d,0x49,0xfd,0xf9,0xf4,0x46,0xe6,0x4f,0xa8,0xa7,0xa5,0x21,0xb3,0xe3,0xed,0x74,0xfa,0x2f,0xd8,0xfb,0xf6,0xa7,0x08,0x95,0x38,0xb3,0x77,0xe0,0xca,0xa7,0x1e,0x94,0xf8,0x3d,0x9c,0xfb,0xae,0x78,0x13,0x26,0x1e,0x63,
0x0b,0x0e,0xdf,0x09,0xd8,0x16,0xc5,0x55,0x21,0xaa,0x4f,0xed,0x48,0xcf,0x83,0x8b,0xf3,0x12,0xad,0xfa,0x45,0xcd,0x2c,0x7d,0xa8,0x81,0x0d,0x4b,0x32,0x9b,0x7b,0x08,0x04,0x83,0xf4,0xbd,0x6c,0x12,0x3b,0x8f,0xbd,0xdc,0xd9,0xf9,0x8a,0x35,0x2b,0x99,0x77,0xd6,0x21,0x34,0x7e,0xfc,0x81,0xe4,0x9c,0x19,0x09,0xc3,0x74,0xfe,0x2e,0x80,
0x5b,0x0c,0x60,0x25,0xd0,0xdd,0xcd,0xbd,0x55,0xba,0x4b,0x11,0x7d,0xcf,0x2c,0xa5,0x4b,0x4d,0x6e,0xf6,0x13,0xdc,0xf4,0x59,0x0b,0x4b,0x1f,0x6a,0x60,0xed,0xbb,0x4d,0x19,0x2f,0x4f,0x16,0x8c,0x16,0x33,0xe0,0x4f,0x0f,0xd0,0xed,0xc8,0x53,0x5c,0x11,0x1b,0x99,0xc0,0x8e,0x15,0x4f,0x86,0x49,0x4f,0x19,0x40,0xda,0x00,0x16,0x03,0x7b,
0x78,0xa1,0xd7,0x3a,0xf4,0x0a,0x51,0xb5,0x6f,0x94,0xae,0xc3,0xa3,0xe9,0xcd,0x3a,0x33,0x88,0x60,0xe3,0xf2,0x56,0x6a,0xdf,0x4a,0x50,0xfb,0x56,0x82,0x8d,0x4b,0x9a,0x77,0xa8,0x6a,0x2e,0x2a,0xeb,0xcc,0xa0,0x3b,0x9f,0x71,0x6c,0xa6,0x5f,0x26,0x90,0x33,0x16,0x1b,0x26,0x03,0x64,0x00,0x69,0x03,0x78,0x13,0xd8,0xcf,0x6b,0x3d,0x18,
0x29,0x0f,0x52,0x39,0x28,0x42,0xb4,0x2a,0x48,0xb4,0x32,0x44,0xb4,0x22,0x48,0xa4,0x22,0x48,0x30,0x1c,0x20,0xb1,0xae,0x95,0xa6,0xba,0x24,0x89,0x75,0x49,0x12,0x75,0x49,0xea,0x17,0x35,0xd1,0xb8,0x22,0xbb,0x17,0x8f,0xc2,0x15,0x55,0x0c,0xb9,0xf7,0x45,0xca,0x06,0xd6,0xb8,0x32,0x1e,0x32,0x81,0x8c,0x78,0xd3,0x30,0x39,0xc0,0xe9,
0x46,0xb8,0x65,0x41,0x90,0x7a,0x2f,0xf6,0x60,0x53,0x7d,0x92,0x95,0x33,0xed,0x79,0x78,0x28,0xda,0xad,0x17,0x43,0xee,0x7f,0xd9,0x91,0xb7,0xf9,0xda,0x6d,0x88,0x55,0x3d,0xa8,0x79,0xe8,0x55,0x99,0x80,0x87,0x72,0xde,0x2d,0xcf,0x01,0xd4,0x29,0x1f,0xb6,0x4d,0x49,0xef,0x6a,0x6a,0xa6,0xcd,0x72,0xb5,0xf8,0xbf,0x6b,0x02,0x4e,0x3d,
0x8f,0xe0,0x21,0xea,0x64,0x00,0x32,0x80,0x1f,0x18,0xa0,0x05,0xe8,0x7e,0xd4,0x4f,0xd8,0xe7,0xc9,0xb9,0x94,0xf4,0xd9,0xcd,0x3b,0x43,0x23,0x99,0x80,0x0c,0x40,0x06,0x90,0x1d,0xe1,0xca,0xae,0xec,0x75,0xcb,0xe3,0x0c,0xfc,0xcb,0xa3,0x84,0xcb,0xbb,0x78,0xae,0xfd,0x32,0x01,0x19,0x40,0xc1,0xcf,0x01,0xe4,0x8b,0xae,0xa3,0x4f,0x64,
0xe4,0xf4,0x45,0x74,0x1b,0x7d,0x92,0xa7,0xcf,0x43,0x26,0xa0,0x39,0x80,0xf6,0xd2,0xc7,0xf7,0xd5,0x7e,0x30,0x48,0xd5,0xa8,0x63,0xa8,0x99,0x36,0x8b,0xbd,0x6f,0xfd,0x3b,0xe1,0xca,0xae,0x05,0x71,0x5e,0x32,0x01,0x77,0xe7,0xbc,0xe3,0xb7,0x01,0xe3,0x31,0xae,0xc1,0xa1,0x3d,0x02,0x5d,0xe1,0xc0,0xd1,0x62,0x7a,0x1c,0x77,0x36,0x3b,
0x9f,0x77,0x19,0x1d,0x76,0x8d,0x15,0xec,0x79,0xea,0x16,0xe1,0x56,0xb9,0xc6,0xda,0x19,0xcb,0x9f,0x06,0x10,0x8f,0x71,0x3d,0x0e,0xec,0x0d,0xe8,0xf8,0xf8,0xbe,0xa2,0x8a,0x8a,0x11,0x87,0x50,0xb9,0xff,0xa1,0x54,0x1d,0x7a,0x9c,0x63,0x2f,0xf1,0xc8,0x04,0x5c,0xc1,0xf5,0xd6,0x1e,0x99,0xfe,0x32,0x80,0x78,0x8c,0x89,0xc0,0x95,0x9e,
0xee,0xba,0x40,0xa0,0xdd,0x2f,0xc1,0x04,0x42,0x21,0xca,0x06,0xd4,0x50,0xb1,0xff,0xa1,0x94,0xed,0x39,0x24,0xfd,0xd9,0xaf,0x7e,0xc7,0xf7,0x3a,0x25,0xb0,0xf5,0x63,0x6d,0xe5,0xdf,0x02,0xa1,0x10,0x81,0x70,0x84,0x60,0x51,0x38,0xfd,0x3d,0x1c,0xb1,0xbe,0x7f,0xe7,0xef,0xdf,0xf9,0x7f,0x27,0x96,0x09,0x93,0x09,0x6c,0x93,0x89,0x4e,
0xed,0x10,0x1c,0x70,0x48,0xfc,0x37,0x01,0x97,0xa9,0xdf,0x9d,0x9d,0x73,0x08,0xb4,0x31,0x85,0x8a,0x91,0xa3,0x18,0xf8,0xe7,0x69,0x04,0x42,0x45,0x32,0x01,0x67,0xb8,0xc9,0x30,0xb9,0xbc,0xe0,0x0d,0x20,0x1e,0xe3,0x16,0xe0,0x62,0xf5,0xb7,0xfb,0xa8,0x32,0x8e,0x65,0xef,0xdb,0xfe,0x2e,0x13,0x70,0x8e,0x5b,0x0c,0x93,0x4b,0x0a,0xd2,
0x00,0xe2,0x31,0x02,0xc0,0xed,0xc0,0xcf,0xd5,0xcf,0x32,0x01,0x99,0xc0,0x36,0xb9,0x03,0xf8,0xa5,0x61,0x92,0x2a,0x18,0x03,0x88,0xc7,0x08,0x02,0x77,0x01,0x63,0xd5,0xbf,0x32,0x01,0x99,0xc0,0x0f,0x72,0x0f,0x70,0x81,0x1d,0x26,0x10,0xb0,0x49,0xfc,0xf7,0x01,0xe7,0xa8,0x5f,0x65,0x02,0x32,0x81,0x76,0x33,0x05,0x38,0xdf,0x30,0x49,
0x7a,0xd6,0x00,0xe2,0x31,0x42,0xc0,0x03,0xc0,0x19,0xea,0x4f,0x99,0x80,0x4c,0x20,0x63,0xa6,0x02,0xe7,0x18,0x26,0xad,0x9e,0x33,0x80,0x78,0x8c,0x22,0xeb,0x04,0x4e,0x51,0x3f,0xca,0x04,0x64,0x02,0x3b,0xcc,0x63,0xc0,0x99,0x86,0x49,0x8b,0x67,0x0c,0x20,0x1e,0x23,0x0c,0x3c,0x0a,0x9c,0xa0,0xfe,0x93,0x09,0xc8,0x04,0xb2,0xe6,0x49,
0xe0,0x34,0xc3,0xa4,0xd9,0xf5,0x06,0x10,0x8f,0x11,0x01,0x9e,0x00,0x8e,0x51,0xbf,0xc9,0x04,0x64,0x02,0x39,0xe3,0x69,0xe0,0x14,0xc3,0xa4,0xc9,0xb5,0x06,0x10,0x8f,0x11,0x05,0xfe,0x01,0x1c,0xa5,0xfe,0x92,0x09,0xc8,0x04,0x72,0xce,0x74,0xe0,0x44,0xc3,0x24,0xe1,0x3a,0x03,0xb0,0x36,0xf9,0x7c,0x0a,0x38,0x5c,0xfd,0x24,0x13,0x90,
0x09,0xe4,0x8d,0x97,0x80,0xe3,0x0c,0x93,0xcd,0xae,0x31,0x80,0x78,0x8c,0x0e,0xc0,0xb3,0xc0,0x28,0xf5,0x8f,0x4c,0x40,0x26,0x90,0x77,0x5e,0x01,0xc6,0x18,0x26,0x8d,0x8e,0x1b,0x40,0x3c,0x46,0xa9,0x55,0x9a,0x1c,0xa4,0x7e,0x91,0x09,0xc8,0x04,0x6c,0x63,0x26,0xf0,0x63,0xc3,0xa4,0xc1,0x31,0x03,0x88,0xc7,0xe8,0x04,0xbc,0x00,0xec,
0xaf,0xfe,0x90,0x09,0xc8,0x04,0x6c,0x67,0x36,0x70,0xa4,0x61,0xb2,0xd1,0x76,0x03,0x88,0xc7,0xe8,0x0c,0xbc,0x08,0x8c,0x50,0x3f,0xc8,0x04,0x64,0x02,0x8e,0xf1,0x6f,0x60,0xb4,0x61,0xb2,0x7e,0x47,0x3e,0x9c,0xcd,0x92,0x60,0x7d,0x25,0x7e,0xb1,0x26,0xfe,0x34,0x0b,0x7f,0x75,0x12,0xa9,0xd6,0x96,0xbc,0x1f,0x4b,0xcb,0x8b,0x6d,0x95,
0x11,0x96,0x16,0x1d,0x19,0x02,0x98,0x40,0x3f,0xf5,0x81,0x50,0x25,0xe0,0x18,0xa6,0x61,0xd2,0x7f,0x47,0x3f,0x9c,0xed,0xa2,0xa0,0x8f,0x29,0xfe,0x42,0x95,0x80,0xa3,0x64,0xa5,0xc1,0x6c,0x0d,0xe0,0x11,0xc5,0x5f,0xc8,0x04,0x1c,0xe5,0x11,0xc7,0x0c,0xc0,0x30,0xf9,0x0f,0xf0,0xbe,0x52,0x5f,0x38,0x65,0x02,0x3d,0x8f,0xf7,0xf5,0x5b,
0xe6,0x0b,0x0d,0x93,0xc5,0x4e,0x56,0x00,0x90,0x7e,0xe9,0x47,0x08,0x47,0x4c,0x20,0xd9,0xdc,0xe4,0xe7,0x50,0x67,0xad,0x3d,0x19,0x80,0xf0,0xb4,0x09,0xa4,0x64,0x00,0xce,0x1a,0x80,0x61,0xf2,0x11,0xf0,0xb6,0x52,0x5e,0x38,0x61,0x02,0x3e,0xae,0x00,0xe6,0x1a,0x26,0x1f,0xbb,0xa1,0x02,0x50,0x15,0x20,0x1c,0x33,0x81,0x54,0x73,0xb3,
0x5f,0x43,0x9b,0x13,0xcd,0xe5,0xca,0x00,0x1e,0x03,0x7b,0x56,0x31,0x15,0x32,0x01,0x55,0x00,0xa4,0xc8,0xd1,0x2d,0xf8,0x9c,0x18,0x80,0x61,0xf2,0x05,0xe9,0xe7,0x92,0x85,0xb0,0xd5,0x04,0x7c,0x3a,0x07,0xf0,0x86,0x61,0xb2,0xdc,0x4d,0x15,0x80,0x86,0x01,0xc2,0x11,0x13,0xf0,0x69,0x05,0x90,0x33,0xad,0xe5,0xd2,0x00,0x9e,0x80,0xfc,
0xad,0x5e,0x2a,0x64,0x02,0x5b,0xad,0x00,0x5a,0x7c,0x37,0x07,0xd0,0x6a,0x69,0xcd,0x5d,0x06,0x60,0x98,0xac,0x06,0x5e,0x55,0x8a,0x0b,0x3b,0x4d,0xc0,0x87,0x15,0xc0,0x2b,0x86,0x49,0xad,0x1b,0x2b,0x00,0x80,0x7b,0x95,0xde,0xc2,0x4e,0x13,0xf0,0xe1,0x1c,0xc0,0x7d,0xb9,0xfc,0x65,0xb9,0x36,0x80,0xc7,0x81,0x0f,0x95,0xde,0xc2,0x2e,
0x13,0x48,0x36,0xf9,0xca,0x00,0x3e,0xb4,0x34,0xe6,0x4e,0x03,0xb0,0xb6,0x31,0x9a,0xa0,0xd4,0x16,0x76,0x99,0x80,0xcf,0xe6,0x00,0xc6,0xe7,0x7a,0xab,0xb0,0x60,0x1e,0x1a,0x39,0x0d,0x58,0xa2,0xd4,0x16,0x76,0x98,0x80,0x8f,0x86,0x00,0x4b,0xc8,0xc3,0xdb,0xb7,0x39,0x37,0x00,0x6b,0x1f,0x33,0x55,0x01,0xc2,0x16,0x13,0xf0,0xd1,0x24,
0xe0,0xf8,0x7c,0xec,0x11,0x18,0xcc,0x53,0x63,0xa7,0x02,0x1f,0x29,0xad,0x45,0xbe,0x4d,0xc0,0x27,0x06,0xf0,0x91,0xa5,0x29,0x3c,0x61,0x00,0xd6,0x46,0x86,0x13,0x95,0xd2,0x22,0xdf,0x26,0xe0,0x93,0x21,0xc0,0x84,0x7c,0xed,0x10,0x1c,0xcc,0x63,0xa3,0x1f,0x04,0x96,0x29,0xa5,0x45,0x3e,0x4d,0xc0,0x07,0x2f,0x03,0x7d,0x0c,0x3c,0x94,
0xaf,0x5f,0x9e,0x37,0x03,0x50,0x15,0x20,0xec,0x30,0x01,0x1f,0x0c,0x01,0x26,0xe6,0x6b,0x6b,0xf0,0x7c,0x57,0x00,0x00,0x0f,0x00,0x9f,0x2a,0x9d,0x45,0xbe,0x4c,0xa0,0xc0,0x0d,0xe0,0x13,0xab,0x92,0xc6,0x93,0x06,0x60,0xed,0x67,0x7e,0x83,0x52,0x59,0xe4,0xcb,0x04,0x0a,0x7c,0x0e,0xe0,0x06,0x4b,0x43,0xde,0x34,0x00,0x8b,0xfb,0x81,
0xcf,0x95,0xca,0x22,0x1f,0x26,0x50,0xc0,0x0f,0x02,0x7d,0x66,0x69,0x07,0x4f,0x1b,0x80,0x61,0xd2,0x04,0x4c,0x52,0x1a,0x8b,0x7c,0x98,0x40,0x01,0x0f,0x01,0x26,0xe5,0xfb,0xea,0x6f,0x57,0x05,0x00,0xe9,0x97,0x84,0x54,0x05,0x88,0x9c,0x9b,0x40,0x81,0x56,0x00,0x9f,0x63,0xd3,0x8b,0x75,0xb6,0x18,0x80,0x61,0x92,0x00,0x7e,0xa1,0x14,
0x16,0xb9,0x34,0x81,0x54,0x6b,0x2b,0xa9,0xd6,0x82,0x5c,0x82,0xe2,0xe7,0x56,0xe5,0x5c,0x18,0x06,0x60,0x99,0xc0,0x73,0xe4,0xf1,0x7e,0xa6,0xf0,0x9f,0x09,0xb4,0x6e,0xde,0x54,0x88,0xa7,0xf7,0xa0,0x61,0x32,0xdd,0xae,0x83,0x05,0xec,0x3c,0xb3,0x78,0x8c,0x0a,0x60,0x11,0xd0,0x53,0x69,0x2c,0xb2,0xa5,0xf2,0x80,0xc3,0x58,0x37,0xfb,
0xe5,0x42,0x3a,0xa5,0x15,0xc0,0x40,0xc3,0xa4,0xbe,0x20,0x0d,0xc0,0x32,0x81,0xa3,0x81,0x67,0x95,0xbe,0x42,0x7c,0x8f,0x31,0x56,0xa5,0x6c,0x1b,0x41,0xbb,0xcf,0x50,0x43,0x01,0x21,0xb6,0x59,0xfa,0x3f,0x67,0xf7,0x41,0x83,0x0e,0x9d,0xec,0x38,0xe0,0x4b,0xf5,0xb9,0x10,0x5f,0x97,0xfe,0xe3,0x9c,0x38,0xb0,0x23,0x06,0x60,0x98,0xd4,
0x01,0x3f,0x53,0xbf,0x0b,0x01,0xc0,0x05,0x76,0x8e,0xfb,0xdd,0x50,0x01,0x68,0x28,0x20,0x84,0x83,0xa5,0xbf,0xe3,0x06,0xa0,0xa1,0x80,0x10,0xce,0x95,0xfe,0xae,0x30,0x00,0x6b,0x28,0x70,0x81,0xf2,0x40,0xa8,0xf4,0xf7,0x67,0x05,0x80,0x61,0xf2,0x2c,0xf0,0xb0,0x72,0x41,0xf8,0x8c,0x87,0x9c,0x2c,0xfd,0x5d,0x63,0x00,0x16,0x17,0x6b,
0x28,0x20,0x7c,0xc4,0x97,0x4e,0x97,0xfe,0xae,0x32,0x00,0x6b,0x28,0x70,0x36,0xe4,0x6f,0xe5,0x13,0x21,0x5c,0x42,0x0b,0x70,0xb6,0x95,0xf3,0x32,0x80,0x36,0x26,0xf0,0x4f,0xe0,0xe7,0xca,0x0f,0x51,0xe0,0x5c,0x68,0xe5,0x3a,0x32,0x80,0xef,0x9b,0xc0,0xdf,0xd0,0x3a,0x82,0xa2,0x70,0x99,0x60,0x98,0xee,0xda,0x3f,0x33,0xe8,0xc2,0x20,
0x5d,0x4d,0x7a,0x77,0x21,0x21,0x0a,0x89,0xa9,0x86,0xc9,0xd5,0x6e,0x6b,0x94,0xeb,0x0c,0xc0,0x30,0x49,0x01,0xe7,0x01,0x33,0x1d,0x6a,0xc2,0x7a,0xe0,0x1f,0xc0,0x7b,0xca,0xd9,0x82,0xe1,0x3d,0xab,0x4f,0xd7,0x3b,0x74,0xfc,0xd7,0xad,0x9c,0x46,0x06,0xd0,0x3e,0x13,0x48,0x00,0xc7,0x01,0x1f,0xd8,0x70,0xb8,0x14,0xf0,0x36,0xe9,0xed,
0xcc,0x0e,0x04,0xaa,0x0c,0x93,0x13,0x81,0xe1,0xc0,0x75,0x40,0xb3,0xf4,0xe3,0x59,0x9a,0x81,0xdf,0x03,0xfb,0x5a,0x7d,0x5a,0x65,0xf5,0xf1,0x04,0xab,0xcf,0x53,0x36,0xb4,0xe1,0x03,0xe0,0x78,0xbb,0x16,0xf8,0xc8,0x94,0x80,0x9b,0x7b,0x2f,0x1e,0xa3,0x1a,0x98,0x03,0x74,0xcb,0xf1,0xaf,0x5e,0x05,0xbc,0x68,0x7d,0xbd,0x64,0x98,0xac,
0xd9,0x4e,0x1b,0x86,0x00,0x53,0x80,0xc1,0xd2,0x93,0xe7,0xae,0xfa,0xe7,0x1a,0x26,0xf3,0xb7,0xd3,0xb7,0x5d,0x81,0xc3,0x80,0x23,0x80,0xc3,0x81,0xee,0x79,0xc8,0xb3,0x91,0x86,0xc9,0x27,0x6e,0x0d,0x52,0xc0,0xed,0xbd,0x18,0x8f,0x31,0x1c,0x78,0x15,0xe8,0x90,0xe5,0x95,0x60,0xb6,0x25,0xf8,0x19,0xc0,0x7c,0x6b,0xa8,0xd1,0xde,0x36,
0x84,0x81,0xdf,0x01,0x57,0x01,0x61,0x69,0xcb,0xf5,0x57,0xfd,0x09,0xa4,0x37,0xd4,0x68,0xce,0xa0,0x8f,0x03,0xc0,0x10,0x60,0xb4,0x65,0x08,0xfb,0x67,0xd9,0xd7,0x8d,0xc0,0xc1,0x86,0xc9,0x5c,0x37,0x07,0x2b,0xe0,0x85,0x1e,0x8d,0xc7,0x38,0xd6,0x1a,0xc3,0x65,0x32,0x64,0xf9,0xb8,0x8d,0xe0,0x5f,0x35,0x4c,0x36,0xe6,0xa0,0x1d,0x43,
0x48,0x6f,0x76,0x32,0x48,0x3a,0x73,0x25,0xf3,0xad,0xab,0xfe,0x7b,0x39,0xe8,0xeb,0x32,0x60,0x94,0x65,0x08,0xa3,0x81,0xdd,0x32,0xf8,0x78,0xd2,0x2a,0xfb,0x9f,0x71,0x7b,0xc0,0x02,0x5e,0xe9,0xd9,0x78,0x8c,0x71,0xc0,0xe4,0xed,0xfc,0xc8,0x26,0xe0,0x35,0x4b,0xf0,0x2f,0x1a,0x26,0x4b,0xf2,0xd4,0x8e,0x30,0xe9,0x3b,0x15,0x57,0x01,
0x45,0xd2,0x9c,0x2b,0xf8,0x6a,0x1b,0xba,0xf1,0xf9,0x5a,0x4a,0x3b,0x1e,0xa3,0x5f,0x9b,0xea,0xe0,0x60,0xa0,0xe3,0x76,0x7e,0xfc,0x62,0xc3,0xe4,0x36,0x2f,0x04,0x2e,0xe0,0xa5,0x5e,0x8e,0xc7,0x98,0xcc,0xb7,0x1f,0xa1,0x5c,0xf8,0x95,0xe0,0x81,0x59,0x76,0x4e,0xb4,0xc4,0x63,0xd4,0x58,0x73,0x03,0x7b,0x4b,0x7f,0x8e,0xb2,0xc0,0xba,
0xea,0xbf,0x6b,0x63,0xdf,0x47,0x48,0x4f,0x26,0x7e,0x65,0x08,0x6d,0x73,0x60,0xb2,0x61,0x72,0xa9,0x57,0x82,0xe7,0x35,0x03,0x08,0x92,0x9e,0x99,0x5f,0x66,0x5d,0xe5,0x57,0x38,0xdc,0x9e,0x08,0x70,0x39,0x70,0x19,0x50,0x21,0x2d,0xda,0x4a,0x1d,0x70,0x13,0x70,0xa3,0x1d,0x1b,0x68,0xfc,0x40,0x1e,0xf4,0xb2,0xcc,0xa0,0x1a,0xb8,0xce,
0x30,0x49,0xca,0x00,0x7c,0x44,0x3c,0x46,0x27,0xe0,0x57,0xc0,0xa5,0x40,0x17,0x45,0x24,0xaf,0xac,0x05,0xfe,0x02,0xdc,0x66,0x98,0x6c,0x50,0x38,0x64,0x00,0x6e,0x32,0x82,0x52,0xe0,0x22,0xab,0x22,0xe8,0xaa,0x88,0xe4,0x94,0x5a,0xe0,0x66,0xe0,0x76,0xc3,0xa4,0x41,0xe1,0x90,0x01,0xb8,0xd9,0x08,0x3a,0x92,0x7e,0xb1,0xe9,0x37,0xe4,
0xfe,0xde,0xb2,0xdf,0x58,0x05,0xdc,0x08,0xdc,0x69,0x98,0x34,0x2a,0x1c,0x32,0x00,0x2f,0x19,0x41,0x09,0xe9,0x15,0x8f,0xae,0x40,0x9b,0xa1,0x64,0xca,0x97,0xc0,0xff,0x02,0x77,0x19,0x26,0x9b,0x15,0x0e,0x19,0x80,0x97,0x8d,0xa0,0x18,0xf8,0x6f,0xe0,0xb7,0xc0,0x4e,0x8a,0xc8,0x76,0x59,0x4e,0x7a,0x37,0xe9,0xbf,0x19,0x26,0x5b,0x14,
0x0e,0x19,0x40,0x21,0x19,0xc1,0x8f,0xc1,0xf9,0x65,0xa0,0x5c,0xce,0x8f,0x0d,0x93,0xe7,0x15,0x06,0x7b,0x08,0x2a,0x04,0xb6,0x32,0x13,0xad,0x7a,0xb4,0x3d,0x5a,0x80,0x59,0x0a,0x83,0x0c,0xa0,0x20,0xb1,0x1e,0x47,0x7e,0x47,0x91,0xd8,0x26,0x6f,0xe7,0xe2,0x91,0x6d,0x21,0x03,0x70,0x33,0xaf,0x28,0x04,0x8a,0x8d,0x0c,0x40,0x49,0x2e,
0x14,0x1b,0x19,0x80,0x0f,0x99,0x0d,0xee,0x5c,0x1c,0xc2,0x61,0x12,0xc0,0x9b,0x0a,0x83,0x0c,0xa0,0xd0,0xe7,0x01,0x36,0x93,0x5e,0xe4,0x44,0x7c,0x9b,0x39,0xba,0xdf,0x2f,0x03,0x50,0xa9,0xab,0x98,0x08,0x19,0x80,0x92,0x5d,0x31,0x11,0x32,0x80,0xc2,0xe5,0xdf,0xa0,0xe7,0xda,0xdb,0xd0,0x68,0xc5,0x44,0xc8,0x00,0x7c,0x31,0x0f,0xd0,
0x44,0x7a,0x32,0x50,0xa4,0x79,0xc3,0xe9,0x77,0xfa,0x65,0x00,0x42,0x25,0xaf,0x62,0x21,0x03,0x10,0x4a,0x7a,0xc5,0x42,0x06,0x20,0xf2,0xcf,0x3b,0xa0,0x15,0x6d,0x48,0xef,0xd6,0x33,0x4f,0x61,0x90,0x01,0xf8,0x6d,0x1e,0xa0,0x15,0xe7,0xb6,0x3f,0x73,0x13,0x33,0xad,0x58,0x08,0x19,0x80,0x4a,0x5f,0xc5,0x40,0xc8,0x00,0x94,0xfc,0x8a,
0x81,0x90,0x01,0xf8,0x80,0x05,0xa4,0x57,0xb9,0xf5,0x2b,0x6b,0x48,0xef,0xed,0x20,0x64,0x00,0xbe,0x9c,0x07,0x48,0x91,0xde,0xcd,0xc8,0xaf,0xbc,0x96,0xc9,0x1e,0x8d,0x42,0x06,0xa0,0x12,0x58,0xe7,0x2e,0x64,0x00,0x12,0x81,0xce,0x5d,0xe4,0x02,0x2d,0x0a,0xea,0x02,0xe2,0x31,0x56,0xe0,0xbf,0x65,0xc3,0x57,0x18,0xa6,0x56,0x48,0x56,
0x05,0x20,0x00,0x5e,0xd5,0x39,0x0b,0x19,0x80,0x4a,0x61,0x9d,0xb3,0x90,0x01,0x48,0x0c,0xfe,0x18,0xf9,0xa8,0xdb,0x65,0x00,0x02,0x30,0x4c,0x96,0x01,0x4f,0x93,0x7e,0x2e,0xbe,0xd0,0xa9,0x07,0x9e,0x36,0x4c,0x3e,0x55,0xcf,0x3b,0x8f,0x26,0x01,0xdd,0x74,0x49,0x8c,0x11,0x20,0xbd,0xc7,0x7c,0xcd,0x77,0xbe,0xbc,0xba,0xd3,0xf0,0x6a,
0xe0,0x5d,0xd2,0x2f,0xfb,0xcc,0x03,0xe6,0x19,0x26,0x1f,0xab,0xa7,0x65,0x00,0x22,0x33,0x63,0xe8,0x6d,0x19,0xc1,0xd0,0x36,0xa6,0xd0,0xdb,0x65,0xcd,0xfc,0xa2,0xad,0xd0,0x2d,0xb1,0x2f,0x57,0xef,0xc9,0x00,0x44,0x7e,0x4c,0xa1,0x6b,0x1b,0x33,0xa8,0x06,0xca,0xad,0xaf,0x8a,0x36,0xdf,0x3b,0x03,0x45,0x59,0x1e,0xaa,0xc5,0x1a,0x9a,
0xd4,0x59,0xe5,0xfb,0x57,0xdf,0xeb,0x81,0x65,0x6d,0xc4,0x5e,0xab,0x5e,0x91,0x01,0x08,0xf7,0x19,0x45,0xe9,0x77,0x4c,0xe1,0xbb,0x46,0xc1,0x56,0x84,0xfd,0xb5,0xd8,0x0d,0x93,0x06,0x45,0x51,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0xc2,0x8d,0xfc,
0x3f,0x5c,0x56,0xd9,0x0b,0xad,0xff,0xf9,0xa9,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
};
read_only global String8 lnx_sh_logo_file_bytes = {lnx_sh_logo_file_bytes__data, sizeof(lnx_sh_logo_file_bytes__data)};
C_LINKAGE_END
#endif // LINUX_SHELL_META_H
+189
View File
@@ -0,0 +1,189 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: Generated Code
#include "generated/linux_shell.meta.c"
////////////////////////////////
//~ rjf: @per_os_impl Shell Operations
internal void
sh_message(B32 error, String8 title, String8 message)
{
B32 done = 0;
B32 text_is_long = (str8_find_needle(message, 0, s("\n"), 0) < message.size);
//- rjf: try zenity
if(!done)
{
Temp scratch = scratch_begin(0, 0);
if(text_is_long)
{
String8 cmd = str8f(scratch.arena, "echo \"%S\" | zenity --text-info --no-markup --title=\"%S\"", escaped_from_raw_str8(scratch.arena, message), title);
FILE *f = popen((char *)cmd.str, "r");
done = (f != 0);
pclose(f);
}
else
{
String8 cmd = str8f(scratch.arena, "zenity %s --no-markup --title=\"%S\" --text=\"%S\"", error ? "--error" : "--info", title, escaped_from_raw_str8(scratch.arena, message));
FILE *f = popen((char *)cmd.str, "r");
done = (f != 0);
pclose(f);
}
scratch_end(scratch);
}
//- rjf: fall back to stderr
if(!done)
{
if(error)
{
fprintf(stderr, "[X] ");
}
fprintf(stderr, "%.*s\n", str8_varg(title));
fprintf(stderr, "%.*s\n\n", str8_varg(message));
}
}
internal String8
sh_pick_file(Arena *arena, String8 title, String8 initial_path)
{
String8 result = {0};
B32 done = 0;
//- rjf: try zenity
if(!done)
{
Temp scratch = scratch_begin(&arena, 1);
String8 cmd = str8f(scratch.arena, "zenity --file-selection --filename=\"%S\" --title=\"%S\"", initial_path, title);
FILE *f = popen((char *)cmd.str, "r");
done = (f != 0);
if(done)
{
U64 output_buffer_size = 4096;
char *output_buffer = push_array(scratch.arena, char, output_buffer_size);
char *path = fgets(output_buffer, output_buffer_size, f);
if(path != 0)
{
result = str8_copy(arena, str8_chop(str8_cstring_capped(path, output_buffer+output_buffer_size), 1));
}
}
pclose(f);
scratch_end(scratch);
}
return result;
}
internal void
sh_show_in_file_browser(String8 path)
{
B32 done = 0;
//- rjf: try xdg-open
if(!done)
{
Temp scratch = scratch_begin(0, 0);
String8 cmd = str8f(scratch.arena, "xdg-open %S", str8_chop_last_slash(path));
FILE *f = popen((char *)cmd.str, "r");
pclose(f);
scratch_end(scratch);
}
//- rjf: fallback -> tell user
if(!done)
{
Temp scratch = scratch_begin(0, 0);
sh_message(1, s("Error"), s("Could not find a way to pick a file using the locally installed system utilities."));
scratch_end(scratch);
}
}
internal void
sh_open_in_browser(String8 url)
{
B32 done = 0;
//- rjf: try xdg-open
if(!done)
{
Temp scratch = scratch_begin(0, 0);
String8 cmd = str8f(scratch.arena, "xdg-open %S", url);
FILE *f = popen((char *)cmd.str, "r");
done = (f != 0);
pclose(f);
scratch_end(scratch);
}
//- rjf: fallback -> tell user
if(!done)
{
Temp scratch = scratch_begin(0, 0);
sh_message(1, s("Error"), str8f(scratch.arena, "Could not find a way to open %S in a locally installed browser.", url));
scratch_end(scratch);
}
}
internal void
sh_install_or_uninstall_self(B32 install)
{
Temp scratch = scratch_begin(0, 0);
//- rjf: get xdg local application install info path
String8 application_name = str8_chop_last_dot(str8_skip_last_slash(get_process_info()->binary_file_path));
char *xdg_data_home_cstring = getenv("XDG_DATA_HOME");
String8 desktop_entries_folder_name = str8_cstring(xdg_data_home_cstring);
if(desktop_entries_folder_name.size == 0)
{
char *home = getenv("HOME");
desktop_entries_folder_name = str8f(scratch.arena, "%s/.local/share", home);
}
String8 desktop_file_path = str8f(scratch.arena, "%S/applications/%S.desktop", desktop_entries_folder_name, application_name);
//- rjf: get icon image path
B32 has_icon = 0;
String8 icon_path = {0};
#if LNX_WM_ICON
{
has_icon = 1;
icon_path = str8f(scratch.arena, "%S/%S.png", get_process_info()->user_program_config_data_path, application_name);
}
#endif
//- rjf: install -> write files
if(install)
{
//- rjf: write icon
write_data_to_file_path(icon_path, lnx_sh_logo_file_bytes);
//- rjf: write .desktop file
String8 desktop_file_data = str8f(scratch.arena,
"[Desktop Entry]\n"
"Type=Application\n"
"Version=" BUILD_VERSION_STRING_LITERAL "\n"
"Name=" BUILD_TITLE "\n"
"Comment=" BUILD_TITLE_STRING_LITERAL "\n"
"Exec=%S\n"
"%s%S%s" // (optional icon)
"Terminal=%s\n"
"Categories=Utility;Development;",
get_process_info()->binary_file_path,
has_icon ? "Icon=" : "",
has_icon ? icon_path : s(""),
has_icon ? "\n" : "",
BUILD_CONSOLE_INTERFACE ? "true" : "false");
write_data_to_file_path(desktop_file_path, desktop_file_data);
}
//- rjf: uninstall -> delete files
else
{
delete_file_at_path(icon_path);
delete_file_at_path(desktop_file_path);
}
scratch_end(scratch);
}
+12
View File
@@ -0,0 +1,12 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef LINUX_SHELL_H
#define LINUX_SHELL_H
////////////////////////////////
//~ rjf: Generated Code
#include "generated/linux_shell.meta.h"
#endif // LINUX_SHELL_H
+4
View File
@@ -0,0 +1,4 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
@embed_file lnx_sh_logo_file_bytes: "../data/logo.png"
@@ -381,6 +381,15 @@ wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title)
XFlush(lnx_wm_state->display); XFlush(lnx_wm_state->display);
} }
//- rjf: set class
{
XClassHint *class_hints = XAllocClassHint();
class_hints->res_name = "raddbg";
class_hints->res_class = "RADDBG";
XSetClassHint(lnx_wm_state->display, w->window, class_hints);
XFree(class_hints);
}
//- rjf: create xic //- rjf: create xic
w->xic = XCreateIC(lnx_wm_state->xim, w->xic = XCreateIC(lnx_wm_state->xim,
XNInputStyle, XIMPreeditNothing|XIMStatusNothing, XNInputStyle, XIMPreeditNothing|XIMStatusNothing,
@@ -1097,38 +1106,3 @@ wm_set_cursor(WM_Cursor cursor)
{ {
lnx_wm_state->last_set_cursor = cursor; lnx_wm_state->last_set_cursor = cursor;
} }
////////////////////////////////
//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS)
internal void
wm_graphical_message(B32 error, String8 title, String8 message)
{
if(error)
{
fprintf(stderr, "[X] ");
}
fprintf(stderr, "%.*s\n", str8_varg(title));
fprintf(stderr, "%.*s\n\n", str8_varg(message));
}
internal String8
wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path)
{
return str8_zero();
}
////////////////////////////////
//~ rjf: @per_os_impl Shell Operations
internal void
wm_show_in_filesystem_ui(String8 path)
{
// TODO(rjf)
}
internal void
wm_open_in_browser(String8 url)
{
// TODO(rjf)
}
+1 -1
View File
@@ -440,7 +440,7 @@ RD_VocabInfo rd_vocab_info_table[372] =
RD_NameSchemaInfo rd_name_schema_info_table[39] = RD_NameSchemaInfo rd_name_schema_info_table[39] =
{ {
{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @expand_if(\"$.animations\") @description(\"Controls whether or not a movement trail animation of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transienLine truncated {str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @expand_if(\"$.animations\") @description(\"Controls whether or not a movement trail animation of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transienLine truncated
{str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\ Line truncated {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\ Line truncated
{str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")},
{str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")},
+3
View File
@@ -325,6 +325,9 @@ RD_VocabTable:
//- rjf: update check //- rjf: update check
@default(1) @display_name('Check For Updates') @description("Enables a small network request to check if there is a newer release version available.") @default(1) @display_name('Check For Updates') @description("Enables a small network request to check if there is a newer release version available.")
'check_for_updates': bool, 'check_for_updates': bool,
//- rjf: system installation
@display_name('Install To System') @description("Controls whether or not associated installation files are created on the system, for tighter integration with the operating system shell.") 'install_to_system': bool,
} }
``` ```
} }
+15 -4
View File
@@ -7549,7 +7549,7 @@ rd_window_frame(void)
UI_Signal sig = ui_button(str8_lit("Submit request, issue, or bug report")); UI_Signal sig = ui_button(str8_lit("Submit request, issue, or bug report"));
if(ui_clicked(sig)) if(ui_clicked(sig))
{ {
wm_open_in_browser(url); sh_open_in_browser(url);
} }
} }
ui_spacer(ui_em(0.5f, 1.f)); ui_spacer(ui_em(0.5f, 1.f));
@@ -8018,7 +8018,7 @@ rd_window_frame(void)
ui_box_equip_display_fstrs(label, &fstrs); ui_box_equip_display_fstrs(label, &fstrs);
if(ui_clicked(sig)) if(ui_clicked(sig))
{ {
wm_open_in_browser(s("https://github.com/EpicGames/raddebugger/releases/latest")); sh_open_in_browser(s("https://github.com/EpicGames/raddebugger/releases/latest"));
} }
} }
@@ -13201,6 +13201,17 @@ rd_frame(void)
rd_state->eval_viz_base_string_flags |= EV_StringFlag_DisplayAddressUnmappedStatus; rd_state->eval_viz_base_string_flags |= EV_StringFlag_DisplayAddressUnmappedStatus;
} }
////////////////////////////
//- rjf: do installation/uninstallation of app
//
B32 installed = rd_setting_b32_from_name(s("install_to_system"));
B32 last_installed = rd_state->installed;
if(installed != last_installed)
{
sh_install_or_uninstall_self(installed);
rd_state->installed = installed;
}
//////////////////////////// ////////////////////////////
//- rjf: send update check if needed //- rjf: send update check if needed
// //
@@ -13503,7 +13514,7 @@ rd_frame(void)
{ {
cmd_title = info->string; cmd_title = info->string;
} }
String8 file_path = wm_graphical_pick_file(scratch.arena, cmd_title, current_path_string); String8 file_path = sh_pick_file(scratch.arena, cmd_title, current_path_string);
file_path = path_normalized_from_string(scratch.arena, file_path); file_path = path_normalized_from_string(scratch.arena, file_path);
if(file_path.size != 0) if(file_path.size != 0)
{ {
@@ -15084,7 +15095,7 @@ rd_frame(void)
if(rd_regs()->file_path.size != 0) if(rd_regs()->file_path.size != 0)
{ {
String8 full_path = rd_regs()->file_path; String8 full_path = rd_regs()->file_path;
wm_show_in_filesystem_ui(full_path); sh_show_in_file_browser(full_path);
}break; }break;
//- rjf: source <-> disasm //- rjf: source <-> disasm
+3
View File
@@ -390,6 +390,9 @@ struct RD_State
S32 frame_depth; S32 frame_depth;
U64 frame_eval_memread_endt_us; U64 frame_eval_memread_endt_us;
// rjf: installation setting state
B32 installed;
// rjf: update checker // rjf: update checker
B32 sent_update_check; B32 sent_update_check;
B32 got_update_check; B32 got_update_check;
+22 -20
View File
@@ -387,6 +387,7 @@
#include "minidump/minidump_parse.h" #include "minidump/minidump_parse.h"
#include "mdesk/mdesk.h" #include "mdesk/mdesk.h"
#include "window_manager/window_manager_inc.h" #include "window_manager/window_manager_inc.h"
#include "shell/shell_inc.h"
#include "http/http_inc.h" #include "http/http_inc.h"
#include "symbol_server/symbol_server_inc.h" #include "symbol_server/symbol_server_inc.h"
#include "config/config_inc.h" #include "config/config_inc.h"
@@ -448,6 +449,7 @@
#include "minidump/minidump_parse.c" #include "minidump/minidump_parse.c"
#include "mdesk/mdesk.c" #include "mdesk/mdesk.c"
#include "window_manager/window_manager_inc.c" #include "window_manager/window_manager_inc.c"
#include "shell/shell_inc.c"
#include "http/http_inc.c" #include "http/http_inc.c"
#include "symbol_server/symbol_server_inc.c" #include "symbol_server/symbol_server_inc.c"
#include "config/config_inc.c" #include "config/config_inc.c"
@@ -964,26 +966,26 @@ entry_point(CmdLine *cmd_line)
//- rjf: help message box //- rjf: help message box
case ExecMode_Help: case ExecMode_Help:
{ {
wm_graphical_message(0, sh_message(0,
str8_lit("The RAD Debugger - Help"), str8_lit("The RAD Debugger - Help"),
str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n"
"--user:<path>\n" "--user:<path>\n"
"Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n" "Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n"
"--project:<path>\n" "--project:<path>\n"
"Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made.\n\n" "Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made.\n\n"
"--auto_step\n" "--auto_step\n"
"This will step into all active targets after the debugger initially starts.\n\n" "This will step into all active targets after the debugger initially starts.\n\n"
"--auto_run\n" "--auto_run\n"
"This will run all active targets after the debugger initially starts.\n\n" "This will run all active targets after the debugger initially starts.\n\n"
"--quit_after_success (or -q)\n" "--quit_after_success (or -q)\n"
"This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\n\n" "This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\n\n"
"--ipc <command>\n" "--ipc <command>\n"
"This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n" "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n"
"--gen_crash_dump\n" "--gen_crash_dump\n"
"Generate mini dump on crash.\n\n" "Generate mini dump on crash.\n\n"
"--logs:<path>\n" "--logs:<path>\n"
"Overrides default path to the folder with logs.\n" "Overrides default path to the folder with logs.\n"
)); ));
}break; }break;
} }
+5 -5
View File
@@ -198,7 +198,7 @@ r_init(CmdLine *cmdln)
{ {
char buffer[256] = {0}; char buffer[256] = {0};
raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error); raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error);
wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); sh_message(1, str8_lit("Fatal Error"), str8_cstring(buffer));
abort_self(1); abort_self(1);
} }
ProfEnd(); ProfEnd();
@@ -370,7 +370,7 @@ r_init(CmdLine *cmdln)
{ {
errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(vshad_source_errors), errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(vshad_source_errors),
(U64)vshad_source_errors->lpVtbl->GetBufferSize(vshad_source_errors)); (U64)vshad_source_errors->lpVtbl->GetBufferSize(vshad_source_errors));
wm_graphical_message(1, str8_lit("Vertex Shader Compilation Failure"), errors); sh_message(1, str8_lit("Vertex Shader Compilation Failure"), errors);
} }
else else
{ {
@@ -425,7 +425,7 @@ r_init(CmdLine *cmdln)
{ {
errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(pshad_source_errors), errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(pshad_source_errors),
(U64)pshad_source_errors->lpVtbl->GetBufferSize(pshad_source_errors)); (U64)pshad_source_errors->lpVtbl->GetBufferSize(pshad_source_errors));
wm_graphical_message(1, str8_lit("Pixel Shader Compilation Failure"), errors); sh_message(1, str8_lit("Pixel Shader Compilation Failure"), errors);
} }
else else
{ {
@@ -534,7 +534,7 @@ r_window_equip(WM_Window handle)
{ {
char buffer[256] = {0}; char buffer[256] = {0};
raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error); raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error);
wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); sh_message(1, str8_lit("Fatal Error"), str8_cstring(buffer));
abort_self(1); abort_self(1);
} }
@@ -1052,7 +1052,7 @@ r_window_end_frame(WM_Window window, R_Handle window_equip)
{ {
char buffer[256] = {0}; char buffer[256] = {0};
raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error); raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error);
wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); sh_message(1, str8_lit("Fatal Error"), str8_cstring(buffer));
abort_self(1); abort_self(1);
} }
d_ctx->lpVtbl->ClearState(d_ctx); d_ctx->lpVtbl->ClearState(d_ctx);
@@ -23,7 +23,7 @@ r_ogl_os_init(CmdLine *cmdln)
r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)lnx_wm_state->display); r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)lnx_wm_state->display);
if(r_ogl_lnx_state->display == EGL_NO_DISPLAY) if(r_ogl_lnx_state->display == EGL_NO_DISPLAY)
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display."));
abort_self(1); abort_self(1);
} }
} }
@@ -33,14 +33,14 @@ r_ogl_os_init(CmdLine *cmdln)
EGLint egl_version_minor = 0; EGLint egl_version_minor = 0;
if(!eglInitialize(r_ogl_lnx_state->display, &egl_version_major, &egl_version_minor)) if(!eglInitialize(r_ogl_lnx_state->display, &egl_version_major, &egl_version_minor))
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display."));
abort_self(1); abort_self(1);
} }
if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5)) if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5))
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
String8 message = push_str8f(scratch.arena, "Unsupported EGL version (%i.%i, need at least 1.5)", egl_version_major, egl_version_minor); String8 message = push_str8f(scratch.arena, "Unsupported EGL version (%i.%i, need at least 1.5)", egl_version_major, egl_version_minor);
wm_graphical_message(1, str8_lit("Fatal Error"), message); sh_message(1, str8_lit("Fatal Error"), message);
abort_self(1); abort_self(1);
scratch_end(scratch); scratch_end(scratch);
} }
@@ -48,7 +48,7 @@ r_ogl_os_init(CmdLine *cmdln)
//- rjf: pick GL API //- rjf: pick GL API
if(!eglBindAPI(EGL_OPENGL_API)) if(!eglBindAPI(EGL_OPENGL_API))
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL."));
abort_self(1); abort_self(1);
} }
@@ -71,7 +71,7 @@ r_ogl_os_init(CmdLine *cmdln)
EGLint configs_count = 0; EGLint configs_count = 0;
if(!eglChooseConfig(r_ogl_lnx_state->display, config_filter, configs, ArrayCount(configs), &configs_count) || configs_count == 0) if(!eglChooseConfig(r_ogl_lnx_state->display, config_filter, configs, ArrayCount(configs), &configs_count) || configs_count == 0)
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration."));
abort_self(1); abort_self(1);
} }
int screen = DefaultScreen(lnx_wm_state->display); int screen = DefaultScreen(lnx_wm_state->display);
@@ -97,7 +97,7 @@ r_ogl_os_init(CmdLine *cmdln)
} }
if(vi == 0 || r_ogl_lnx_state->config == 0) if(vi == 0 || r_ogl_lnx_state->config == 0)
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find an EGL config with a matching X11 visual.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find an EGL config with a matching X11 visual."));
abort_self(1); abort_self(1);
} }
lnx_wm_state->window_visual = vi->visual; lnx_wm_state->window_visual = vi->visual;
@@ -125,7 +125,7 @@ r_ogl_os_init(CmdLine *cmdln)
r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, r_ogl_lnx_state->config, EGL_NO_CONTEXT, options); r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, r_ogl_lnx_state->config, EGL_NO_CONTEXT, options);
if(r_ogl_lnx_state->context == EGL_NO_CONTEXT) if(r_ogl_lnx_state->context == EGL_NO_CONTEXT)
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL."));
abort_self(1); abort_self(1);
} }
} }
@@ -168,7 +168,7 @@ r_ogl_os_window_equip(WM_Window window)
} }
if(w->surface == EGL_NO_SURFACE) if(w->surface == EGL_NO_SURFACE)
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface."));
abort_self(1); abort_self(1);
} }
} }
@@ -20,7 +20,7 @@ r_ogl_os_init(CmdLine *cmdln)
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
String8 message = push_str8f(scratch.arena, "Unsupported GLX version (%i.%i, need at least 1.3)", glx_version_major, glx_version_minor); String8 message = push_str8f(scratch.arena, "Unsupported GLX version (%i.%i, need at least 1.3)", glx_version_major, glx_version_minor);
wm_graphical_message(1, str8_lit("Fatal Error"), message); sh_message(1, str8_lit("Fatal Error"), message);
abort_self(1); abort_self(1);
scratch_end(scratch); scratch_end(scratch);
} }
@@ -45,25 +45,25 @@ r_ogl_os_init(CmdLine *cmdln)
GLXFBConfig *framebuffer_configs = glXChooseFBConfig(lnx_wm_state->display, DefaultScreen(lnx_wm_state->display), framebuffer_config_options, &framebuffer_configs_count); GLXFBConfig *framebuffer_configs = glXChooseFBConfig(lnx_wm_state->display, DefaultScreen(lnx_wm_state->display), framebuffer_config_options, &framebuffer_configs_count);
if(framebuffer_configs == 0) if(framebuffer_configs == 0)
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration."));
abort_self(1); abort_self(1);
} }
GLXFBConfig framebuffer_config = framebuffer_configs[0]; GLXFBConfig framebuffer_config = framebuffer_configs[0];
XFree(framebuffer_configs); XFree(framebuffer_configs);
//- extract visual/colormap from chosen fbconfig, publish to os layer //- extract visual/colormap from chosen fbconfig, publish to os layer
{ {
XVisualInfo *vi = glXGetVisualFromFBConfig(lnx_wm_state->display, framebuffer_config); XVisualInfo *vi = glXGetVisualFromFBConfig(lnx_wm_state->display, framebuffer_config);
if(vi == 0) if(vi == 0)
{ {
wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not get visual from GLX framebuffer config.")); sh_message(1, str8_lit("Fatal Error"), str8_lit("Could not get visual from GLX framebuffer config."));
abort_self(1); abort_self(1);
} }
lnx_wm_state->window_visual = vi->visual; lnx_wm_state->window_visual = vi->visual;
lnx_wm_state->window_depth = vi->depth; lnx_wm_state->window_depth = vi->depth;
lnx_wm_state->window_colormap = XCreateColormap(lnx_wm_state->display, lnx_wm_state->window_colormap = XCreateColormap(lnx_wm_state->display,
XRootWindow(lnx_wm_state->display, vi->screen), XRootWindow(lnx_wm_state->display, vi->screen),
vi->visual, AllocNone); vi->visual, AllocNone);
XFree(vi); XFree(vi);
} }
+2
View File
@@ -0,0 +1,2 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
+16
View File
@@ -0,0 +1,16 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef SHELL_H
#define SHELL_H
////////////////////////////////
//~ rjf: @per_os_impl Shell Operations
internal void sh_message(B32 error, String8 title, String8 message);
internal String8 sh_pick_file(Arena *arena, String8 title, String8 initial_path);
internal void sh_show_in_file_browser(String8 path);
internal void sh_open_in_browser(String8 url);
internal void sh_install_or_uninstall_self(B32 install);
#endif // SHELL_H
+11
View File
@@ -0,0 +1,11 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#include "shell.c"
#if OS_WINDOWS
# include "win32/shell/win32_shell.c"
#elif OS_LINUX
# include "linux/shell/linux_shell.c"
#else
# error Shell functions not implemented for this operating system.
#endif
+16
View File
@@ -0,0 +1,16 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef SHELL_INC_H
#define SHELL_INC_H
#include "shell.h"
#if OS_WINDOWS
# include "win32/shell/win32_shell.h"
#elif OS_LINUX
# include "linux/shell/linux_shell.h"
#else
# error Shell functions not implemented for this operating system.
#endif
#endif // SHELL_INC_H
+78
View File
@@ -0,0 +1,78 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: @per_os_impl Shell Operations
internal void
sh_message(B32 error, String8 title, String8 message)
{
Temp scratch = scratch_begin(0, 0);
String16 title16 = str16_from_8(scratch.arena, title);
String16 message16 = str16_from_8(scratch.arena, message);
MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR));
scratch_end(scratch);
}
internal String8
sh_pick_file(Arena *arena, String8 title, String8 initial_path)
{
String8 result = {0};
{
Temp scratch = scratch_begin(&arena, 1);
U64 buffer_size = 4096;
U16 *buffer = push_array(scratch.arena, U16, buffer_size);
OPENFILENAMEW params = {sizeof(params)};
{
params.lpstrTitle = (WCHAR *)str16_from_8(scratch.arena, title).str;
params.lpstrFile = (WCHAR *)buffer;
params.nMaxFile = buffer_size;
params.lpstrInitialDir = (WCHAR *)str16_from_8(scratch.arena, initial_path).str;
}
if(GetOpenFileNameW(&params))
{
result = str8_from_16(arena, str16_cstring((U16 *)buffer));
}
scratch_end(scratch);
}
return result;
}
internal void
sh_show_in_file_browser(String8 path)
{
Temp scratch = scratch_begin(0, 0);
String8 path_copy = push_str8_copy(scratch.arena, path);
for(U64 idx = 0; idx < path_copy.size; idx += 1)
{
if(path_copy.str[idx] == '/')
{
path_copy.str[idx] = '\\';
}
}
String16 path16 = str16_from_8(scratch.arena, path_copy);
SFGAOF flags = 0;
PIDLIST_ABSOLUTE list = 0;
if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags)))
{
HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0);
CoTaskMemFree(list);
(void)hr;
}
scratch_end(scratch);
}
internal void
sh_open_in_browser(String8 url)
{
Temp scratch = scratch_begin(0, 0);
String16 url16 = str16_from_8(scratch.arena, url);
ShellExecuteW(0, L"open", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL);
scratch_end(scratch);
}
internal void
sh_install_or_uninstall_self(B32 install)
{
// TODO(rjf)
}
+7
View File
@@ -0,0 +1,7 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef WIN32_SHELL_H
#define WIN32_SHELL_H
#endif // WIN32_SHELL_H
@@ -1618,76 +1618,3 @@ hcursor = curs; }break;
w32_wm_state->hCursor = hcursor; w32_wm_state->hCursor = hcursor;
} }
} }
////////////////////////////////
//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS)
internal void
wm_graphical_message(B32 error, String8 title, String8 message)
{
Temp scratch = scratch_begin(0, 0);
String16 title16 = str16_from_8(scratch.arena, title);
String16 message16 = str16_from_8(scratch.arena, message);
MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR));
scratch_end(scratch);
}
internal String8
wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path)
{
String8 result = {0};
{
Temp scratch = scratch_begin(&arena, 1);
U64 buffer_size = 4096;
U16 *buffer = push_array(scratch.arena, U16, buffer_size);
OPENFILENAMEW params = {sizeof(params)};
{
params.lpstrTitle = (WCHAR *)str16_from_8(scratch.arena, title).str;
params.lpstrFile = (WCHAR *)buffer;
params.nMaxFile = buffer_size;
params.lpstrInitialDir = (WCHAR *)str16_from_8(scratch.arena, initial_path).str;
}
if(GetOpenFileNameW(&params))
{
result = str8_from_16(arena, str16_cstring((U16 *)buffer));
}
scratch_end(scratch);
}
return result;
}
////////////////////////////////
//~ rjf: @per_os_impl Shell Operations
internal void
wm_show_in_filesystem_ui(String8 path)
{
Temp scratch = scratch_begin(0, 0);
String8 path_copy = push_str8_copy(scratch.arena, path);
for(U64 idx = 0; idx < path_copy.size; idx += 1)
{
if(path_copy.str[idx] == '/')
{
path_copy.str[idx] = '\\';
}
}
String16 path16 = str16_from_8(scratch.arena, path_copy);
SFGAOF flags = 0;
PIDLIST_ABSOLUTE list = 0;
if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags)))
{
HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0);
CoTaskMemFree(list);
(void)hr;
}
scratch_end(scratch);
}
internal void
wm_open_in_browser(String8 url)
{
Temp scratch = scratch_begin(0, 0);
String16 url16 = str16_from_8(scratch.arena, url);
ShellExecuteW(0, L"open", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL);
scratch_end(scratch);
}
-12
View File
@@ -231,16 +231,4 @@ internal Vec2F32 wm_mouse_from_window(WM_Window window);
internal void wm_set_cursor(WM_Cursor cursor); internal void wm_set_cursor(WM_Cursor cursor);
////////////////////////////////
//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS)
internal void wm_graphical_message(B32 error, String8 title, String8 message);
internal String8 wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path);
////////////////////////////////
//~ rjf: @per_os_impl Shell Operations
internal void wm_show_in_filesystem_ui(String8 path);
internal void wm_open_in_browser(String8 url);
#endif // WINDOW_MANAGER_H #endif // WINDOW_MANAGER_H
-27
View File
@@ -249,30 +249,3 @@ internal void
wm_set_cursor(WM_Cursor cursor) wm_set_cursor(WM_Cursor cursor)
{ {
} }
////////////////////////////////
//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS)
internal void
wm_graphical_message(B32 error, String8 title, String8 message)
{
}
internal String8
wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path)
{
return str8_zero();
}
////////////////////////////////
//~ rjf: @per_os_impl Shell Operations
internal void
wm_show_in_filesystem_ui(String8 path)
{
}
internal void
wm_open_in_browser(String8 url)
{
}