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
+526 -176

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, },
//- 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 = "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, },
+6 -6
View File
@@ -69,13 +69,13 @@ arena_alloc_(ArenaParams *params)
}
// rjf: panic on arena creation failure
#if OS_FEATURE_GRAPHICAL
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);
}
#endif
// rjf: extract arena header & fill
AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE);
@@ -295,13 +295,13 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero)
#endif
// rjf: panic on failure
#if OS_FEATURE_GRAPHICAL
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);
}
#endif
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);
}
//- 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
w->xic = XCreateIC(lnx_wm_state->xim,
XNInputStyle, XIMPreeditNothing|XIMStatusNothing,
@@ -1097,38 +1106,3 @@ wm_set_cursor(WM_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] =
{
{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("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")},
+3
View File
@@ -325,6 +325,9 @@ RD_VocabTable:
//- 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.")
'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"));
if(ui_clicked(sig))
{
wm_open_in_browser(url);
sh_open_in_browser(url);
}
}
ui_spacer(ui_em(0.5f, 1.f));
@@ -8018,7 +8018,7 @@ rd_window_frame(void)
ui_box_equip_display_fstrs(label, &fstrs);
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;
}
////////////////////////////
//- 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
//
@@ -13503,7 +13514,7 @@ rd_frame(void)
{
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);
if(file_path.size != 0)
{
@@ -15084,7 +15095,7 @@ rd_frame(void)
if(rd_regs()->file_path.size != 0)
{
String8 full_path = rd_regs()->file_path;
wm_show_in_filesystem_ui(full_path);
sh_show_in_file_browser(full_path);
}break;
//- rjf: source <-> disasm
+3
View File
@@ -390,6 +390,9 @@ struct RD_State
S32 frame_depth;
U64 frame_eval_memread_endt_us;
// rjf: installation setting state
B32 installed;
// rjf: update checker
B32 sent_update_check;
B32 got_update_check;
+3 -1
View File
@@ -387,6 +387,7 @@
#include "minidump/minidump_parse.h"
#include "mdesk/mdesk.h"
#include "window_manager/window_manager_inc.h"
#include "shell/shell_inc.h"
#include "http/http_inc.h"
#include "symbol_server/symbol_server_inc.h"
#include "config/config_inc.h"
@@ -448,6 +449,7 @@
#include "minidump/minidump_parse.c"
#include "mdesk/mdesk.c"
#include "window_manager/window_manager_inc.c"
#include "shell/shell_inc.c"
#include "http/http_inc.c"
#include "symbol_server/symbol_server_inc.c"
#include "config/config_inc.c"
@@ -964,7 +966,7 @@ entry_point(CmdLine *cmd_line)
//- rjf: help message box
case ExecMode_Help:
{
wm_graphical_message(0,
sh_message(0,
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"
"--user:<path>\n"
+5 -5
View File
@@ -198,7 +198,7 @@ r_init(CmdLine *cmdln)
{
char buffer[256] = {0};
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);
}
ProfEnd();
@@ -370,7 +370,7 @@ r_init(CmdLine *cmdln)
{
errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(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
{
@@ -425,7 +425,7 @@ r_init(CmdLine *cmdln)
{
errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(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
{
@@ -534,7 +534,7 @@ r_window_equip(WM_Window handle)
{
char buffer[256] = {0};
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);
}
@@ -1052,7 +1052,7 @@ r_window_end_frame(WM_Window window, R_Handle window_equip)
{
char buffer[256] = {0};
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);
}
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);
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);
}
}
@@ -33,14 +33,14 @@ r_ogl_os_init(CmdLine *cmdln)
EGLint egl_version_minor = 0;
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);
}
if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5))
{
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);
wm_graphical_message(1, str8_lit("Fatal Error"), message);
sh_message(1, str8_lit("Fatal Error"), message);
abort_self(1);
scratch_end(scratch);
}
@@ -48,7 +48,7 @@ r_ogl_os_init(CmdLine *cmdln)
//- rjf: pick GL 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);
}
@@ -71,7 +71,7 @@ r_ogl_os_init(CmdLine *cmdln)
EGLint 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);
}
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)
{
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);
}
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);
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);
}
}
@@ -168,7 +168,7 @@ r_ogl_os_window_equip(WM_Window window)
}
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);
}
}
@@ -20,7 +20,7 @@ r_ogl_os_init(CmdLine *cmdln)
{
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);
wm_graphical_message(1, str8_lit("Fatal Error"), message);
sh_message(1, str8_lit("Fatal Error"), message);
abort_self(1);
scratch_end(scratch);
}
@@ -45,7 +45,7 @@ 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);
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);
}
GLXFBConfig framebuffer_config = framebuffer_configs[0];
@@ -56,7 +56,7 @@ r_ogl_os_init(CmdLine *cmdln)
XVisualInfo *vi = glXGetVisualFromFBConfig(lnx_wm_state->display, framebuffer_config);
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);
}
lnx_wm_state->window_visual = vi->visual;
+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;
}
}
////////////////////////////////
//~ 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);
////////////////////////////////
//~ 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
-27
View File
@@ -249,30 +249,3 @@ 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)
{
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)
{
}