From cbd6b20e9d6cd6708c52487efef52198b9f20566 Mon Sep 17 00:00:00 2001 From: KaruroChori Date: Wed, 7 Aug 2024 08:53:25 +0000 Subject: [PATCH] sqlite: add support for loading sqlite extensions --- CMakeLists.txt | 7 + src/bundles/c/stdlib/sqlite.c | 687 ++++++++++++++++--------------- src/js/stdlib/sqlite.js | 4 + src/mod_sqlite3.c | 36 ++ tests/fixtures/sqlite-test-ext.c | 29 ++ tests/test-sqlite.js | 22 +- types/src/sqlite.d.ts | 8 + 7 files changed, 457 insertions(+), 336 deletions(-) create mode 100644 tests/fixtures/sqlite-test-ext.c diff --git a/CMakeLists.txt b/CMakeLists.txt index d0cd182c..d57a6844 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,6 +113,13 @@ add_library(ffi-test SHARED tests/fixtures/ffi-test-lib.c ) +add_library(sqlite-test SHARED + tests/fixtures/sqlite-test-ext.c +) + +target_link_libraries(sqlite-test sqlite3) + + if(NOT USE_EXTERNAL_FFI AND NOT MINGW AND NOT APPLE) set(LIBFFI_SRC "${CMAKE_CURRENT_SOURCE_DIR}/deps/libffi") set(TMP_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/ffi_root") diff --git a/src/bundles/c/stdlib/sqlite.c b/src/bundles/c/stdlib/sqlite.c index bad8e139..9e8fb170 100644 --- a/src/bundles/c/stdlib/sqlite.c +++ b/src/bundles/c/stdlib/sqlite.c @@ -2,15 +2,15 @@ #include -const uint32_t tjs__sqlite_size = 2919; +const uint32_t tjs__sqlite_size = 3052; -const uint8_t tjs__sqlite[2919] = { - 0x0c, 0x44, 0x14, 0x74, 0x6a, 0x73, 0x3a, 0x73, +const uint8_t tjs__sqlite[3052] = { + 0x0c, 0x46, 0x14, 0x74, 0x6a, 0x73, 0x3a, 0x73, 0x71, 0x6c, 0x69, 0x74, 0x65, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x02, 0x54, - 0x02, 0x6e, 0x02, 0x73, 0x02, 0x68, 0x02, 0x6d, - 0x02, 0x49, 0x02, 0x75, 0x02, 0x6f, 0x02, 0x45, - 0x02, 0x65, 0x02, 0x72, 0x02, 0x6c, 0x10, 0x3a, + 0x02, 0x69, 0x02, 0x6f, 0x02, 0x68, 0x02, 0x64, + 0x02, 0x49, 0x02, 0x75, 0x02, 0x73, 0x02, 0x45, + 0x02, 0x65, 0x02, 0x74, 0x02, 0x6c, 0x10, 0x3a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x3a, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x24, @@ -27,7 +27,7 @@ const uint8_t tjs__sqlite[2919] = { 0x20, 0x44, 0x42, 0x0e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x1c, 0x69, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x02, 0x69, 0x50, 0x45, 0x78, 0x70, + 0x6f, 0x6e, 0x02, 0x6e, 0x50, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, @@ -36,339 +36,356 @@ const uint8_t tjs__sqlite[2919] = { 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x12, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x76, 0x65, 0x02, 0x74, 0x0c, 0x43, 0x4f, 0x4d, - 0x4d, 0x49, 0x54, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x10, 0x52, 0x4f, 0x4c, 0x4c, 0x42, - 0x41, 0x43, 0x4b, 0x10, 0x72, 0x6f, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x26, 0x53, 0x41, 0x56, - 0x45, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x20, 0x60, - 0x09, 0x5f, 0x62, 0x73, 0x33, 0x2e, 0x09, 0x60, - 0x12, 0x73, 0x61, 0x76, 0x65, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x22, 0x52, 0x45, 0x4c, 0x45, 0x41, - 0x53, 0x45, 0x20, 0x60, 0x09, 0x5f, 0x62, 0x73, - 0x33, 0x2e, 0x09, 0x60, 0x0e, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x2a, 0x52, 0x4f, 0x4c, - 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x20, 0x54, 0x4f, - 0x20, 0x60, 0x09, 0x5f, 0x62, 0x73, 0x33, 0x2e, - 0x09, 0x60, 0x14, 0x72, 0x6f, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x54, 0x6f, 0x0c, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x0a, 0x42, 0x45, 0x47, - 0x49, 0x4e, 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e, - 0x1c, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x44, - 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x1e, - 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x49, 0x4d, - 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, 0x1e, - 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x45, 0x58, - 0x43, 0x4c, 0x55, 0x53, 0x49, 0x56, 0x45, 0x02, - 0x64, 0x02, 0x4f, 0x02, 0x76, 0x02, 0x70, 0x02, - 0x61, 0x02, 0x63, 0x02, 0x66, 0x1a, 0x69, 0x6e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x06, 0x72, 0x75, 0x6e, 0x08, - 0x63, 0x61, 0x6c, 0x6c, 0x1a, 0x73, 0x74, 0x6d, - 0x74, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x16, 0x73, 0x74, 0x6d, 0x74, 0x5f, - 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x10, 0x73, - 0x74, 0x6d, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x10, - 0x73, 0x74, 0x6d, 0x74, 0x5f, 0x72, 0x75, 0x6e, - 0x22, 0x74, 0x6a, 0x73, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x0e, 0x73, 0x71, 0x6c, 0x69, 0x74, - 0x65, 0x33, 0x1c, 0x6b, 0x53, 0x71, 0x6c, 0x69, - 0x74, 0x65, 0x33, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x6b, 0x53, - 0x71, 0x6c, 0x69, 0x74, 0x65, 0x33, 0x53, 0x74, - 0x6d, 0x74, 0x10, 0x66, 0x69, 0x6e, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x06, 0x61, 0x6c, 0x6c, 0x0d, - 0xb2, 0x03, 0x00, 0x01, 0x00, 0x04, 0xb4, 0x03, - 0x00, 0x00, 0x00, 0x0c, 0x20, 0xfa, 0x01, 0x9e, - 0x01, 0x00, 0x02, 0x00, 0x04, 0x09, 0x0d, 0xc5, - 0x01, 0x02, 0xea, 0x01, 0x03, 0x00, 0x70, 0xea, - 0x01, 0x05, 0x00, 0x70, 0xb6, 0x03, 0x00, 0x01, - 0xb8, 0x03, 0x01, 0x01, 0xba, 0x03, 0x02, 0x01, - 0xbc, 0x03, 0x03, 0x01, 0xbe, 0x03, 0x04, 0x01, - 0xc0, 0x03, 0x05, 0x01, 0xc2, 0x03, 0x06, 0x01, - 0xc4, 0x03, 0x07, 0x01, 0xc6, 0x03, 0x08, 0x01, - 0x0c, 0x40, 0xfb, 0x01, 0x00, 0x02, 0x04, 0x00, - 0x06, 0x03, 0x00, 0x9b, 0x01, 0x06, 0xc8, 0x03, - 0x00, 0x01, 0x00, 0xca, 0x03, 0x00, 0x01, 0x00, - 0xc8, 0x03, 0x01, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0x20, 0xca, 0x03, 0x01, 0x01, 0x20, 0xcc, 0x03, - 0x02, 0x00, 0x20, 0x10, 0x00, 0x01, 0x00, 0xea, - 0x01, 0x00, 0x0d, 0xb8, 0x03, 0x01, 0x00, 0xba, - 0x03, 0x02, 0x00, 0x08, 0xcb, 0x2b, 0x65, 0x00, - 0x00, 0x11, 0xe9, 0x06, 0xc7, 0x1b, 0x24, 0x00, - 0x00, 0x0e, 0x61, 0x01, 0x00, 0x61, 0x00, 0x00, - 0xd0, 0x11, 0xf1, 0xe9, 0x08, 0x0e, 0x04, 0xe7, - 0x00, 0x00, 0x00, 0xd8, 0xc8, 0xd1, 0x11, 0xf1, - 0xe9, 0x12, 0x0e, 0x0b, 0xb3, 0x96, 0x4c, 0xe8, - 0x00, 0x00, 0x00, 0xb4, 0x96, 0x4c, 0xe9, 0x00, - 0x00, 0x00, 0xd9, 0xc9, 0x61, 0x02, 0x00, 0xb3, - 0xca, 0xd1, 0x41, 0xe8, 0x00, 0x00, 0x00, 0x11, - 0xe9, 0x10, 0x0e, 0x62, 0x02, 0x00, 0xdd, 0x41, - 0xea, 0x00, 0x00, 0x00, 0xa4, 0x11, 0x63, 0x02, - 0x00, 0x0e, 0xd1, 0x41, 0xe9, 0x00, 0x00, 0x00, - 0xe9, 0x11, 0x62, 0x02, 0x00, 0xdd, 0x41, 0xeb, - 0x00, 0x00, 0x00, 0xa4, 0x11, 0x63, 0x02, 0x00, - 0xeb, 0x0f, 0x62, 0x02, 0x00, 0xdd, 0x41, 0xec, - 0x00, 0x00, 0x00, 0xa4, 0x11, 0x63, 0x02, 0x00, - 0x0e, 0xc7, 0xde, 0x1b, 0x11, 0xb0, 0xea, 0x04, - 0x1b, 0x71, 0x1b, 0x1b, 0xdd, 0x42, 0xed, 0x00, - 0x00, 0x00, 0xd0, 0x62, 0x02, 0x00, 0x24, 0x02, - 0x00, 0x1b, 0x71, 0x1b, 0x49, 0x29, 0xb2, 0x03, - 0x01, 0x04, 0x05, 0x00, 0x3c, 0x00, 0xae, 0x02, - 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x04, 0x02, 0x00, 0x28, 0x01, 0x10, 0x00, - 0x01, 0x00, 0xba, 0x03, 0x02, 0x00, 0xb8, 0x03, - 0x01, 0x00, 0x08, 0xc8, 0xc4, 0xdc, 0x47, 0x11, - 0xe9, 0x20, 0x0e, 0xdd, 0x42, 0xee, 0x00, 0x00, - 0x00, 0xc4, 0xdc, 0x47, 0x24, 0x01, 0x00, 0x0e, - 0xc4, 0xdc, 0x1b, 0x11, 0xb0, 0xea, 0x04, 0x1b, - 0x71, 0x1b, 0x1b, 0x07, 0x1b, 0x71, 0x1b, 0x16, - 0x49, 0x29, 0xb2, 0x03, 0x01, 0x9b, 0x01, 0x00, - 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, 0x01, 0x01, - 0x01, 0x04, 0x02, 0x00, 0x25, 0x02, 0xc8, 0x03, - 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0xba, - 0x03, 0x02, 0x00, 0xb8, 0x03, 0x01, 0x00, 0x08, - 0xc8, 0xc4, 0xdc, 0x47, 0x96, 0xe9, 0x10, 0x38, - 0x92, 0x00, 0x00, 0x00, 0x11, 0x04, 0xef, 0x00, - 0x00, 0x00, 0x21, 0x01, 0x00, 0x2f, 0xdd, 0x42, - 0x85, 0x00, 0x00, 0x00, 0xc4, 0xdc, 0x47, 0xd0, - 0x24, 0x02, 0x00, 0x29, 0xb2, 0x03, 0x01, 0x9b, - 0x01, 0x03, 0x2a, 0x96, 0x03, 0x00, 0x0c, 0x42, - 0xfb, 0x01, 0x00, 0x01, 0x01, 0x01, 0x06, 0x03, - 0x00, 0x2a, 0x02, 0xc8, 0x03, 0x00, 0x01, 0x00, - 0x10, 0x00, 0x01, 0x00, 0xba, 0x03, 0x02, 0x00, - 0xc6, 0x03, 0x08, 0x00, 0xb8, 0x03, 0x01, 0x00, - 0x08, 0xc8, 0xc4, 0xdc, 0x47, 0x96, 0xe9, 0x10, - 0x38, 0x92, 0x00, 0x00, 0x00, 0x11, 0x04, 0xef, - 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2f, 0xdd, - 0x11, 0xde, 0x42, 0xf0, 0x00, 0x00, 0x00, 0xc4, - 0xdc, 0x47, 0xd0, 0x24, 0x02, 0x00, 0x21, 0x01, - 0x00, 0x28, 0xb2, 0x03, 0x01, 0xe6, 0x02, 0x05, - 0x2a, 0x8e, 0x01, 0x4d, 0x3e, 0x00, 0x0c, 0x42, + 0x76, 0x65, 0x1c, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x02, 0x72, 0x0c, 0x43, 0x4f, 0x4d, 0x4d, + 0x49, 0x54, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x10, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, + 0x43, 0x4b, 0x10, 0x72, 0x6f, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x26, 0x53, 0x41, 0x56, 0x45, + 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x20, 0x60, 0x09, + 0x5f, 0x62, 0x73, 0x33, 0x2e, 0x09, 0x60, 0x12, + 0x73, 0x61, 0x76, 0x65, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x22, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, + 0x45, 0x20, 0x60, 0x09, 0x5f, 0x62, 0x73, 0x33, + 0x2e, 0x09, 0x60, 0x0e, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x2a, 0x52, 0x4f, 0x4c, 0x4c, + 0x42, 0x41, 0x43, 0x4b, 0x20, 0x54, 0x4f, 0x20, + 0x60, 0x09, 0x5f, 0x62, 0x73, 0x33, 0x2e, 0x09, + 0x60, 0x14, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x54, 0x6f, 0x0c, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x0a, 0x42, 0x45, 0x47, 0x49, + 0x4e, 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x1c, + 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x44, 0x45, + 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x1e, 0x42, + 0x45, 0x47, 0x49, 0x4e, 0x20, 0x49, 0x4d, 0x4d, + 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, 0x1e, 0x42, + 0x45, 0x47, 0x49, 0x4e, 0x20, 0x45, 0x58, 0x43, + 0x4c, 0x55, 0x53, 0x49, 0x56, 0x45, 0x02, 0x6d, + 0x02, 0x4f, 0x02, 0x76, 0x02, 0x70, 0x02, 0x61, + 0x02, 0x63, 0x02, 0x66, 0x1a, 0x69, 0x6e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x06, 0x72, 0x75, 0x6e, 0x08, 0x63, + 0x61, 0x6c, 0x6c, 0x1a, 0x73, 0x74, 0x6d, 0x74, + 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x16, 0x73, 0x74, 0x6d, 0x74, 0x5f, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x10, 0x73, 0x74, + 0x6d, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x10, 0x73, + 0x74, 0x6d, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x22, + 0x74, 0x6a, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x0e, 0x73, 0x71, 0x6c, 0x69, 0x74, 0x65, + 0x33, 0x1c, 0x6b, 0x53, 0x71, 0x6c, 0x69, 0x74, + 0x65, 0x33, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x6c, 0x6f, 0x61, + 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x6b, 0x53, 0x71, 0x6c, 0x69, + 0x74, 0x65, 0x33, 0x53, 0x74, 0x6d, 0x74, 0x10, + 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x06, 0x61, 0x6c, 0x6c, 0x0d, 0xb2, 0x03, 0x00, + 0x01, 0x00, 0x04, 0xb4, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x20, 0xfa, 0x01, 0x9e, 0x01, 0x00, 0x02, + 0x00, 0x04, 0x09, 0x0e, 0xcd, 0x01, 0x02, 0xea, + 0x01, 0x03, 0x00, 0x70, 0xea, 0x01, 0x05, 0x00, + 0x70, 0xb6, 0x03, 0x00, 0x01, 0xb8, 0x03, 0x01, + 0x01, 0xba, 0x03, 0x02, 0x01, 0xbc, 0x03, 0x03, + 0x01, 0xbe, 0x03, 0x04, 0x01, 0xc0, 0x03, 0x05, + 0x01, 0xc2, 0x03, 0x06, 0x01, 0xc4, 0x03, 0x07, + 0x01, 0xc6, 0x03, 0x08, 0x01, 0x0c, 0x40, 0xfb, + 0x01, 0x00, 0x02, 0x04, 0x00, 0x06, 0x03, 0x00, + 0x9b, 0x01, 0x06, 0xc8, 0x03, 0x00, 0x01, 0x00, + 0xca, 0x03, 0x00, 0x01, 0x00, 0xc8, 0x03, 0x01, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x20, 0xca, 0x03, + 0x01, 0x01, 0x20, 0xcc, 0x03, 0x02, 0x00, 0x20, + 0x10, 0x00, 0x01, 0x00, 0xea, 0x01, 0x00, 0x0d, + 0xb8, 0x03, 0x01, 0x00, 0xba, 0x03, 0x02, 0x00, + 0x08, 0xcb, 0x2b, 0x65, 0x00, 0x00, 0x11, 0xe9, + 0x06, 0xc7, 0x1b, 0x24, 0x00, 0x00, 0x0e, 0x61, + 0x01, 0x00, 0x61, 0x00, 0x00, 0xd0, 0x11, 0xf1, + 0xe9, 0x08, 0x0e, 0x04, 0xe7, 0x00, 0x00, 0x00, + 0xd8, 0xc8, 0xd1, 0x11, 0xf1, 0xe9, 0x12, 0x0e, + 0x0b, 0xb3, 0x96, 0x4c, 0xe8, 0x00, 0x00, 0x00, + 0xb4, 0x96, 0x4c, 0xe9, 0x00, 0x00, 0x00, 0xd9, + 0xc9, 0x61, 0x02, 0x00, 0xb3, 0xca, 0xd1, 0x41, + 0xe8, 0x00, 0x00, 0x00, 0x11, 0xe9, 0x10, 0x0e, + 0x62, 0x02, 0x00, 0xdd, 0x41, 0xea, 0x00, 0x00, + 0x00, 0xa4, 0x11, 0x63, 0x02, 0x00, 0x0e, 0xd1, + 0x41, 0xe9, 0x00, 0x00, 0x00, 0xe9, 0x11, 0x62, + 0x02, 0x00, 0xdd, 0x41, 0xeb, 0x00, 0x00, 0x00, + 0xa4, 0x11, 0x63, 0x02, 0x00, 0xeb, 0x0f, 0x62, + 0x02, 0x00, 0xdd, 0x41, 0xec, 0x00, 0x00, 0x00, + 0xa4, 0x11, 0x63, 0x02, 0x00, 0x0e, 0xc7, 0xde, + 0x1b, 0x11, 0xb0, 0xea, 0x04, 0x1b, 0x71, 0x1b, + 0x1b, 0xdd, 0x42, 0xed, 0x00, 0x00, 0x00, 0xd0, + 0x62, 0x02, 0x00, 0x24, 0x02, 0x00, 0x1b, 0x71, + 0x1b, 0x49, 0x29, 0xb2, 0x03, 0x01, 0x04, 0x05, + 0x00, 0x3c, 0x00, 0xae, 0x02, 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, 0x00, 0x01, 0x00, 0x04, 0x02, - 0x00, 0x17, 0x01, 0x10, 0x00, 0x01, 0x00, 0xba, + 0x00, 0x28, 0x01, 0x10, 0x00, 0x01, 0x00, 0xba, 0x03, 0x02, 0x00, 0xb8, 0x03, 0x01, 0x00, 0x08, - 0xc8, 0xc4, 0xdc, 0x47, 0xe9, 0x0e, 0xdd, 0x42, - 0xf1, 0x00, 0x00, 0x00, 0xc4, 0xdc, 0x47, 0x24, - 0x01, 0x00, 0x28, 0xb4, 0x96, 0x28, 0xb2, 0x03, - 0x01, 0xe8, 0x03, 0x02, 0x0c, 0x2e, 0x00, 0x0c, - 0x42, 0xfb, 0x01, 0x00, 0x01, 0x04, 0x01, 0x06, - 0x02, 0x00, 0x92, 0x02, 0x05, 0xc8, 0x03, 0x00, - 0x01, 0x00, 0xca, 0x03, 0x01, 0x00, 0x20, 0xcc, - 0x03, 0x01, 0x01, 0x20, 0xe4, 0x03, 0x01, 0x02, - 0x20, 0x10, 0x00, 0x01, 0x00, 0xc0, 0x03, 0x05, - 0x00, 0xc2, 0x03, 0x06, 0x00, 0x08, 0xcb, 0x61, - 0x02, 0x00, 0x61, 0x01, 0x00, 0x61, 0x00, 0x00, - 0xd0, 0xf4, 0xea, 0x10, 0x38, 0xc7, 0x00, 0x00, - 0x00, 0x11, 0x04, 0xf3, 0x00, 0x00, 0x00, 0x21, - 0x01, 0x00, 0x2f, 0xc7, 0xc8, 0xdc, 0x62, 0x00, - 0x00, 0xee, 0xc9, 0x0b, 0x0b, 0xdd, 0xd0, 0x62, - 0x00, 0x00, 0x62, 0x01, 0x00, 0x41, 0x16, 0x00, + 0xc8, 0xc4, 0xdc, 0x47, 0x11, 0xe9, 0x20, 0x0e, + 0xdd, 0x42, 0xee, 0x00, 0x00, 0x00, 0xc4, 0xdc, + 0x47, 0x24, 0x01, 0x00, 0x0e, 0xc4, 0xdc, 0x1b, + 0x11, 0xb0, 0xea, 0x04, 0x1b, 0x71, 0x1b, 0x1b, + 0x07, 0x1b, 0x71, 0x1b, 0x16, 0x49, 0x29, 0xb2, + 0x03, 0x01, 0x9b, 0x01, 0x00, 0x00, 0x0c, 0x42, + 0xfb, 0x01, 0x00, 0x01, 0x01, 0x01, 0x04, 0x02, + 0x00, 0x25, 0x02, 0xc8, 0x03, 0x00, 0x01, 0x00, + 0x10, 0x00, 0x01, 0x00, 0xba, 0x03, 0x02, 0x00, + 0xb8, 0x03, 0x01, 0x00, 0x08, 0xc8, 0xc4, 0xdc, + 0x47, 0x96, 0xe9, 0x10, 0x38, 0x92, 0x00, 0x00, + 0x00, 0x11, 0x04, 0xef, 0x00, 0x00, 0x00, 0x21, + 0x01, 0x00, 0x2f, 0xdd, 0x42, 0x85, 0x00, 0x00, + 0x00, 0xc4, 0xdc, 0x47, 0xd0, 0x24, 0x02, 0x00, + 0x29, 0xb2, 0x03, 0x01, 0x9b, 0x01, 0x03, 0x2a, + 0x96, 0x03, 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x06, 0x03, 0x00, 0x2a, 0x02, + 0xc8, 0x03, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, + 0x00, 0xba, 0x03, 0x02, 0x00, 0xc6, 0x03, 0x08, + 0x00, 0xb8, 0x03, 0x01, 0x00, 0x08, 0xc8, 0xc4, + 0xdc, 0x47, 0x96, 0xe9, 0x10, 0x38, 0x92, 0x00, + 0x00, 0x00, 0x11, 0x04, 0xef, 0x00, 0x00, 0x00, + 0x21, 0x01, 0x00, 0x2f, 0xdd, 0x11, 0xde, 0x42, + 0xf0, 0x00, 0x00, 0x00, 0xc4, 0xdc, 0x47, 0xd0, + 0x24, 0x02, 0x00, 0x21, 0x01, 0x00, 0x28, 0xb2, + 0x03, 0x01, 0xe6, 0x02, 0x05, 0x2a, 0x8e, 0x01, + 0x4d, 0x3e, 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x02, 0x00, 0x17, 0x01, + 0x10, 0x00, 0x01, 0x00, 0xba, 0x03, 0x02, 0x00, + 0xb8, 0x03, 0x01, 0x00, 0x08, 0xc8, 0xc4, 0xdc, + 0x47, 0xe9, 0x0e, 0xdd, 0x42, 0xf1, 0x00, 0x00, + 0x00, 0xc4, 0xdc, 0x47, 0x24, 0x01, 0x00, 0x28, + 0xb4, 0x96, 0x28, 0xb2, 0x03, 0x01, 0xe8, 0x03, + 0x02, 0x0c, 0x2e, 0x00, 0x0c, 0x42, 0xfb, 0x01, + 0x00, 0x01, 0x04, 0x01, 0x06, 0x02, 0x00, 0x92, + 0x02, 0x05, 0xc8, 0x03, 0x00, 0x01, 0x00, 0xca, + 0x03, 0x01, 0x00, 0x20, 0xcc, 0x03, 0x01, 0x01, + 0x20, 0xe4, 0x03, 0x01, 0x02, 0x20, 0x10, 0x00, + 0x01, 0x00, 0xc0, 0x03, 0x05, 0x00, 0xc2, 0x03, + 0x06, 0x00, 0x08, 0xcb, 0x61, 0x02, 0x00, 0x61, + 0x01, 0x00, 0x61, 0x00, 0x00, 0xd0, 0xf4, 0xea, + 0x10, 0x38, 0xc7, 0x00, 0x00, 0x00, 0x11, 0x04, + 0xf3, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2f, + 0xc7, 0xc8, 0xdc, 0x62, 0x00, 0x00, 0xee, 0xc9, + 0x0b, 0x0b, 0xdd, 0xd0, 0x62, 0x00, 0x00, 0x62, + 0x01, 0x00, 0x41, 0x16, 0x00, 0x00, 0x00, 0xf0, + 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x4c, 0x16, 0x00, + 0x00, 0x00, 0x0b, 0xdd, 0xd0, 0x62, 0x00, 0x00, + 0x62, 0x01, 0x00, 0x41, 0xf4, 0x00, 0x00, 0x00, + 0xf0, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x4c, 0xf4, + 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xd0, 0x62, 0x00, + 0x00, 0x62, 0x01, 0x00, 0x41, 0xf5, 0x00, 0x00, + 0x00, 0xf0, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x4c, + 0xf5, 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xd0, 0x62, + 0x00, 0x00, 0x62, 0x01, 0x00, 0x41, 0xf6, 0x00, 0x00, 0x00, 0xf0, 0x4c, 0x3f, 0x00, 0x00, 0x00, - 0x4c, 0x16, 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xd0, - 0x62, 0x00, 0x00, 0x62, 0x01, 0x00, 0x41, 0xf4, - 0x00, 0x00, 0x00, 0xf0, 0x4c, 0x3f, 0x00, 0x00, - 0x00, 0x4c, 0xf4, 0x00, 0x00, 0x00, 0x0b, 0xdd, - 0xd0, 0x62, 0x00, 0x00, 0x62, 0x01, 0x00, 0x41, - 0xf5, 0x00, 0x00, 0x00, 0xf0, 0x4c, 0x3f, 0x00, - 0x00, 0x00, 0x4c, 0xf5, 0x00, 0x00, 0x00, 0x0b, - 0xdd, 0xd0, 0x62, 0x00, 0x00, 0x62, 0x01, 0x00, - 0x41, 0xf6, 0x00, 0x00, 0x00, 0xf0, 0x4c, 0x3f, - 0x00, 0x00, 0x00, 0x4c, 0xf6, 0x00, 0x00, 0x00, - 0xca, 0x38, 0x90, 0x00, 0x00, 0x00, 0x42, 0x58, - 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, 0x41, 0x16, - 0x00, 0x00, 0x00, 0x41, 0x3f, 0x00, 0x00, 0x00, - 0x62, 0x02, 0x00, 0x24, 0x02, 0x00, 0x0e, 0x38, - 0x90, 0x00, 0x00, 0x00, 0x42, 0x58, 0x00, 0x00, - 0x00, 0x62, 0x02, 0x00, 0x41, 0xf4, 0x00, 0x00, - 0x00, 0x41, 0x3f, 0x00, 0x00, 0x00, 0x62, 0x02, - 0x00, 0x24, 0x02, 0x00, 0x0e, 0x38, 0x90, 0x00, - 0x00, 0x00, 0x42, 0x58, 0x00, 0x00, 0x00, 0x62, - 0x02, 0x00, 0x41, 0xf5, 0x00, 0x00, 0x00, 0x41, - 0x3f, 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, 0x24, - 0x02, 0x00, 0x0e, 0x38, 0x90, 0x00, 0x00, 0x00, - 0x42, 0x58, 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, - 0x41, 0xf6, 0x00, 0x00, 0x00, 0x41, 0x3f, 0x00, - 0x00, 0x00, 0x62, 0x02, 0x00, 0x24, 0x02, 0x00, - 0x0e, 0x62, 0x02, 0x00, 0x41, 0x16, 0x00, 0x00, - 0x00, 0x41, 0x3f, 0x00, 0x00, 0x00, 0x28, 0xb2, - 0x03, 0x01, 0xff, 0x03, 0x0b, 0x39, 0x7c, 0x16, - 0x30, 0x4d, 0x74, 0x00, 0x6e, 0x00, 0xce, 0x02, - 0x00, 0x0c, 0x02, 0xfa, 0x01, 0x00, 0x01, 0x02, - 0x01, 0x07, 0x01, 0x00, 0xd1, 0x02, 0x03, 0xee, - 0x03, 0x00, 0x01, 0x00, 0xc8, 0x03, 0x01, 0x00, - 0x20, 0xca, 0x03, 0x03, 0x01, 0x20, 0xbc, 0x03, - 0x03, 0x00, 0x61, 0x00, 0x00, 0x7b, 0xde, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3c, 0x11, 0xea, 0x0f, - 0x0e, 0x38, 0xb2, 0x00, 0x00, 0x00, 0x11, 0x21, - 0x00, 0x00, 0x16, 0x3d, 0xeb, 0x03, 0x0f, 0x0f, - 0x42, 0x40, 0x00, 0x00, 0x00, 0xd0, 0x24, 0x01, - 0x00, 0xc8, 0x62, 0x00, 0x00, 0x96, 0x69, 0x20, - 0x01, 0x00, 0x00, 0x61, 0x01, 0x00, 0x0b, 0xd0, - 0x42, 0xf0, 0x00, 0x00, 0x00, 0x04, 0xf8, 0x00, - 0x00, 0x00, 0x24, 0x01, 0x00, 0x4c, 0xf9, 0x00, - 0x00, 0x00, 0xd0, 0x42, 0xf0, 0x00, 0x00, 0x00, - 0x04, 0xfa, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, - 0x4c, 0xfb, 0x00, 0x00, 0x00, 0xd0, 0x42, 0xf0, - 0x00, 0x00, 0x00, 0x04, 0xfc, 0x00, 0x00, 0x00, - 0x24, 0x01, 0x00, 0x4c, 0xfd, 0x00, 0x00, 0x00, - 0xd0, 0x42, 0xf0, 0x00, 0x00, 0x00, 0x04, 0xfe, - 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x4c, 0xff, + 0x4c, 0xf6, 0x00, 0x00, 0x00, 0xca, 0x38, 0x90, + 0x00, 0x00, 0x00, 0x42, 0x58, 0x00, 0x00, 0x00, + 0x62, 0x02, 0x00, 0x41, 0x16, 0x00, 0x00, 0x00, + 0x41, 0x3f, 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, + 0x24, 0x02, 0x00, 0x0e, 0x38, 0x90, 0x00, 0x00, + 0x00, 0x42, 0x58, 0x00, 0x00, 0x00, 0x62, 0x02, + 0x00, 0x41, 0xf4, 0x00, 0x00, 0x00, 0x41, 0x3f, + 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, 0x24, 0x02, + 0x00, 0x0e, 0x38, 0x90, 0x00, 0x00, 0x00, 0x42, + 0x58, 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, 0x41, + 0xf5, 0x00, 0x00, 0x00, 0x41, 0x3f, 0x00, 0x00, + 0x00, 0x62, 0x02, 0x00, 0x24, 0x02, 0x00, 0x0e, + 0x38, 0x90, 0x00, 0x00, 0x00, 0x42, 0x58, 0x00, + 0x00, 0x00, 0x62, 0x02, 0x00, 0x41, 0xf6, 0x00, + 0x00, 0x00, 0x41, 0x3f, 0x00, 0x00, 0x00, 0x62, + 0x02, 0x00, 0x24, 0x02, 0x00, 0x0e, 0x62, 0x02, + 0x00, 0x41, 0x16, 0x00, 0x00, 0x00, 0x41, 0x3f, + 0x00, 0x00, 0x00, 0x28, 0xb2, 0x03, 0x01, 0xff, + 0x03, 0x0b, 0x39, 0x7c, 0x16, 0x30, 0x4d, 0x74, + 0x00, 0x6e, 0x00, 0xce, 0x02, 0x00, 0x0c, 0x40, + 0xfb, 0x01, 0x00, 0x02, 0x03, 0x01, 0x05, 0x02, + 0x00, 0x21, 0x05, 0xc8, 0x03, 0x00, 0x01, 0x00, + 0xca, 0x03, 0x00, 0x01, 0x00, 0xc8, 0x03, 0x01, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x20, 0xca, 0x03, + 0x01, 0x01, 0x20, 0x10, 0x00, 0x01, 0x00, 0xb8, + 0x03, 0x01, 0x00, 0xba, 0x03, 0x02, 0x00, 0x08, + 0xca, 0x61, 0x01, 0x00, 0x61, 0x00, 0x00, 0xd0, + 0xc8, 0xd1, 0x11, 0xf1, 0xe9, 0x04, 0x0e, 0x06, + 0xd9, 0xc9, 0xdc, 0x42, 0xf7, 0x00, 0x00, 0x00, + 0xc6, 0xdd, 0x47, 0xd0, 0xd1, 0x25, 0x03, 0x00, + 0xb2, 0x03, 0x01, 0xb6, 0x06, 0x05, 0x52, 0xb0, + 0x03, 0x11, 0x14, 0x00, 0x0c, 0x02, 0xfa, 0x01, + 0x00, 0x01, 0x02, 0x01, 0x07, 0x01, 0x00, 0xd1, + 0x02, 0x03, 0xf0, 0x03, 0x00, 0x01, 0x00, 0xc8, + 0x03, 0x01, 0x00, 0x20, 0xca, 0x03, 0x03, 0x01, + 0x20, 0xbc, 0x03, 0x03, 0x00, 0x61, 0x00, 0x00, + 0x7b, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x11, 0xea, 0x0f, 0x0e, 0x38, 0xb2, 0x00, 0x00, + 0x00, 0x11, 0x21, 0x00, 0x00, 0x16, 0x3d, 0xeb, + 0x03, 0x0f, 0x0f, 0x42, 0x40, 0x00, 0x00, 0x00, + 0xd0, 0x24, 0x01, 0x00, 0xc8, 0x62, 0x00, 0x00, + 0x96, 0x69, 0x20, 0x01, 0x00, 0x00, 0x61, 0x01, + 0x00, 0x0b, 0xd0, 0x42, 0xf0, 0x00, 0x00, 0x00, + 0x04, 0xf9, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, + 0x4c, 0xfa, 0x00, 0x00, 0x00, 0xd0, 0x42, 0xf0, + 0x00, 0x00, 0x00, 0x04, 0xfb, 0x00, 0x00, 0x00, + 0x24, 0x01, 0x00, 0x4c, 0xfc, 0x00, 0x00, 0x00, + 0xd0, 0x42, 0xf0, 0x00, 0x00, 0x00, 0x04, 0xfd, + 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x4c, 0xfe, 0x00, 0x00, 0x00, 0xd0, 0x42, 0xf0, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x24, 0x01, - 0x00, 0x4c, 0x01, 0x01, 0x00, 0x00, 0xc9, 0x0b, - 0x38, 0x90, 0x00, 0x00, 0x00, 0x42, 0x02, 0x01, - 0x00, 0x00, 0x0b, 0xd0, 0x42, 0xf0, 0x00, 0x00, - 0x00, 0x04, 0x03, 0x01, 0x00, 0x00, 0x24, 0x01, - 0x00, 0x4c, 0x04, 0x01, 0x00, 0x00, 0x62, 0x01, - 0x00, 0x24, 0x02, 0x00, 0x4c, 0x16, 0x00, 0x00, - 0x00, 0x38, 0x90, 0x00, 0x00, 0x00, 0x42, 0x02, - 0x01, 0x00, 0x00, 0x0b, 0xd0, 0x42, 0xf0, 0x00, - 0x00, 0x00, 0x04, 0x05, 0x01, 0x00, 0x00, 0x24, - 0x01, 0x00, 0x4c, 0x04, 0x01, 0x00, 0x00, 0x62, - 0x01, 0x00, 0x24, 0x02, 0x00, 0x4c, 0xf4, 0x00, - 0x00, 0x00, 0x38, 0x90, 0x00, 0x00, 0x00, 0x42, - 0x02, 0x01, 0x00, 0x00, 0x0b, 0xd0, 0x42, 0xf0, - 0x00, 0x00, 0x00, 0x04, 0x06, 0x01, 0x00, 0x00, - 0x24, 0x01, 0x00, 0x4c, 0x04, 0x01, 0x00, 0x00, - 0x62, 0x01, 0x00, 0x24, 0x02, 0x00, 0x4c, 0xf5, - 0x00, 0x00, 0x00, 0x38, 0x90, 0x00, 0x00, 0x00, - 0x42, 0x02, 0x01, 0x00, 0x00, 0x0b, 0xd0, 0x42, - 0xf0, 0x00, 0x00, 0x00, 0x04, 0x07, 0x01, 0x00, - 0x00, 0x24, 0x01, 0x00, 0x4c, 0x04, 0x01, 0x00, + 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x24, 0x01, + 0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0xd0, 0x42, + 0xf0, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, + 0x00, 0x24, 0x01, 0x00, 0x4c, 0x02, 0x01, 0x00, + 0x00, 0xc9, 0x0b, 0x38, 0x90, 0x00, 0x00, 0x00, + 0x42, 0x03, 0x01, 0x00, 0x00, 0x0b, 0xd0, 0x42, + 0xf0, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0x00, + 0x00, 0x24, 0x01, 0x00, 0x4c, 0x05, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x24, 0x02, 0x00, 0x4c, - 0xf6, 0x00, 0x00, 0x00, 0x11, 0x63, 0x00, 0x00, - 0x0e, 0xdc, 0x42, 0x41, 0x00, 0x00, 0x00, 0xd0, - 0x62, 0x00, 0x00, 0x24, 0x02, 0x00, 0x0e, 0x62, - 0x00, 0x00, 0x28, 0xb2, 0x03, 0x01, 0xb6, 0x06, - 0x0d, 0x11, 0x9a, 0x03, 0x3e, 0x16, 0xbb, 0x36, - 0x00, 0x99, 0x02, 0x00, 0x8c, 0x07, 0x00, 0x0c, - 0x00, 0xfa, 0x01, 0x00, 0x03, 0x06, 0x03, 0x02, - 0x00, 0x01, 0x32, 0x09, 0xee, 0x03, 0x00, 0x01, - 0x40, 0xc8, 0x03, 0x00, 0x01, 0x40, 0x00, 0x00, - 0x01, 0x00, 0xca, 0x03, 0x00, 0x00, 0x40, 0xcc, - 0x03, 0x00, 0x01, 0x40, 0xe4, 0x03, 0x00, 0x02, - 0x40, 0x90, 0x04, 0x00, 0x03, 0x40, 0x92, 0x04, - 0x00, 0x04, 0x40, 0x94, 0x04, 0x00, 0x05, 0x40, - 0x0c, 0x43, 0xfa, 0x01, 0x00, 0x00, 0x07, 0x00, - 0x06, 0x08, 0x00, 0xc5, 0x01, 0x07, 0x96, 0x04, - 0x01, 0x00, 0x20, 0x98, 0x04, 0x01, 0x01, 0x20, - 0x9a, 0x04, 0x01, 0x02, 0x20, 0x9c, 0x04, 0x02, - 0x03, 0x20, 0x9c, 0x04, 0x03, 0x03, 0x03, 0x10, - 0x00, 0x01, 0x00, 0x98, 0x01, 0x00, 0x01, 0x00, - 0xc8, 0x03, 0x01, 0x03, 0x90, 0x04, 0x03, 0x01, - 0x92, 0x04, 0x04, 0x01, 0x94, 0x04, 0x05, 0x01, - 0xca, 0x03, 0x00, 0x01, 0xcc, 0x03, 0x01, 0x01, - 0xe4, 0x03, 0x02, 0x01, 0xee, 0x03, 0x00, 0x03, - 0x08, 0xc1, 0x05, 0x0c, 0x00, 0xc1, 0x06, 0x61, - 0x02, 0x00, 0x61, 0x01, 0x00, 0x61, 0x00, 0x00, - 0x06, 0xc8, 0x06, 0xc9, 0x06, 0xca, 0xdc, 0x41, - 0x0f, 0x01, 0x00, 0x00, 0xe9, 0x14, 0xdd, 0x11, - 0x63, 0x00, 0x00, 0x0e, 0xde, 0x11, 0x63, 0x01, - 0x00, 0x0e, 0xdf, 0x11, 0x63, 0x02, 0x00, 0xeb, - 0x18, 0x5e, 0x04, 0x00, 0x11, 0x63, 0x00, 0x00, - 0x0e, 0x5e, 0x05, 0x00, 0x11, 0x63, 0x01, 0x00, - 0x0e, 0x5e, 0x06, 0x00, 0x11, 0x63, 0x02, 0x00, - 0x0e, 0x6c, 0x43, 0x00, 0x00, 0x00, 0x61, 0x03, - 0x00, 0x62, 0x00, 0x00, 0x42, 0x10, 0x01, 0x00, - 0x00, 0x24, 0x00, 0x00, 0x0e, 0x38, 0x9b, 0x00, - 0x00, 0x00, 0x41, 0x3a, 0x00, 0x00, 0x00, 0x41, - 0x59, 0x00, 0x00, 0x00, 0x42, 0x11, 0x01, 0x00, - 0x00, 0x5e, 0x07, 0x00, 0xc0, 0x05, 0xc0, 0x06, - 0x24, 0x03, 0x00, 0xcb, 0x62, 0x01, 0x00, 0x42, - 0x10, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x0e, - 0x62, 0x03, 0x00, 0x6f, 0x28, 0xc1, 0x04, 0x6c, - 0x34, 0x00, 0x00, 0x00, 0xdc, 0x41, 0x0f, 0x01, - 0x00, 0x00, 0x11, 0xe9, 0x24, 0x0e, 0x62, 0x02, - 0x00, 0x42, 0x10, 0x01, 0x00, 0x00, 0x24, 0x00, - 0x00, 0x0e, 0x62, 0x02, 0x00, 0x5e, 0x06, 0x00, - 0xaf, 0x11, 0xe9, 0x0d, 0x0e, 0x62, 0x01, 0x00, - 0x42, 0x10, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, - 0x0e, 0xc0, 0x04, 0x2f, 0x2f, 0xb2, 0x03, 0x01, - 0xef, 0x0b, 0x0c, 0x52, 0xb8, 0x01, 0x00, 0x4d, - 0x00, 0x84, 0x01, 0x9d, 0x72, 0x7a, 0x32, 0x00, - 0xd2, 0x70, 0x11, 0x41, 0x04, 0x01, 0x00, 0x00, - 0xc8, 0x11, 0x41, 0xf9, 0x00, 0x00, 0x00, 0xc9, - 0x11, 0x41, 0xfb, 0x00, 0x00, 0x00, 0xca, 0x11, - 0x41, 0xfd, 0x00, 0x00, 0x00, 0xcb, 0x11, 0x41, - 0xff, 0x00, 0x00, 0x00, 0xc1, 0x04, 0x11, 0x41, - 0x01, 0x01, 0x00, 0x00, 0xc1, 0x05, 0x0e, 0xbe, - 0x00, 0x28, 0xb2, 0x03, 0x01, 0xef, 0x0b, 0x03, - 0xed, 0xe0, 0x03, 0x00, 0x0c, 0x42, 0xfb, 0x01, - 0x00, 0x01, 0x01, 0x01, 0x03, 0x02, 0x00, 0x20, - 0x02, 0xc8, 0x03, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x01, 0x00, 0xea, 0x01, 0x01, 0x0d, 0xc4, 0x03, - 0x07, 0x00, 0x08, 0xc8, 0x2b, 0x65, 0x00, 0x00, - 0x11, 0xe9, 0x06, 0xc4, 0x1b, 0x24, 0x00, 0x00, - 0x0e, 0xc4, 0xdd, 0x1b, 0x11, 0xb0, 0xea, 0x04, - 0x1b, 0x71, 0x1b, 0x1b, 0xd0, 0x1b, 0x71, 0x1b, - 0x49, 0x29, 0xb2, 0x03, 0x01, 0xdf, 0x0d, 0x00, - 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x04, 0x02, 0x00, 0x0f, 0x01, 0x10, 0x00, - 0x01, 0x00, 0xb8, 0x03, 0x01, 0x00, 0xc4, 0x03, - 0x07, 0x00, 0x08, 0xc8, 0xdc, 0x42, 0x12, 0x01, - 0x00, 0x00, 0xc4, 0xdd, 0x47, 0x24, 0x01, 0x00, - 0x29, 0xb2, 0x03, 0x01, 0xdf, 0x0d, 0x00, 0x00, - 0x0c, 0x42, 0xfb, 0x01, 0x00, 0x00, 0x01, 0x00, - 0x04, 0x02, 0x00, 0x0e, 0x01, 0x10, 0x00, 0x01, + 0x16, 0x00, 0x00, 0x00, 0x38, 0x90, 0x00, 0x00, + 0x00, 0x42, 0x03, 0x01, 0x00, 0x00, 0x0b, 0xd0, + 0x42, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x06, 0x01, + 0x00, 0x00, 0x24, 0x01, 0x00, 0x4c, 0x05, 0x01, + 0x00, 0x00, 0x62, 0x01, 0x00, 0x24, 0x02, 0x00, + 0x4c, 0xf4, 0x00, 0x00, 0x00, 0x38, 0x90, 0x00, + 0x00, 0x00, 0x42, 0x03, 0x01, 0x00, 0x00, 0x0b, + 0xd0, 0x42, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x07, + 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x4c, 0x05, + 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x24, 0x02, + 0x00, 0x4c, 0xf5, 0x00, 0x00, 0x00, 0x38, 0x90, + 0x00, 0x00, 0x00, 0x42, 0x03, 0x01, 0x00, 0x00, + 0x0b, 0xd0, 0x42, 0xf0, 0x00, 0x00, 0x00, 0x04, + 0x08, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x4c, + 0x05, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x24, + 0x02, 0x00, 0x4c, 0xf6, 0x00, 0x00, 0x00, 0x11, + 0x63, 0x00, 0x00, 0x0e, 0xdc, 0x42, 0x41, 0x00, + 0x00, 0x00, 0xd0, 0x62, 0x00, 0x00, 0x24, 0x02, + 0x00, 0x0e, 0x62, 0x00, 0x00, 0x28, 0xb2, 0x03, + 0x01, 0x98, 0x08, 0x0c, 0x11, 0x54, 0x3e, 0x16, + 0xbb, 0x36, 0x00, 0x99, 0x02, 0x00, 0x8c, 0x07, + 0x00, 0x0c, 0x00, 0xfa, 0x01, 0x00, 0x03, 0x06, + 0x03, 0x02, 0x00, 0x01, 0x32, 0x09, 0xf0, 0x03, + 0x00, 0x01, 0x40, 0xc8, 0x03, 0x00, 0x01, 0x40, + 0x00, 0x00, 0x01, 0x00, 0xca, 0x03, 0x00, 0x00, + 0x40, 0xcc, 0x03, 0x00, 0x01, 0x40, 0xe4, 0x03, + 0x00, 0x02, 0x40, 0x92, 0x04, 0x00, 0x03, 0x40, + 0x94, 0x04, 0x00, 0x04, 0x40, 0x96, 0x04, 0x00, + 0x05, 0x40, 0x0c, 0x43, 0xfa, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x06, 0x08, 0x00, 0xc5, 0x01, 0x07, + 0x98, 0x04, 0x01, 0x00, 0x20, 0x9a, 0x04, 0x01, + 0x01, 0x20, 0x9c, 0x04, 0x01, 0x02, 0x20, 0x9e, + 0x04, 0x02, 0x03, 0x20, 0x9e, 0x04, 0x03, 0x03, + 0x03, 0x10, 0x00, 0x01, 0x00, 0x98, 0x01, 0x00, + 0x01, 0x00, 0xc8, 0x03, 0x01, 0x03, 0x92, 0x04, + 0x03, 0x01, 0x94, 0x04, 0x04, 0x01, 0x96, 0x04, + 0x05, 0x01, 0xca, 0x03, 0x00, 0x01, 0xcc, 0x03, + 0x01, 0x01, 0xe4, 0x03, 0x02, 0x01, 0xf0, 0x03, + 0x00, 0x03, 0x08, 0xc1, 0x05, 0x0c, 0x00, 0xc1, + 0x06, 0x61, 0x02, 0x00, 0x61, 0x01, 0x00, 0x61, + 0x00, 0x00, 0x06, 0xc8, 0x06, 0xc9, 0x06, 0xca, + 0xdc, 0x41, 0x10, 0x01, 0x00, 0x00, 0xe9, 0x14, + 0xdd, 0x11, 0x63, 0x00, 0x00, 0x0e, 0xde, 0x11, + 0x63, 0x01, 0x00, 0x0e, 0xdf, 0x11, 0x63, 0x02, + 0x00, 0xeb, 0x18, 0x5e, 0x04, 0x00, 0x11, 0x63, + 0x00, 0x00, 0x0e, 0x5e, 0x05, 0x00, 0x11, 0x63, + 0x01, 0x00, 0x0e, 0x5e, 0x06, 0x00, 0x11, 0x63, + 0x02, 0x00, 0x0e, 0x6c, 0x43, 0x00, 0x00, 0x00, + 0x61, 0x03, 0x00, 0x62, 0x00, 0x00, 0x42, 0x11, + 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x0e, 0x38, + 0x9b, 0x00, 0x00, 0x00, 0x41, 0x3a, 0x00, 0x00, + 0x00, 0x41, 0x59, 0x00, 0x00, 0x00, 0x42, 0x12, + 0x01, 0x00, 0x00, 0x5e, 0x07, 0x00, 0xc0, 0x05, + 0xc0, 0x06, 0x24, 0x03, 0x00, 0xcb, 0x62, 0x01, + 0x00, 0x42, 0x11, 0x01, 0x00, 0x00, 0x24, 0x00, + 0x00, 0x0e, 0x62, 0x03, 0x00, 0x6f, 0x28, 0xc1, + 0x04, 0x6c, 0x34, 0x00, 0x00, 0x00, 0xdc, 0x41, + 0x10, 0x01, 0x00, 0x00, 0x11, 0xe9, 0x24, 0x0e, + 0x62, 0x02, 0x00, 0x42, 0x11, 0x01, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x0e, 0x62, 0x02, 0x00, 0x5e, + 0x06, 0x00, 0xaf, 0x11, 0xe9, 0x0d, 0x0e, 0x62, + 0x01, 0x00, 0x42, 0x11, 0x01, 0x00, 0x00, 0x24, + 0x00, 0x00, 0x0e, 0xc0, 0x04, 0x2f, 0x2f, 0xb2, + 0x03, 0x01, 0xae, 0x0c, 0x0c, 0x52, 0xb8, 0x01, + 0x00, 0x4d, 0x00, 0x84, 0x01, 0x9d, 0x72, 0x7a, + 0x32, 0x00, 0xd2, 0x70, 0x11, 0x41, 0x05, 0x01, + 0x00, 0x00, 0xc8, 0x11, 0x41, 0xfa, 0x00, 0x00, + 0x00, 0xc9, 0x11, 0x41, 0xfc, 0x00, 0x00, 0x00, + 0xca, 0x11, 0x41, 0xfe, 0x00, 0x00, 0x00, 0xcb, + 0x11, 0x41, 0x00, 0x01, 0x00, 0x00, 0xc1, 0x04, + 0x11, 0x41, 0x02, 0x01, 0x00, 0x00, 0xc1, 0x05, + 0x0e, 0xbe, 0x00, 0x28, 0xb2, 0x03, 0x01, 0xae, + 0x0c, 0x03, 0xed, 0xe0, 0x03, 0x00, 0x0c, 0x42, + 0xfb, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x02, + 0x00, 0x20, 0x02, 0xc8, 0x03, 0x00, 0x01, 0x00, + 0x10, 0x00, 0x01, 0x00, 0xea, 0x01, 0x01, 0x0d, + 0xc4, 0x03, 0x07, 0x00, 0x08, 0xc8, 0x2b, 0x65, + 0x00, 0x00, 0x11, 0xe9, 0x06, 0xc4, 0x1b, 0x24, + 0x00, 0x00, 0x0e, 0xc4, 0xdd, 0x1b, 0x11, 0xb0, + 0xea, 0x04, 0x1b, 0x71, 0x1b, 0x1b, 0xd0, 0x1b, + 0x71, 0x1b, 0x49, 0x29, 0xb2, 0x03, 0x01, 0x9e, + 0x0e, 0x00, 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x02, 0x00, 0x0f, 0x01, + 0x10, 0x00, 0x01, 0x00, 0xb8, 0x03, 0x01, 0x00, + 0xc4, 0x03, 0x07, 0x00, 0x08, 0xc8, 0xdc, 0x42, + 0x13, 0x01, 0x00, 0x00, 0xc4, 0xdd, 0x47, 0x24, + 0x01, 0x00, 0x29, 0xb2, 0x03, 0x01, 0x9e, 0x0e, + 0x00, 0x00, 0x0c, 0x42, 0xfb, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x04, 0x02, 0x00, 0x0e, 0x01, 0x10, + 0x00, 0x01, 0x00, 0xb8, 0x03, 0x01, 0x00, 0xc4, + 0x03, 0x07, 0x00, 0x08, 0xc8, 0xdc, 0x42, 0x14, + 0x01, 0x00, 0x00, 0xc4, 0xdd, 0x47, 0x25, 0x01, + 0x00, 0xb2, 0x03, 0x01, 0x9e, 0x0e, 0x03, 0x0c, + 0xbc, 0x02, 0x00, 0x0c, 0x40, 0xfb, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x04, 0x02, 0x00, 0x32, 0x02, + 0xc8, 0x03, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0xb8, 0x03, 0x01, 0x00, 0xc4, 0x03, 0x07, - 0x00, 0x08, 0xc8, 0xdc, 0x42, 0x13, 0x01, 0x00, - 0x00, 0xc4, 0xdd, 0x47, 0x25, 0x01, 0x00, 0xb2, - 0x03, 0x01, 0xdf, 0x0d, 0x03, 0x0c, 0xbc, 0x02, - 0x00, 0x0c, 0x40, 0xfb, 0x01, 0x00, 0x01, 0x01, - 0x00, 0x04, 0x02, 0x00, 0x32, 0x02, 0xc8, 0x03, - 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0xb8, - 0x03, 0x01, 0x00, 0xc4, 0x03, 0x07, 0x00, 0x08, - 0xc8, 0x0d, 0x00, 0x00, 0xd8, 0x11, 0xe9, 0x1c, - 0x0e, 0xd0, 0xe8, 0xb4, 0xae, 0x11, 0xe9, 0x14, - 0x0e, 0xd0, 0xb3, 0x47, 0x97, 0x04, 0x48, 0x00, - 0x00, 0x00, 0xac, 0x11, 0xe9, 0x06, 0x0e, 0xd0, - 0xb3, 0x47, 0xd8, 0x0e, 0xdc, 0x42, 0x14, 0x01, - 0x00, 0x00, 0xc4, 0xdd, 0x47, 0xd0, 0x25, 0x02, - 0x00, 0xb2, 0x03, 0x01, 0xfd, 0x0e, 0x04, 0x1b, - 0x50, 0x43, 0x30, 0x00, 0x0c, 0x40, 0xfb, 0x01, - 0x00, 0x01, 0x01, 0x00, 0x04, 0x02, 0x00, 0x33, - 0x02, 0xc8, 0x03, 0x00, 0x01, 0x00, 0x10, 0x00, - 0x01, 0x00, 0xb8, 0x03, 0x01, 0x00, 0xc4, 0x03, - 0x07, 0x00, 0x08, 0xc8, 0x0d, 0x00, 0x00, 0xd8, - 0x11, 0xe9, 0x1c, 0x0e, 0xd0, 0xe8, 0xb4, 0xae, - 0x11, 0xe9, 0x14, 0x0e, 0xd0, 0xb3, 0x47, 0x97, - 0x04, 0x48, 0x00, 0x00, 0x00, 0xac, 0x11, 0xe9, - 0x06, 0x0e, 0xd0, 0xb3, 0x47, 0xd8, 0x0e, 0xdc, - 0x42, 0x15, 0x01, 0x00, 0x00, 0xc4, 0xdd, 0x47, - 0xd0, 0x24, 0x02, 0x00, 0x29, 0xb2, 0x03, 0x01, - 0xbd, 0x0f, 0x03, 0x5c, 0xa2, 0x01, 0x00, 0x08, - 0xe9, 0x02, 0x29, 0x38, 0x8a, 0x00, 0x00, 0x00, - 0x38, 0x96, 0x00, 0x00, 0x00, 0x42, 0x11, 0x00, - 0x00, 0x00, 0x04, 0x16, 0x01, 0x00, 0x00, 0x24, - 0x01, 0x00, 0x47, 0xe4, 0x41, 0x17, 0x01, 0x00, - 0x00, 0xe1, 0x38, 0x96, 0x00, 0x00, 0x00, 0x04, - 0x18, 0x01, 0x00, 0x00, 0xee, 0xe2, 0x06, 0x61, - 0x00, 0x00, 0xbd, 0x00, 0x56, 0xdf, 0x00, 0x00, - 0x00, 0x00, 0xbe, 0x01, 0x54, 0xee, 0x00, 0x00, - 0x00, 0x00, 0xbe, 0x02, 0x54, 0x85, 0x00, 0x00, - 0x00, 0x00, 0xbe, 0x03, 0x54, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0xbe, 0x04, 0x54, 0x0f, 0x01, 0x00, - 0x00, 0x01, 0xbe, 0x05, 0x54, 0x19, 0x01, 0x00, - 0x00, 0x00, 0x06, 0xc8, 0x0e, 0x68, 0x00, 0x00, - 0x5f, 0x04, 0x00, 0xbe, 0x06, 0x4d, 0xe0, 0x00, - 0x00, 0x00, 0x5f, 0x05, 0x00, 0xbe, 0x07, 0x4d, - 0xe1, 0x00, 0x00, 0x00, 0x5f, 0x06, 0x00, 0x38, - 0x96, 0x00, 0x00, 0x00, 0x04, 0x1a, 0x01, 0x00, - 0x00, 0xee, 0x5f, 0x07, 0x00, 0x06, 0x61, 0x01, - 0x00, 0xbd, 0x08, 0x56, 0xe3, 0x00, 0x00, 0x00, - 0x00, 0xbe, 0x09, 0x54, 0x1b, 0x01, 0x00, 0x00, - 0x00, 0xbe, 0x0a, 0x54, 0x36, 0x00, 0x00, 0x00, - 0x00, 0xbe, 0x0b, 0x54, 0x1c, 0x01, 0x00, 0x00, - 0x00, 0xbe, 0x0c, 0x54, 0x10, 0x01, 0x00, 0x00, - 0x00, 0x06, 0xc9, 0x0e, 0x68, 0x01, 0x00, 0x5f, - 0x08, 0x00, 0x06, 0x2e, 0xb2, 0x03, 0x01, 0x01, - 0x25, 0x01, 0x01, 0x17, 0x08, 0x00, 0x37, 0x00, - 0xae, 0x02, 0x2a, 0x96, 0x03, 0x2a, 0xcc, 0x01, - 0x2a, 0x66, 0x2a, 0xee, 0x04, 0x57, 0xf2, 0x0a, - 0x34, 0xe0, 0x03, 0xde, 0xbc, 0x02, 0x2a, 0x80, - 0x01, 0x2a, 0xa2, 0x01, 0x57, 0x7a, 0x00, + 0x00, 0x08, 0xc8, 0x0d, 0x00, 0x00, 0xd8, 0x11, + 0xe9, 0x1c, 0x0e, 0xd0, 0xe8, 0xb4, 0xae, 0x11, + 0xe9, 0x14, 0x0e, 0xd0, 0xb3, 0x47, 0x97, 0x04, + 0x48, 0x00, 0x00, 0x00, 0xac, 0x11, 0xe9, 0x06, + 0x0e, 0xd0, 0xb3, 0x47, 0xd8, 0x0e, 0xdc, 0x42, + 0x15, 0x01, 0x00, 0x00, 0xc4, 0xdd, 0x47, 0xd0, + 0x25, 0x02, 0x00, 0xb2, 0x03, 0x01, 0xbc, 0x0f, + 0x04, 0x1b, 0x50, 0x43, 0x30, 0x00, 0x0c, 0x40, + 0xfb, 0x01, 0x00, 0x01, 0x01, 0x00, 0x04, 0x02, + 0x00, 0x33, 0x02, 0xc8, 0x03, 0x00, 0x01, 0x00, + 0x10, 0x00, 0x01, 0x00, 0xb8, 0x03, 0x01, 0x00, + 0xc4, 0x03, 0x07, 0x00, 0x08, 0xc8, 0x0d, 0x00, + 0x00, 0xd8, 0x11, 0xe9, 0x1c, 0x0e, 0xd0, 0xe8, + 0xb4, 0xae, 0x11, 0xe9, 0x14, 0x0e, 0xd0, 0xb3, + 0x47, 0x97, 0x04, 0x48, 0x00, 0x00, 0x00, 0xac, + 0x11, 0xe9, 0x06, 0x0e, 0xd0, 0xb3, 0x47, 0xd8, + 0x0e, 0xdc, 0x42, 0x16, 0x01, 0x00, 0x00, 0xc4, + 0xdd, 0x47, 0xd0, 0x24, 0x02, 0x00, 0x29, 0xb2, + 0x03, 0x01, 0xfc, 0x0f, 0x03, 0x5c, 0xa2, 0x01, + 0x00, 0x08, 0xe9, 0x02, 0x29, 0x38, 0x8a, 0x00, + 0x00, 0x00, 0x38, 0x96, 0x00, 0x00, 0x00, 0x42, + 0x11, 0x00, 0x00, 0x00, 0x04, 0x17, 0x01, 0x00, + 0x00, 0x24, 0x01, 0x00, 0x47, 0xe4, 0x41, 0x18, + 0x01, 0x00, 0x00, 0xe1, 0x38, 0x96, 0x00, 0x00, + 0x00, 0x04, 0x19, 0x01, 0x00, 0x00, 0xee, 0xe2, + 0x06, 0x61, 0x00, 0x00, 0xbd, 0x00, 0x56, 0xdf, + 0x00, 0x00, 0x00, 0x00, 0xbe, 0x01, 0x54, 0xee, + 0x00, 0x00, 0x00, 0x00, 0xbe, 0x02, 0x54, 0x85, + 0x00, 0x00, 0x00, 0x00, 0xbe, 0x03, 0x54, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0xbe, 0x04, 0x54, 0x10, + 0x01, 0x00, 0x00, 0x01, 0xbe, 0x05, 0x54, 0x1a, + 0x01, 0x00, 0x00, 0x00, 0xbe, 0x06, 0x54, 0x1b, + 0x01, 0x00, 0x00, 0x00, 0x06, 0xc8, 0x0e, 0x68, + 0x00, 0x00, 0x5f, 0x04, 0x00, 0xbe, 0x07, 0x4d, + 0xe0, 0x00, 0x00, 0x00, 0x5f, 0x05, 0x00, 0xbe, + 0x08, 0x4d, 0xe1, 0x00, 0x00, 0x00, 0x5f, 0x06, + 0x00, 0x38, 0x96, 0x00, 0x00, 0x00, 0x04, 0x1c, + 0x01, 0x00, 0x00, 0xee, 0x5f, 0x07, 0x00, 0x06, + 0x61, 0x01, 0x00, 0xbd, 0x09, 0x56, 0xe3, 0x00, + 0x00, 0x00, 0x00, 0xbe, 0x0a, 0x54, 0x1d, 0x01, + 0x00, 0x00, 0x00, 0xbe, 0x0b, 0x54, 0x36, 0x00, + 0x00, 0x00, 0x00, 0xbe, 0x0c, 0x54, 0x1e, 0x01, + 0x00, 0x00, 0x00, 0xbe, 0x0d, 0x54, 0x11, 0x01, + 0x00, 0x00, 0x00, 0x06, 0xc9, 0x0e, 0x68, 0x01, + 0x00, 0x5f, 0x08, 0x00, 0x06, 0x2e, 0xb2, 0x03, + 0x01, 0x01, 0x28, 0x01, 0x01, 0x17, 0x08, 0x00, + 0x37, 0x00, 0xae, 0x02, 0x2a, 0x96, 0x03, 0x2a, + 0xcc, 0x01, 0x2a, 0x66, 0x2a, 0xee, 0x04, 0x2a, + 0xc4, 0x03, 0x57, 0xac, 0x08, 0x34, 0xe0, 0x03, + 0xde, 0xbc, 0x02, 0x2a, 0x80, 0x01, 0x2a, 0xa2, + 0x01, 0x57, 0x7a, 0x00, }; diff --git a/src/js/stdlib/sqlite.js b/src/js/stdlib/sqlite.js index 10073575..a879f362 100644 --- a/src/js/stdlib/sqlite.js +++ b/src/js/stdlib/sqlite.js @@ -80,6 +80,10 @@ class Database { // Return the default version of the transaction function. return properties.default.value; } + + loadExtension(file, entrypoint=undefined) { + return sqlite3.load_extension(this[kSqlite3Handle],file,entrypoint); + } } // Return the database's cached transaction controller, or create a new one. diff --git a/src/mod_sqlite3.c b/src/mod_sqlite3.c index 07f5ee96..b3ee0c39 100644 --- a/src/mod_sqlite3.c +++ b/src/mod_sqlite3.c @@ -153,6 +153,13 @@ static JSValue tjs_sqlite3_open(JSContext *ctx, JSValue this_val, int argc, JSVa return tjs_throw_sqlite3_errno(ctx, r); } + // Enable sqlite extensions (but only via C calls) + r = sqlite3_db_config(handle, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, NULL); + if (r != SQLITE_OK) { + sqlite3_close(handle); + return tjs_throw_sqlite3_errno(ctx, r); + } + JSValue obj = tjs_new_sqlite3(ctx, handle); if (JS_IsException(obj)) { sqlite3_close(handle); @@ -177,6 +184,34 @@ static JSValue tjs_sqlite3_close(JSContext *ctx, JSValue this_val, int argc, JSV return JS_UNDEFINED; } +static JSValue tjs_sqlite3_load_extension(JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { + TJSSqlite3Handle *h = tjs_sqlite3_get(ctx, argv[0]); + + if (!h) + return JS_EXCEPTION; + + const char *zFile = JS_ToCString(ctx, argv[1]); + const char *zProc = JS_IsUndefined(argv[2]) ? NULL : JS_ToCString(ctx, argv[2]); + + if (!zFile) { + return JS_EXCEPTION; + } + + // zProc can be 0, it means "sqlite, do your best to quess it" + + int r = sqlite3_load_extension(h->handle, zFile, zProc, NULL); + + JS_FreeCString(ctx, zFile); + if (zProc) + JS_FreeCString(ctx, zProc); + + if (r != SQLITE_OK) { + return tjs_throw_sqlite3_errno(ctx, r); + } + + return JS_UNDEFINED; +} + static JSValue tjs_sqlite3_exec(JSContext *ctx, JSValue this_val, int argc, JSValue *argv) { TJSSqlite3Handle *h = tjs_sqlite3_get(ctx, argv[0]); @@ -518,6 +553,7 @@ static JSValue tjs_sqlite3_stmt_run(JSContext *ctx, JSValue this_val, int argc, static const JSCFunctionListEntry tjs_sqlite3_funcs[] = { TJS_CFUNC_DEF("open", 2, tjs_sqlite3_open), + TJS_CFUNC_DEF("load_extension", 3, tjs_sqlite3_load_extension), TJS_CFUNC_DEF("close", 1, tjs_sqlite3_close), TJS_CFUNC_DEF("exec", 2, tjs_sqlite3_exec), TJS_CFUNC_DEF("prepare", 2, tjs_sqlite3_prepare), diff --git a/tests/fixtures/sqlite-test-ext.c b/tests/fixtures/sqlite-test-ext.c new file mode 100644 index 00000000..8266aaa2 --- /dev/null +++ b/tests/fixtures/sqlite-test-ext.c @@ -0,0 +1,29 @@ +#include + +SQLITE_EXTENSION_INIT1 + +void fn(sqlite3_context* context ,int,sqlite3_value**){ + sqlite3_result_int64(context, 43); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif + +int sqlite_test_ext_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + /* Insert here calls to + ** sqlite3_create_function_v2(), + ** sqlite3_create_collation_v2(), + ** sqlite3_create_module_v2(), and/or + ** sqlite3_vfs_register() + ** to register the new features that your extension adds. + */ + sqlite3_create_function_v2(db,"testfn",0, SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0, fn, 0, 0, 0); + return rc; +} diff --git a/tests/test-sqlite.js b/tests/test-sqlite.js index 29738a61..99b925cf 100644 --- a/tests/test-sqlite.js +++ b/tests/test-sqlite.js @@ -192,6 +192,26 @@ function testTransactionsNested() { assert.eq(data1.length, 2); } +function testExtensions(){ + let sopath = './build/libsqlite-test.so'; + switch(tjs.system.platform){ + case 'linux': + sopath = './build/libsqlite-test.so'; + break; + case 'darwin': + sopath = './build/libsqlite-test.dylib'; + break; + case 'windows': + sopath = './build/libsqlite-test.dll'; + break; + } + + const db = new Database(); + db.loadExtension(sopath, 'sqlite_test_ext_init') + assert.eq(db.prepare("SELECT testfn();").all()[0]["testfn()"], 43) +} + testTransactions(); testTransactionsError(); -testTransactionsNested() +testTransactionsNested(); +testExtensions(); diff --git a/types/src/sqlite.d.ts b/types/src/sqlite.d.ts index 059bed3f..96220d47 100644 --- a/types/src/sqlite.d.ts +++ b/types/src/sqlite.d.ts @@ -122,5 +122,13 @@ declare module 'tjs:sqlite'{ * Closes the database. No further operations can be performed afterwards. */ close(): void; + + /** + * Load an extension from file + * @param file location of the shared library + * @param entrypoint entrypoint, if left empty a guess is made by sqlite + */ + loadExtension(file:string, entrypoint?:string): undefined; + } }