diff --git a/.gitignore b/.gitignore index f3eb78a9e39..1dab9a41d59 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ dist node_modules xcuserdata v8forios +hermesforios *.log *.iml diff --git a/devtools/devtools-backend/CMakeLists.txt b/devtools/devtools-backend/CMakeLists.txt index f319ec12b47..2776ac0faf0 100644 --- a/devtools/devtools-backend/CMakeLists.txt +++ b/devtools/devtools-backend/CMakeLists.txt @@ -46,6 +46,8 @@ if ("${JS_ENGINE}" STREQUAL "V8") target_compile_definitions(${PROJECT_NAME} PRIVATE "JS_V8") elseif ("${JS_ENGINE}" STREQUAL "JSC") target_compile_definitions(${PROJECT_NAME} PRIVATE "JS_JSC") +elseif ("${JS_ENGINE}" STREQUAL "HERMES") + target_compile_definitions(${PROJECT_NAME} PUBLIC "JS_HERMES") endif () # endregion diff --git a/devtools/devtools-backend/src/api/devtools_backend_service.cc b/devtools/devtools-backend/src/api/devtools_backend_service.cc index 61e37564fb6..37f438fb4cd 100644 --- a/devtools/devtools-backend/src/api/devtools_backend_service.cc +++ b/devtools/devtools-backend/src/api/devtools_backend_service.cc @@ -50,7 +50,7 @@ DevtoolsBackendService::DevtoolsBackendService(const DevtoolsConfig& devtools_co DevtoolsBackendService::~DevtoolsBackendService() { FOOTSTONE_DLOG(INFO) << kDevToolsTag << "~DevtoolsBackendService"; } void DevtoolsBackendService::Create() { -#if defined(JS_V8) && !defined(V8_WITHOUT_INSPECTOR) +#if (defined(JS_V8) && !defined(V8_WITHOUT_INSPECTOR)) || defined(JS_HERMES) data_channel_->GetNotificationCenter()->vm_response_notification = std::make_shared([WEAK_THIS](const std::string& data) { DEFINE_AND_CHECK_SELF(DevtoolsBackendService) diff --git a/devtools/devtools-backend/src/module/domain_dispatch.cc b/devtools/devtools-backend/src/module/domain_dispatch.cc index c867bdf1d09..60dba4e8fd7 100644 --- a/devtools/devtools-backend/src/module/domain_dispatch.cc +++ b/devtools/devtools-backend/src/module/domain_dispatch.cc @@ -145,7 +145,7 @@ bool DomainDispatch::ReceiveDataFromFrontend(const std::string& data_string) { } void DomainDispatch::DispatchToVm(const std::string& data) { -#if defined(JS_V8) && !defined(V8_WITHOUT_INSPECTOR) +#if (defined(JS_V8) && !defined(V8_WITHOUT_INSPECTOR)) || defined(JS_HERMES) FOOTSTONE_DLOG(INFO) << kDevToolsTag << "JSDebugger, params=" << data.c_str(); auto vm_request = data_channel_->GetProvider()->vm_request_adapter; if (vm_request) { diff --git a/devtools/devtools-integration/native/CMakeLists.txt b/devtools/devtools-integration/native/CMakeLists.txt index 55cffdd2799..f65d78baffe 100644 --- a/devtools/devtools-integration/native/CMakeLists.txt +++ b/devtools/devtools-integration/native/CMakeLists.txt @@ -47,6 +47,8 @@ if ("${JS_ENGINE}" STREQUAL "V8") endif () elseif ("${JS_ENGINE}" STREQUAL "JSC") target_compile_definitions(${PROJECT_NAME} PRIVATE "JS_JSC") +elseif ("${JS_ENGINE}" STREQUAL "HERMES") + target_compile_definitions(${PROJECT_NAME} PRIVATE "JS_HERMES") endif () # endregion diff --git a/docs/development/ios-3.0-integration-guidelines.md b/docs/development/ios-3.0-integration-guidelines.md index f9ec4d4845e..ee44251ce8c 100644 --- a/docs/development/ios-3.0-integration-guidelines.md +++ b/docs/development/ios-3.0-integration-guidelines.md @@ -153,56 +153,11 @@ rootView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizin Hippy 3.x的一个重要特性是支持了多引擎的便捷切换,目前,可切换的引擎有两个,一是布局引擎,二是JS引擎。默认配置下,Hippy使用布局引擎是[Taitank](https://github.com/Tencent/Taitank),JS引擎是iOS系统内置的`JavaScriptCore`。 -如需使用其他布局引擎,如[Yoga](https://github.com/facebook/yoga),或使用其他JS引擎,如V8,可参考如下指引调整Hippy接入配置。 - -> Hippy3.x提供了iOS环境下默认的v8引擎实现,如需使用其他JS引擎需用户自行实现相关napi接口。 +如需使用其他布局引擎,如[Yoga](https://github.com/facebook/yoga),或使用其他JS引擎,可参考如下指引调整Hippy接入配置。 ### 4.1 切换JS引擎 -如需使用V8引擎,在Podfile文件中添加如下环境变量即可: - -```ruby -ENV['js_engine'] = 'v8' -``` - -修改后的Podfile应该看起来像这样: - -```text -#use_frameworks! -platform :ios, '11.0' -ENV['js_engine'] = 'v8' #切换为V8引擎 - -# TargetName大概率是您的项目名称 -target TargetName do - - pod 'hippy', 'your_specified_version' - -end -``` - -之后,重新执行`pod install`命令更新项目依赖即可。 - -如需使用其他第三方JS引擎,需要做如下操作: - -#### 1.修改Podfile配置为第三方JS引擎 - -将Podfile中的js_engine环境变量配置为other,这样在拉取代码时,jsc或者v8的代码将不会被添加到工程中。 - -```ruby -ENV['js_engine'] = 'other' -``` - -> Hippy3.0中使用napi抽象了不同JS引擎的接口。其中,JSC与V8的接口进行了实现。用户若使用JSC或者V8,可直接切换,Hippy默认进行了实现。 - -#### 2.自行实现napi抽象接口 - -napi将js引擎接口抽象化,由js driver层调用。接入方自行实现napi接口,即可实现对第三方JS引擎的支持。 - -napi文件位于 `/driver/js/napi*` 目录下。 - -#### 3.将实现文件添加到工程中 - -接入方自行将对应的napi实现文件添加到工程中。 +TODO: 切换Hermes引擎 ## 4.2 切换布局引擎 diff --git a/driver/js/CMakeLists.txt b/driver/js/CMakeLists.txt index 35b3befaacd..342bcff6ce1 100644 --- a/driver/js/CMakeLists.txt +++ b/driver/js/CMakeLists.txt @@ -22,6 +22,8 @@ cmake_minimum_required(VERSION 3.14) project("js_driver") +add_compile_options(-fno-rtti) + get_filename_component(PROJECT_ROOT_DIR "${PROJECT_SOURCE_DIR}/../.." REALPATH) include("${PROJECT_ROOT_DIR}/buildconfig/cmake/GlobalPackagesModule.cmake") @@ -127,6 +129,18 @@ if ("${JS_ENGINE}" STREQUAL "V8") endif () elseif ("${JS_ENGINE}" STREQUAL "JSC") target_compile_definitions(${PROJECT_NAME} PUBLIC "JS_JSC") +elseif ("${JS_ENGINE}" STREQUAL "HERMES") + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") + set(HERMES_REMOTE_FILENAME "android.tgz") + else () + message(FATAL_ERROR + "Unsupported system ${CMAKE_SYSTEM_NAME}") + endif () + InfraPackage_Add(Hermes + REMOTE "global_packages/hermes/${HERMES_COMPONENT}/${HERMES_REMOTE_FILENAME}" + LOCAL "${HERMES_COMPONENT}") + target_link_libraries(${PROJECT_NAME} PUBLIC hermes) + target_compile_definitions(${PROJECT_NAME} PUBLIC "JS_HERMES") elseif ("${JS_ENGINE}" STREQUAL "JSH") target_compile_definitions(${PROJECT_NAME} PUBLIC "JS_JSH") endif () @@ -188,6 +202,7 @@ set(SOURCE_SET src/modules/event_module.cc src/modules/scene_builder_module.cc src/napi/callback_info.cc + src/napi/js_try_catch.cc src/performance/performance.cc src/performance/performance_entry.cc src/performance/performance_frame_timing.cc @@ -222,7 +237,7 @@ elseif ("${JS_ENGINE}" STREQUAL "JSC") src/napi/jsc/jsc_ctx.cc src/napi/jsc/jsc_try_catch.cc src/vm/jsc/jsc_vm.cc - src/vm/jsc/native_source_code_ios.cc) + src/vm/jsc/native_source_code_jsc.cc) elseif ("${JS_ENGINE}" STREQUAL "JSH") list(APPEND SOURCE_SET src/napi/jsh/jsh_class_definition.cc @@ -230,6 +245,21 @@ elseif ("${JS_ENGINE}" STREQUAL "JSH") src/napi/jsh/jsh_try_catch.cc src/vm/jsh/jsh_vm.cc src/vm/jsh/native_source_code_ohos.cc) +elseif("${JS_ENGINE}" STREQUAL "HERMES") + list(APPEND SOURCE_SET + src/napi/hermes/hermes_class_definition.cc + src/napi/hermes/hermes_ctx.cc + src/napi/hermes/hermes_ctx_value.cc + src/napi/hermes/hermes_try_catch.cc + src/vm/hermes/hermes_vm.cc) + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") + list(APPEND SOURCE_SET src/vm/hermes/native_source_code_hermes_android.cc) + elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "iOS") + list(APPEND SOURCE_SET src/vm/hermes/native_source_code_hermes_ios.cc) + else() + message(FATAL_ERROR + "Unsupported system ${CMAKE_SYSTEM_NAME} by hermes engine") + endif() endif () set(SOURCE_SET_STANDALONE src/modules/console_module.cc diff --git a/driver/js/examples/hippy-react-demo/package.json b/driver/js/examples/hippy-react-demo/package.json index 50d2737107d..0867ab015b3 100644 --- a/driver/js/examples/hippy-react-demo/package.json +++ b/driver/js/examples/hippy-react-demo/package.json @@ -16,6 +16,8 @@ "hippy:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ios.js --config ./scripts/hippy-webpack.android.js --config ./scripts/hippy-webpack.ohos.js", "web:dev": "npm run hippy:dev & node ./scripts/env-polyfill.js webpack serve --config ./scripts/hippy-webpack.web-renderer.dev.js", "web:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.web-renderer.js", + "hippy:vendor:hermes": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.hermes.ios-vendor.js --config ./scripts/hippy-webpack.hermes.android-vendor.js", + "hippy:build:hermes": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.hermes.ios.js --config ./scripts/hippy-webpack.hermes.android.js" "ohos:vendor": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ohos-vendor.js", "ohos:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ohos.js" }, diff --git a/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.android-vendor.js b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.android-vendor.js new file mode 100644 index 00000000000..56085678b87 --- /dev/null +++ b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.android-vendor.js @@ -0,0 +1,80 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); + +const platform = 'android'; +const engine = 'hermes'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, './vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + library: 'hippyReactBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '..'), + path: path.resolve(__dirname, `../dist/${platform}/[name]-manifest.json`), + name: 'hippyReactBase', + }), + ], + module: { + rules: [ + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.jsx', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = {}; + // If hippy-react was built exist then make a alias + // Remove the section if you don't use it + const hippyReactPath = path.resolve(__dirname, '../../../packages/hippy-react'); + if (fs.existsSync(path.resolve(hippyReactPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/react in ${hippyReactPath}`); + aliases['@hippy/react'] = hippyReactPath; + } else { + console.warn('* Using the @hippy/react defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.android.js b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.android.js new file mode 100644 index 00000000000..2ea78d374e2 --- /dev/null +++ b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.android.js @@ -0,0 +1,113 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const pkg = require('../package.json'); +const manifest = require('../dist/android/vendor-manifest.json'); + +const platform = 'android'; +const engine = 'hermes'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + index: ['regenerator-runtime', path.resolve(pkg.main)], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + // CDN path can be configured to load children bundles from remote server + // publicPath: 'https://xxx/hippy/hippyReactDemo/', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, '..'), + manifest, + }), + new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + ], + module: { + rules: [ + { + test: /\.(jsx?)$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + '@babel/preset-react', + [ + '@babel/preset-env', + { + targets: { + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 8192, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + ], + }, + resolve: { + extensions: ['.js', '.jsx', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = {}; + + // If hippy-react was built exist then make a alias + // Remove the section if you don't use it + const hippyReactPath = path.resolve(__dirname, '../../../packages/hippy-react'); + if (fs.existsSync(path.resolve(hippyReactPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/react in ${hippyReactPath}`); + aliases['@hippy/react'] = hippyReactPath; + } else { + console.warn('* Using the @hippy/react defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.ios-vendor.js b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.ios-vendor.js new file mode 100644 index 00000000000..f1c66d1308f --- /dev/null +++ b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.ios-vendor.js @@ -0,0 +1,81 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); + +const platform = 'ios'; +const engine = 'hermes'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, './vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + library: 'hippyReactBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '..'), + path: path.resolve(__dirname, `../dist/${platform}/[name]-manifest.json`), + name: 'hippyReactBase', + }), + ], + module: { + rules: [ + { + test: /\.(jsx?)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + ios: 8, + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.jsx', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = {}; + // If hippy-react was built exist then make a alias + // Remove the section if you don't use it + const hippyReactPath = path.resolve(__dirname, '../../../packages/hippy-react'); + if (fs.existsSync(path.resolve(hippyReactPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/react in ${hippyReactPath}`); + aliases['@hippy/react'] = hippyReactPath; + } else { + console.warn('* Using the @hippy/react defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.ios.js b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.ios.js new file mode 100644 index 00000000000..f0a32b6b002 --- /dev/null +++ b/driver/js/examples/hippy-react-demo/scripts/hippy-webpack.hermes.ios.js @@ -0,0 +1,114 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const pkg = require('../package.json'); +const manifest = require('../dist/ios/vendor-manifest.json'); + +const platform = 'ios'; +const engine = 'hermes'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + index: ['@hippy/rejection-tracking-polyfill', 'regenerator-runtime', path.resolve(pkg.main)], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + // CDN path can be configured to load children bundles from remote server + // publicPath: 'https://xxx/hippy/hippyReactDemo/', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, '..'), + manifest, + }), + new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + ], + module: { + rules: [ + { + test: /\.(jsx?)$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + '@babel/preset-react', + [ + '@babel/preset-env', + { + targets: { + ios: 8, + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 8192, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + ], + }, + resolve: { + extensions: ['.js', '.jsx', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = {}; + + // If hippy-react was built exist then make a alias + // Remove the section if you don't use it + const hippyReactPath = path.resolve(__dirname, '../../../packages/hippy-react'); + if (fs.existsSync(path.resolve(hippyReactPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/react in ${hippyReactPath}`); + aliases['@hippy/react'] = hippyReactPath; + } else { + console.warn('* Using the @hippy/react defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-demo/package.json b/driver/js/examples/hippy-vue-demo/package.json index 55beadb9e50..c0f4572265f 100644 --- a/driver/js/examples/hippy-vue-demo/package.json +++ b/driver/js/examples/hippy-vue-demo/package.json @@ -14,6 +14,8 @@ "hippy:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ohos.js", "web:dev": "npm run hippy:dev & node ./scripts/env-polyfill.js webpack serve --config ./scripts/hippy-webpack.web-renderer.dev.js", "web:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.web-renderer.js", + "hippy:vendor:hermes": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.hermes.ios-vendor.js --config ./scripts/hippy-webpack.hermes.android-vendor.js", + "hippy:build:hermes": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.hermes.ios.js --config ./scripts/hippy-webpack.hermes.android.js" "ohos:vendor": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ohos-vendor.js", "ohos:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ohos.js" }, diff --git a/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.android-vendor.js b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.android-vendor.js new file mode 100644 index 00000000000..58f0cb806b7 --- /dev/null +++ b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.android-vendor.js @@ -0,0 +1,132 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); + +const platform = 'android'; +const engine = 'hermes'; + +let vueLoader = '@hippy/vue-loader'; +let VueLoaderPlugin; +const hippyVueLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib'); +const hippyVueLoaderNodeModulesPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/node_modules'); +if (fs.existsSync(hippyVueLoaderNodeModulesPath) && fs.existsSync(hippyVueLoaderPath)) { + console.warn(`* Using the @hippy/vue-loader in ${hippyVueLoaderPath}`); + vueLoader = hippyVueLoaderPath; + VueLoaderPlugin = require(path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib/plugin')); +} else { + console.warn('* Using the @hippy/vue-loader defined in package.json'); + VueLoaderPlugin = require('@hippy/vue-loader/lib/plugin'); +} + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, './vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + library: 'hippyVueBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '..'), + path: path.resolve(__dirname, `../dist/${platform}/[name]-manifest.json`), + name: 'hippyVueBase', + }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: vueLoader, + options: { + compilerOptions: { + // whitespace handler, default is 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = { + vue: '@hippy/vue', + '@': path.resolve('./src'), + 'vue-router': '@hippy/vue-router', + }; + // If hippy-vue was built exist then make a alias + // Remove the section if you don't use it + const hippyVuePath = path.resolve(__dirname, '../../../packages/hippy-vue'); + if (fs.existsSync(path.resolve(hippyVuePath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue in ${hippyVuePath} as vue alias`); + aliases.vue = hippyVuePath; + aliases['@hippy/vue'] = hippyVuePath; + } else { + console.warn('* Using the @hippy/vue defined in package.json'); + } + // If hippy-vue-router was built exist then make a alias + // Remove the section if you don't use it + const hippyVueRouterPath = path.resolve(__dirname, '../../../packages/hippy-vue-router'); + if (fs.existsSync(path.resolve(hippyVueRouterPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-router in ${hippyVueRouterPath} as vue-router alias`); + aliases['vue-router'] = hippyVueRouterPath; + } else { + console.warn('* Using the @hippy/vue-router defined in package.json'); + } + + // If hippy-vue-native-components was built exist then make a alias + // Remove the section if you don't use it + const hippyVueNativeComponentsPath = path.resolve(__dirname, '../../../packages/hippy-vue-native-components'); + if (fs.existsSync(path.resolve(hippyVueNativeComponentsPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-native-components in ${hippyVueNativeComponentsPath}`); + aliases['@hippy/vue-native-components'] = hippyVueNativeComponentsPath; + } else { + console.warn('* Using the @hippy/vue-native-components defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.android.js b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.android.js new file mode 100644 index 00000000000..6e8b318a6ac --- /dev/null +++ b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.android.js @@ -0,0 +1,180 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const pkg = require('../package.json'); +const manifest = require('../dist/android/vendor-manifest.json'); + +const platform = 'android'; +const engine = 'hermes'; + +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +let vueLoader = '@hippy/vue-loader'; +let VueLoaderPlugin; +const hippyVueLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib'); +const hippyVueLoaderNodeModulesPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/node_modules'); +if (fs.existsSync(hippyVueLoaderNodeModulesPath) && fs.existsSync(hippyVueLoaderPath)) { + console.warn(`* Using the @hippy/vue-loader in ${hippyVueLoaderPath}`); + vueLoader = hippyVueLoaderPath; + VueLoaderPlugin = require(path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib/plugin')); +} else { + console.warn('* Using the @hippy/vue-loader defined in package.json'); + VueLoaderPlugin = require('@hippy/vue-loader/lib/plugin'); +} + +module.exports = { + mode: 'production', + bail: true, + entry: { + index: [path.resolve(pkg.nativeMain)], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + // CDN path can be configured to load children bundles from remote server + // publicPath: 'https://xxx/hippy/hippyVueDemo/', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, '..'), + manifest, + }), + new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: vueLoader, + options: { + compilerOptions: { + // whitespace handler, default is 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.css$/, + use: [ + cssLoader, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 8192, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = { + vue: '@hippy/vue', + '@': path.resolve('./src'), + 'vue-router': '@hippy/vue-router', + }; + + // If hippy-vue was built exist in packages directory then make a alias + // Remove the section if you don't use it + const hippyVuePath = path.resolve(__dirname, '../../../packages/hippy-vue'); + if (fs.existsSync(path.resolve(hippyVuePath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue in ${hippyVuePath} as vue alias`); + aliases.vue = hippyVuePath; + aliases['@hippy/vue'] = hippyVuePath; + } else { + console.warn('* Using the @hippy/vue defined in package.json'); + } + + // If hippy-vue-router was built exist in packages directory then make a alias + // Remove the section if you don't use it + const hippyVueRouterPath = path.resolve(__dirname, '../../../packages/hippy-vue-router'); + if (fs.existsSync(path.resolve(hippyVueRouterPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-router in ${hippyVueRouterPath} as vue-router alias`); + aliases['vue-router'] = hippyVueRouterPath; + } else { + console.warn('* Using the @hippy/vue-router defined in package.json'); + } + + // If hippy-vue-native-components was built in packages directory exist then make a alias + // Remove the section if you don't use it + const hippyVueNativeComponentsPath = path.resolve(__dirname, '../../../packages/hippy-vue-native-components'); + if (fs.existsSync(path.resolve(hippyVueNativeComponentsPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-native-components in ${hippyVueNativeComponentsPath}`); + aliases['@hippy/vue-native-components'] = hippyVueNativeComponentsPath; + } else { + console.warn('* Using the @hippy/vue-native-components defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.ios-vendor.js b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.ios-vendor.js new file mode 100644 index 00000000000..61abefb63b1 --- /dev/null +++ b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.ios-vendor.js @@ -0,0 +1,133 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); + +const platform = 'ios'; +const engine = 'hermes'; + +let vueLoader = '@hippy/vue-loader'; +let VueLoaderPlugin; +const hippyVueLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib'); +const hippyVueLoaderNodeModulesPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/node_modules'); +if (fs.existsSync(hippyVueLoaderNodeModulesPath) && fs.existsSync(hippyVueLoaderPath)) { + console.warn(`* Using the @hippy/vue-loader in ${hippyVueLoaderPath}`); + vueLoader = hippyVueLoaderPath; + VueLoaderPlugin = require(path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib/plugin')); +} else { + console.warn('* Using the @hippy/vue-loader defined in package.json'); + VueLoaderPlugin = require('@hippy/vue-loader/lib/plugin'); +} + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, './vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + library: 'hippyVueBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '..'), + path: path.resolve(__dirname, `../dist/${platform}/[name]-manifest.json`), + name: 'hippyVueBase', + }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: vueLoader, + options: { + compilerOptions: { + // whitespace handler, default is 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + ios: 8, + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = { + vue: '@hippy/vue', + '@': path.resolve('./src'), + 'vue-router': '@hippy/vue-router', + }; + // If hippy-vue was built exist in packages directory then make a alias + // Remove the section if you don't use it + const hippyVuePath = path.resolve(__dirname, '../../../packages/hippy-vue'); + if (fs.existsSync(path.resolve(hippyVuePath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue in ${hippyVuePath} as vue alias`); + aliases.vue = hippyVuePath; + aliases['@hippy/vue'] = hippyVuePath; + } else { + console.warn('* Using the @hippy/vue defined in package.json'); + } + // If hippy-vue-router was built in packages directory exist then make a alias + // Remove the section if you don't use it + const hippyVueRouterPath = path.resolve(__dirname, '../../../packages/hippy-vue-router'); + if (fs.existsSync(path.resolve(hippyVueRouterPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-router in ${hippyVueRouterPath} as vue-router alias`); + aliases['vue-router'] = hippyVueRouterPath; + } else { + console.warn('* Using the @hippy/vue-router defined in package.json'); + } + + // If hippy-vue-native-components was built in packages directory exist then make a alias + // Remove the section if you don't use it + const hippyVueNativeComponentsPath = path.resolve(__dirname, '../../../packages/hippy-vue-native-components'); + if (fs.existsSync(path.resolve(hippyVueNativeComponentsPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-native-components in ${hippyVueNativeComponentsPath}`); + aliases['@hippy/vue-native-components'] = hippyVueNativeComponentsPath; + } else { + console.warn('* Using the @hippy/vue-native-components defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.ios.js b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.ios.js new file mode 100644 index 00000000000..e598bfd5e38 --- /dev/null +++ b/driver/js/examples/hippy-vue-demo/scripts/hippy-webpack.hermes.ios.js @@ -0,0 +1,181 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const pkg = require('../package.json'); +const manifest = require('../dist/ios/vendor-manifest.json'); + +const platform = 'ios'; +const engine = 'hermes'; + +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +let vueLoader = '@hippy/vue-loader'; +let VueLoaderPlugin; +const hippyVueLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib'); +const hippyVueLoaderNodeModulesPath = path.resolve(__dirname, '../../../packages/hippy-vue-loader/node_modules'); +if (fs.existsSync(hippyVueLoaderNodeModulesPath) && fs.existsSync(hippyVueLoaderPath)) { + console.warn(`* Using the @hippy/vue-loader in ${hippyVueLoaderPath}`); + vueLoader = hippyVueLoaderPath; + VueLoaderPlugin = require(path.resolve(__dirname, '../../../packages/hippy-vue-loader/lib/plugin')); +} else { + console.warn('* Using the @hippy/vue-loader defined in package.json'); + VueLoaderPlugin = require('@hippy/vue-loader/lib/plugin'); +} + +module.exports = { + mode: 'production', + bail: true, + entry: { + index: ['@hippy/rejection-tracking-polyfill', path.resolve(pkg.nativeMain)], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + // CDN path can be configured to load children bundles from remote server + // publicPath: 'https://xxx/hippy/hippyVueDemo/', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, '..'), + manifest, + }), + new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: vueLoader, + options: { + compilerOptions: { + // whitespace handler, default is 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.css$/, + use: [ + cssLoader, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + ios: 8, + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 8192, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + // if node_modules path listed below is not your repo directory, change it. + modules: [path.resolve(__dirname, '../node_modules')], + alias: (() => { + const aliases = { + vue: '@hippy/vue', + '@': path.resolve('./src'), + 'vue-router': '@hippy/vue-router', + }; + + // If hippy-vue was built exist in packages directory then make a alias + // Remove the section if you don't use it + const hippyVuePath = path.resolve(__dirname, '../../../packages/hippy-vue'); + if (fs.existsSync(path.resolve(hippyVuePath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue in ${hippyVuePath} as vue alias`); + aliases.vue = hippyVuePath; + aliases['@hippy/vue'] = hippyVuePath; + } else { + console.warn('* Using the @hippy/vue defined in package.json'); + } + + // If hippy-vue-router was built exist in packages directory then make a alias + // Remove the section if you don't use it + const hippyVueRouterPath = path.resolve(__dirname, '../../../packages/hippy-vue-router'); + if (fs.existsSync(path.resolve(hippyVueRouterPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-router in ${hippyVueRouterPath} as vue-router alias`); + aliases['vue-router'] = hippyVueRouterPath; + } else { + console.warn('* Using the @hippy/vue-router defined in package.json'); + } + + // If hippy-vue-native-components was built exist in packages directory then make a alias + // Remove the section if you don't use it + const hippyVueNativeComponentsPath = path.resolve(__dirname, '../../../packages/hippy-vue-native-components'); + if (fs.existsSync(path.resolve(hippyVueNativeComponentsPath, 'dist/index.js'))) { + console.warn(`* Using the @hippy/vue-native-components in ${hippyVueNativeComponentsPath}`); + aliases['@hippy/vue-native-components'] = hippyVueNativeComponentsPath; + } else { + console.warn('* Using the @hippy/vue-native-components defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-demo/package.json b/driver/js/examples/hippy-vue-next-demo/package.json index 49a345a7a53..318d43577f1 100644 --- a/driver/js/examples/hippy-vue-next-demo/package.json +++ b/driver/js/examples/hippy-vue-next-demo/package.json @@ -14,6 +14,8 @@ "hippy:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ios.js --config ./scripts/hippy-webpack.android.js --config ./scripts/hippy-webpack.ohos.js", "web:dev": "npm run hippy:dev & node ./scripts/env-polyfill.js webpack serve --config ./scripts/hippy-webpack.web-renderer.dev.js", "web:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.web-renderer.js", + "hippy:vendor:hermes": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.hermes.ios-vendor.js --config ./scripts/hippy-webpack.hermes.android-vendor.js", + "hippy:build:hermes": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.hermes.ios.js --config ./scripts/hippy-webpack.hermes.android.js" "ohos:vendor": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ohos-vendor.js", "ohos:build": "node ./scripts/env-polyfill.js webpack --config ./scripts/hippy-webpack.ohos.js" }, diff --git a/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.android-vendor.js b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.android-vendor.js new file mode 100644 index 00000000000..ee26b466b70 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.android-vendor.js @@ -0,0 +1,109 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const { VueLoaderPlugin } = require('vue-loader'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); + +const platform = 'android'; +const engine = 'hermes'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, './vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + library: 'hippyVueBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '..'), + path: path.resolve(__dirname, `../dist/${platform}/[name]-manifest.json`), + name: 'hippyVueBase', + }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.android.js b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.android.js new file mode 100644 index 00000000000..baf441057ba --- /dev/null +++ b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.android.js @@ -0,0 +1,171 @@ +const path = require('path'); +const fs = require('fs'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const { VueLoaderPlugin } = require('vue-loader'); +const webpack = require('webpack'); + +const platform = 'android'; +const engine = 'hermes'; + +const pkg = require('../package.json'); +const manifest = require('../dist/android/vendor-manifest.json'); +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +module.exports = { + mode: 'production', + bail: true, + entry: { + index: [path.resolve(pkg.nativeMain)], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + // CDN path can be configured to load children bundles from remote server + // publicPath: 'https://xxx/hippy/hippyVueNextDemo/', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, '..'), + manifest, + }), + new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 8192, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.ios-vendor.js b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.ios-vendor.js new file mode 100644 index 00000000000..d7480b8e81b --- /dev/null +++ b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.ios-vendor.js @@ -0,0 +1,110 @@ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const { VueLoaderPlugin } = require('vue-loader'); + +const platform = 'ios'; +const engine = 'hermes'; + +module.exports = { + mode: 'production', + bail: true, + entry: { + vendor: [path.resolve(__dirname, './vendor.js')], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + library: 'hippyVueBase', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllPlugin({ + context: path.resolve(__dirname, '..'), + path: path.resolve(__dirname, `../dist/${platform}/[name]-manifest.json`), + name: 'hippyVueBase', + }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(js)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: { + ios: 8, + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ], + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.ios.js b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.ios.js new file mode 100644 index 00000000000..19800565466 --- /dev/null +++ b/driver/js/examples/hippy-vue-next-demo/scripts/hippy-webpack.hermes.ios.js @@ -0,0 +1,172 @@ +const path = require('path'); +const fs = require('fs'); +const HippyDynamicImportPlugin = require('@hippy/hippy-dynamic-import-plugin'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const { VueLoaderPlugin } = require('vue-loader'); +const webpack = require('webpack'); + +const platform = 'ios'; +const engine = 'hermes'; + +const pkg = require('../package.json'); +const manifest = require('../dist/ios/vendor-manifest.json'); +let cssLoader = '@hippy/vue-css-loader'; +const hippyVueCssLoaderPath = path.resolve(__dirname, '../../../packages/hippy-vue-css-loader/dist/css-loader.js'); +if (fs.existsSync(hippyVueCssLoaderPath)) { + console.warn(`* Using the @hippy/vue-css-loader in ${hippyVueCssLoaderPath}`); + cssLoader = hippyVueCssLoaderPath; +} else { + console.warn('* Using the @hippy/vue-css-loader defined in package.json'); +} + +module.exports = { + mode: 'production', + bail: true, + entry: { + index: ['@hippy/rejection-tracking-polyfill', path.resolve(pkg.nativeMain)], + }, + output: { + filename: `[name].${platform}.js`, + path: path.resolve(`./dist/${platform}_${engine}/`), + globalObject: '(0, eval)("this")', + // CDN path can be configured to load children bundles from remote server + // publicPath: 'https://xxx/hippy/hippyVueNextDemo/', + }, + plugins: [ + new webpack.NamedModulesPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + __PLATFORM__: JSON.stringify(platform), + }), + new CaseSensitivePathsPlugin(), + new VueLoaderPlugin(), + new webpack.DllReferencePlugin({ + context: path.resolve(__dirname, '..'), + manifest, + }), + new HippyDynamicImportPlugin(), + // LimitChunkCountPlugin can control dynamic import ability + // Using 1 will prevent any additional chunks from being added + // new webpack.optimize.LimitChunkCountPlugin({ + // maxChunks: 1, + // }), + // use SourceMapDevToolPlugin can generate sourcemap file + // new webpack.SourceMapDevToolPlugin({ + // test: /\.(js|jsbundle|css|bundle)($|\?)/i, + // filename: '[file].map', + // }), + ], + module: { + rules: [ + { + test: /\.vue$/, + use: [ + { + loader: 'vue-loader', + options: { + compilerOptions: { + // disable vue3 dom patch flag,because hippy do not support innerHTML + hoistStatic: false, + // whitespace handler, default is 'condense', it can be set 'preserve' + whitespace: 'condense', + }, + }, + }, + ], + }, + { + test: /\.(le|c)ss$/, + use: [cssLoader, 'less-loader'], + }, + { + test: /\.t|js$/, + use: [ + { + loader: 'babel-loader', + options: { + sourceType: 'unambiguous', + presets: [ + [ + '@babel/preset-env', + { + targets: { + ios: 9, + chrome: 41, + }, + }, + ], + ], + plugins: [ + ['@babel/plugin-proposal-class-properties'], + ['@babel/plugin-proposal-decorators', { legacy: true }], + ['@babel/plugin-transform-runtime', { regenerator: true }], + ], + }, + }, + ], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [{ + loader: 'url-loader', + options: { + // if you would like to use base64 for picture, uncomment limit: true + // limit: true, + limit: 8192, + fallback: 'file-loader', + name: '[name].[ext]', + outputPath: 'assets/', + }, + }], + }, + { + test: /\.(ts)$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: [/\.vue$/], + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.mjs$/, + include: /node_modules/, + type: 'javascript/auto', + }, + ], + }, + resolve: { + extensions: ['.js', '.vue', '.json', '.ts'], + alias: (() => { + const aliases = { + src: path.resolve('./src'), + }; + + // If @vue/runtime-core was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueRuntimeCorePath = path.resolve(__dirname, '../../../packages/hippy-vue-next/node_modules/@vue/runtime-core'); + if (fs.existsSync(path.resolve(hippyVueRuntimeCorePath, 'index.js'))) { + console.warn(`* Using the @vue/runtime-core in ${hippyVueRuntimeCorePath} as vue alias`); + aliases['@vue/runtime-core'] = hippyVueRuntimeCorePath; + } else { + console.warn('* Using the @vue/runtime-core defined in package.json'); + } + + // If @hippy/vue-next was built exist in packages directory then make an alias + // Remove the section if you don't use it + const hippyVueNextPath = path.resolve(__dirname, '../../../packages/hippy-vue-next/dist'); + if (fs.existsSync(path.resolve(hippyVueNextPath, 'index.js'))) { + console.warn(`* Using the @hippy/vue-next in ${hippyVueNextPath} as @hippy/vue-next alias`); + aliases['@hippy/vue-next'] = hippyVueNextPath; + } else { + console.warn('* Using the @hippy/vue-next defined in package.json'); + } + + return aliases; + })(), + }, +}; diff --git a/driver/js/include/driver/engine.h b/driver/js/include/driver/engine.h index 449ec2e68d4..a7e81dd5296 100644 --- a/driver/js/include/driver/engine.h +++ b/driver/js/include/driver/engine.h @@ -31,9 +31,6 @@ #include "footstone/logging.h" #include "footstone/task_runner.h" -#if defined(ENABLE_INSPECTOR) && defined(JS_V8) && !defined(V8_WITHOUT_INSPECTOR) -#include "driver/vm/v8/inspector/v8_inspector_client_impl.h" -#endif namespace hippy { inline namespace driver { diff --git a/driver/js/include/driver/js_driver_utils.h b/driver/js/include/driver/js_driver_utils.h index 342b2792cda..5b56a18022b 100644 --- a/driver/js/include/driver/js_driver_utils.h +++ b/driver/js/include/driver/js_driver_utils.h @@ -24,9 +24,11 @@ #include #include - #include "driver/scope.h" #include "footstone/string_view.h" +#ifdef ENABLE_INSPECTOR +#include "devtools/devtools_data_source.h" +#endif namespace hippy { inline namespace driver { @@ -80,6 +82,10 @@ class JsDriverUtils { byte_string)>& callback); static void LoadInstance(const std::shared_ptr& scope, byte_string&& buffer_data); static void UnloadInstance(const std::shared_ptr& scope, byte_string&& buffer_data); + + static void InitDevTools(const std::shared_ptr& scope, + const std::shared_ptr& vm, + const std::shared_ptr& source); }; } // namespace driver diff --git a/driver/js/include/driver/modules/module_register.h b/driver/js/include/driver/modules/module_register.h index 72484b8cae3..7ffa99afc79 100644 --- a/driver/js/include/driver/modules/module_register.h +++ b/driver/js/include/driver/modules/module_register.h @@ -26,13 +26,16 @@ #include "driver/napi/callback_info.h" #include "driver/scope.h" -#define GEN_INVOKE_CB_INTERNAL(Module, Function, Name) \ - static void Name(hippy::napi::CallbackInfo& info, void* data) { \ - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); \ - auto scope = scope_wrapper->scope.lock(); \ - FOOTSTONE_CHECK(scope); \ - auto target = std::static_pointer_cast(scope->GetModuleObject(#Module)); \ - target->Function(info, data); \ + +#define GEN_INVOKE_CB_INTERNAL(Module, Function, Name) \ + static void Name(hippy::napi::CallbackInfo& info, void* data) { \ + std::any slot_any = info.GetSlot(); \ + auto any_pointer = std::any_cast(&slot_any); \ + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); \ + auto scope = scope_wrapper->scope.lock(); \ + FOOTSTONE_CHECK(scope); \ + auto target = std::static_pointer_cast(scope->GetModuleObject(#Module)); \ + target->Function(info, data); \ } #ifndef REGISTER_EXTERNAL_REFERENCES diff --git a/driver/js/include/driver/napi/hermes/hermes_class_definition.h b/driver/js/include/driver/napi/hermes/hermes_class_definition.h new file mode 100644 index 00000000000..c67617215e6 --- /dev/null +++ b/driver/js/include/driver/napi/hermes/hermes_class_definition.h @@ -0,0 +1,56 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2023 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#include "driver/napi/js_class_definition.h" +#include "footstone/string_view.h" + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" +#pragma clang diagnostic ignored "-Wsign-conversion" +#include "jsi/jsi.h" +#pragma clang diagnostic pop + +namespace hippy { +inline namespace driver { +inline namespace napi { + +using Runtime = facebook::jsi::Runtime; +using Function = facebook::jsi::Function; +using Value = facebook::jsi::Value; + +class HermesClassDefinition : public ClassDefinition { + public: + HermesClassDefinition(Runtime& runtime, const footstone::stringview::string_view& name, Function& function); + virtual ~HermesClassDefinition(); + + Value& GetTemplate() { return function_; } + + private: + footstone::stringview::string_view name_; + Value function_; +}; + +} // namespace napi +} // namespace driver +} // namespace hippy diff --git a/driver/js/include/driver/napi/hermes/hermes_ctx.h b/driver/js/include/driver/napi/hermes/hermes_ctx.h new file mode 100644 index 00000000000..0b2af74bd8d --- /dev/null +++ b/driver/js/include/driver/napi/hermes/hermes_ctx.h @@ -0,0 +1,274 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#include +#include +#include + +#include "driver/napi/hermes/hermes_class_definition.h" +#include "driver/napi/hermes/hermes_ctx_value.h" +#include "driver/scope.h" +#include "driver/napi/js_ctx.h" +#include "driver/vm/hermes/hermes_vm.h" + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" +#pragma clang diagnostic ignored "-Wsign-conversion" +#pragma clang diagnostic ignored "-Wshorten-64-to-32" +#include "jsi/jsi.h" + +#ifdef ENABLE_INSPECTOR +#include "hermes/cdp/CDPAgent.h" +#include "hermes/cdp/CDPDebugAPI.h" + +using CDPAgent = facebook::hermes::cdp::CDPAgent; +using CDPDebugAPI = facebook::hermes::cdp::CDPDebugAPI; +#endif /* ENABLE_INSPECTOR */ + +#pragma clang diagnostic pop + +namespace hippy { +inline namespace driver { +inline namespace napi { + +using Runtime = facebook::jsi::Runtime; +using PropNameID = facebook::jsi::PropNameID; +using Value = facebook::jsi::Value; +using Object = facebook::jsi::Object; +using NativeState = facebook::jsi::NativeState; +using String = facebook::jsi::String; +using Array = facebook::jsi::Array; + +class LocalNativeState : public NativeState { +public: + LocalNativeState() = default; + ~LocalNativeState() { + if (weak_callback_wrapper) { + auto scope = weak_callback_wrapper->scope.lock(); + if (scope && scope->isValid()) { + weak_callback_wrapper->callback(weak_callback_wrapper->data, Get()); + } + } + } + + void Set(void* address) { data_ = address; } + void* Get() { return data_; } + + void Set(int key, void* address) { + data_map_[key] = address; + } + + void* Get(int key) { + auto it = data_map_.find(key); + if (it != data_map_.end()) { + return it->second; + } + return nullptr; + } + + void SetWeakCallbackWrapper(std::unique_ptr&& wrapper) { + weak_callback_wrapper = std::move(wrapper); + } + +private: + void* data_; + std::unordered_map data_map_; + std::unique_ptr weak_callback_wrapper; +}; + +class GlobalNativeState : public NativeState { + public: + GlobalNativeState() = default; + ~GlobalNativeState() = default; + + void Set(uint32_t index, std::any data) { external_map_[index] = data; } + bool Get(uint32_t index, std::any& value) const { + const auto it = external_map_.find(index); + if (it == external_map_.end()) return false; + value = it->second; + return true; + } + + private: + std::unordered_map external_map_; +}; + +class HippyJsiBuffer : public facebook::jsi::Buffer { + public: + HippyJsiBuffer(const uint8_t* data, size_t len); + virtual ~HippyJsiBuffer(); + uint8_t* data() const override { return data_; } + size_t size() const override { return len_; } + + private: + uint8_t* data_; + size_t len_; +}; + +class HippyMutableBuffer : public facebook::jsi::MutableBuffer { +public: + HippyMutableBuffer(void* buffer, size_t length) + : buffer_(static_cast(buffer)), length_(length) {} + + size_t size() const override { return length_; } + uint8_t* data() override { return buffer_; } + +private: + uint8_t* buffer_; + size_t length_; +}; + +class HermesCtx : public Ctx { + public: + HermesCtx(); + ~HermesCtx(); + + virtual std::shared_ptr DefineProxy(const std::unique_ptr& constructor_wrapper) override; + virtual std::shared_ptr DefineProxyHandler(const std::unique_ptr& proxy_handler) override; + virtual std::shared_ptr DefineClass(const string_view& name, const std::shared_ptr& parent, + const std::unique_ptr& constructor_wrapper, + size_t property_count, + std::shared_ptr properties[]) override; + + virtual std::shared_ptr NewInstance(const std::shared_ptr& cls, int argc, + std::shared_ptr argv[], void* external) override; + + virtual std::shared_ptr GetGlobalObject() override; + void SetExternalData(void* data) override; + virtual void* GetObjectExternalData(const std::shared_ptr& object) override; + virtual std::shared_ptr GetClassDefinition(const string_view& name) override; + virtual void SetWeak(std::shared_ptr value, const std::unique_ptr& wrapper) override; + virtual void SetWeak(std::shared_ptr value, std::unique_ptr&& wrapper) override; + + // Get and Set property to object + virtual bool SetProperty(std::shared_ptr object, + std::shared_ptr key, + std::shared_ptr value) override; + virtual bool SetProperty(std::shared_ptr object, + std::shared_ptr key, + std::shared_ptr value, + const PropertyAttribute& attr) override; + virtual std::shared_ptr GetProperty(const std::shared_ptr& object, + std::shared_ptr key) override; + virtual std::shared_ptr GetProperty(const std::shared_ptr& object, + const string_view& name) override; + + // Create Hermes JS Object + virtual std::shared_ptr CreateObject() override; + virtual std::shared_ptr CreateNumber(double number) override; + virtual std::shared_ptr CreateBoolean(bool b) override; + virtual std::shared_ptr CreateString(const string_view& string_view) override; + virtual std::shared_ptr CreateUndefined() override; + virtual std::shared_ptr CreateNull() override; + virtual std::shared_ptr CreateFunction(const std::unique_ptr& wrapper) override; + virtual std::shared_ptr CreateObject(const std::unordered_map>& object) override; + virtual std::shared_ptr CreateObject(const std::unordered_map, std::shared_ptr>& object) override; + virtual std::shared_ptr CreateMap(const std::map, std::shared_ptr>& map) override; + virtual std::shared_ptr CreateArray(size_t count, std::shared_ptr value[]) override; + virtual std::shared_ptr CreateException(const string_view& msg) override; + virtual std::shared_ptr CreateByteBuffer(void* buffer, size_t length) override; + + // Get From Value + virtual bool GetValueNumber(const std::shared_ptr& value, double* result) override; + virtual bool GetValueNumber(const std::shared_ptr& value, int32_t* result) override; + virtual bool GetValueBoolean(const std::shared_ptr& value, bool* result) override; + virtual bool GetValueString(const std::shared_ptr& value, string_view* result) override; + virtual bool GetValueJson(const std::shared_ptr& value, string_view* result) override; + virtual bool GetEntriesFromObject(const std::shared_ptr& value, + std::unordered_map, std::shared_ptr>& map) override; + virtual bool GetEntriesFromMap(const std::shared_ptr& value, + std::unordered_map, std::shared_ptr>& map) override; + virtual bool GetByteBuffer(const std::shared_ptr& value, + void** out_data, size_t& out_length, uint32_t& out_type) override; + virtual uint32_t GetArrayLength(const std::shared_ptr& value) override; + + + // Check Value type + virtual bool IsNull(const std::shared_ptr& value) override; + virtual bool IsUndefined(const std::shared_ptr& value) override; + virtual bool IsNullOrUndefined(const std::shared_ptr& value) override; + virtual bool IsBoolean(const std::shared_ptr& value) override; + virtual bool IsNumber(const std::shared_ptr& value) override; + virtual bool IsString(const std::shared_ptr& value) override; + virtual bool IsFunction(const std::shared_ptr& value) override; + virtual bool IsObject(const std::shared_ptr& value) override; + virtual bool IsMap(const std::shared_ptr& value) override; + virtual bool IsArray(const std::shared_ptr& value) override; + virtual bool IsByteBuffer(const std::shared_ptr& value) override; + virtual bool HasNamedProperty(const std::shared_ptr& value, const string_view& utf8name) override; + virtual bool Equals(const std::shared_ptr& lhs, const std::shared_ptr& rhs) override; + + // Copy operations + virtual std::shared_ptr CopyArrayElement(const std::shared_ptr& value, uint32_t index) override; + virtual std::shared_ptr CopyNamedProperty(const std::shared_ptr& value, const string_view& name) override; + virtual string_view CopyFunctionName(const std::shared_ptr& value) override; + + // Run Script and Call Function + virtual std::shared_ptr RunScript(const string_view& data, const string_view& file_name) override; + virtual std::shared_ptr CallFunction(const std::shared_ptr& function, + const std::shared_ptr& receiver, + size_t argument_count, + const std::shared_ptr arguments[]) override; + + + // TryCatch and Exception Related + virtual std::shared_ptr CreateTryCatchScope(bool enable, std::shared_ptr ctx) override; + virtual void ThrowException(const std::shared_ptr& exception) override; + virtual void ThrowException(const string_view& exception) override; + inline std::shared_ptr GetException() { return exception_; } + string_view GetExceptionMessage(const std::shared_ptr& exception); + + // Get hermes runtime + const std::unique_ptr& GetRuntime() { return runtime_; } + + // Get platform-specific internal embedded code + std::unique_ptr GetNativeSourceCodeProvider() const override; + +#ifdef ENABLE_INSPECTOR + inline std::unique_ptr &GetCDPAgent() { return cdpAgent_; }; + void SetupDebugAgent(facebook::hermes::debugger::EnqueueRuntimeTaskFunc enqueueRuntimeTask, + facebook::hermes::cdp::OutboundMessageFunc messageCallback); +#endif /* ENABLE_INSPECTOR */ + + private: + Value Eval(const char* code); + Function EvalFunction(const std::string& code); + void BuiltinModule(); + void BuiltinFunction(facebook::jsi::Object& module, const std::string& name); + + private: + std::unique_ptr runtime_; +#ifdef ENABLE_INSPECTOR + std::unique_ptr cdpAgent_; + std::unique_ptr cdpDebugAPI_; +#endif /* ENABLE_INSPECTOR */ + std::shared_ptr global_native_state_; + std::unordered_map> template_map_; + std::shared_ptr exception_; + friend class hippy::driver::vm::HermesVM; +}; + +} // namespace napi +} // namespace driver +} // namespace hippy diff --git a/driver/js/include/driver/napi/hermes/hermes_ctx_value.h b/driver/js/include/driver/napi/hermes/hermes_ctx_value.h new file mode 100644 index 00000000000..f68e5a58cdd --- /dev/null +++ b/driver/js/include/driver/napi/hermes/hermes_ctx_value.h @@ -0,0 +1,82 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" +#pragma clang diagnostic ignored "-Wsign-conversion" +#include "hermes/hermes.h" +#include "jsi/jsi.h" +#pragma clang diagnostic pop + +#include + +#include "driver/napi/js_ctx_value.h" + +namespace hippy { +inline namespace driver { +inline namespace napi { + +using HermesRuntime = facebook::hermes::HermesRuntime; +using Runtime = facebook::jsi::Runtime; +using Value = facebook::jsi::Value; + +using Symbol = facebook::jsi::Symbol; +using BigInt = facebook::jsi::BigInt; +using String = facebook::jsi::String; +using Object = facebook::jsi::Object; + +class HermesCtxValue : public CtxValue { + public: + enum Type { + SymbolKind, + BigIntKind, + StringKind, + ObjectKind, + UnknowKind, + }; + + HermesCtxValue(Runtime& runtime, const Value& value) : value_(runtime, value), type_(Type::UnknowKind) {} + HermesCtxValue(Runtime& runtime, const Symbol& value) : value_(runtime, value), type_(Type::SymbolKind) {} + HermesCtxValue(Runtime& runtime, const BigInt& value) : value_(runtime, value), type_(Type::BigIntKind) {} + HermesCtxValue(Runtime& runtime, const String& value) : value_(runtime, value), type_(Type::StringKind) {} + HermesCtxValue(Runtime& runtime, const Object& value) : value_(runtime, value), type_(Type::ObjectKind) {} + Value GetValue(const std::unique_ptr& runtime); + + private: + Value value_; + Type type_; +}; + +class HermesExceptionCtxValue : public CtxValue { + public: + HermesExceptionCtxValue(std::exception_ptr exception, std::string& message) : exception_(exception), message_(message) {} + std::string Message() const { return message_; } + private: + std::exception_ptr exception_; + std::string message_; +}; + +} // namespace napi +} // namespace driver +} // namespace hippy diff --git a/driver/js/include/driver/napi/hermes/hermes_try_catch.h b/driver/js/include/driver/napi/hermes/hermes_try_catch.h new file mode 100644 index 00000000000..14544ae5f32 --- /dev/null +++ b/driver/js/include/driver/napi/hermes/hermes_try_catch.h @@ -0,0 +1,51 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#include "driver/napi/hermes/hermes_ctx.h" +#include "driver/napi/hermes/hermes_ctx_value.h" +#include "driver/napi/js_try_catch.h" + +namespace hippy { +inline namespace driver { +inline namespace napi { + +class HermesTryCatch : public TryCatch { + public: + HermesTryCatch(bool enable, std::shared_ptr& ctx); + virtual ~HermesTryCatch() = default; + + virtual void ReThrow(); + virtual bool HasCaught(); + virtual bool CanContinue(); + virtual bool HasTerminated(); + virtual bool IsVerbose(); + virtual void SetVerbose(bool verbose); + virtual std::shared_ptr Exception(); + virtual footstone::string_view GetExceptionMessage(); + +}; + +} // namespace napi +} // namespace driver +} // namespace hippy diff --git a/driver/js/include/driver/napi/js_ctx.h b/driver/js/include/driver/napi/js_ctx.h index b5b476a5089..cc0ad11de60 100644 --- a/driver/js/include/driver/napi/js_ctx.h +++ b/driver/js/include/driver/napi/js_ctx.h @@ -34,12 +34,14 @@ #include "driver/napi/callback_info.h" #include "driver/napi/js_class_definition.h" #include "driver/napi/js_ctx_value.h" - +#include "driver/vm/native_source_code.h" #include "dom/dom_event.h" namespace hippy { inline namespace driver { +class Scope; inline namespace napi { +class TryCatch; enum PropertyAttribute { /** None. **/ @@ -75,6 +77,7 @@ class WeakCallbackWrapper { WeakCallback callback; void* data; + std::weak_ptr scope; }; class CtxValue; @@ -114,6 +117,8 @@ class Ctx { virtual std::shared_ptr DefineProxy(const std::unique_ptr& constructor_wrapper) = 0; + virtual std::shared_ptr DefineProxyHandler(const std::unique_ptr& proxy_handler) = 0; + virtual std::shared_ptr DefineClass(const string_view& name, const std::shared_ptr& parent, const std::unique_ptr& constructor_wrapper, @@ -216,6 +221,7 @@ class Ctx { virtual void ThrowException(const std::shared_ptr& exception) = 0; virtual void ThrowException(const string_view& exception) = 0; + virtual std::shared_ptr CreateTryCatchScope(bool enable, std::shared_ptr ctx) = 0; virtual void SetExternalData(void* data) = 0; virtual std::shared_ptr GetClassDefinition(const string_view& name) = 0; @@ -223,6 +229,12 @@ class Ctx { const std::unique_ptr& wrapper) = 0; virtual void InvalidWeakCallbackWrapper() {} virtual void SetReceiverData(std::shared_ptr value, void* data) {} + virtual void SetWeak(std::shared_ptr value, + std::unique_ptr&& wrapper) = 0; + + // Get platform-specific internal embedded code + virtual std::unique_ptr GetNativeSourceCodeProvider() const = 0; + }; } diff --git a/driver/js/include/driver/napi/js_try_catch.h b/driver/js/include/driver/napi/js_try_catch.h index cb8419aec3d..65e72558907 100644 --- a/driver/js/include/driver/napi/js_try_catch.h +++ b/driver/js/include/driver/napi/js_try_catch.h @@ -47,13 +47,12 @@ class TryCatch { virtual std::shared_ptr Exception() = 0; virtual footstone::string_view GetExceptionMessage() = 0; + static std::shared_ptr CreateTryCatchScope(bool enable, std::shared_ptr ctx); protected: bool enable_; std::shared_ptr ctx_; }; -std::shared_ptr CreateTryCatchScope(bool enable, std::shared_ptr ctx); - } } } diff --git a/driver/js/include/driver/napi/jsc/jsc_ctx.h b/driver/js/include/driver/napi/jsc/jsc_ctx.h index 075837285d5..bf80fc80b11 100644 --- a/driver/js/include/driver/napi/jsc/jsc_ctx.h +++ b/driver/js/include/driver/napi/jsc/jsc_ctx.h @@ -121,9 +121,11 @@ class JSCCtx : public Ctx { JSGlobalContextSetName(context_, js_name); JSStringRelease(js_name); } - + virtual std::shared_ptr DefineProxy(const std::unique_ptr& wrapper) override; - + + virtual std::shared_ptr DefineProxyHandler(const std::unique_ptr& proxy_handler) override; + virtual std::shared_ptr DefineClass(const string_view& name, const std::shared_ptr& parent, const std::unique_ptr& constructor_wrapper, @@ -219,16 +221,21 @@ class JSCCtx : public Ctx { virtual void ThrowException(const std::shared_ptr &exception) override; virtual void ThrowException(const string_view& exception) override; + virtual std::shared_ptr CreateTryCatchScope(bool enable, std::shared_ptr ctx) override; virtual void SetExternalData(void* data) override; virtual std::shared_ptr GetClassDefinition(const string_view& name) override; virtual void SetWeak(std::shared_ptr value, const std::unique_ptr& wrapper) override; + virtual void SetWeak(std::shared_ptr value, std::unique_ptr&& wrapper) override; string_view GetExceptionMessage(const std::shared_ptr& exception); void* GetPrivateData(const std::shared_ptr& value); void SaveConstructorData(std::unique_ptr constructor_data); std::shared_ptr GetClassPrototype(JSClassRef ref); + // Get platform-specific internal embedded code + std::unique_ptr GetNativeSourceCodeProvider() const override; + JSGlobalContextRef context_; std::shared_ptr exception_; bool is_exception_handled_; diff --git a/driver/js/include/driver/napi/v8/v8_ctx.h b/driver/js/include/driver/napi/v8/v8_ctx.h index a61c2ba3b85..381601ac858 100644 --- a/driver/js/include/driver/napi/v8/v8_ctx.h +++ b/driver/js/include/driver/napi/v8/v8_ctx.h @@ -27,9 +27,9 @@ #include "driver/base/js_value_wrapper.h" #include "driver/napi/js_ctx.h" #include "driver/napi/js_ctx_value.h" - #include "driver/napi/v8/v8_ctx_value.h" #include "driver/napi/v8/v8_class_definition.h" +#include "driver/vm/native_source_code.h" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wconversion" @@ -53,6 +53,8 @@ class V8Ctx : public Ctx { virtual std::shared_ptr DefineProxy(const std::unique_ptr& constructor_wrapper) override; + virtual std::shared_ptr DefineProxyHandler(const std::unique_ptr& proxy_handler) override; + virtual std::shared_ptr DefineClass(const unicode_string_view& name, const std::shared_ptr& parent, const std::unique_ptr& constructor_wrapper, @@ -172,6 +174,8 @@ class V8Ctx : public Ctx { virtual std::shared_ptr CreateFunction(const std::unique_ptr& wrapper) override; virtual void SetWeak(std::shared_ptr value, const std::unique_ptr& wrapper) override; + virtual void SetWeak(std::shared_ptr value, + std::unique_ptr&& wrapper) override; virtual std::shared_ptr GetPropertyNames(const std::shared_ptr& value); virtual std::shared_ptr GetOwnPropertyNames(const std::shared_ptr& value); @@ -182,6 +186,10 @@ class V8Ctx : public Ctx { std::string GetSerializationBuffer(const std::shared_ptr& value, std::string& reused_buffer); void SetAlignedPointerInEmbedderData(int index, intptr_t address); + virtual std::shared_ptr CreateTryCatchScope(bool enable, std::shared_ptr ctx) override; + + // Get platform-specific internal embedded code + std::unique_ptr GetNativeSourceCodeProvider() const override; v8::Isolate* isolate_; v8::Persistent global_persistent_; diff --git a/driver/js/include/driver/scope.h b/driver/js/include/driver/scope.h index a8e6a0dfe05..3f2d462a292 100644 --- a/driver/js/include/driver/scope.h +++ b/driver/js/include/driver/scope.h @@ -43,6 +43,10 @@ #include "vfs/uri_loader.h" #include "performance/performance.h" +#if defined(ENABLE_INSPECTOR) && defined(JS_V8) && !defined(V8_WITHOUT_INSPECTOR) +#include "driver/vm/v8/inspector/v8_inspector_client_impl.h" +#endif + namespace hippy { namespace devtools { @@ -158,6 +162,14 @@ class Scope : public std::enable_shared_from_this { std::string name); ~Scope(); + inline void setValid(bool valid) { + is_valid_.store(valid, std::memory_order_relaxed); + } + + inline bool isValid() const { + return is_valid_.load(std::memory_order_relaxed); + } + inline std::shared_ptr GetContext() { return context_; } inline std::shared_ptr GetBridgeObject() { return bridge_object_; } inline void SetBridgeObject(std::shared_ptr bridge_object) { bridge_object_ = bridge_object; } @@ -354,7 +366,9 @@ class Scope : public std::enable_shared_from_this { template std::shared_ptr DefineClass(const std::shared_ptr>& class_template) { class_template->constructor_wrapper = std::make_unique([](CallbackInfo& info, void* data) { - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); @@ -382,6 +396,9 @@ class Scope : public std::enable_shared_from_this { FOOTSTONE_CHECK(context); auto weak_callback_wrapper = std::make_unique([](void* callback_data, void* internal_data) { auto class_template = reinterpret_cast*>(callback_data); + if (!class_template || !internal_data) { + return; + } auto& holder_map = class_template->holder_map; // FOOTSTONE_DLOG(INFO) << "hippy gc, holder map erase, class_tp: " << class_template << ", " << class_template->name << ", obj: " << internal_data; auto it = holder_map.find(internal_data); @@ -390,8 +407,17 @@ class Scope : public std::enable_shared_from_this { holder_map.erase(it); } }, class_template); - context->SetWeak(receiver, weak_callback_wrapper); - scope->SaveWeakCallbackWrapper(std::move(weak_callback_wrapper)); + + auto engine = scope->GetEngine().lock(); + FOOTSTONE_CHECK(engine); + if (engine->GetVM()->GetVMType() == VM::kJSEngineHermes) { + // weak_callback_wrapper hold by hermes ctx. + context->SetWeak(receiver, std::move(weak_callback_wrapper)); + } else { + context->SetWeak(receiver, weak_callback_wrapper); + scope->SaveWeakCallbackWrapper(std::move(weak_callback_wrapper)); + } + info.GetReturnValue()->Set(receiver); }, class_template.get()); std::vector> properties; @@ -439,7 +465,6 @@ class Scope : public std::enable_shared_from_this { nullptr)); } for (size_t i = 0; i < class_template->functions.size(); ++i) { - //todo(polly) why & auto function_define_pointer = &class_template->functions[i]; auto function = std::make_unique([](CallbackInfo& info, void* data) { auto function_define = reinterpret_cast*>(data); @@ -484,6 +509,7 @@ class Scope : public std::enable_shared_from_this { void SetCallbackForUriLoader(); private: + std::atomic is_valid_; std::weak_ptr engine_; std::shared_ptr context_; std::shared_ptr bridge_object_; diff --git a/driver/js/include/driver/vm/hermes/hermes_vm.h b/driver/js/include/driver/vm/hermes/hermes_vm.h new file mode 100644 index 00000000000..f2716d31595 --- /dev/null +++ b/driver/js/include/driver/vm/hermes/hermes_vm.h @@ -0,0 +1,54 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#include + +#include "driver/napi/js_ctx.h" +#include "driver/vm/js_vm.h" +#include "footstone/hippy_value.h" +#include "footstone/logging.h" + +namespace hippy { +inline namespace driver { +inline namespace vm { + +using HippyValue = footstone::value::HippyValue; + +struct HermesVMInitParam : public VM::VMInitParam { +}; + +class HermesVM : public VM { + public: + HermesVM(const std::shared_ptr& param); + ~HermesVM() = default; + + virtual std::shared_ptr ParseJson(const std::shared_ptr& ctx, const string_view& json) override; + virtual std::shared_ptr CreateContext() override; + bool ParseHippyValue(const std::shared_ptr& ctx, const string_view& json, HippyValue& hippy_value); + static std::shared_ptr CreateVM(const std::shared_ptr& param); +}; + +} // namespace vm +} // namespace driver +} // namespace hippy diff --git a/driver/js/include/driver/vm/hermes/native_source_code_hermes.h b/driver/js/include/driver/vm/hermes/native_source_code_hermes.h new file mode 100644 index 00000000000..d28dd4531e6 --- /dev/null +++ b/driver/js/include/driver/vm/hermes/native_source_code_hermes.h @@ -0,0 +1,40 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef native_source_code_hermes_h +#define native_source_code_hermes_h + +#include "driver/vm/native_source_code.h" + +namespace hippy { +inline namespace driver { + +class NativeSourceCodeProviderHermes : public NativeSourceCodeProvider { +public: + NativeSourceCode GetNativeSourceCode(const std::string& filename) const override; +}; + +} // namespace driver +} // namespace hippy + + +#endif /* native_source_code_hermes_h */ diff --git a/driver/js/include/driver/vm/js_vm.h b/driver/js/include/driver/vm/js_vm.h index b5c88f0a1c1..3b757a6d1ec 100644 --- a/driver/js/include/driver/vm/js_vm.h +++ b/driver/js/include/driver/vm/js_vm.h @@ -38,8 +38,12 @@ inline namespace vm { class VM { public: - static const int64_t kDefaultGroupId = -1; - static const int64_t kDebuggerGroupId = -2; + static inline const int64_t kDefaultGroupId = -1; + static inline const int64_t kDebuggerGroupId = -2; + static inline const std::string kJSEngineV8 = "V8"; + static inline const std::string kJSEngineJSC = "JSC"; + static inline const std::string kJSEngineHermes = "Hermes"; + using string_view = footstone::string_view; using Ctx = hippy::napi::Ctx; using CtxValue = hippy::napi::CtxValue; @@ -51,6 +55,7 @@ class VM { public: bool is_debug; int64_t group_id; + std::string vm_type; #ifdef ENABLE_INSPECTOR std::shared_ptr devtools_data_source; #endif @@ -65,39 +70,31 @@ class VM { VMInitParam(): VMInitParam(false, VM::kDefaultGroupId, nullptr) {} }; - VM(std::shared_ptr param = std::make_shared()) - : is_debug_(param->is_debug), group_id_(param->group_id), uncaught_exception_callback_(param->uncaught_exception_callback) {} + VM(std::shared_ptr param) : is_debug_(param->is_debug), group_id_(param->group_id), vm_type_(param->vm_type), + uncaught_exception_callback_(param->uncaught_exception_callback) {} virtual ~VM() { FOOTSTONE_DLOG(INFO) << "~VM"; } inline void SetDebug(bool is_debug) { is_debug_ = is_debug; } - inline bool IsDebug() { - return is_debug_; - } - - inline int64_t GetGroupId() { - return group_id_; - } - - inline const auto& GetUncaughtExceptionCallback() { - return uncaught_exception_callback_; - } + inline bool IsDebug() { return is_debug_; } + inline int64_t GetGroupId() { return group_id_; } + inline std::string& GetVMType() { return vm_type_; } + inline const auto& GetUncaughtExceptionCallback() { return uncaught_exception_callback_; } + static std::shared_ptr CreateVM(const std::shared_ptr& param); static void HandleException(const std::shared_ptr& ctx, const string_view& event_name, const std::shared_ptr& exception); - virtual std::shared_ptr ParseJson(const std::shared_ptr& ctx, const string_view& json) = 0; virtual std::shared_ptr CreateContext() = 0; private: bool is_debug_; int64_t group_id_; + std::string vm_type_; std::function uncaught_exception_callback_; }; -std::shared_ptr CreateVM(const std::shared_ptr& param); - } } diff --git a/driver/js/include/driver/vm/jsc/jsc_vm.h b/driver/js/include/driver/vm/jsc/jsc_vm.h index 3bd0b02ae7c..6eab130eeb6 100644 --- a/driver/js/include/driver/vm/jsc/jsc_vm.h +++ b/driver/js/include/driver/vm/jsc/jsc_vm.h @@ -40,7 +40,7 @@ inline namespace vm { class JSCVM : public VM, public std::enable_shared_from_this { public: - JSCVM(): VM() { vm_ = JSContextGroupCreate(); } + JSCVM(const std::shared_ptr& param): VM(param) { vm_ = JSContextGroupCreate(); } ~JSCVM() { JSContextGroupRelease(vm_); @@ -52,6 +52,7 @@ class JSCVM : public VM, public std::enable_shared_from_this { virtual std::shared_ptr CreateContext() override; static JSStringRef CreateJSCString(const footstone::string_view& str_view); + static std::shared_ptr CreateVM(const std::shared_ptr& param); }; } diff --git a/driver/js/include/driver/vm/jsc/native_source_code_jsc.h b/driver/js/include/driver/vm/jsc/native_source_code_jsc.h new file mode 100644 index 00000000000..10000ea31f7 --- /dev/null +++ b/driver/js/include/driver/vm/jsc/native_source_code_jsc.h @@ -0,0 +1,39 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef native_source_code_jsc_h +#define native_source_code_jsc_h + +#include "driver/vm/native_source_code.h" + +namespace hippy { +inline namespace driver { + +class NativeSourceCodeProviderJSC : public NativeSourceCodeProvider { +public: + NativeSourceCode GetNativeSourceCode(const std::string& filename) const override; +}; + +} // namespace driver +} // namespace hippy + +#endif /* native_source_code_jsc_h */ diff --git a/driver/js/include/driver/vm/native_source_code.h b/driver/js/include/driver/vm/native_source_code.h index e0b106971ce..078ba37c4ad 100644 --- a/driver/js/include/driver/vm/native_source_code.h +++ b/driver/js/include/driver/vm/native_source_code.h @@ -35,7 +35,11 @@ struct NativeSourceCode { size_t length_; }; -const NativeSourceCode GetNativeSourceCode(const std::string& filename); +class NativeSourceCodeProvider { +public: + virtual ~NativeSourceCodeProvider() = default; + virtual NativeSourceCode GetNativeSourceCode(const std::string& filename) const = 0; +}; } } // namespace hippy diff --git a/driver/js/include/driver/vm/v8/native_source_code_v8.h b/driver/js/include/driver/vm/v8/native_source_code_v8.h new file mode 100644 index 00000000000..39a683b8e63 --- /dev/null +++ b/driver/js/include/driver/vm/v8/native_source_code_v8.h @@ -0,0 +1,39 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef native_source_code_v8_h +#define native_source_code_v8_h + +#include "driver/vm/native_source_code.h" + +namespace hippy { +inline namespace driver { + +class NativeSourceCodeProviderV8 : public NativeSourceCodeProvider { +public: + NativeSourceCode GetNativeSourceCode(const std::string& filename) const override; +}; + +} // namespace driver +} // namespace hippy + +#endif /* native_source_code_v8_h */ diff --git a/driver/js/include/driver/vm/v8/v8_vm.h b/driver/js/include/driver/vm/v8/v8_vm.h index 5b1ae964d92..5fbc04b7fa7 100644 --- a/driver/js/include/driver/vm/v8/v8_vm.h +++ b/driver/js/include/driver/vm/v8/v8_vm.h @@ -132,6 +132,7 @@ class V8VM : public VM { v8::Local context, v8::Local trace); static void PlatformDestroy(); + static std::shared_ptr CreateVM(const std::shared_ptr& param); v8::Isolate* isolate_; v8::Isolate::CreateParams create_params_; diff --git a/driver/js/lib/entry/android/hermes/hippy.js b/driver/js/lib/entry/android/hermes/hippy.js new file mode 100644 index 00000000000..b5bc35adb09 --- /dev/null +++ b/driver/js/lib/entry/android/hermes/hippy.js @@ -0,0 +1,44 @@ +/* + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2017-2019 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// init global params, global is the top 'this' +require('../../global/Others.js'); + +// add global functions, do not change this order +require('../../global/DynamicLoad.js'); +require('../../global/Platform.js'); // Hippy.device.platform +require('../../global/UIManagerModule.js'); // Hippy.document +require('../../bridge/android/js2native.js'); +require('../../global/TimerModule.js'); // setTimeout clearTimeout setInterval clearInterval +require('../../global/android/promise.js'); // promise for hermes engine +require('../../global/ConsoleModule.js'); // console +require('../../global/Network.js'); // Headers fetch Response +require('../../global/Storage.js'); // localStorageAsync +require('../../global/Dimensions.js'); // Hippy.device.window Hippy.device.screen Hippy.device.pixelRatio +require('../../global/UtilsModule.js'); // Hippy.device.vibrate Hippy.device.cancelVibrate +require('../../global/android/global.js'); // set __GLOBAL__ object +require('../../bridge/android/native2js.js'); +require('../../global/Event.js'); // register global events callback +require('../../global/AnimationFrameModule.js'); // requestAnimationFrame cancelAnimationFrame +require('../../global/android/Turbo.js'); // turbo + +// alias +global.localStorage = Hippy.asyncStorage; +global.turboPromise = Hippy.turboPromise; diff --git a/driver/js/lib/entry/android/hippy.js b/driver/js/lib/entry/android/v8/hippy.js similarity index 100% rename from driver/js/lib/entry/android/hippy.js rename to driver/js/lib/entry/android/v8/hippy.js diff --git a/driver/js/lib/entry/ios/hippy.js b/driver/js/lib/entry/ios/hermes/hippy.js similarity index 100% rename from driver/js/lib/entry/ios/hippy.js rename to driver/js/lib/entry/ios/hermes/hippy.js diff --git a/driver/js/lib/entry/ios/jsc/hippy.js b/driver/js/lib/entry/ios/jsc/hippy.js new file mode 100644 index 00000000000..7e4e0798455 --- /dev/null +++ b/driver/js/lib/entry/ios/jsc/hippy.js @@ -0,0 +1,43 @@ +/* + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2017-2019 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// init global params, global is the top 'this' +require('../../global/Others.js'); + +// add global functions, do not change this order +require('../../global/DynamicLoad.js'); +require('../../global/Platform.js'); // Hippy.device.platform +require('../../global/UIManagerModule.js'); // Hippy.document +require('../../bridge/ios/js2native.js'); // Hippy.bridge +require('../../global/TimerModule.js'); // setTimeout clearTimeout setInterval clearInterval +require('../../global/ios/promise.js'); // add Promise when iosVersion < 9, to_do +require('../../global/ConsoleModule.js'); // console +require('../../global/Network.js'); // Headers fetch Response +require('../../global/Storage.js'); // localStorageAsync +require('../../global/Dimensions.js'); // Hippy.device.window Hippy.device.screen Hippy.device.pixelRatio +require('../../global/UtilsModule.js'); // Hippy.device.vibrate Hippy.device.cancelVibrate +require('../../global/ios/global.js'); // set __GLOBAL__ object +require('../../bridge/ios/native2js.js'); +require('../../global/Event.js'); // register global events callback +require('../../global/AnimationFrameModule.js'); // requestAnimationFrame cancelAnimationFrame +require('../../global/ios/Turbo.js'); // turbo +// alias +global.localStorage = Hippy.asyncStorage; +global.turboPromise = Hippy.turboPromise; diff --git a/driver/js/lib/global/android/promise.js b/driver/js/lib/global/android/promise.js new file mode 100644 index 00000000000..5975a2eba3c --- /dev/null +++ b/driver/js/lib/global/android/promise.js @@ -0,0 +1,345 @@ +/* + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2017-2019 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable */ + +// core.js +function noop() {} + +var LAST_ERROR = null; +var IS_ERROR = {}; + +function getThen(obj) { + try { + return obj.then; + } catch (ex) { + LAST_ERROR = ex; + return IS_ERROR; + } +} + +function tryCallOne(fn, a) { + try { + return fn(a); + } catch (ex) { + LAST_ERROR = ex; + return IS_ERROR; + } +} + +function tryCallTwo(fn, a, b) { + try { + fn(a, b); + } catch (ex) { + LAST_ERROR = ex; + return IS_ERROR; + } +} + +function Promise(fn) { + if (typeof this !== 'object') { + throw new TypeError('Promises must be constructed via new'); + } + if (typeof fn !== 'function') { + throw new TypeError('Promise constructor\'s argument is not a function'); + } + this._deferredState = 0; + this._state = 0; + this._value = null; + this._deferreds = null; + if (fn === noop) return; + doResolve(fn, this); +} +Promise._onHandle = null; +Promise._onReject = null; +Promise._noop = noop; + +Promise.prototype.then = function(onFulfilled, onRejected) { + if (this.constructor !== Promise) { + return safeThen(this, onFulfilled, onRejected); + } + var res = new Promise(noop); + handle(this, new Handler(onFulfilled, onRejected, res)); + return res; +}; + +function safeThen(self, onFulfilled, onRejected) { + return new self.constructor(function (resolve, reject) { + var res = new Promise(noop); + res.then(resolve, reject); + handle(self, new Handler(onFulfilled, onRejected, res)); + }); +} + +function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (Promise._onHandle) { + Promise._onHandle(self); + } + if (self._state === 0) { + if (self._deferredState === 0) { + self._deferredState = 1; + self._deferreds = deferred; + return; + } + if (self._deferredState === 1) { + self._deferredState = 2; + self._deferreds = [self._deferreds, deferred]; + return; + } + self._deferreds.push(deferred); + return; + } + handleResolved(self, deferred); +} + +function handleResolved(self, deferred) { + // use setTimeout to replace setImmediate + setTimeout(function() { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + if (self._state === 1) { + resolve(deferred.promise, self._value); + } else { + reject(deferred.promise, self._value); + } + return; + } + var ret = tryCallOne(cb, self._value); + if (ret === IS_ERROR) { + reject(deferred.promise, LAST_ERROR); + } else { + resolve(deferred.promise, ret); + } + }, 0); +} + +function resolve(self, newValue) { + if (newValue === self) { + return reject( + self, + new TypeError('A promise cannot be resolved with itself.') + ); + } + if ( + newValue && + (typeof newValue === 'object' || typeof newValue === 'function') + ) { + var then = getThen(newValue); + if (then === IS_ERROR) { + return reject(self, LAST_ERROR); + } + if ( + then === self.then && + newValue instanceof Promise + ) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(then.bind(newValue), self); + return; + } + } + self._state = 1; + self._value = newValue; + finale(self); +} + +function reject(self, newValue) { + self._state = 2; + self._value = newValue; + if (Promise._onReject) { + Promise._onReject(self, newValue); + } + finale(self); +} +function finale(self) { + if (self._deferredState === 1) { + handle(self, self._deferreds); + self._deferreds = null; + } + if (self._deferredState === 2) { + for (var i = 0; i < self._deferreds.length; i++) { + handle(self, self._deferreds[i]); + } + self._deferreds = null; + } +} + +function Handler(onFulfilled, onRejected, promise){ + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; +} + +function doResolve(fn, promise) { + var done = false; + var res = tryCallTwo(fn, function (value) { + if (done) return; + done = true; + resolve(promise, value); + }, function (reason) { + if (done) return; + done = true; + reject(promise, reason); + }); + if (!done && res === IS_ERROR) { + done = true; + reject(promise, LAST_ERROR); + } +} + +// done.js +Promise.prototype.done = function (onFulfilled, onRejected) { + var self = arguments.length ? this.then.apply(this, arguments) : this; + self.then(null, function (err) { + setTimeout(function () { + throw err; + }, 0); + }); +}; + +// finally.js +Promise.prototype['finally'] = function (f) { + return this.then(function (value) { + return Promise.resolve(f()).then(function () { + return value; + }); + }, function (err) { + return Promise.resolve(f()).then(function () { + throw err; + }); + }); +}; + +// es6-extensions.js +var TRUE = valuePromise(true); +var FALSE = valuePromise(false); +var NULL = valuePromise(null); +var UNDEFINED = valuePromise(undefined); +var ZERO = valuePromise(0); +var EMPTYSTRING = valuePromise(''); + +function valuePromise(value) { + var p = new Promise(Promise._noop); + p._state = 1; + p._value = value; + return p; +} +Promise.resolve = function (value) { + if (value instanceof Promise) return value; + + if (value === null) return NULL; + if (value === undefined) return UNDEFINED; + if (value === true) return TRUE; + if (value === false) return FALSE; + if (value === 0) return ZERO; + if (value === '') return EMPTYSTRING; + + if (typeof value === 'object' || typeof value === 'function') { + try { + var then = value.then; + if (typeof then === 'function') { + return new Promise(then.bind(value)); + } + } catch (ex) { + return new Promise(function (resolve, reject) { + reject(ex); + }); + } + } + return valuePromise(value); +}; + +var iterableToArray = function (iterable) { + if (typeof Array.from === 'function') { + // ES2015+, iterables exist + iterableToArray = Array.from; + return Array.from(iterable); + } + + // ES5, only arrays and array-likes exist + iterableToArray = function (x) { return Array.prototype.slice.call(x); }; + return Array.prototype.slice.call(iterable); +} + +Promise.all = function (arr) { + var args = iterableToArray(arr); + + return new Promise(function (resolve, reject) { + if (args.length === 0) return resolve([]); + var remaining = args.length; + function res(i, val) { + if (val && (typeof val === 'object' || typeof val === 'function')) { + if (val instanceof Promise && val.then === Promise.prototype.then) { + while (val._state === 3) { + val = val._value; + } + if (val._state === 1) return res(i, val._value); + if (val._state === 2) reject(val._value); + val.then(function (val) { + res(i, val); + }, reject); + return; + } else { + var then = val.then; + if (typeof then === 'function') { + var p = new Promise(then.bind(val)); + p.then(function (val) { + res(i, val); + }, reject); + return; + } + } + } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); +}; + +Promise.reject = function (value) { + return new Promise(function (resolve, reject) { + reject(value); + }); +}; + +Promise.race = function (values) { + return new Promise(function (resolve, reject) { + iterableToArray(values).forEach(function(value){ + Promise.resolve(value).then(resolve, reject); + }); + }); +}; + +Promise.prototype['catch'] = function (onRejected) { + return this.then(null, onRejected); +}; + +global.Promise = Promise; diff --git a/driver/js/packages/hippy-react/src/utils/node.ts b/driver/js/packages/hippy-react/src/utils/node.ts index 6396143bbd7..186e4e0552e 100644 --- a/driver/js/packages/hippy-react/src/utils/node.ts +++ b/driver/js/packages/hippy-react/src/utils/node.ts @@ -216,7 +216,7 @@ function isNativeGesture(name) { } function translateToNativeEventName(name) { - return name.replace(/^(on)?/g, '').toLocaleLowerCase(); + return name.replace(/^(on)?/g, '').toLowerCase(); } function isTextNode(targetNode: ElementNode) { diff --git a/driver/js/packages/hippy-vue-next/src/util/event.ts b/driver/js/packages/hippy-vue-next/src/util/event.ts index 2fb2cff5ce0..55e3da38a79 100644 --- a/driver/js/packages/hippy-vue-next/src/util/event.ts +++ b/driver/js/packages/hippy-vue-next/src/util/event.ts @@ -49,7 +49,7 @@ function isNativeGesture(name: string) { } function translateToNativeEventName(name: string) { - return name.replace(/^(on)?/g, '').toLocaleLowerCase(); + return name.replace(/^(on)?/g, '').toLowerCase(); } const RelativeToRefType = { diff --git a/driver/js/packages/hippy-vue/src/util/event.ts b/driver/js/packages/hippy-vue/src/util/event.ts index f43cf5216f1..b28c6d962af 100644 --- a/driver/js/packages/hippy-vue/src/util/event.ts +++ b/driver/js/packages/hippy-vue/src/util/event.ts @@ -49,7 +49,7 @@ function isNativeGesture(name: keyof typeof NativeEventMap) { } function translateToNativeEventName(name: string) { - return name.replace(/^(on)?/g, '').toLocaleLowerCase(); + return name.replace(/^(on)?/g, '').toLowerCase(); } // event method constant diff --git a/driver/js/scripts/build-core.js b/driver/js/scripts/build-core.js index d56c09ac855..1635f09d32f 100644 --- a/driver/js/scripts/build-core.js +++ b/driver/js/scripts/build-core.js @@ -21,42 +21,15 @@ const fs = require('fs'); const path = require('path'); const readline = require('readline'); +const { execSync } = require('child_process'); const babel = require('@babel/core'); -/** - * Babel configuration - */ -const babelConfig = { - flutter: { - comments: false, - compact: false, - }, - android: { - comments: false, - compact: false, - }, - ios: { - presets: [ - [ - '@babel/env', - { - targets: { - safari: '8', - }, - }, - ], - ], - comments: false, - compact: false, - }, -}; - /** * Code header and content */ const CodePieces = { - header() { - return `/* + header: { + piece1: `/* * Tencent is pleased to support the open source community by making * Hippy available. * @@ -79,12 +52,20 @@ const CodePieces = { #include #include "driver/vm/native_source_code.h" -#include "footstone/macros.h" - - -namespace {`; +#include "footstone/macros.h"`, + piece2_v8: ` +#include "driver/vm/v8/native_source_code_v8.h"`, + piece2_jsc: ` +#include "driver/vm/jsc/native_source_code_jsc.h"`, + piece2_hermes: ` +#include "driver/vm/hermes/native_source_code_hermes.h"`, + piece2_flutter: '', + piece3: ` + + +namespace {`, }, - android: { + common: { piece1: ` } // namespace @@ -94,50 +75,52 @@ inline namespace driver { static const std::unordered_map global_base_js_source_map{ {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT`, - piece2: ` + piece2_v8: ` }; -const NativeSourceCode GetNativeSourceCode(const std::string& filename) { +static NativeSourceCode GetNativeSourceCodeImp(const std::string& filename) { const auto it = global_base_js_source_map.find(filename); return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; } +NativeSourceCode NativeSourceCodeProviderV8::GetNativeSourceCode(const std::string &filename) const { + return GetNativeSourceCodeImp(filename); +} + } // namespace driver } // namespace hippy `, - }, - ios: { - piece1: ` -} // namespace - -namespace hippy { -inline namespace driver { + piece2_jsc: ` +}; -const NativeSourceCode GetNativeSourceCode(const std::string& filename) { - const std::unordered_map global_base_js_source_map{ - {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT - {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT`, - piece2: ` - }; +static NativeSourceCode GetNativeSourceCodeImp(const std::string& filename) { const auto it = global_base_js_source_map.find(filename); return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; } +NativeSourceCode NativeSourceCodeProviderJSC::GetNativeSourceCode(const std::string &filename) const { + return GetNativeSourceCodeImp(filename); +} + } // namespace driver } // namespace hippy `, - }, - flutter: { - piece1: ` -} // namespace + piece2_hermes: ` +}; -namespace hippy { -inline namespace driver { +static NativeSourceCode GetNativeSourceCodeImp(const std::string& filename) { + const auto it = global_base_js_source_map.find(filename); + return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; +} -static const std::unordered_map global_base_js_source_map{ - {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT - {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT`, - piece2: ` +NativeSourceCode NativeSourceCodeProviderHermes::GetNativeSourceCode(const std::string &filename) const { + return GetNativeSourceCodeImp(filename); +} + +} // namespace driver +} // namespace hippy +`, + piece2_flutter: ` }; const NativeSourceCode GetNativeSourceCode(const std::string& filename) { @@ -173,21 +156,6 @@ const NativeSourceCode GetNativeSourceCode(const std::string& filename) { }, }; -/** - * Initial the code git st buffer header and footer. - */ -const wrapperBeginBuffer = Buffer.from('(function(exports, require, internalBinding) {'); -const wraperBeginByteArr = []; -for (let i = 0; i < wrapperBeginBuffer.length; i += 1) { - wraperBeginByteArr.push(wrapperBeginBuffer[i]); -} - -const wrapperEndBuffer = Buffer.from('});'); -const wraperEndByteArr = []; -for (let i = 0; i < wrapperEndBuffer.length; i += 1) { - wraperEndByteArr.push(wrapperEndBuffer[i]); -} - /** * Get the absolute full path * @param {string} relativePath - relative path @@ -197,26 +165,32 @@ function getAbsolutePath(relativePath) { } /** - * Get the core js files list for specific platform. + * Get the core js files list for specific renderer. * - * @param {android|ios} platform - specific platform. + * @param {android|ios|flutter} renderer - specific renderer. */ -function getAllRequiredFiles(platform) { +function getAllRequiredFiles(renderer, engine) { return new Promise((resole) => { + let hippyPath = getAbsolutePath(`../lib/entry/${renderer}/hippy.js`); + if (renderer === 'android' || renderer === 'ios') { + hippyPath = getAbsolutePath(`../lib/entry/${renderer}/${engine}/hippy.js`); + } + const rl = readline.createInterface({ - input: fs.createReadStream(getAbsolutePath(`../lib/entry/${platform}/hippy.js`)), + input: fs.createReadStream(hippyPath), }); const filePaths = [ getAbsolutePath('../lib/bootstrap.js'), - getAbsolutePath(`../lib/entry/${platform}/hippy.js`), + hippyPath, getAbsolutePath('../lib/modules/ExceptionHandle.js'), ]; rl.on('line', (line) => { const lineSlice = line.split('//')[0]; - if (lineSlice.indexOf('require(\'') > -1 || lineSlice.indexOf('require("') > -1) { + if (lineSlice.indexOf('require(\'') > -1 + || lineSlice.indexOf('require("') > -1) { const entry = line.split('(\'')[1].split('\')')[0]; - filePaths.push(getAbsolutePath(`../lib/entry/${platform}/${entry}`)); + filePaths.push(getAbsolutePath(`../lib/entry/${renderer}/${entry}`)); } }); rl.on('close', () => { @@ -225,21 +199,74 @@ function getAllRequiredFiles(platform) { }); } +/** + * Wrap the compiled code with a header and footer. + * + * @param {string} code - The compiled JavaScript code. + * @returns {string} - The wrapped code. + */ +function wrapCodeIfNeeded(code, fileName) { + if (fileName === 'bootstrap' || fileName === 'ExceptionHandle') { + return code; + } + const header = '(function(exports, require, internalBinding) {'; + const footer = '});'; + return `${header}${code}${footer}`; +} + /** * Read the file content to be a buffer. * - * @param {android|ios} platform - specific platform. + * @param {android|ios|flutter} renderer - specific renderer. + * @param {v8|jsc|hermes} engine - js engine to use. * @param {string} filePath - the file path will read. */ -function readFileToBuffer(platform, filePath) { - switch (platform) { +function readFileToBuffer(renderer, engine, filePath) { + const fileName = path.basename(filePath, '.js'); + switch (renderer) { case 'ohos': - case 'flutter': - case 'android': - case 'ios': { + case 'flutter': { const code = fs.readFileSync(filePath).toString(); - const compiled = babel.transform(code, babelConfig[platform]); - return Buffer.from(compiled.code); + const babelConfig = { comments: false, compact: false }; + const compiled = babel.transform(code, babelConfig); + return Buffer.from(wrapCodeIfNeeded(compiled.code, fileName)); + } + case 'android': { + if (engine === 'hermes') { + const code = fs.readFileSync(filePath).toString(); + // see ios hermes notes bellow + const babelConfig = { presets: [['@babel/env', { targets: { chrome: 41 } }]], comments: false, compact: true }; + // Compile the code using Babel + const compiled = babel.transform(code, babelConfig); + // Wrap the compiled code with header and footer + const wrappedCode = wrapCodeIfNeeded(compiled.code, fileName); + return Buffer.from(wrappedCode); + } + if (engine === 'v8') { + const code = fs.readFileSync(filePath).toString(); + const babelConfig = { comments: false, compact: false }; + const compiled = babel.transform(code, babelConfig); + return Buffer.from(wrapCodeIfNeeded(compiled.code, fileName)); + } + } + case 'ios': { + if (engine === 'hermes') { + const code = fs.readFileSync(filePath).toString(); + // since hermes does not support es6 class currently, use chrome: 41 to avoid generating incompatible code + // A more reasonable approach is to use a configuration such as metro-react-native-babel-preset + const babelConfig = { presets: [['@babel/env', { targets: { chrome: 41 } }]], comments: false, compact: true }; + // Compile the code using Babel + const compiled = babel.transform(code, babelConfig); + // Wrap the compiled code with header and footer + const wrappedCode = wrapCodeIfNeeded(compiled.code, fileName); + return Buffer.from(wrappedCode); + } + if (engine === 'jsc') { + const code = fs.readFileSync(filePath).toString(); + const babelConfig = { presets: [['@babel/env', { targets: { safari: '8' } }]], comments: false, compact: false }; + const compiled = babel.transform(code, babelConfig); + return Buffer.from(wrapCodeIfNeeded(compiled.code, fileName)); + } } default: return null; @@ -249,40 +276,62 @@ function readFileToBuffer(platform, filePath) { /** * Read the js files and generate the core cpp files. * - * @param {android|ios} platform - specific platform. + * @param {android|ios|flutter} renderer - specific renderer. + * @param {v8|jsc|hermes|null} engine - js engine to use. * @param {string} buildDirPath - output directory. */ -function generateCpp(platform, buildDirPath) { - let code = CodePieces.header(platform); +function generateCpp(renderer, engine, buildDirPath) { + let code = CodePieces.header.piece1; + code += CodePieces.header[`piece2_${engine}`]; + code += CodePieces.header.piece3; - getAllRequiredFiles(platform).then((filesArr) => { + getAllRequiredFiles(renderer, engine).then((filesArr) => { filesArr.forEach((filePath) => { const fileName = path.basename(filePath, '.js'); - const fileBuffer = readFileToBuffer(platform, filePath); + const fileBuffer = readFileToBuffer(renderer, engine, filePath); + + // compile to hbc if using hermes engine + let codeBuffer; + if (engine === 'hermes') { + const tempFilePath = path.join(__dirname, `${fileName}_temp.js`); + const tempHbcFilePath = `${tempFilePath}.hbc`; + fs.writeFileSync(tempFilePath, fileBuffer); + const hermesCompilerPath = getAbsolutePath('../tools/hermes'); + execSync(`${hermesCompilerPath} -emit-binary -out ${tempHbcFilePath} ${tempFilePath} -O -g0 -Wno-undefined-variable`); + const hbcBuffer = fs.readFileSync(tempHbcFilePath); + console.log(`Compiled ${fileName}, HBC buffer length: ${hbcBuffer.length}`); + fs.unlinkSync(tempFilePath); + fs.unlinkSync(tempHbcFilePath); + codeBuffer = hbcBuffer; + } else { + codeBuffer = fileBuffer; + } + + // write to byte array const byteArr = []; - for (let i = 0; i < fileBuffer.length; i += 1) { - byteArr.push(fileBuffer[i]); + for (let i = 0; i < codeBuffer.length; i += 1) { + byteArr.push(codeBuffer[i]); } - if (fileName === 'bootstrap' || fileName === 'ExceptionHandle') { - code += ` + + code += ` const uint8_t k_${fileName}[] = { ${byteArr.join(',')},0 }; // NOLINT`; - } else { - code += ` - const uint8_t k_${fileName}[] = { ${wraperBeginByteArr.join(',')},${byteArr.join(',')},${wraperEndByteArr.join(',')},0 }; // NOLINT`; - } }); - code += CodePieces[platform].piece1; + code += CodePieces.common.piece1; for (let i = 2; i < filesArr.length; i += 1) { const fileName = path.basename(filesArr[i], '.js'); code += ` - {"${fileName}.js", {k_${fileName}, ARRAY_SIZE(k_${fileName}) - 1}}, // NOLINT`; + {"${fileName}.js", {k_${fileName}, ARRAY_SIZE(k_${fileName}) - 1}}, // NOLINT`; } - code += CodePieces[platform].piece2; + code += CodePieces.common[`piece2_${engine}`]; + + let targetPath = `${buildDirPath}/native_source_code_${engine}.cc`; + if (engine === 'hermes') { + targetPath = `${buildDirPath}/native_source_code_${engine}_${renderer}.cc`; + } - const targetPath = `${buildDirPath}/native_source_code_${platform}.cc`; fs.writeFile(targetPath, code, (err) => { if (err) { /* eslint-disable-next-line no-console */ @@ -290,13 +339,15 @@ function generateCpp(platform, buildDirPath) { return; } /* eslint-disable-next-line no-console */ - console.log(`${platform} convert success, output ${targetPath}`); + console.log(`${renderer} convert success, output ${targetPath}`); }); }); } // Start to work -generateCpp('ios', getAbsolutePath('../../../driver/js/src/vm/jsc/')); -generateCpp('android', getAbsolutePath('../../../driver/js/src/vm/v8/')); +generateCpp('ios', 'jsc', getAbsolutePath('../../../driver/js/src/vm/jsc/')); +generateCpp('ios', 'hermes', getAbsolutePath('../../../driver/js/src/vm/hermes/')); +generateCpp('android', 'v8', getAbsolutePath('../../../driver/js/src/vm/v8/')); +generateCpp('android', 'hermes', getAbsolutePath('../../../driver/js/src/vm/hermes/')); generateCpp('ohos', getAbsolutePath('../../../driver/js/src/vm/v8/')); -generateCpp('flutter', getAbsolutePath('../../../framework/voltron/core/src/bridge/')); +generateCpp('flutter', 'flutter', getAbsolutePath('../../../framework/voltron/core/src/bridge/')); diff --git a/driver/js/scripts/build-example.js b/driver/js/scripts/build-example.js index a4ebc3182a0..e86ad8005d6 100644 --- a/driver/js/scripts/build-example.js +++ b/driver/js/scripts/build-example.js @@ -19,6 +19,7 @@ */ /* eslint-disable no-console */ +const fs = require('fs'); const path = require('path'); const { cp, @@ -28,13 +29,17 @@ const { test, } = require('shelljs'); -const cmdExample = 'please execute command like \'npm run buildexample hippy-react-demo\' or \'npm run buildexample hippy-vue-demo|hippy-vue-next-demo\''; +const cmdExample = 'please execute command like \'npm run buildexample hippy-react-demo [hermes]\' or \'npm run buildexample hippy-vue-demo|hippy-vue-next-demo [hermes]\''; const example = process.argv[2]; if (!example) { console.error(`❌ No example argument found, ${cmdExample}.`); process.exit(1); return; } + +const use_hermes_engine = process.argv[3] === 'hermes'; +const engine = process.argv[3]; + const BASE_PATH = process.cwd(); // Target demo project path const DEMO_PATH = path.join(BASE_PATH, 'examples', example); @@ -44,6 +49,28 @@ if (!test('-d', DEMO_PATH)) { return; } +const TOOLS_PATH = path.join(BASE_PATH, '/tools'); +async function BuildHBCFile(platform) { + const sourcePath = path.join(DEMO_PATH, `dist/${platform}_${engine}`); + const destPath = path.join(DEMO_PATH, `dist/${platform}_hbc`) + if (fs.existsSync(destPath)) fs.rmdirSync(destPath, { recursive: true }); + fs.mkdirSync(`${destPath}`, { recursive: true }); + cp('-Rf', `${sourcePath}/*`, `${destPath}/`); // copy to dest path + + const files = await fs.readdirSync(destPath, { recursive: true }); + for (const file of files) { + let filePath = path.join(destPath, file); + let stats = fs.statSync(filePath); + if (stats.isDirectory()) { + continue; + } else if (path.extname(file) === '.js') { + const basename = path.basename(file, '.js'); + runScript(`${TOOLS_PATH}/hermes -emit-binary -out ${destPath}/${basename}.js ${destPath}/${file}`) + console.log(`convert file ${destPath}/${file} format form js to hbc`); + } + } +} + pushd(DEMO_PATH); const execOptions = { stdio: 'inherit' }; @@ -59,23 +86,48 @@ console.log(`1/3 Start to install ${example} dependencies.`); runScript('npm install --legacy-peer-deps'); console.log(`2/3 Start to build project ${example}.`); -runScript('npm run hippy:vendor'); // Build vendor js -runScript('npm run hippy:build'); // Build index js +if (!use_hermes_engine) { + runScript('npm run hippy:vendor'); // Build vendor js + runScript('npm run hippy:build'); // Build index js -console.log('3/3 Copy the built files to native.'); -let jsPath = ''; -if (example === 'hippy-react-demo') { - jsPath = 'react/'; -} else if (example === 'hippy-vue-demo') { - jsPath = 'vue2/'; -} else if (example === 'hippy-vue-next-demo') { - jsPath = 'vue3/'; -} + console.log('3/3 Copy the built files to native.'); + let jsPath = ''; + if (example === 'hippy-react-demo') { + jsPath = 'react/'; + } else if (example === 'hippy-vue-demo') { + jsPath = 'vue2/'; + } else if (example === 'hippy-vue-next-demo') { + jsPath = 'vue3/'; + } + + cp('-Rf', './dist/ios/*', `../../../../framework/examples/ios-demo/res/${jsPath}`); // Update the ios demo project + cp('-Rf', './dist/android/*', `../../../../framework/examples/android-demo/res/${jsPath}`); // # Update the android project + cp('-Rf', './dist/ohos/*', `../../../../framework/examples/ohos-demo/src/main/resources/rawfile/${jsPath}`); // # Update the ohos project + cp('-Rf', './dist/android/*', `../../../../framework/voltron/example/assets/jsbundle/${jsPath}`); // # Update the flutter project, ios and android use same bundle -cp('-Rf', './dist/ios/*', `../../../../framework/examples/ios-demo/res/${jsPath}`); // Update the ios demo project -cp('-Rf', './dist/android/*', `../../../../framework/examples/android-demo/res/${jsPath}`); // # Update the android project -cp('-Rf', './dist/ohos/*', `../../../../framework/examples/ohos-demo/src/main/resources/rawfile/${jsPath}`); // # Update the ohos project -cp('-Rf', './dist/android/*', `../../../../framework/voltron/example/assets/jsbundle/${jsPath}`); // # Update the flutter project, ios and android use same bundle + console.log('👌 All done, you can open your native app now, enjoy.'); + popd(); +} else { + runScript('npm run hippy:vendor:hermes'); // Build vendor js + runScript('npm run hippy:build:hermes'); // Build index js + BuildHBCFile('android').then(()=> { + return BuildHBCFile('ios') + }).then(()=> { + console.log('3/3 Copy the built files to native.'); + let jsPath = ''; + if (example === 'hippy-react-demo') { + jsPath = 'react/'; + } else if (example === 'hippy-vue-demo') { + jsPath = 'vue2/'; + } else if (example === 'hippy-vue-next-demo') { + jsPath = 'vue3/'; + } -console.log('👌 All done, you can open your native app now, enjoy.'); -popd(); + cp('-Rf', './dist/ios_hbc/*', `../../../../framework/examples/ios-demo/res/${jsPath}`); // Update the ios demo project + cp('-Rf', './dist/android_hbc/*', `../../../../framework/examples/android-demo/res/${jsPath}`); // # Update the android project + cp('-Rf', './dist/android_hbc/*', `../../../../framework/voltron/example/assets/jsbundle/${jsPath}`); // # Update the flutter project, ios and android use same bundle + + console.log('👌 All done, you can open your native app now, enjoy.'); + popd(); + }); +} diff --git a/driver/js/src/base/js_convert_utils.cc b/driver/js/src/base/js_convert_utils.cc index 81d51653b5f..35abc8361ec 100644 --- a/driver/js/src/base/js_convert_utils.cc +++ b/driver/js/src/base/js_convert_utils.cc @@ -37,6 +37,11 @@ #include "driver/napi/jsc/jsc_ctx_value.h" #endif +#ifdef JS_HERMES +#include "driver/napi/hermes/hermes_ctx.h" +#include "driver/napi/hermes/hermes_ctx_value.h" +#endif + #ifdef JS_JSH #include "driver/napi/jsh/jsh_ctx.h" #include "driver/napi/jsh/jsh_ctx_value.h" @@ -61,7 +66,7 @@ static std::string IntToString(int v) { return buf; } -bool IsEqualCtxValue(const std::shared_ptr& value1, const std::shared_ptr& value2) { +bool IsEqualCtxValue(const std::shared_ptr& value1, const std::shared_ptr& value2, const std::shared_ptr& ctx) { #ifdef JS_V8 auto v1 = std::static_pointer_cast(value1); auto v2 = std::static_pointer_cast(value2); @@ -70,6 +75,12 @@ bool IsEqualCtxValue(const std::shared_ptr& value1, const std::shared_ auto v1 = std::static_pointer_cast(value1); auto v2 = std::static_pointer_cast(value2); return v1->value_ == v2->value_; +#elif JS_HERMES + auto v1 = std::static_pointer_cast(value1); + auto v2 = std::static_pointer_cast(value2); + auto hermes_ctx = std::static_pointer_cast(ctx); + const std::unique_ptr& runtime = hermes_ctx->GetRuntime(); + return Value::strictEquals(*runtime, v1->GetValue(runtime), v2->GetValue(runtime)); #elif JS_JSH auto v1 = std::static_pointer_cast(value1); auto v2 = std::static_pointer_cast(value2); @@ -85,7 +96,7 @@ std::shared_ptr ToDomValueWithCycleCheck(const std::shared_ptr& std::vector>& value_stack) { int stack_len = static_cast(value_stack.size()); for (int i = 0; i < stack_len - 1; i++) { - if(IsEqualCtxValue(value, value_stack[static_cast(i)])) { + if(IsEqualCtxValue(value, value_stack[static_cast(i)], ctx)) { std::string str = "value stack: "; for (int t = 0; t < stack_len; t++) { str.append(IntToString(t)); diff --git a/driver/js/src/engine.cc b/driver/js/src/engine.cc index 64b13bb1482..c395cf939e2 100644 --- a/driver/js/src/engine.cc +++ b/driver/js/src/engine.cc @@ -47,9 +47,13 @@ Engine::Engine() Engine::~Engine() { FOOTSTONE_DLOG(INFO) << "~Engine"; for(auto& [key, template_map] : class_template_holder_map_) { - auto animation_template = std::any_cast>>(template_map["Animation"]); + std::any animation_any = template_map["Animation"]; + auto animation_any_pointer = std::any_cast>>(&animation_any); + auto animation_template = static_cast>>(*animation_any_pointer); animation_template->holder_ctx_values.clear(); - auto animation_set_template = std::any_cast>>(template_map["AnimationSet"]); + std::any animation_set_any = template_map["AnimationSet"]; + auto animation_set_any_pointer = std::any_cast>>(&animation_set_any); + auto animation_set_template = static_cast>>(*animation_set_any_pointer); animation_set_template->holder_ctx_values.clear(); } } @@ -139,7 +143,7 @@ void Engine::ClearWeakCallbackWrapper(void* key) { void Engine::CreateVM(const std::shared_ptr& param) { FOOTSTONE_DLOG(INFO) << "Engine CreateVM"; - vm_ = hippy::CreateVM(param); + vm_ = hippy::VM::CreateVM(param); } } diff --git a/driver/js/src/js_driver_utils.cc b/driver/js/src/js_driver_utils.cc index ebefda76706..32b6a597c22 100644 --- a/driver/js/src/js_driver_utils.cc +++ b/driver/js/src/js_driver_utils.cc @@ -31,7 +31,6 @@ #include "driver/napi/js_ctx.h" #include "driver/napi/js_ctx_value.h" #include "driver/napi/js_try_catch.h" -#include "driver/napi/callback_info.h" #include "footstone/check.h" #include "footstone/deserializer.h" #include "footstone/hippy_value.h" @@ -55,6 +54,16 @@ #include "driver/vm/jsh/jsh_vm.h" #endif +#ifdef JS_HERMES +#include "driver/napi/hermes/hermes_ctx.h" +#include "driver/vm/hermes/hermes_vm.h" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" +#pragma clang diagnostic ignored "-Wsign-conversion" +#include "hermes/hermes.h" +#pragma clang diagnostic pop +#endif /* JS_HERMES */ + namespace hippy { inline namespace driver { @@ -68,7 +77,6 @@ using u8string = string_view::u8string; using Ctx = hippy::Ctx; using CtxValue = hippy::napi::CtxValue; using Deserializer = footstone::value::Deserializer; -using HippyValue = footstone::value::HippyValue; using HippyFile = hippy::vfs::HippyFile; using VMInitParam = hippy::VM::VMInitParam; using ScopeWrapper = hippy::ScopeWrapper; @@ -79,6 +87,10 @@ using V8VM = hippy::V8VM; using V8Ctx = hippy::V8Ctx; #endif +#ifdef JS_HERMES +using HermesVM = hippy::HermesVM; +#endif + constexpr char kBridgeName[] = "hippyBridge"; constexpr char kWorkerRunnerName[] = "hippy_worker"; constexpr char kGlobalKey[] = "global"; @@ -231,9 +243,9 @@ void RegisterCallHostObject(const std::shared_ptr& scope, const JsCallbac } #ifdef ENABLE_INSPECTOR -void InitDevTools(const std::shared_ptr& scope, - const std::shared_ptr& vm, - const std::shared_ptr& source) { +void JsDriverUtils::InitDevTools(const std::shared_ptr& scope, + const std::shared_ptr& vm, + const std::shared_ptr& source) { if (vm->IsDebug()) { scope->SetDevtoolsDataSource(source); #if defined(JS_V8) && !defined(V8_WITHOUT_INSPECTOR) @@ -257,10 +269,27 @@ void InitDevTools(const std::shared_ptr& scope, inspector_client->SendMessageToV8(scope->GetInspectorContext(), std::move(u16str)); } }); +#elif defined(JS_HERMES) + auto hermes_vm = std::static_pointer_cast(vm); + std::weak_ptr weak_hermes_vm = hermes_vm; + std::weak_ptr weak_scope = scope; + scope->GetDevtoolsDataSource()->SetVmRequestHandler([weak_hermes_vm, weak_scope](const std::string& data) { + auto hermes_vm = weak_hermes_vm.lock(); + if (!hermes_vm) { + return; + } + auto scope = weak_scope.lock(); + if (!scope) { + return; + } + // FOOTSTONE_DLOG(INFO) << "From Debugger:" << data.c_str(); + auto hermesCtx = std::static_pointer_cast(scope->GetContext()); + hermesCtx->GetCDPAgent()->handleCommand(data); + }); #endif } } -#endif +#endif /* ENABLE_INSPECTOR */ void CreateScopeAndAsyncInitialize(const std::shared_ptr& engine, const std::shared_ptr& param, @@ -272,7 +301,7 @@ void CreateScopeAndAsyncInitialize(const std::shared_ptr& engine, auto engine = scope->GetEngine().lock(); FOOTSTONE_CHECK(engine); #ifdef ENABLE_INSPECTOR - InitDevTools(scope, engine->GetVM(), param->devtools_data_source); + JsDriverUtils::InitDevTools(scope, engine->GetVM(), param->devtools_data_source); #endif scope->CreateContext(); RegisterGlobalObjectAndGlobalConfig(scope, global_config); @@ -403,9 +432,14 @@ bool JsDriverUtils::RunScript(const std::shared_ptr& scope, code_cache_content = read_file_future.get(); } +#ifdef JS_HERMES + FOOTSTONE_DLOG(INFO) << "uri = " << uri + << "read_script_flag = " << read_script_flag; +#else FOOTSTONE_DLOG(INFO) << "uri = " << uri << ", read_script_flag = " << read_script_flag << ", script content = " << script_content; +#endif if (!read_script_flag || StringViewUtils::IsEmpty(script_content)) { FOOTSTONE_LOG(WARNING) << "read_script_flag = " << read_script_flag @@ -460,6 +494,17 @@ bool JsDriverUtils::RunScript(const std::shared_ptr& scope, worker_task_runner->PostTask(std::move(func)); } } +#elif defined(JS_HERMES) + std::shared_ptr ret = nullptr; + try { + ret = scope->GetContext()->RunScript(script_content, file_name); + } catch (facebook::jsi::JSIException& err) { + auto engine = scope->GetEngine().lock(); + FOOTSTONE_CHECK(engine); + auto callback = engine->GetVM()->GetUncaughtExceptionCallback(); + auto context = scope->GetContext(); + callback(scope->GetBridge(), "Hermes Exception", err.what()); + } #else auto ret = scope->GetContext()->RunScript(script_content, file_name); #endif @@ -520,12 +565,14 @@ void JsDriverUtils::DestroyInstance(std::shared_ptr&& engine, } else { scope->WillExit(); } + FOOTSTONE_LOG(INFO) << "js destroy end"; + callback(true); #else (void)is_reload; scope->WillExit(); -#endif FOOTSTONE_LOG(INFO) << "js destroy end"; callback(true); +#endif }; runner->PostTask(std::move(scope_destroy_callback)); FOOTSTONE_DLOG(INFO) << "destroy, group = " << group; @@ -621,7 +668,9 @@ void JsDriverUtils::CallNative(hippy::napi::CallbackInfo& info, const std::funct bool, byte_string)>& callback) { FOOTSTONE_DLOG(INFO) << "CallHost"; - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); @@ -629,7 +678,7 @@ void JsDriverUtils::CallNative(hippy::napi::CallbackInfo& info, const std::funct string_view module_name; if (info[0]) { if (!context->GetValueString(info[0], &module_name)) { - info.GetExceptionValue()->Set(context,"module name error"); + info.GetExceptionValue()->Set(context, "module name error"); return; } FOOTSTONE_DLOG(INFO) << "CallJava module_name = " << module_name; @@ -641,7 +690,7 @@ void JsDriverUtils::CallNative(hippy::napi::CallbackInfo& info, const std::funct string_view fn_name; if (info[1]) { if (!context->GetValueString(info[1], &fn_name)) { - info.GetExceptionValue()->Set(context,"func name error"); + info.GetExceptionValue()->Set(context, "func name error"); return; } FOOTSTONE_DLOG(INFO) << "CallJava fn_name = " << fn_name; @@ -713,6 +762,7 @@ void JsDriverUtils::LoadInstance(const std::shared_ptr& scope, byte_strin if (!scope) { return; } +#ifdef JS_V8 Deserializer deserializer( reinterpret_cast(buffer_data_.c_str()), buffer_data_.length()); @@ -724,6 +774,24 @@ void JsDriverUtils::LoadInstance(const std::shared_ptr& scope, byte_strin } else { scope->GetContext()->ThrowException("LoadInstance param error"); } + #elif defined(JS_HERMES) + std::u16string str(reinterpret_cast(&buffer_data_[0]), buffer_data_.length() / sizeof(char16_t)); + string_view buf_str(std::move(str)); + auto engine = scope->GetEngine().lock(); + if (!engine) { + return; + } + auto vm = engine->GetVM(); + auto hermes_vm = std::static_pointer_cast(vm); + auto context = scope->GetContext(); + HippyValue hippy_value; + auto ret = hermes_vm->ParseHippyValue(context, buf_str, hippy_value); + if (ret) { + scope->LoadInstance(std::make_shared(std::move(hippy_value))); + } else { + scope->GetContext()->ThrowException("LoadInstance param error"); + } +#endif }; runner->PostTask(std::move(callback)); } @@ -739,11 +807,11 @@ void JsDriverUtils::UnloadInstance(const std::shared_ptr& scope, byte_str Deserializer deserializer( reinterpret_cast(buffer_data_.c_str()), buffer_data_.length()); - HippyValue value; + footstone::value::HippyValue value; deserializer.ReadHeader(); auto ret = deserializer.ReadValue(value); if (ret) { - scope->UnloadInstance(std::make_shared(std::move(value))); + scope->UnloadInstance(std::make_shared(std::move(value))); } else { scope->GetContext()->ThrowException("UnloadInstance param error"); } @@ -751,5 +819,5 @@ void JsDriverUtils::UnloadInstance(const std::shared_ptr& scope, byte_str runner->PostTask(std::move(callback)); } -} -} +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/modules/animation_frame_module.cc b/driver/js/src/modules/animation_frame_module.cc index 8f92b82144e..4c6baa390d4 100644 --- a/driver/js/src/modules/animation_frame_module.cc +++ b/driver/js/src/modules/animation_frame_module.cc @@ -45,7 +45,9 @@ GEN_INVOKE_CB(AnimationFrameModule, RequestAnimationFrame) // NOLINT(cert-err58- GEN_INVOKE_CB(AnimationFrameModule, CancelAnimationFrame) // NOLINT(cert-err58-cpp) void AnimationFrameModule::RequestAnimationFrame(hippy::napi::CallbackInfo &info, void* data) { // NOLINT(readability-convert-member-functions-to-static) - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); @@ -96,7 +98,9 @@ void AnimationFrameModule::RequestAnimationFrame(hippy::napi::CallbackInfo &info } void AnimationFrameModule::CancelAnimationFrame(hippy::napi::CallbackInfo &info, void* data) { // NOLINT(readability-convert-member-functions-to-static) - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); diff --git a/driver/js/src/modules/animation_module.cc b/driver/js/src/modules/animation_module.cc index 9c26a60f154..88ae50f9e23 100644 --- a/driver/js/src/modules/animation_module.cc +++ b/driver/js/src/modules/animation_module.cc @@ -554,7 +554,9 @@ RegisterAnimation(const std::weak_ptr& weak_scope) { }; animation->AddEventListener(StringViewUtils::ToStdString(StringViewUtils::ConvertEncoding( event_name, string_view::Encoding::Utf8).utf8_value()), std::move(cb)); - auto class_template_ptr = std::any_cast>>(scope->GetClassTemplate("Animation")); + std::any animation_any = scope->GetClassTemplate("Animation"); + auto any_pointer = std::any_cast>>(&animation_any); + auto class_template_ptr = static_cast>>(*any_pointer); class_template_ptr->holder_ctx_values.emplace_back(func); return nullptr; }; @@ -835,7 +837,9 @@ RegisterAnimationSet(const std::weak_ptr& weak_scope) { }; animation_set->AddEventListener(StringViewUtils::ToStdString(StringViewUtils::ConvertEncoding( event_name, string_view::Encoding::Utf8).utf8_value()), std::move(cb)); - auto class_template_ptr = std::any_cast>>(scope->GetClassTemplate("AnimationSet")); + std::any animation_set_any = scope->GetClassTemplate("AnimationSet"); + auto any_pointer = std::any_cast>>(&animation_set_any); + auto class_template_ptr = static_cast>>(*any_pointer); class_template_ptr->holder_ctx_values.emplace_back(func); return nullptr; }; diff --git a/driver/js/src/modules/console_module.cc b/driver/js/src/modules/console_module.cc index f406831a57a..05bea98c4ad 100644 --- a/driver/js/src/modules/console_module.cc +++ b/driver/js/src/modules/console_module.cc @@ -63,7 +63,9 @@ inline namespace module { GEN_INVOKE_CB(ConsoleModule, Log) // NOLINT(cert-err58-cpp) void ConsoleModule::Log(hippy::napi::CallbackInfo &info, void* data) { // NOLINT(readability-convert-member-functions-to-static) - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); diff --git a/driver/js/src/modules/contextify_module.cc b/driver/js/src/modules/contextify_module.cc index b45b830883b..e7ae25812c5 100644 --- a/driver/js/src/modules/contextify_module.cc +++ b/driver/js/src/modules/contextify_module.cc @@ -34,12 +34,21 @@ #include "footstone/logging.h" #include "footstone/task.h" -#if JS_V8 +#ifdef JS_V8 #include "driver/napi/v8/v8_ctx.h" #include "driver/napi/v8/v8_ctx_value.h" #include "driver/napi/v8/v8_try_catch.h" #endif +#ifdef JS_HERMES +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" +#pragma clang diagnostic ignored "-Wsign-conversion" +#include "hermes/hermes.h" +#pragma clang diagnostic pop +#include "driver/napi/hermes/hermes_ctx_value.h" +#endif + using string_view = footstone::stringview::string_view; using StringViewUtils = footstone::stringview::StringViewUtils; using u8string = string_view::u8string; @@ -50,7 +59,6 @@ using TryCatch = hippy::napi::TryCatch; constexpr char kCurDir[] = "__HIPPYCURDIR__"; - namespace hippy { inline namespace driver { inline namespace module { @@ -58,16 +66,13 @@ inline namespace module { GEN_INVOKE_CB(ContextifyModule, RunInThisContext) // NOLINT(cert-err58-cpp) GEN_INVOKE_CB(ContextifyModule, LoadUntrustedContent) // NOLINT(cert-err58-cpp) -void ContextifyModule::RunInThisContext(hippy::napi::CallbackInfo &info, void* data) { // NOLINT(readability-convert-member-functions-to-static) - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); +void ContextifyModule::RunInThisContext(hippy::napi::CallbackInfo& info, void* data) { // NOLINT(readability-convert-member-functions-to-static) + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); -#ifdef JS_V8 - auto context = std::static_pointer_cast(scope->GetContext()); -#else auto context = scope->GetContext(); -#endif - string_view key; if (!context->GetValueString(info[0], &key)) { info.GetExceptionValue()->Set(context, "The first argument must be non-empty string."); @@ -75,12 +80,14 @@ void ContextifyModule::RunInThisContext(hippy::napi::CallbackInfo &info, void* d } FOOTSTONE_DLOG(INFO) << "RunInThisContext key = " << key; - const auto &source_code = hippy::GetNativeSourceCode(StringViewUtils::ToStdString(StringViewUtils::ConvertEncoding( - key, string_view::Encoding::Utf8).utf8_value())); - std::shared_ptr try_catch = CreateTryCatchScope(true, context); + auto file_name = StringViewUtils::ToStdString(StringViewUtils::ConvertEncoding(key, string_view::Encoding::Utf8).utf8_value()); + auto source_code_provider = context->GetNativeSourceCodeProvider(); + const auto &source_code = source_code_provider->GetNativeSourceCode(file_name); + std::shared_ptr try_catch = hippy::TryCatch::CreateTryCatchScope(true, context); string_view str_view(reinterpret_cast(source_code.data_), source_code.length_); #ifdef JS_V8 - auto ret = context->RunScript(str_view, key, false, nullptr, false); + auto v8_context = std::static_pointer_cast(context); + auto ret = v8_context->RunScript(str_view, key, false, nullptr, false); #else auto ret = context->RunScript(str_view, key); #endif @@ -97,7 +104,9 @@ void ContextifyModule::RemoveCBFunc(const string_view& uri) { } void ContextifyModule::LoadUntrustedContent(CallbackInfo& info, void* data) { - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); if (!scope) { @@ -115,6 +124,29 @@ void ContextifyModule::LoadUntrustedContent(CallbackInfo& info, void* data) { } FOOTSTONE_DLOG(INFO) << "uri = " << uri; + // This is a temporary special logic for hermes + // that the front end did not handle when packing dynamically loaded modules + // due to the different file suffixes required by the Hermes engine + // TODO: Remove this special logic in the future + auto engine = scope->GetEngine().lock(); + if (engine && engine->GetVM()->GetVMType() == VM::kJSEngineHermes) { + std::string oriUri = StringViewUtils::ToStdString(StringViewUtils::CovertToUtf8(uri, uri.encoding()).utf8_value()); + + // Check that the oriUri begins with "file://" and ends with ".js" + const std::string filePrefix = "file://"; + const std::string jsSuffix = ".js"; + + if (oriUri.rfind(filePrefix, 0) == 0 && oriUri.size() >= jsSuffix.size() && + oriUri.rfind(jsSuffix) == oriUri.size() - jsSuffix.size()) { + // modify the ext to .hbc + oriUri = oriUri.substr(0, oriUri.size() - jsSuffix.size()) + ".hbc"; + + // replace the uri object + uri = string_view(oriUri); + FOOTSTONE_DLOG(INFO) << "change file ext from .js to .hbc for hermes"; + } + } + std::shared_ptr param = info[1]; std::shared_ptr function; hippy::napi::Encoding encode = hippy::napi::UNKNOWN_ENCODING; @@ -137,8 +169,9 @@ void ContextifyModule::LoadUntrustedContent(CallbackInfo& info, void* data) { std::weak_ptr weak_scope = scope; std::weak_ptr weak_function = function; - auto cb = [this, weak_scope, weak_function, encode, uri]( - UriLoader::RetCode ret_code, const std::unordered_map&, UriLoader::bytes content) { + auto cb = [this, weak_scope, weak_function, encode, uri](UriLoader::RetCode ret_code, + const std::unordered_map&, + UriLoader::bytes content) { std::shared_ptr scope = weak_scope.lock(); if (!scope) { return; @@ -159,8 +192,7 @@ void ContextifyModule::LoadUntrustedContent(CallbackInfo& info, void* data) { if (ret_code != UriLoader::RetCode::Success || content.empty()) { FOOTSTONE_LOG(WARNING) << "Load uri = " << uri << ", code empty"; } else { - FOOTSTONE_DLOG(INFO) << "Load uri = " << uri << ", len = " << content.length() - << ", encode = " << encode + FOOTSTONE_DLOG(INFO) << "Load uri = " << uri << ", len = " << content.length() << ", encode = " << encode << ", code = " << string_view(content); } auto callback = [this, weak_scope, weak_function, move_code = std::move(content), cur_dir, file_name, uri]() { @@ -178,9 +210,9 @@ void ContextifyModule::LoadUntrustedContent(CallbackInfo& info, void* data) { FOOTSTONE_DLOG(INFO) << "__HIPPYCURDIR__ cur_dir = " << cur_dir; auto cur_dir_value = ctx->CreateString(cur_dir); ctx->SetProperty(global_object, cur_dir_key, cur_dir_value); - auto try_catch = CreateTryCatchScope(true, scope->GetContext()); + auto try_catch = hippy::TryCatch::CreateTryCatchScope(true, scope->GetContext()); try_catch->SetVerbose(true); - string_view view_code(reinterpret_cast(move_code.c_str()), move_code.length()); + string_view view_code(reinterpret_cast(move_code.c_str()), move_code.length()); scope->RunJS(view_code, uri, file_name); if (last_dir_str_obj) { ctx->SetProperty(global_object, cur_dir_key, last_dir_str_obj, hippy::napi::PropertyAttribute::ReadOnly); @@ -192,6 +224,7 @@ void ContextifyModule::LoadUntrustedContent(CallbackInfo& info, void* data) { } else { string_view err_msg = uri + " not found"; error = ctx->CreateException(string_view(err_msg)); + FOOTSTONE_LOG(ERROR) << err_msg;; } std::shared_ptr function = weak_function.lock(); @@ -199,9 +232,9 @@ void ContextifyModule::LoadUntrustedContent(CallbackInfo& info, void* data) { FOOTSTONE_DLOG(INFO) << "run js cb"; if (!error) { error = ctx->CreateNull(); + std::shared_ptr argv[] = {error}; + ctx->CallFunction(function, ctx->GetGlobalObject(), 1, argv); } - std::shared_ptr argv[] = {error}; - ctx->CallFunction(function, ctx->GetGlobalObject(), 1, argv); RemoveCBFunc(uri); } }; @@ -241,7 +274,6 @@ std::shared_ptr ContextifyModule::BindFunction(std::shared_ptr return object; } -} -} -} - +} // namespace module +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/modules/event_module.cc b/driver/js/src/modules/event_module.cc index 7ccf2aea6e6..6534c4cfc2f 100644 --- a/driver/js/src/modules/event_module.cc +++ b/driver/js/src/modules/event_module.cc @@ -61,7 +61,9 @@ std::shared_ptr> MakeEventClassTemplate( if (!scope) { return nullptr; } - auto current_event =std::any_cast>(scope->GetCurrentEvent()); + std::any event_any = scope->GetCurrentEvent(); + auto any_pointer = std::any_cast>(&event_any); + auto current_event = static_cast>(*any_pointer); return current_event; }; diff --git a/driver/js/src/modules/performance/performance_mark_module.cc b/driver/js/src/modules/performance/performance_mark_module.cc index 0b41c9fe377..4c0dbd7b4ea 100644 --- a/driver/js/src/modules/performance/performance_mark_module.cc +++ b/driver/js/src/modules/performance/performance_mark_module.cc @@ -88,7 +88,9 @@ std::shared_ptr> RegisterPerformanceMark(const st if (!detail.has_value()) { return context->CreateNull(); } - return std::any_cast>(detail); + auto any_pointer = std::any_cast>(&detail); + auto detail_ctx = static_cast>(*any_pointer); + return detail_ctx; }; class_template.properties.push_back(std::move(name_property_define)); diff --git a/driver/js/src/modules/performance/performance_measure_module.cc b/driver/js/src/modules/performance/performance_measure_module.cc index 1d7293a2271..8ffe9a57de4 100644 --- a/driver/js/src/modules/performance/performance_measure_module.cc +++ b/driver/js/src/modules/performance/performance_measure_module.cc @@ -85,7 +85,9 @@ std::shared_ptr> RegisterPerformanceMeasure(co if (!detail.has_value()) { return context->CreateNull(); } - return std::any_cast>(detail); + auto any_pointer = std::any_cast>(&detail); + auto detail_ctx = static_cast>(*any_pointer); + return detail_ctx; }; class_template.properties.push_back(std::move(name_property_define)); diff --git a/driver/js/src/modules/timer_module.cc b/driver/js/src/modules/timer_module.cc index fb38c6b5b94..e946c645045 100644 --- a/driver/js/src/modules/timer_module.cc +++ b/driver/js/src/modules/timer_module.cc @@ -82,7 +82,9 @@ void TimerModule::SetInterval(CallbackInfo& info, void* data) { } void TimerModule::ClearInterval(CallbackInfo& info, void* data) { - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); @@ -100,7 +102,9 @@ void TimerModule::ClearInterval(CallbackInfo& info, void* data) { } void TimerModule::RequestIdleCallback(CallbackInfo& info, void* data) { - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); @@ -173,10 +177,10 @@ void TimerModule::CancelIdleCallback(CallbackInfo& info, void* data) { } -std::shared_ptr TimerModule::Start( - CallbackInfo& info, - bool repeat) { - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); +std::shared_ptr TimerModule::Start(CallbackInfo& info, bool repeat) { + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); diff --git a/driver/js/src/modules/ui_manager_module.cc b/driver/js/src/modules/ui_manager_module.cc index 5b98f742464..f1973738ae4 100644 --- a/driver/js/src/modules/ui_manager_module.cc +++ b/driver/js/src/modules/ui_manager_module.cc @@ -49,7 +49,9 @@ inline namespace module { GEN_INVOKE_CB(UIManagerModule, CallUIFunction) void UIManagerModule::CallUIFunction(CallbackInfo& info, void* data) { - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); diff --git a/driver/js/src/napi/hermes/hermes_class_definition.cc b/driver/js/src/napi/hermes/hermes_class_definition.cc new file mode 100644 index 00000000000..1fa1cd9fc50 --- /dev/null +++ b/driver/js/src/napi/hermes/hermes_class_definition.cc @@ -0,0 +1,38 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2023 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "driver/napi/hermes/hermes_class_definition.h" + +namespace hippy { +inline namespace driver { +inline namespace napi { + +HermesClassDefinition::HermesClassDefinition(Runtime& runtime, + const footstone::stringview::string_view& name, + Function& function) + : name_(name), function_(runtime, function) {} + +HermesClassDefinition::~HermesClassDefinition() {} + +} // namespace napi +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/napi/hermes/hermes_ctx.cc b/driver/js/src/napi/hermes/hermes_ctx.cc new file mode 100644 index 00000000000..e25076469f7 --- /dev/null +++ b/driver/js/src/napi/hermes/hermes_ctx.cc @@ -0,0 +1,1253 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "driver/napi/hermes/hermes_ctx.h" +#include "driver/napi/hermes/hermes_try_catch.h" +#include "driver/scope.h" +#include "footstone/string_view.h" +#include "footstone/string_view_utils.h" +#include "driver/vm/hermes/native_source_code_hermes.h" + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" +#pragma clang diagnostic ignored "-Wshorten-64-to-32" +#include "hermes/hermes.h" +#include "jsi/jsi-inl.h" +#include "hermes/cdp/CDPDebugAPI.h" +#pragma clang diagnostic pop + + +namespace hippy { +inline namespace driver { +inline namespace napi { + +using Scope = driver::Scope; +using CallbackInfo = hippy::CallbackInfo; +using string_view = footstone::string_view; +using StringViewUtils = footstone::StringViewUtils; +using Runtime = facebook::jsi::Runtime; +using HermesRuntime = facebook::hermes::HermesRuntime; +using ConsoleAPIType = facebook::hermes::cdp::ConsoleAPIType; + +constexpr int kScopeWrapperIndex = 5; +constexpr char kProtoKey[] = "__proto__"; +constexpr char kUniqueIdInLocalStateKey[] = "__uniqueID"; +std::atomic unique_id_counter{0}; // for saving this_value to LocalNativeState + +constexpr char kConstructor[] = "function() { this.hostfunction_constructor.apply(this, arguments); return this; }"; +constexpr char kProxyFunction[] = "function(handler) { return new Proxy(this, handler); }"; +constexpr char kProxyTargetObject[] = "proxy_target_object"; +constexpr char kIsProxyObject[] = "is_proxy_object"; +constexpr char kJsonStringify[] = "function(obj) { return JSON.stringify(obj); }"; + +// 确保返回数据以空字符结尾 +static uint8_t* EnsureNullTerminated(const uint8_t* data, size_t len) { + if (!data || len == 0) { + return nullptr; + } + unsigned char last_byte = data[len - 1]; + uint8_t* p = nullptr; + if (last_byte == '\0') { + p = static_cast(malloc(sizeof(uint8_t) * len)); + memset(p, 0, len); + memcpy(p, data, len); + } else { + p = static_cast(malloc(sizeof(uint8_t) * (len + 1))); + memset(p, 0, len + 1); + memcpy(p, data, len); + } + return p; +} + +HippyJsiBuffer::HippyJsiBuffer(const uint8_t* data, size_t len) { + data_ = EnsureNullTerminated(data, len); + len_ = len; +} + +HippyJsiBuffer::~HippyJsiBuffer() { delete data_; } + +static void HandleJsException(std::shared_ptr scope, std::shared_ptr exception) { + VM::HandleException(scope->GetContext(), "uncaughtException", exception); + auto engine = scope->GetEngine().lock(); + FOOTSTONE_CHECK(engine); + auto callback = engine->GetVM()->GetUncaughtExceptionCallback(); + auto context = scope->GetContext(); + footstone::string_view description("Hermes Engine JS Exception"); + footstone::string_view stack(exception->Message()); + callback(scope->GetBridge(), description, stack); +} + +static Value InvokePropertyCallback(Runtime& runtime, + const Value& this_value, + const std::string& property, + void* function_pointer) { + auto global_native_state = runtime.global().getNativeState(runtime); + std::any scope_any; + if (!global_native_state->Get(kScopeWrapperIndex, scope_any)) { + return facebook::jsi::Value::undefined(); + } + auto any_pointer = std::any_cast(&scope_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); + auto scope = scope_wrapper->scope.lock(); + if (scope == nullptr) return facebook::jsi::Value::undefined(); + auto hermes_ctx = std::static_pointer_cast(scope->GetContext()); + if (hermes_ctx == nullptr) return facebook::jsi::Value::undefined(); + + CallbackInfo cb_info; + cb_info.SetSlot(scope_any); + cb_info.SetReceiver(std::make_shared(runtime, this_value)); + cb_info.AddValue(std::make_shared(runtime, String::createFromAscii(runtime, property))); + + auto* func_wrapper = reinterpret_cast(function_pointer); + FOOTSTONE_CHECK(func_wrapper && func_wrapper->callback); + (func_wrapper->callback)(cb_info, func_wrapper->data); + auto exception = std::static_pointer_cast(cb_info.GetExceptionValue()->Get()); + if (exception) { + HandleJsException(scope, exception); + return Value::undefined(); + } + + auto ret_value = std::static_pointer_cast(cb_info.GetReturnValue()->Get()); + if (!ret_value) { + return Value::undefined(); + } + return ret_value->GetValue(hermes_ctx->GetRuntime()); +} + +static Value InvokeConstructorJsCallback(Runtime& runtime, + const Value& this_value, + const Value* args, + size_t count, + void* function_pointer) { + // 1. Get GlobalNativeState + auto global_native_state = runtime.global().getNativeState(runtime); + std::any scope_any; + if (!global_native_state->Get(kScopeWrapperIndex, scope_any)) { + return Value::undefined(); + } + // 2. Get Scope + auto any_pointer = std::any_cast(&scope_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); + auto scope = scope_wrapper->scope.lock(); + if (scope == nullptr) return facebook::jsi::Value::undefined(); + auto hermes_ctx = std::static_pointer_cast(scope->GetContext()); + if (hermes_ctx == nullptr) return facebook::jsi::Value::undefined(); + + // 3. Create CallbackInfo, CallbackInfo bind Scope + CallbackInfo cb_info; + cb_info.SetSlot(scope_any); + + // 4. CallbackInfo set data getting from proto.constructor.LocalNativeState + if (this_value.isObject()) { + auto prototype = this_value.asObject(runtime).getProperty(runtime, kProtoKey); + if (prototype.isObject()) { + auto constructor_func = prototype.asObject(runtime).getProperty(runtime, "constructor"); + if (constructor_func.asObject(runtime).asFunction(runtime).hasNativeState(runtime)) { + auto local_native_state = constructor_func.asObject(runtime).getNativeState(runtime); + auto data = local_native_state->Get(); + cb_info.SetData(data); + } + } + } + + // 5. CallbackInfo set receiver (may be object) + if (this_value.isObject()) { + cb_info.SetReceiver(std::make_shared(runtime, this_value.asObject(runtime))); + } else { + cb_info.SetReceiver(std::make_shared(runtime, this_value)); + } + + // 6. CallbackInfo add args + for (size_t i = 0; i < count; i++) { + if (args[i].isString()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asString(runtime))); + } else if (args[i].isSymbol()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asSymbol(runtime))); + } else if (args[i].isObject()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asObject(runtime))); + } else if (args[i].isBigInt()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asBigInt(runtime))); + } else { + cb_info.AddValue(std::make_shared(runtime, args[i])); + } + } + + // 7. Get function wrapper (which is constructor_wrapper when calling DefineClass()) + // and Execute wrapper->callback + auto function_wrapper = reinterpret_cast(function_pointer); + auto js_cb = function_wrapper->callback; + auto external_data = function_wrapper->data; + js_cb(cb_info, external_data); + auto exception = std::static_pointer_cast(cb_info.GetExceptionValue()->Get()); + if (exception) { + HandleJsException(scope, exception); + return Value::undefined(); + } + + // 8. Binding new constructor return value in proto + if (this_value.isObject()) { + auto prototype = this_value.asObject(runtime).getProperty(runtime, kProtoKey); + if (prototype.isObject()) { + // currently internal_data is the C++ object + auto internal_data = cb_info.GetData(); + if (internal_data != nullptr) { + // Set a unique id for this_value and save this id in LocalNativeState as the key, + // which is used to retrieve the saved value in LocalNativeState based on the id. + // Sets the unique ID to an attribute of this_value. + int uniqueID = ++unique_id_counter; + this_value.asObject(runtime).setProperty(runtime, kUniqueIdInLocalStateKey, Value(uniqueID)); + + std::shared_ptr local_state = nullptr; + if (prototype.asObject(runtime).hasNativeState(runtime)) { + local_state = prototype.asObject(runtime).getNativeState(runtime); + } else { + local_state = std::make_shared(); + } + local_state->Set(uniqueID, internal_data); + prototype.asObject(runtime).setNativeState(runtime, local_state); + } + } + } + + // 9. Return the generated hermes ctx value + auto ret_value = std::static_pointer_cast(cb_info.GetReturnValue()->Get()); + if (!ret_value) { + return Value::undefined(); + } + return ret_value->GetValue(hermes_ctx->GetRuntime()); +} + +static Value InvokeJsCallback(Runtime& runtime, const Value& this_value, const Value* args, size_t count, + void* function_pointer) { + auto global_native_state = runtime.global().getNativeState(runtime); + std::any scope_any; + if (!global_native_state->Get(kScopeWrapperIndex, scope_any)) { + return Value::undefined(); + } + auto any_pointer = std::any_cast(&scope_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); + auto scope = scope_wrapper->scope.lock(); + if (scope == nullptr) return facebook::jsi::Value::undefined(); + auto hermes_ctx = std::static_pointer_cast(scope->GetContext()); + if (hermes_ctx == nullptr) return facebook::jsi::Value::undefined(); + + CallbackInfo cb_info; + cb_info.SetSlot(scope_any); + + if (this_value.isObject()) { + auto instance_object = this_value.asObject(runtime); + + if (instance_object.hasNativeState(runtime)) { + auto local_native_state = instance_object.getNativeState(runtime); + auto data = local_native_state->Get(); + cb_info.SetData(data); + } + + if (instance_object.hasProperty(runtime, kProtoKey)) { + auto proto_object = instance_object.getProperty(runtime, kProtoKey).asObject(runtime); + if (proto_object.hasNativeState(runtime)) { + auto local_native_state = proto_object.getNativeState(runtime); + void *data; + if (instance_object.hasProperty(runtime, kUniqueIdInLocalStateKey)) { + int uniqueID = instance_object.getProperty(runtime, kUniqueIdInLocalStateKey).asNumber(); + data = local_native_state->Get(uniqueID); + } else { + data = local_native_state->Get(); + } + cb_info.SetData(data); + } + } + } + + if (this_value.isObject()) { + cb_info.SetReceiver(std::make_shared(runtime, this_value.asObject(runtime))); + } else { + cb_info.SetReceiver(std::make_shared(runtime, this_value)); + } + for (size_t i = 0; i < count; i++) { + if (args[i].isString()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asString(runtime))); + } else if (args[i].isSymbol()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asSymbol(runtime))); + } else if (args[i].isObject()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asObject(runtime))); + } else if (args[i].isBigInt()) { + cb_info.AddValue(std::make_shared(runtime, args[i].asBigInt(runtime))); + } else { + cb_info.AddValue(std::make_shared(runtime, args[i])); + } + } + + auto function_wrapper = reinterpret_cast(function_pointer); + auto js_cb = function_wrapper->callback; + auto external_data = function_wrapper->data; + js_cb(cb_info, external_data); + auto exception = std::static_pointer_cast(cb_info.GetExceptionValue()->Get()); + if (exception) { + HandleJsException(scope, exception); + return Value::undefined(); + } + + auto ret_value = std::static_pointer_cast(cb_info.GetReturnValue()->Get()); + if (!ret_value) { + return Value::undefined(); + } + return ret_value->GetValue(hermes_ctx->GetRuntime()); +} + +void fatalHandler(const std::string &message) { + FOOTSTONE_LOG(FATAL) << "Received Hermes Fatal Error: %s\n" << message.c_str(); +} + +constexpr char kHippyHermes[] = "HippyHermesBridge"; +HermesCtx::HermesCtx() { + auto runtimeConfigBuilder = ::hermes::vm::RuntimeConfig::Builder() + .withGCConfig(::hermes::vm::GCConfig::Builder() + // Default to 3GB + .withMaxHeapSize(3072 << 20) + .withName(kHippyHermes) + // For the next two arguments: avoid GC before TTI + // by initializing the runtime to allocate directly + // in the old generation, but revert to normal + // operation when we reach the (first) TTI point. + //.withAllocInYoung(false) + //.withRevertToYGAtTTI(true) + .build()) + .withEnableSampleProfiling(true) + .withES6Class(true) + .withES6Proxy(true) + .withES6Promise(false) + .withMicrotaskQueue(true); + + // TODO: Use Hermes's Crash Manager in future + // like: runtimeConfigBuilder.withCrashMgr(cm); + + runtime_ = facebook::hermes::makeHermesRuntime(runtimeConfigBuilder.build()); + facebook::hermes::HermesRuntime::setFatalHandler(fatalHandler); + + global_native_state_ = std::make_shared(); + runtime_->global().setNativeState(*runtime_, global_native_state_); + + // Hermes doesn't support the console object, so we implement a console module + BuiltinModule(); +} + +HermesCtx::~HermesCtx() { +#ifdef ENABLE_INSPECTOR + cdpAgent_ = nullptr; + cdpDebugAPI_ = nullptr; +#endif /* ENABLE_INSPECTOR */ +} + +#ifdef ENABLE_INSPECTOR +void HermesCtx::SetupDebugAgent(facebook::hermes::debugger::EnqueueRuntimeTaskFunc enqueueRuntimeTask, + facebook::hermes::cdp::OutboundMessageFunc messageCallback) { + cdpDebugAPI_ = CDPDebugAPI::create(*runtime_); + cdpAgent_ = CDPAgent::create(0, + *cdpDebugAPI_, + enqueueRuntimeTask, + messageCallback); +} +#endif /* ENABLE_INSPECTOR */ + +std::shared_ptr HermesCtx::DefineProxy(const std::unique_ptr& getter) { + auto constructor = EvalFunction(kProxyFunction); + return std::make_shared(*runtime_, constructor); +} + +std::shared_ptr HermesCtx::DefineProxyHandler(const std::unique_ptr& proxy_handler) { + auto proxy_getter = facebook::jsi::Function::createFromHostFunction( + *runtime_, PropNameID::forAscii(*runtime_, ""), 3, + [proxy_handler_pointer = proxy_handler.get()](Runtime& runtime, const Value& this_value, const Value* args, + size_t count) -> Value { + // proxy get method argument (target, property, receiver) + if (count != 3) return Value::undefined(); + if (!args[1].isString()) return Value::undefined(); + std::string method_name = args[1].toString(runtime).utf8(runtime); + + // 获取 Proxy 对象的原始 target 对象 + if (method_name == kProxyTargetObject) return Value(runtime, args[0]); + // 判断是否是 Proxy 对象 + if (method_name == kIsProxyObject) return Value(true); + + // 返回 jsi 需要的函数, 现在只支持了函数的返回 + return facebook::jsi::Function::createFromHostFunction( + runtime, PropNameID::forAscii(runtime, ""), 1, + [proxy_handler_pointer = proxy_handler_pointer, method_name](Runtime& runtime, const Value& this_value, + const Value* args, size_t count) -> Value { + auto jsi_call_method = InvokePropertyCallback(runtime, this_value, method_name, proxy_handler_pointer); + if (jsi_call_method.isObject() && jsi_call_method.asObject(runtime).isFunction(runtime)) { + auto f = jsi_call_method.asObject(runtime).asFunction(runtime); + if (this_value.isObject()) { + return f.callWithThis(runtime, this_value.asObject(runtime), args, count); + } else { + return f.call(runtime, args, count); + } + } + return Value::undefined(); + }); + }); + facebook::jsi::Object handler = facebook::jsi::Object(*runtime_); + handler.setProperty(*runtime_, "get", proxy_getter); + return std::make_shared(*runtime_, handler); +} + +std::shared_ptr HermesCtx::DefineClass(const string_view& name, + const std::shared_ptr& parent, + const std::unique_ptr& constructor_wrapper, + size_t property_count, + std::shared_ptr properties[]) { + auto class_name = StringViewUtils::CovertToUtf8(name, name.encoding()); + + // 1. host function (Create a function which, when invoked, calls C++ code) + auto func_tpl = facebook::jsi::Function::createFromHostFunction( + *runtime_, PropNameID::forUtf8(*runtime_, class_name.utf8_value().data(), class_name.utf8_value().size()), 0, + [pointer = constructor_wrapper.get()](Runtime& runtime, const Value& this_value, const Value* args, size_t count) + -> Value { return InvokeConstructorJsCallback(runtime, this_value, args, count, pointer); }); + + // 2. Make constructor + // Since hostfunction cannot be a constructor in Hermes, + // so implemented through a function wrapper + auto ctor_function = EvalFunction(kConstructor); + auto ctor_prototype = ctor_function.getProperty(*runtime_, "prototype").asObject(*runtime_); + ctor_prototype.setProperty(*runtime_, "hostfunction_constructor", func_tpl); + + // 3. Add properties + // use "Object.defineProperty(...)" + for (size_t i = 0; i < property_count; i++) { + const auto& property = properties[i]; + auto define_property = + runtime_->global().getPropertyAsObject(*runtime_, "Object").getPropertyAsFunction(*runtime_, "defineProperty"); + auto property_name = std::static_pointer_cast(property->name)->GetValue(runtime_); + if (property->getter || property->setter) { + auto descriptor = facebook::jsi::Object(*runtime_); + if (property->getter) { + auto getter = facebook::jsi::Function::createFromHostFunction( + *runtime_, PropNameID::forString(*runtime_, property_name.asString(*runtime_)), 0, + [function_pointer = property->getter.get()](Runtime& runtime, const Value& this_value, const Value* args, + size_t count) -> Value { + return InvokeJsCallback(runtime, this_value, args, count, function_pointer); + }); + descriptor.setProperty(*runtime_, "get", getter); + } else { + auto setter = facebook::jsi::Function::createFromHostFunction( + *runtime_, PropNameID::forString(*runtime_, property_name.asString(*runtime_)), 0, + [function_pointer = property->setter.get()](Runtime& runtime, const Value& this_value, const Value* args, + size_t count) -> Value { + return InvokeJsCallback(runtime, this_value, args, count, function_pointer); + }); + descriptor.setProperty(*runtime_, "set", setter); + } + define_property.call(*runtime_, ctor_prototype, property_name, descriptor); + } else if (property->method) { + auto method = facebook::jsi::Function::createFromHostFunction( + *runtime_, PropNameID::forString(*runtime_, property_name.asString(*runtime_)), 0, + [function_pointer = property->method.get(), name = property_name.asString(*runtime_).utf8(*runtime_)]( + Runtime& runtime, const Value& this_value, const Value* args, size_t count) -> Value { + auto ret = InvokeJsCallback(runtime, this_value, args, count, function_pointer); + return ret; + }); + ctor_prototype.setProperty(*runtime_, property_name.asString(*runtime_), method); + } else if (property->value) { + auto jsi_value = std::static_pointer_cast(property->value); + ctor_prototype.setProperty(*runtime_, property_name.asString(*runtime_), jsi_value->GetValue(runtime_)); + } + } + + // 4. child inherit from parent + // Implementation: + // child.prototype.__proto__ = parent.prototype + if (parent) { + auto parent_tpl = std::static_pointer_cast(parent); + auto parent_prototype = parent_tpl->GetTemplate().asObject(*runtime_).getProperty(*runtime_, "prototype"); + ctor_prototype.setProperty(*runtime_, kProtoKey, parent_prototype); + } + + template_map_[name] = std::make_shared(*runtime_, name, ctor_function); + return std::make_shared(*runtime_, ctor_function); +} + +std::shared_ptr HermesCtx::NewInstance(const std::shared_ptr& cls, int argc, + std::shared_ptr argv[], void* external) { + auto hermes_ctx = std::static_pointer_cast(cls); + auto value = hermes_ctx->GetValue(runtime_); + if (!value.isObject()) return nullptr; + + auto object = value.asObject(*runtime_); + bool is_function = object.isFunction(*runtime_); + if (!is_function) return nullptr; + + // Provide external pointer for the constructor + auto function = object.asFunction(*runtime_); + auto local_native_state = std::make_shared(); + local_native_state->Set(external); + function.setNativeState(*runtime_, local_native_state); + + std::vector arguments; + size_t len = static_cast(argc); + arguments.reserve(len); + for (size_t i = 0; i < len; ++i) { + auto arg = std::static_pointer_cast(argv[i]); + arguments.push_back(arg->GetValue(runtime_)); + } + const Value* val = &arguments[0]; + Value instance = argc == 0 ? function.callAsConstructor(*runtime_) : function.callAsConstructor(*runtime_, val, len); + + // Delete the external pointer after it is used in the constructor, + // and bind the corresponding external pointer to the instance object. + function.setNativeState(*runtime_, nullptr); + if (instance.isObject()) { + const auto &instanceObj = instance.asObject(*runtime_); + // In order to unify all functional interfaces, Hermes implements JSI interception through Proxy objects, + // but setNativeState cannot function on Proxy and HostObject. + // Therefore, for the Proxy object, we need to bind the external pointer to the Proxy target object, + // and the external pointer needs to be obtained from the Proxy target object. + auto is_proxy = instanceObj.getProperty(*runtime_, kIsProxyObject); + if (is_proxy.isBool() && is_proxy.asBool()) { + auto target_object = instanceObj.getProperty(*runtime_, kProxyTargetObject); + if (target_object.isObject()) target_object.asObject(*runtime_).setNativeState(*runtime_, local_native_state); + } else { + if (instanceObj.hasNativeState(*runtime_)) { + auto native_state = instanceObj.getNativeState(*runtime_); + native_state->Set(external); + } else { + instanceObj.setNativeState(*runtime_, local_native_state); + } + } + } + return std::make_shared(*runtime_, instance); +} + +void* HermesCtx::GetObjectExternalData(const std::shared_ptr& object) { + auto hermes_ctx = std::static_pointer_cast(object); + auto value = hermes_ctx->GetValue(runtime_); + + if (!value.isObject()) { + return nullptr; + } + + auto hermes_object = value.asObject(*runtime_); + auto is_proxy = hermes_object.getProperty(*runtime_, kIsProxyObject); + + // hermes jsi 通过 Proxy 对象实现, Proxy 对象的 external 指针绑定在 target 对象上 + if (is_proxy.isBool() && is_proxy.asBool()) { + auto target_object = hermes_object.getProperty(*runtime_, kProxyTargetObject); + if (target_object.isObject() && target_object.asObject(*runtime_).hasNativeState(*runtime_)) { + auto state = target_object.asObject(*runtime_).getNativeState(*runtime_); + return state->Get(); + } + return nullptr; + } + + if (hermes_object.hasNativeState(*runtime_)) { + auto state = hermes_object.getNativeState(*runtime_); + return state->Get(); + } + + return nullptr; +} + +std::shared_ptr HermesCtx::GetGlobalObject() { + return std::make_shared(*runtime_, runtime_->global()); +} + +bool HermesCtx::SetProperty(std::shared_ptr object, std::shared_ptr key, + std::shared_ptr value) { + auto hermes_object = std::static_pointer_cast(object); + auto hermes_key = std::static_pointer_cast(key); + auto hermes_value = std::static_pointer_cast(value); + const auto& key_value = hermes_key->GetValue(runtime_); + auto ret = key_value.isString(); + if (!ret) { + return false; + } + hermes_object->GetValue(runtime_).asObject(*runtime_).setProperty( + *runtime_, hermes_key->GetValue(runtime_).asString(*runtime_), hermes_value->GetValue(runtime_)); + return true; +} + +bool HermesCtx::SetProperty(std::shared_ptr object, std::shared_ptr key, + std::shared_ptr value, __unused const PropertyAttribute& attr) { + // key must be string + // `attr` currently not in use, since hermes do not support. + return SetProperty(object, key, value); +} + +std::shared_ptr HermesCtx::GetProperty(const std::shared_ptr& object, const string_view& name) { + auto hermes_object = std::static_pointer_cast(object); + auto u8_key = StringViewUtils::CovertToUtf8(name, name.encoding()); + auto property = hermes_object->GetValue(runtime_).asObject(*runtime_).getProperty( + *runtime_, PropNameID::forUtf8(*runtime_, u8_key.utf8_value().data(), u8_key.utf8_value().size())); + return std::make_shared(*runtime_, property); +} + +std::shared_ptr HermesCtx::GetProperty(const std::shared_ptr& object, + std::shared_ptr key) { + auto hermes_object = std::static_pointer_cast(object); + auto hermes_key = std::static_pointer_cast(key); + auto property = hermes_object->GetValue(runtime_).asObject(*runtime_).getProperty( + *runtime_, hermes_key->GetValue(runtime_).asString(*runtime_)); + return std::make_shared(*runtime_, property); +} + + +// MARK: - Create Funtions + +std::shared_ptr HermesCtx::CreateObject() { + return std::make_shared(*runtime_, Object(*runtime_)); +} + +std::shared_ptr HermesCtx::CreateNumber(double number) { + return std::make_shared(*runtime_, Value(number)); +} + +std::shared_ptr HermesCtx::CreateBoolean(bool b) { + return std::make_shared(*runtime_, Value(b)); +} + +std::shared_ptr HermesCtx::CreateString(const string_view& string_view) { + auto u8_string = StringViewUtils::CovertToUtf8(string_view, string_view.encoding()); + auto jsi_string = String::createFromUtf8(*runtime_, u8_string.utf8_value().c_str(), u8_string.utf8_value().size()); + return std::make_shared(*runtime_, jsi_string); +} + +std::shared_ptr HermesCtx::CreateUndefined() { + facebook::jsi::Value value = facebook::jsi::Value::undefined(); + return std::make_shared(*runtime_, value); +} + +std::shared_ptr HermesCtx::CreateNull() { + facebook::jsi::Value value = facebook::jsi::Value::null(); + return std::make_shared(*runtime_, value); +} + +std::shared_ptr HermesCtx::CreateFunction(const std::unique_ptr& wrapper) { + auto func = facebook::jsi::Function::createFromHostFunction( + *runtime_, PropNameID::forAscii(*runtime_, ""), 0, + [pointer = wrapper.get()](Runtime& runtime, const Value& this_value, const Value* args, size_t count) -> Value { + return InvokeJsCallback(runtime, this_value, args, count, pointer); + }); + return std::make_shared(*runtime_, func); +} + +std::shared_ptr HermesCtx::CreateObject( + const std::unordered_map>& kvs) { + facebook::jsi::Object obj = facebook::jsi::Object(*runtime_); + for (const auto& [k, v] : kvs) { + if (StringViewUtils::IsEmpty(k) || v == nullptr) { + continue; + } + + auto u8_string = StringViewUtils::CovertToUtf8(k, k.encoding()); + auto key_jsi_string = + String::createFromUtf8(*runtime_, u8_string.utf8_value().c_str(), u8_string.utf8_value().size()); + std::shared_ptr ctx_value = std::static_pointer_cast(v); + + obj.setProperty(*runtime_, key_jsi_string, ctx_value->GetValue(runtime_)); + } + return std::make_shared(*runtime_, obj); +} + +std::shared_ptr HermesCtx::CreateObject( + const std::unordered_map, std::shared_ptr>& kvs) { + facebook::jsi::Object obj = facebook::jsi::Object(*runtime_); + for (const auto& [k, v] : kvs) { + std::shared_ptr key_ctx_value = std::static_pointer_cast(k); + if (!key_ctx_value->GetValue(runtime_).isString()) { + continue; + } + String jsi_key = key_ctx_value->GetValue(runtime_).asString(*runtime_); + std::shared_ptr ctx_value = std::static_pointer_cast(v); + Value jsi_val = ctx_value->GetValue(runtime_); + obj.setProperty(*runtime_, jsi_key, jsi_val); + } + return std::make_shared(*runtime_, obj); +} + +std::shared_ptr HermesCtx::CreateMap( + const std::map, std::shared_ptr>& map) { + auto js_map = runtime_->global().getProperty(*runtime_, "Map"); + auto instance = js_map.asObject(*runtime_).asFunction(*runtime_).callAsConstructor(*runtime_); + auto set_function = js_map.asObject(*runtime_) + .getProperty(*runtime_, "prototype") + .asObject(*runtime_) + .getProperty(*runtime_, "set") + .asObject(*runtime_) + .asFunction(*runtime_); + for (const auto& kv : map) { + auto ctx_k = std::static_pointer_cast(kv.first); + auto ctx_v = std::static_pointer_cast(kv.second); + set_function.callWithThis(*runtime_, instance.asObject(*runtime_), + {ctx_k->GetValue(runtime_), ctx_v->GetValue(runtime_)}); + } + return std::make_shared(*runtime_, instance.asObject(*runtime_)); +} + +std::shared_ptr HermesCtx::CreateArray(size_t count, std::shared_ptr values[]) { + if (count < 0) { + return nullptr; + } + facebook::jsi::Array array = facebook::jsi::Array(*runtime_, count); + for (size_t i = 0; i < count; i++) { + std::shared_ptr value = std::static_pointer_cast(values[i]); + array.setValueAtIndex(*runtime_, i, value->GetValue(runtime_)); + } + return std::make_shared(*runtime_, array); +} + +std::shared_ptr HermesCtx::CreateException(const string_view& msg) { + FOOTSTONE_DLOG(INFO) << "HermesCtx::CreateException msg = " << msg; + auto u8_msg = StringViewUtils::CovertToUtf8(msg, msg.encoding()); + auto str = StringViewUtils::ToStdString(u8_msg.utf8_value()); + auto exptr = std::make_exception_ptr(facebook::jsi::JSINativeException(str)); + return std::make_shared(exptr, str); +} + +std::shared_ptr HermesCtx::CreateByteBuffer(void* buffer, size_t length) { + auto mutableBuffer = std::make_shared(buffer, length); + auto arrayBuffer = facebook::jsi::ArrayBuffer(*runtime_, std::move(mutableBuffer)); + return std::make_shared(*runtime_, std::move(arrayBuffer)); +} + +std::shared_ptr HermesCtx::CallFunction(const std::shared_ptr& function, + const std::shared_ptr& receiver, + size_t argument_count, + const std::shared_ptr arguments[]) { + auto ctx_value = std::static_pointer_cast(function); + auto jsi_value = ctx_value->GetValue(runtime_); + if (!jsi_value.isObject()) { + return nullptr; + } + + auto jsi_object = jsi_value.asObject(*runtime_); + if (!jsi_object.isFunction(*runtime_)) { + return nullptr; + } + + try { + auto jsi_func = jsi_object.asFunction(*runtime_); + auto receiver_ctx_value = std::static_pointer_cast(receiver); + auto this_object = receiver_ctx_value->GetValue(runtime_); + + if (argument_count == 0) { + auto value = jsi_func.callWithThis(*runtime_, this_object.asObject(*runtime_)); + return std::make_shared(*runtime_, value); + } else { + std::vector arg_vec(argument_count); + for (size_t i = 0; i < argument_count; ++i) { + auto argument_ctx_val = std::static_pointer_cast(arguments[i]); + FOOTSTONE_DCHECK(argument_ctx_val); + arg_vec[i] = argument_ctx_val ? argument_ctx_val->GetValue(runtime_) : facebook::jsi::Value::null(); + } + auto value = jsi_func.callWithThis(*runtime_, this_object.asObject(*runtime_), (const Value *)(arg_vec.data()), argument_count); + return std::make_shared(*runtime_, value); + } + } catch (const facebook::jsi::JSIException& err) { + auto exptr = std::current_exception(); + std::string message(err.what()); + exception_ = std::make_shared(exptr, message); + return nullptr; + } +} + +bool HermesCtx::GetValueNumber(const std::shared_ptr& value, double* result) { + if (!value) { + result = nullptr; + return false; + } + std::shared_ptr ctx_value = std::static_pointer_cast(value); + if (!ctx_value->GetValue(runtime_).isNumber()) { + result = nullptr; + return false; + } + *result = ctx_value->GetValue(runtime_).asNumber(); + return true; +} + +bool HermesCtx::GetValueNumber(const std::shared_ptr& value, int32_t* result) { + if (!value) { + result = nullptr; + return false; + } + std::shared_ptr ctx_value = std::static_pointer_cast(value); + if (!ctx_value->GetValue(runtime_).isNumber()) { + result = nullptr; + return false; + } + *result = static_cast(ctx_value->GetValue(runtime_).asNumber()); + return true; +} + +bool HermesCtx::GetValueBoolean(const std::shared_ptr& value, bool* result) { + if (!value) { + result = nullptr; + return false; + } + std::shared_ptr ctx_value = std::static_pointer_cast(value); + if (!ctx_value->GetValue(runtime_).isBool()) { + result = nullptr; + return false; + } + *result = ctx_value->GetValue(runtime_).asBool(); + return true; +} + +bool HermesCtx::GetValueString(const std::shared_ptr& value, string_view* result) { + if (!value) { + result = nullptr; + return false; + } + std::shared_ptr ctx_value = std::static_pointer_cast(value); + if (!ctx_value->GetValue(runtime_).isString()) { + result = nullptr; + return false; + } + String jsi_str = ctx_value->GetValue(runtime_).asString(*runtime_); + const std::string utf8_string = jsi_str.utf8(*runtime_); + *result = string_view::new_from_utf8(utf8_string.data(), utf8_string.size()); + return true; +} + +bool HermesCtx::GetValueJson(const std::shared_ptr& value, string_view* result) { + if (!value) { + result = nullptr; + return false; + } + std::shared_ptr ctx_value = std::static_pointer_cast(value); + if (ctx_value->GetValue(runtime_).isString()) { + return GetValueString(value, result); + } else if (ctx_value->GetValue(runtime_).isObject()) { + facebook::jsi::Object jsi_obj = ctx_value->GetValue(runtime_).asObject(*runtime_); + Function stringify = EvalFunction(kJsonStringify); + Value ret = stringify.call(*runtime_, ctx_value->GetValue(runtime_).asObject(*runtime_)); + if (!ret.isString()) return false; + const std::string utf8_string = ret.asString(*runtime_).utf8(*runtime_); + *result = string_view(utf8_string); + return true; + } else { + return false; + } +} + +bool HermesCtx::GetEntriesFromObject(const std::shared_ptr& value, + std::unordered_map, std::shared_ptr>& map) { + if (!value) return false; + auto ctx_value = std::static_pointer_cast(value); + Value val = ctx_value->GetValue(runtime_); + + if (!val.isObject()) return false; + auto obj = val.asObject(*runtime_); + Array prop_names = obj.getPropertyNames(*runtime_); + for (size_t i = 0; i < prop_names.size(*runtime_); i++) { + auto prop_name = prop_names.getValueAtIndex(*runtime_, i); + if (!prop_name.isString()) continue; + auto prop_value = obj.getProperty(*runtime_, prop_name.asString(*runtime_)); + map[std::make_shared(*runtime_, prop_name)] = + std::make_shared(*runtime_, prop_value); + } + return true; +} + +bool HermesCtx::GetEntriesFromMap(const std::shared_ptr& value, + std::unordered_map, std::shared_ptr>& map) { + if (!value) return false; + auto ctx_value = std::static_pointer_cast(value); + Value val = ctx_value->GetValue(runtime_); + + if (!val.isObject()) return false; + auto obj = val.asObject(*runtime_); + + auto entries = obj.getProperty(*runtime_, "entries"); + if (entries.isUndefined()) return false; + auto size = obj.getProperty(*runtime_, "size"); + if (!size.isNumber()) return false; + auto iterator = entries.asObject(*runtime_).asFunction(*runtime_).callWithThis(*runtime_, obj); + for (size_t i = 0; i < static_cast(size.asNumber()); i++) { + auto next = iterator.asObject(*runtime_).getProperty(*runtime_, "next"); + if (!next.isObject()) return false; + if (!next.asObject(*runtime_).isFunction(*runtime_)) return false; + auto next_ret = + next.asObject(*runtime_).asFunction(*runtime_).callWithThis(*runtime_, iterator.asObject(*runtime_)); + if (!next_ret.isObject()) return false; + auto kv_array = next_ret.asObject(*runtime_).getProperty(*runtime_, "value"); + if (!kv_array.asObject(*runtime_).isArray(*runtime_)) return false; + if (kv_array.asObject(*runtime_).asArray(*runtime_).size(*runtime_) != 2) return false; + auto k = kv_array.asObject(*runtime_).asArray(*runtime_).getValueAtIndex(*runtime_, 0); + auto v = kv_array.asObject(*runtime_).asArray(*runtime_).getValueAtIndex(*runtime_, 1); + std::shared_ptr ctx_k = nullptr; + if (k.isString()) { + ctx_k = std::make_shared(*runtime_, k.asString(*runtime_)); + } else if (k.isSymbol()) { + ctx_k = std::make_shared(*runtime_, k.asSymbol(*runtime_)); + } else if (k.isObject()) { + ctx_k = std::make_shared(*runtime_, k.asObject(*runtime_)); + } else if (k.isBigInt()) { + ctx_k = std::make_shared(*runtime_, k.asBigInt(*runtime_)); + } else { + ctx_k = std::make_shared(*runtime_, k); + } + + std::shared_ptr ctx_v = nullptr; + if (v.isString()) { + ctx_v = std::make_shared(*runtime_, v.asString(*runtime_)); + } else if (v.isSymbol()) { + ctx_v = std::make_shared(*runtime_, v.asSymbol(*runtime_)); + } else if (v.isObject()) { + ctx_v = std::make_shared(*runtime_, v.asObject(*runtime_)); + } else if (v.isBigInt()) { + ctx_v = std::make_shared(*runtime_, v.asBigInt(*runtime_)); + } else { + ctx_v = std::make_shared(*runtime_, v); + } + map[ctx_k] = ctx_v; + } + return true; +} + +bool HermesCtx::IsNull(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isNull(); +} + +bool HermesCtx::IsUndefined(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isUndefined(); +} + +bool HermesCtx::IsNullOrUndefined(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isNull() || ctx_value->GetValue(runtime_).isUndefined(); +} + +bool HermesCtx::IsBoolean(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isBool(); +} + +bool HermesCtx::IsNumber(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isNumber(); +} + +bool HermesCtx::IsString(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isString(); +} + +bool HermesCtx::IsFunction(const std::shared_ptr& value) { + if (!value) { + return false; + } + std::shared_ptr ctx_value = std::static_pointer_cast(value); + if (ctx_value->GetValue(runtime_).isObject()) { + return ctx_value->GetValue(runtime_).asObject(*runtime_).isFunction(*runtime_); + } + return false; +} + +bool HermesCtx::IsObject(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isObject(); +} + +bool HermesCtx::IsMap(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + return ctx_value->GetValue(runtime_).isObject(); +} + +bool HermesCtx::IsArray(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + if (ctx_value->GetValue(runtime_).isObject()) { + auto jsi_object = ctx_value->GetValue(runtime_).asObject(*runtime_); + return jsi_object.isArray(*runtime_); + } + return false; +} + +bool HermesCtx::IsByteBuffer(const std::shared_ptr& value) { + if (!value) return false; + std::shared_ptr ctx_value = std::static_pointer_cast(value); + const auto &jsi_value = ctx_value->GetValue(runtime_); + return jsi_value.isObject() && jsi_value.asObject(*runtime_).isArrayBuffer(*runtime_); +} + +bool HermesCtx::GetByteBuffer(const std::shared_ptr& value, + void** out_data, + size_t& out_length, + uint32_t& out_type) { + if (!value || *out_data) { + return false; + } + // Get ArrayBuffer Object + // Assume that type has already been checked using IsByteBuffer for performance. + auto ctx_value = std::static_pointer_cast(value); + const auto &jsi_value = ctx_value->GetValue(runtime_); + auto arrayBuffer = jsi_value.getObject(*runtime_).getArrayBuffer(*runtime_);; + + // Extract data and length + *out_data = arrayBuffer.data(*runtime_); + out_length = arrayBuffer.size(*runtime_); + out_type = 0; // hermes not support + return true; +} + +uint32_t HermesCtx::GetArrayLength(const std::shared_ptr& value) { + if (value == nullptr) return 0; + + std::shared_ptr ctx_value = std::static_pointer_cast(value); + Value val = ctx_value->GetValue(runtime_); + + if (!val.isObject()) return 0; + if (!val.asObject(*runtime_).isArray(*runtime_)) return 0; + + auto arr = val.asObject(*runtime_).asArray(*runtime_); + return static_cast(arr.size(*runtime_)); +} + +std::shared_ptr HermesCtx::CopyArrayElement(const std::shared_ptr& value, uint32_t index) { + if (!value) return nullptr; + + std::shared_ptr ctx_value = std::static_pointer_cast(value); + Value val = ctx_value->GetValue(runtime_); + + if (!val.isObject()) return nullptr; + if (!val.asObject(*runtime_).isArray(*runtime_)) return nullptr; + + auto arr = val.asObject(*runtime_).asArray(*runtime_); + Value index_val = arr.getValueAtIndex(*runtime_, index); + return std::make_shared(*runtime_, index_val); +} + +bool HermesCtx::HasNamedProperty(const std::shared_ptr& value, const string_view& name) { + // TODO: add has named property, currently unused + FOOTSTONE_UNIMPLEMENTED(); + return false; +} + +std::shared_ptr HermesCtx::CopyNamedProperty(const std::shared_ptr& value, + const string_view& name) { + // TODO: add copy named property, currently unused + FOOTSTONE_UNIMPLEMENTED(); + return nullptr; +} + +string_view HermesCtx::CopyFunctionName(const std::shared_ptr& function) { + // TODO: add copy function name, currently unused + FOOTSTONE_UNIMPLEMENTED(); + return ""; +} + +bool HermesCtx::Equals(const std::shared_ptr& lhs, const std::shared_ptr& rhs) { + auto l = std::static_pointer_cast(lhs); + auto r = std::static_pointer_cast(rhs); + return Value::strictEquals(*runtime_, l->GetValue(runtime_), r->GetValue(runtime_)); +} + +std::shared_ptr HermesCtx::RunScript(const string_view& data, const string_view& file_name) { + if (StringViewUtils::IsEmpty(data)) { + return nullptr; + } + auto u8_file_name = StringViewUtils::CovertToUtf8(file_name, file_name.encoding()); + auto u8_script = StringViewUtils::CovertToUtf8(data, data.encoding()); + bool is_hbc = facebook::hermes::HermesRuntime::isHermesBytecode(reinterpret_cast(u8_script.utf8_value().data()), + u8_script.utf8_value().size()); + FOOTSTONE_DLOG(INFO) << "is hbc file " << is_hbc << ", file name " << u8_file_name.utf8_value().c_str(); + try { + if (is_hbc) { + auto jsi_file_name = + String::createFromUtf8(*runtime_, u8_file_name.utf8_value().c_str(), u8_file_name.utf8_value().size()); + auto jsi_script = std::make_shared(static_cast(u8_script.utf8_value().c_str()), + u8_script.utf8_value().size()); + facebook::jsi::Value value = runtime_->evaluateJavaScript(jsi_script, jsi_file_name.utf8(*runtime_)); + return std::make_shared(*runtime_, value); + } else { + auto jsi_file_name = facebook::jsi::String::createFromUtf8(*runtime_, u8_file_name.utf8_value().c_str(), + u8_file_name.utf8_value().size()); + std::shared_ptr prepare_js = nullptr; + auto jsi_script = String::createFromUtf8(*runtime_, u8_script.utf8_value().c_str(), u8_script.utf8_value().size()); + auto buffer = std::make_shared(jsi_script.utf8(*runtime_)); + prepare_js = runtime_->prepareJavaScript(buffer, jsi_file_name.utf8(*runtime_)); + auto value = runtime_->evaluatePreparedJavaScript(prepare_js); + return std::make_shared(*runtime_, value); + } + } catch (facebook::jsi::JSIException& err) { + auto exptr = std::current_exception(); + std::string message(err.what()); + exception_ = std::make_shared(exptr, message); + return nullptr; + } +} + +// MARK: - Exception Handle + +// TODO: add throw exception +void HermesCtx::ThrowException(const std::shared_ptr& exception) {} + +// TODO: add throw exception +void HermesCtx::ThrowException(const string_view& exception) {} + +std::shared_ptr HermesCtx::CreateTryCatchScope(bool enable, std::shared_ptr ctx) { + return std::make_shared(enable, ctx); +} + +string_view HermesCtx::GetExceptionMessage(const std::shared_ptr& exception) { + if (!exception) { + return string_view(); + } + auto hermes_exception = std::static_pointer_cast(exception); + std::string message = hermes_exception->Message(); + FOOTSTONE_DLOG(ERROR) << "GetExceptionMessage msg = " << message; + return string_view(message); +} + +// MARK: - + +void HermesCtx::SetExternalData(void* address) { + global_native_state_->Set(kScopeWrapperIndex, address); +} + +std::shared_ptr HermesCtx::GetClassDefinition(const string_view& name) { + FOOTSTONE_DCHECK(template_map_.find(name) != template_map_.end()); + return template_map_[name]; +} + +void HermesCtx::SetWeak(std::shared_ptr value, const std::unique_ptr& wrapper) { + FOOTSTONE_UNREACHABLE(); +} + +void HermesCtx::SetWeak(std::shared_ptr value, std::unique_ptr&& wrapper) { + // value must be an object + auto hermes_value = std::static_pointer_cast(value); + auto js_object = hermes_value->GetValue(runtime_).asObject(*runtime_); + + std::shared_ptr local_state = nullptr; + if (js_object.hasNativeState(*runtime_)) { + local_state = js_object.getNativeState(*runtime_); + } else { + local_state = std::make_shared(); + js_object.setNativeState(*runtime_, local_state); + } + // bind scope to wrapper, due to the problem that + // some c++ resources of js object that finalize callback need have been released during the destructor. + std::any scope_any; + if (!global_native_state_->Get(kScopeWrapperIndex, scope_any)) { + return; + } + auto any_pointer = std::any_cast(&scope_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); + wrapper->scope = scope_wrapper->scope; + local_state->SetWeakCallbackWrapper(std::move(wrapper)); +} + +Value HermesCtx::Eval(const char* code) { + return runtime_->global().getPropertyAsFunction(*runtime_, "eval").call(*runtime_, code); +} + +Function HermesCtx::EvalFunction(const std::string& code) { + return Eval(("(" + code + ")").c_str()).getObject(*runtime_).getFunction(*runtime_); +} + +void HermesCtx::BuiltinModule() { + auto console = facebook::jsi::Object(*runtime_); + BuiltinFunction(console, "log"); + BuiltinFunction(console, "error"); + BuiltinFunction(console, "warn"); + BuiltinFunction(console, "debug"); + BuiltinFunction(console, "info"); + BuiltinFunction(console, "trace"); + BuiltinFunction(console, "clear"); + runtime_->global().setProperty(*runtime_, "console", console); +} + +// MARK: - Inspector Helper Functions + +#ifdef ENABLE_INSPECTOR +// Get the current time in milliseconds as a double. +inline double getTimestampMs() { + return std::chrono::duration_cast>(std::chrono::system_clock::now() + .time_since_epoch()).count(); +} + +inline ConsoleAPIType consoleTypeForName(const std::string& name) { + static const std::unordered_map nameToTypeMap = { + {"log", facebook::hermes::cdp::ConsoleAPIType::kLog}, + {"error", facebook::hermes::cdp::ConsoleAPIType::kError}, + {"warn", facebook::hermes::cdp::ConsoleAPIType::kWarning}, + {"debug", facebook::hermes::cdp::ConsoleAPIType::kDebug}, + {"info", facebook::hermes::cdp::ConsoleAPIType::kInfo}, + {"trace", facebook::hermes::cdp::ConsoleAPIType::kTrace}, + {"clear", facebook::hermes::cdp::ConsoleAPIType::kClear} + }; + + auto it = nameToTypeMap.find(name); + if (it != nameToTypeMap.end()) { + return it->second; + } else { + throw std::invalid_argument("Unknown console function name: " + name); + } +} + +#endif /* ENABLE_INSPECTOR */ + +void HermesCtx::BuiltinFunction(facebook::jsi::Object& module, + const std::string& name) { + auto name_id = facebook::jsi::PropNameID::forUtf8(*runtime_, name); + auto function = facebook::jsi::Function::createFromHostFunction( + *runtime_, name_id, 1, + [=](facebook::jsi::Runtime& runtime, + const facebook::jsi::Value& thisVal, + const facebook::jsi::Value* args, + size_t count) { +#ifdef ENABLE_INSPECTOR + std::vector argsVec; + auto timestampMs = getTimestampMs(); + for (size_t i = 0; i != count; ++i) { + argsVec.emplace_back(runtime, args[i]); + } + auto stackTrace = runtime_->getDebugger().captureStackTrace(); + if (cdpDebugAPI_) { + auto type = consoleTypeForName(name); + cdpDebugAPI_->addConsoleMessage({timestampMs, type, std::move(argsVec), stackTrace}); + } +#endif /* ENABLE_INSPECTOR */ + return facebook::jsi::Value::undefined(); + }); + module.setProperty(*runtime_, name_id, function); +} + +std::unique_ptr HermesCtx::GetNativeSourceCodeProvider() const { + return std::make_unique(); +} + + +} // namespace napi +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/napi/hermes/hermes_ctx_value.cc b/driver/js/src/napi/hermes/hermes_ctx_value.cc new file mode 100644 index 00000000000..e69173e9fab --- /dev/null +++ b/driver/js/src/napi/hermes/hermes_ctx_value.cc @@ -0,0 +1,47 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "driver/napi/hermes/hermes_ctx_value.h" + +#include "footstone/logging.h" + +namespace hippy { +inline namespace driver { +inline namespace napi { + +Value HermesCtxValue::GetValue(const std::unique_ptr& runtime) { + if (type_ == HermesCtxValue::Type::ObjectKind) { + return Value(*runtime, value_.asObject(*runtime)); + } else if (type_ == HermesCtxValue::Type::SymbolKind) { + return Value(*runtime, value_.asSymbol(*runtime)); + } else if (type_ == HermesCtxValue::Type::StringKind) { + return Value(*runtime, value_.asString(*runtime)); + } else if (type_ == HermesCtxValue::Type::BigIntKind) { + return Value(*runtime, value_.asBigInt(*runtime)); + } else { + return Value(*runtime, value_); + } +} + +} // namespace napi +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/napi/hermes/hermes_try_catch.cc b/driver/js/src/napi/hermes/hermes_try_catch.cc new file mode 100644 index 00000000000..fe01c69d1cb --- /dev/null +++ b/driver/js/src/napi/hermes/hermes_try_catch.cc @@ -0,0 +1,68 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "driver/napi/hermes/hermes_try_catch.h" +#include "footstone/logging.h" + +namespace hippy { +inline namespace driver { +inline namespace napi { + +using string_view = footstone::string_view; + +HermesTryCatch::HermesTryCatch(bool enable, std::shared_ptr& ctx) : TryCatch(enable, ctx) {} + +bool HermesTryCatch::HasCaught() { + if (enable_) { + std::shared_ptr ctx = std::static_pointer_cast(ctx_); + return !!ctx->GetException(); + } + return false; +} + +std::shared_ptr HermesTryCatch::Exception() { + std::shared_ptr ctx = std::static_pointer_cast(ctx_); + return ctx->GetException(); +} + +string_view HermesTryCatch::GetExceptionMessage() { + if (enable_) { + std::shared_ptr ctx = std::static_pointer_cast(ctx_); + return ctx->GetExceptionMessage(ctx->GetException()); + } + return ""; +} + +void HermesTryCatch::ReThrow() { FOOTSTONE_UNIMPLEMENTED(); } + +bool HermesTryCatch::CanContinue() { return false; } + +bool HermesTryCatch::HasTerminated() { return false; } + +bool HermesTryCatch::IsVerbose() { return false; } + +void HermesTryCatch::SetVerbose(__unused bool is_verbose) {} + +} // namespace napi +} // namespace driver +} // namespace hippy + diff --git a/driver/js/src/napi/js_try_catch.cc b/driver/js/src/napi/js_try_catch.cc new file mode 100644 index 00000000000..1c908c4bfa1 --- /dev/null +++ b/driver/js/src/napi/js_try_catch.cc @@ -0,0 +1,40 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "driver/napi/js_try_catch.h" +#include "footstone/logging.h" +#include "driver/napi/js_ctx.h" + +namespace hippy { +inline namespace driver { +inline namespace napi { + + +std::shared_ptr TryCatch::CreateTryCatchScope(bool enable, std::shared_ptr ctx) { + std::shared_ptr try_catch = ctx->CreateTryCatchScope(enable, ctx); + FOOTSTONE_CHECK(try_catch != nullptr); + return try_catch; +} + +} // namespace vm +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/napi/jsc/jsc_ctx.cc b/driver/js/src/napi/jsc/jsc_ctx.cc index 5297a0202e9..9b40eb5f3bc 100644 --- a/driver/js/src/napi/jsc/jsc_ctx.cc +++ b/driver/js/src/napi/jsc/jsc_ctx.cc @@ -26,8 +26,9 @@ #include "driver/napi/jsc/jsc_ctx_value.h" #include "driver/napi/jsc/jsc_class_definition.h" #include "driver/napi/callback_info.h" -#include "driver/vm/native_source_code.h" +#include "driver/napi/jsc/jsc_try_catch.h" #include "driver/vm/jsc/jsc_vm.h" +#include "driver/vm/jsc/native_source_code_jsc.h" namespace hippy { @@ -254,6 +255,10 @@ std::shared_ptr JSCCtx::DefineProxy(const std::unique_ptr(context_, fn_obj); } +std::shared_ptr JSCCtx::DefineProxyHandler(const std::unique_ptr& proxy_handler) { + return nullptr; +} + std::shared_ptr JSCCtx::DefineClass(const string_view& name, const std::shared_ptr& parent, const std::unique_ptr& constructor_wrapper, @@ -398,7 +403,7 @@ std::shared_ptr JSCCtx::DefineClass(const string_view& name, std::shared_ptr JSCCtx::NewInstance(const std::shared_ptr& cls, int argc, std::shared_ptr argv[], void* external) { auto jsc_cls = std::static_pointer_cast(cls); JSValueRef values[argc]; // NOLINT(runtime/arrays) - for (size_t i = 0; i < argc; i++) { + for (int i = 0; i < argc; i++) { auto arg_value = std::static_pointer_cast(argv[i]); values[i] = arg_value->value_; } @@ -917,7 +922,8 @@ std::shared_ptr JSCCtx::CallFunction(const std::shared_ptr& JSValueRef values[argc]; // NOLINT(runtime/arrays) for (size_t i = 0; i < argc; i++) { auto arg_value = std::static_pointer_cast(argv[i]); - values[i] = arg_value->value_; + FOOTSTONE_DCHECK(arg_value); + values[i] = arg_value ? arg_value->value_ : JSValueMakeNull(context_); } auto ret_value_ref = JSObjectCallAsFunction(context_, function_object, receiver_object, argc, values, &exception); @@ -992,6 +998,10 @@ void JSCCtx::ThrowException(const string_view& exception) { ThrowException(CreateException(exception)); } +std::shared_ptr JSCCtx::CreateTryCatchScope(bool enable, std::shared_ptr ctx) { + return std::make_shared(enable, ctx); +} + JSPropertyAttributes ConvertPropertyAttribute(PropertyAttribute attr) { switch (attr) { case None: @@ -1240,6 +1250,14 @@ void JSCCtx::SetWeak(std::shared_ptr value, const std::unique_ptr value, std::unique_ptr&& wrapper) { + FOOTSTONE_UNIMPLEMENTED(); +} + +std::unique_ptr JSCCtx::GetNativeSourceCodeProvider() const { + return std::make_unique(); +} + } // namespace napi } } // namespace hippy diff --git a/driver/js/src/napi/jsc/jsc_try_catch.cc b/driver/js/src/napi/jsc/jsc_try_catch.cc index a85052b2dc8..daa952717b0 100644 --- a/driver/js/src/napi/jsc/jsc_try_catch.cc +++ b/driver/js/src/napi/jsc/jsc_try_catch.cc @@ -30,10 +30,6 @@ inline namespace napi { using string_view = footstone::string_view; -std::shared_ptr CreateTryCatchScope(bool enable, - std::shared_ptr ctx) { - return std::make_shared(enable, ctx); -} JSCTryCatch::JSCTryCatch(bool enable, std::shared_ptr ctx) : TryCatch(enable, ctx) { diff --git a/driver/js/src/napi/v8/v8_ctx.cc b/driver/js/src/napi/v8/v8_ctx.cc index c4a9929a6b9..6ce6031d623 100644 --- a/driver/js/src/napi/v8/v8_ctx.cc +++ b/driver/js/src/napi/v8/v8_ctx.cc @@ -29,7 +29,7 @@ #include "driver/napi/callback_info.h" #include "driver/vm/v8/v8_vm.h" #include "driver/vm/v8/serializer.h" -#include "driver/vm/native_source_code.h" +#include "driver/vm/v8/native_source_code_v8.h" #include "footstone/check.h" #include "footstone/string_view.h" #include "footstone/string_view_utils.h" @@ -1381,6 +1381,10 @@ std::shared_ptr V8Ctx::DefineProxy(const std::unique_ptr(isolate_, func_tpl->GetFunction(context).ToLocalChecked()); } +std::shared_ptr V8Ctx::DefineProxyHandler(const std::unique_ptr& proxy_handler) { + return nullptr; +} + std::shared_ptr V8Ctx::DefineClass(const string_view& name, const std::shared_ptr& parent, const std::unique_ptr& constructor_wrapper, @@ -1522,6 +1526,19 @@ void V8Ctx::SetWeak(std::shared_ptr value, }, v8::WeakCallbackType::kParameter); } +void V8Ctx::SetWeak(std::shared_ptr value, + std::unique_ptr && wrapper) { + FOOTSTONE_UNREACHABLE(); +} + +std::shared_ptr V8Ctx::CreateTryCatchScope(bool enable, std::shared_ptr ctx) { + return std::make_shared(enable, ctx); +} + +std::unique_ptr V8Ctx::GetNativeSourceCodeProvider() const { + return std::make_unique(); +} + } // namespace napi } // namespace driver } // namespace hippy diff --git a/driver/js/src/napi/v8/v8_try_catch.cc b/driver/js/src/napi/v8/v8_try_catch.cc index 480435cbdaa..bb13720acab 100644 --- a/driver/js/src/napi/v8/v8_try_catch.cc +++ b/driver/js/src/napi/v8/v8_try_catch.cc @@ -34,11 +34,6 @@ inline namespace napi { using string_view = footstone::string_view; -std::shared_ptr CreateTryCatchScope(bool enable, - std::shared_ptr ctx) { - return std::make_shared(enable, ctx); -} - V8TryCatch::V8TryCatch(bool enable, const std::shared_ptr& ctx) : TryCatch(enable, ctx), try_catch_(nullptr) { if (enable) { diff --git a/driver/js/src/scope.cc b/driver/js/src/scope.cc index 22bf55730e9..6d1391adcd3 100644 --- a/driver/js/src/scope.cc +++ b/driver/js/src/scope.cc @@ -48,6 +48,7 @@ #include "driver/modules/timer_module.h" #include "driver/modules/ui_manager_module.h" #include "driver/modules/ui_layout_module.h" +#include "driver/vm/js_vm.h" #include "driver/vm/native_source_code.h" #include "footstone/logging.h" #include "footstone/string_view_utils.h" @@ -58,14 +59,21 @@ #include "driver/vm/v8/memory_module.h" #include "driver/napi/v8/v8_ctx.h" #include "driver/vm/v8/v8_vm.h" -#elif JS_JSH +#endif /* JS_V8 */ + +#ifdef JS_HERMES +#include "driver/vm/hermes/hermes_vm.h" +#include "driver/napi/hermes/hermes_ctx.h" +#endif /* JS_HERMES */ + +#ifdef JS_JSH #include "driver/napi/jsh/jsh_ctx.h" #include "driver/vm/jsh/jsh_vm.h" -#endif +#endif /* JS_JSH */ #ifdef ENABLE_INSPECTOR #include "devtools/devtools_data_source.h" -#endif +#endif /* ENABLE_INSPECTOR */ using string_view = footstone::stringview::string_view; using StringViewUtils = footstone::stringview::StringViewUtils; @@ -96,7 +104,9 @@ inline namespace driver { static void InternalBindingCallback(hippy::napi::CallbackInfo& info, void* data) { - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto context = scope->GetContext(); @@ -126,7 +136,8 @@ static void InternalBindingCallback(hippy::napi::CallbackInfo& info, void* data) Scope::Scope(std::weak_ptr engine, std::string name) - : engine_(std::move(engine)), + : is_valid_(true), + engine_(std::move(engine)), context_(nullptr), name_(std::move(name)), extra_function_map_(std::make_unique()), @@ -134,12 +145,14 @@ Scope::Scope(std::weak_ptr engine, performance_(std::make_shared()) {} Scope::~Scope() { + setValid(false); FOOTSTONE_DLOG(INFO) << "~Scope"; #ifdef JS_JSH context_->InvalidWeakCallbackWrapper(); #else context_ = nullptr; #endif + auto engine = engine_.lock(); FOOTSTONE_DCHECK(engine); if (engine) { @@ -212,7 +225,8 @@ void Scope::BindModule() { void Scope::Bootstrap() { FOOTSTONE_LOG(INFO) << "Bootstrap begin"; - auto source_code = hippy::GetNativeSourceCode(kBootstrapJSName); + auto source_code_provider = context_->GetNativeSourceCodeProvider(); + const auto &source_code = source_code_provider->GetNativeSourceCode(kBootstrapJSName); FOOTSTONE_DCHECK(source_code.data_ && source_code.length_); string_view str_view(source_code.data_, source_code.length_); auto function = context_->RunScript(str_view, kBootstrapJSName); @@ -393,7 +407,7 @@ hippy::dom::EventListenerInfo Scope::AddListener(const EventListenerInfo& event_ if (callback == nullptr) return; scope->SetCurrentEvent(std::make_any>(event)); auto event_class = scope->GetJavascriptClass(kEventName); - auto event_instance = context->NewInstance(event_class, 0, nullptr, nullptr); + auto event_instance = context->NewInstance(event_class, 0, nullptr, event.get()); FOOTSTONE_DCHECK(callback) << "callback is nullptr"; if (!callback) { return; @@ -493,13 +507,13 @@ void Scope::RunJS(const string_view& data, const string_view& name, bool is_copy) { std::weak_ptr weak_context = context_; +#ifdef JS_V8 auto callback = [WEAK_THIS, data, uri, name, is_copy, weak_context] { DEFINE_AND_CHECK_SELF(Scope) // perfromance start time auto entry = self->GetPerformance()->PerformanceNavigation(kPerfNavigationHippyInit); entry->BundleInfoOfUrl(uri).execute_source_start_ = footstone::TimePoint::SystemNow(); - -#ifdef JS_V8 + auto context = std::static_pointer_cast(weak_context.lock()); if (context) { context->RunScript(data, name, false, nullptr, is_copy); @@ -510,6 +524,12 @@ void Scope::RunJS(const string_view& data, context->RunScript(data, name, false, nullptr, is_copy); } #else + auto callback = [WEAK_THIS, data, uri, name, weak_context] { + DEFINE_AND_CHECK_SELF(Scope) + // perfromance start time + auto entry = self->GetPerformance()->PerformanceNavigation("hippyInit"); + entry->BundleInfoOfUrl(uri).execute_source_start_ = footstone::TimePoint::SystemNow(); + auto context = weak_context.lock(); if (context) { context->RunScript(data, name); diff --git a/driver/js/src/vm/hermes/hermes_vm.cc b/driver/js/src/vm/hermes/hermes_vm.cc new file mode 100644 index 00000000000..e9b6907838b --- /dev/null +++ b/driver/js/src/vm/hermes/hermes_vm.cc @@ -0,0 +1,124 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2022 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "driver/vm/hermes/hermes_vm.h" + +#include "driver/napi/hermes/hermes_ctx.h" +#include "driver/napi/hermes/hermes_ctx_value.h" +#include "footstone/string_view_utils.h" + +using string_view = footstone::string_view; +using StringViewUtils = footstone::StringViewUtils; +using Ctx = hippy::napi::Ctx; +using HermesCtx = hippy::napi::HermesCtx; + +namespace hippy { +inline namespace driver { +inline namespace vm { + +HermesVM::HermesVM(const std::shared_ptr& param) : VM(param) { + FOOTSTONE_DLOG(INFO) << "HermesVM begin"; + FOOTSTONE_DLOG(INFO) << "HermesVM end"; +} + +std::shared_ptr HermesVM::ParseJson(const std::shared_ptr& ctx, const string_view& json) { + if (footstone::StringViewUtils::IsEmpty(json)) { + return nullptr; + } + auto hermes_ctx = std::static_pointer_cast(ctx); + auto& runtime = hermes_ctx->GetRuntime(); + auto utf8_json = StringViewUtils::CovertToUtf8(json, json.encoding()); + facebook::jsi::Value json_value = + facebook::jsi::Value::createFromJsonUtf8(*runtime, utf8_json.utf8_value().c_str(), utf8_json.utf8_value().size()); + // return std::make_shared(std::move(json_value)); + return std::make_shared(*runtime, json_value); +} + +static bool JsiValueToHippyValue(Runtime& runtime, const Value& value, HippyValue& hippy_value) { + if (value.isUndefined()) { + hippy_value = HippyValue::Undefined(); + } else if (value.isNull()) { + hippy_value = HippyValue::Null(); + } else if (value.isString()) { + auto str = value.asString(runtime).utf8(runtime); + hippy_value = HippyValue(str); + } else if (value.isNumber()) { + auto d = value.asNumber(); + hippy_value = HippyValue(d); + } else if (value.isBool()) { + auto b = value.asBool(); + hippy_value = HippyValue(b); + } else if (value.isObject()) { + auto object = value.asObject(runtime); + if (object.isArray(runtime)) { + auto jsi_array = object.asArray(runtime); + HippyValue::HippyValueArrayType hippy_array; + for (size_t i = 0; i < jsi_array.size(runtime); i++) { + HippyValue val; + auto ret = JsiValueToHippyValue(runtime, jsi_array.getValueAtIndex(runtime, i), val); + if (!ret) return false; + hippy_array[i] = val; + } + hippy_value = HippyValue(std::move(hippy_array)); + } else { + auto jsi_keys = object.getPropertyNames(runtime); + HippyValue::HippyValueObjectType hippy_object; + for (size_t i = 0; i < jsi_keys.size(runtime); i++) { + auto jsi_key = jsi_keys.getValueAtIndex(runtime, i); + if (!jsi_key.isString()) return false; + std::string key = jsi_key.asString(runtime).utf8(runtime); + Value jsi_value = object.getProperty(runtime, key.data()); + HippyValue val; + auto ret = JsiValueToHippyValue(runtime, jsi_value, val); + if (!ret) return false; + hippy_object.insert({key, val}); + } + hippy_value = HippyValue(std::move(hippy_object)); + } + } + return true; +} + +bool HermesVM::ParseHippyValue(const std::shared_ptr& ctx, const string_view& json, HippyValue& hippy_value) { + if (footstone::StringViewUtils::IsEmpty(json)) { + hippy_value = HippyValue::Null(); + return true; + } + auto hermes_ctx = std::static_pointer_cast(ctx); + auto& runtime = hermes_ctx->GetRuntime(); + auto utf8_json = StringViewUtils::CovertToUtf8(json, json.encoding()); + facebook::jsi::Value value = + facebook::jsi::Value::createFromJsonUtf8(*runtime, utf8_json.utf8_value().c_str(), utf8_json.utf8_value().size()); + return JsiValueToHippyValue(*runtime, value, hippy_value); +} + +std::shared_ptr HermesVM::CreateContext() { + return std::make_shared(); +} + +std::shared_ptr HermesVM::CreateVM(const std::shared_ptr& param) { + return std::make_shared(std::static_pointer_cast(param)); +} + +} // namespace vm +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/vm/hermes/native_source_code_hermes_android.cc b/driver/js/src/vm/hermes/native_source_code_hermes_android.cc new file mode 100644 index 00000000000..07c25315465 --- /dev/null +++ b/driver/js/src/vm/hermes/native_source_code_hermes_android.cc @@ -0,0 +1,87 @@ +/* + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2017-2024 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "driver/vm/native_source_code.h" +#include "footstone/macros.h" +#include "driver/vm/hermes/native_source_code_hermes.h" + + +namespace { + const uint8_t k_bootstrap[] = { 198,31,188,3,193,3,25,31,96,0,0,0,15,179,236,212,230,191,10,1,16,147,142,110,143,82,173,158,16,63,11,70,20,8,0,0,0,0,0,0,13,0,0,0,2,0,0,0,29,0,0,0,41,0,0,0,0,0,0,0,111,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,3,0,2,91,0,9,0,228,7,0,6,0,0,5,6,63,4,0,6,51,128,13,0,228,7,0,22,0,2,0,6,114,4,0,6,119,128,14,0,228,7,0,48,0,6,3,6,233,4,0,8,84,128,9,0,228,7,0,32,0,4,0,6,61,5,0,4,41,128,16,0,228,7,0,26,0,1,0,6,102,5,0,6,133,128,15,0,228,7,0,34,0,7,0,6,235,5,0,4,102,0,0,0,228,7,0,24,4,3,2,6,81,6,0,4,54,128,4,0,228,7,0,26,0,0,0,6,135,6,0,2,106,0,0,0,228,7,0,32,1,1,0,6,241,6,0,4,44,128,3,0,228,7,0,26,0,1,2,6,29,7,0,2,57,128,17,0,228,7,0,30,0,4,0,6,86,7,0,2,28,0,17,0,228,7,0,6,0,2,0,6,114,7,0,4,111,0,11,0,228,7,0,24,0,6,0,6,12,0,0,0,29,0,0,128,230,245,66,248,61,105,80,223,132,179,196,162,188,63,131,252,86,255,169,21,176,142,99,223,135,68,180,36,65,204,196,184,117,156,159,56,240,49,222,168,50,202,117,235,250,233,21,150,232,66,53,201,50,61,140,251,186,38,19,147,191,240,222,38,36,60,112,212,44,104,208,95,248,105,196,14,59,222,166,211,6,215,101,199,113,227,189,164,0,227,118,208,175,63,246,178,67,86,25,162,74,7,116,249,67,58,217,69,61,95,124,128,120,180,59,55,0,0,0,0,0,0,0,1,2,0,0,44,90,0,0,33,174,0,0,16,212,0,0,8,226,0,0,6,238,0,0,12,24,1,0,7,38,1,0,15,78,1,0,6,112,1,0,6,6,0,0,11,78,0,0,5,104,0,0,4,156,0,0,16,202,0,0,6,4,1,0,10,66,1,0,6,90,1,0,12,124,1,0,5,134,1,0,6,144,1,0,7,158,1,0,6,170,1,0,6,182,1,0,6,194,1,0,9,212,1,0,15,240,1,0,3,246,1,0,17,22,2,0,5,32,2,0,12,54,2,0,7,68,2,0,14,96,2,0,5,106,2,0,7,120,2,0,12,144,2,0,14,172,2,0,8,188,2,0,9,206,2,0,8,47,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,82,117,110,73,110,84,104,105,115,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,110,103,116,104,105,112,112,121,46,106,115,116,114,105,110,103,78,97,116,105,118,101,77,111,100,117,108,101,110,117,109,101,114,97,98,108,101,100,101,102,97,117,108,116,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,108,111,98,97,108,111,98,106,101,99,116,95,99,114,101,97,116,101,67,108,97,115,115,121,109,98,111,108,72,105,112,112,121,78,117,109,98,101,114,101,113,117,105,114,101,79,98,106,101,99,116,83,116,114,105,110,103,83,121,109,98,111,108,84,121,112,101,69,114,114,111,114,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,101,121,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,112,108,105,116,95,116,111,80,114,105,109,105,116,105,118,101,120,112,111,114,116,115,95,116,111,80,114,111,112,101,114,116,121,75,101,121,99,97,99,104,101,99,111,109,112,105,108,101,99,111,110,102,105,103,117,114,97,98,108,101,100,101,102,105,110,101,80,114,111,112,101,114,116,121,102,105,108,101,110,97,109,101,112,114,111,116,111,116,121,112,101,119,114,105,116,97,98,108,101,0,48,0,0,0,52,27,0,0,0,52,29,0,0,0,52,19,0,0,0,52,33,0,0,0,52,31,0,0,0,50,0,100,1,0,1,0,48,2,59,2,1,1,27,0,100,1,0,2,0,59,2,1,2,29,0,100,1,0,3,0,59,2,1,3,19,0,100,1,0,4,0,59,2,1,4,33,0,100,1,0,5,0,59,2,1,5,31,0,100,0,0,6,0,92,0,108,1,1,108,0,2,39,0,1,0,144,37,0,48,0,57,2,0,1,26,0,54,0,2,2,39,106,1,0,2,115,3,3,0,8,4,1,80,0,2,2,107,0,1,0,95,0,118,0,92,0,108,8,1,108,7,2,54,0,7,1,16,122,6,18,1,6,0,48,5,118,0,120,4,115,3,13,0,146,90,1,73,12,7,6,54,9,12,2,17,8,1,6,144,5,9,121,9,59,12,9,1,17,0,59,12,4,2,36,0,40,9,3,12,146,9,9,59,12,4,3,40,0,57,11,5,3,23,0,54,10,11,4,37,54,13,5,5,33,54,9,12,6,28,83,9,13,0,9,85,9,10,11,8,9,12,37,6,1,54,1,7,1,16,152,173,6,1,92,0,108,0,1,108,5,2,108,3,3,146,23,5,48,1,54,4,1,1,29,54,2,0,2,39,118,1,84,1,4,1,2,5,146,18,3,48,1,54,2,1,1,29,118,1,84,1,2,1,0,3,48,1,57,4,1,3,23,0,54,3,4,4,37,3,2,121,1,63,2,1,40,115,1,39,0,85,1,3,4,0,1,2,92,0,48,0,54,3,0,1,31,118,2,108,1,1,115,0,6,0,84,1,3,2,1,0,115,3,11,0,13,2,1,8,0,1,188,7,3,2,128,0,1,92,0,108,0,1,108,5,2,115,4,10,0,13,1,0,190,118,4,1,146,114,0,48,2,57,1,2,1,25,0,54,1,1,2,12,73,3,0,1,118,6,190,33,6,3,115,1,6,0,188,12,1,5,57,1,2,3,21,0,142,8,57,1,2,4,24,0,83,1,1,6,0,92,1,54,1,3,5,14,144,7,5,115,5,8,0,84,1,1,3,0,5,13,3,1,190,36,4,3,57,4,2,6,26,0,54,2,4,7,39,106,3,2,4,115,9,2,0,8,10,3,80,2,4,2,107,2,3,2,95,2,92,1,92,0,50,1,108,0,1,42,1,0,0,48,0,57,2,0,1,18,0,57,0,0,1,18,0,54,0,0,2,20,144,5,0,3,0,59,2,0,1,20,0,3,0,42,1,1,0,100,3,1,7,0,42,1,2,3,118,0,115,2,4,0,83,2,3,0,2,42,1,3,2,100,1,1,8,0,81,3,1,0,3,1,59,3,1,2,34,0,54,2,3,3,22,115,1,5,0,83,1,2,3,1,92,0,108,1,1,41,0,0,46,2,0,1,73,2,2,1,13,3,2,115,2,10,0,188,23,3,2,46,3,0,1,46,4,0,0,118,2,83,2,4,2,1,74,3,1,2,46,0,0,1,73,0,0,1,92,0,50,2,100,0,2,9,0,42,2,0,0,48,1,54,4,1,1,19,3,1,115,3,35,0,63,1,3,28,100,3,2,10,0,63,1,3,13,7,3,2,0,68,3,1,0,3,1,115,5,34,0,63,1,5,28,100,5,2,11,0,63,1,5,13,68,3,1,1,3,1,115,5,22,0,63,1,5,28,100,2,2,12,0,63,1,2,13,7,2,1,0,68,2,1,0,118,1,85,1,4,1,0,3,2,92,0,108,2,0,48,0,54,3,0,1,27,41,0,0,46,1,0,0,118,0,84,1,3,0,2,1,108,1,1,59,2,1,1,38,0,3,1,59,2,1,2,32,0,92,0,108,1,0,41,0,1,46,4,0,3,54,3,4,1,15,54,2,1,2,38,83,4,3,4,2,54,3,1,3,32,41,1,0,46,1,1,0,54,2,1,4,22,46,1,0,2,118,0,85,1,4,0,3,2,1,92,0,108,2,0,41,0,0,46,0,0,0,54,1,0,1,34,54,0,2,2,38,74,1,0,2,118,0,92,0,108,2,1,54,1,2,1,30,115,0,1,0,83,1,1,2,0,54,2,1,2,16,110,0,1,29,0,2,0,73,3,1,0,41,1,0,46,0,1,0,54,0,0,3,34,73,0,0,3,144,55,0,46,1,1,0,54,2,1,4,39,106,2,2,1,8,5,2,8,4,3,80,1,1,2,107,1,2,1,54,2,1,3,34,81,2,2,1,54,2,1,5,35,81,2,2,1,54,1,1,6,32,92,1,54,0,0,6,32,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,92,56,9,243,78,38,41,82,208,99,123,249,205,156,122,146,143,224,3,0 }; // NOLINT + const uint8_t k_hippy[] = { 198,31,188,3,193,3,25,31,96,0,0,0,215,57,30,35,24,56,225,117,130,138,34,167,177,144,243,228,44,197,198,204,40,4,0,0,0,0,0,0,2,0,0,0,2,0,0,0,5,0,0,0,23,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,3,0,2,9,0,9,0,248,3,0,2,0,0,0,2,37,3,0,8,208,0,0,0,248,3,0,24,0,4,2,6,18,0,0,0,5,0,0,128,135,68,180,36,117,156,159,56,130,51,197,247,79,185,224,129,181,173,102,157,0,0,0,0,0,0,0,33,66,0,0,33,132,0,0,36,204,0,0,29,6,1,0,26,58,1,0,27,112,1,0,21,154,1,0,23,200,1,0,22,244,1,0,24,36,2,0,23,82,2,0,27,136,2,0,31,198,2,0,27,252,2,0,29,54,3,0,30,114,3,0,31,144,0,0,6,176,3,0,5,186,3,0,12,210,3,0,12,234,3,0,12,46,46,47,46,46,47,98,114,105,100,103,101,47,97,110,100,114,111,105,100,47,106,115,50,110,97,116,105,118,101,46,106,115,46,46,47,46,46,47,98,114,105,100,103,101,47,97,110,100,114,111,105,100,47,110,97,116,105,118,101,50,106,115,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,67,111,110,115,111,108,101,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,68,105,109,101,110,115,105,111,110,115,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,68,121,110,97,109,105,99,76,111,97,100,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,69,118,101,110,116,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,78,101,116,119,111,114,107,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,79,116,104,101,114,115,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,80,108,97,116,102,111,114,109,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,83,116,111,114,97,103,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,84,105,109,101,114,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,85,116,105,108,115,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,97,110,100,114,111,105,100,47,84,117,114,98,111,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,97,110,100,114,111,105,100,47,103,108,111,98,97,108,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,97,110,100,114,111,105,100,47,112,114,111,109,105,115,101,46,106,115,72,105,112,112,121,97,115,121,110,99,83,116,111,114,97,103,101,108,111,99,97,108,83,116,111,114,97,103,101,116,117,114,98,111,80,114,111,109,105,115,101,0,0,0,50,0,100,0,0,1,0,92,0,108,2,2,118,0,115,1,9,0,83,1,2,0,1,115,1,6,0,83,1,2,0,1,115,1,10,0,83,1,2,0,1,115,1,13,0,83,1,2,0,1,115,1,1,0,83,1,2,0,1,115,1,12,0,83,1,2,0,1,115,1,17,0,83,1,2,0,1,115,1,4,0,83,1,2,0,1,115,1,8,0,83,1,2,0,1,115,1,11,0,83,1,2,0,1,115,1,5,0,83,1,2,0,1,115,1,14,0,83,1,2,0,1,115,1,16,0,83,1,2,0,1,115,1,2,0,83,1,2,0,1,115,1,7,0,83,1,2,0,1,115,1,3,0,83,1,2,0,1,115,1,15,0,83,1,2,0,1,48,1,57,3,1,1,18,0,57,2,1,2,19,0,54,2,2,3,20,59,3,2,1,21,0,57,2,1,1,18,0,57,1,1,2,19,0,54,1,1,4,22,59,2,1,2,22,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,228,11,240,176,217,158,36,155,154,176,168,10,219,187,96,118,65,189,205,0 }; // NOLINT + const uint8_t k_ExceptionHandle[] = { 198,31,188,3,193,3,25,31,96,0,0,0,181,41,204,244,139,187,39,199,97,86,95,225,15,37,42,20,140,252,219,7,120,1,0,0,0,0,0,0,2,0,0,0,2,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,2,9,128,2,0,72,1,0,2,0,0,0,6,5,1,0,6,67,0,0,0,72,1,0,28,0,5,0,6,1,0,0,0,5,0,0,128,253,43,154,98,218,176,194,44,117,156,159,56,229,122,148,194,135,68,180,36,12,0,0,16,0,0,0,7,40,0,0,5,50,0,0,5,60,0,0,4,68,0,0,6,99,111,110,115,111,108,101,120,99,101,112,116,105,111,110,72,97,110,100,108,101,114,114,111,114,72,105,112,112,121,101,109,105,116,103,108,111,98,97,108,50,0,100,0,0,1,0,92,0,108,3,1,108,2,2,48,0,57,1,0,1,5,0,54,1,1,2,3,144,22,1,57,4,0,3,1,0,54,1,4,4,2,84,1,1,4,3,2,142,24,57,0,0,1,5,0,54,1,0,2,3,54,0,1,5,4,84,0,0,1,3,2,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,122,78,91,52,111,211,36,74,100,149,4,99,179,111,217,128,199,181,12,0 }; // NOLINT + const uint8_t k_Others[] = { 198,31,188,3,193,3,25,31,96,0,0,0,103,253,225,17,245,193,62,86,8,176,5,250,32,190,200,220,226,74,236,235,124,11,0,0,0,0,0,0,12,0,0,0,2,0,0,0,45,0,0,0,62,0,0,0,0,0,0,0,135,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,5,0,2,9,128,12,0,60,11,0,2,0,0,0,2,133,5,0,8,250,0,0,0,60,11,0,38,5,4,11,6,127,6,0,4,41,128,6,0,60,11,0,26,0,0,0,6,168,6,0,6,127,0,6,0,60,11,0,32,0,7,0,6,39,7,0,6,51,128,5,0,60,11,0,22,0,2,0,6,90,7,0,6,33,0,7,0,60,11,0,6,0,2,0,6,123,7,0,6,160,128,9,0,60,11,0,30,0,6,0,6,27,8,0,6,113,0,16,0,60,11,0,24,0,7,0,6,140,8,0,4,61,2,14,0,60,11,0,58,2,15,1,14,201,10,0,4,19,0,0,0,76,11,0,22,0,0,0,6,220,10,0,4,25,0,0,0,76,11,0,26,0,1,0,6,245,10,0,12,69,0,2,0,76,11,0,26,0,0,5,6,17,0,0,0,45,0,0,128,230,245,66,248,132,179,196,162,160,92,246,6,41,197,223,245,186,38,19,147,208,163,2,145,32,149,1,30,232,66,53,201,135,68,180,36,167,254,158,171,117,156,159,56,229,122,148,194,218,176,194,44,86,255,169,21,28,124,216,99,92,22,107,227,17,214,19,149,52,153,0,219,202,9,200,48,104,90,135,68,241,210,24,42,134,69,233,56,45,75,172,4,155,26,103,129,171,186,118,185,199,229,28,151,240,49,222,168,230,198,237,126,250,233,21,150,151,235,174,251,50,61,140,251,187,157,250,88,253,235,117,18,26,125,172,32,52,82,183,227,123,147,228,226,60,135,224,144,253,43,154,98,74,7,116,249,227,205,72,220,206,64,66,42,67,58,217,69,61,95,124,128,189,67,21,141,120,180,59,55,0,0,0,0,0,0,0,44,88,0,0,33,138,0,0,8,172,0,0,10,238,0,0,48,78,1,0,45,168,1,0,47,222,1,0,6,16,2,0,46,108,2,0,72,46,3,0,15,76,3,0,12,100,3,0,14,140,3,0,13,210,3,0,6,222,3,0,6,4,0,0,11,102,0,0,4,150,0,0,2,150,0,0,7,164,0,0,9,172,0,0,5,190,0,0,8,194,0,0,6,204,0,0,6,204,0,0,17,238,0,0,5,250,0,0,4,8,1,0,5,46,1,0,6,2,2,0,7,28,2,0,3,250,2,0,6,250,2,0,8,10,3,0,11,28,3,0,10,128,3,0,7,164,3,0,19,202,3,0,5,232,3,0,6,244,3,0,5,254,3,0,4,4,4,0,6,14,4,0,3,20,4,0,6,32,4,0,3,38,4,0,6,50,4,0,3,50,4,0,16,82,4,0,11,104,4,0,5,114,4,0,6,126,4,0,5,136,4,0,7,150,4,0,14,178,4,0,6,190,4,0,6,202,4,0,8,218,4,0,9,236,4,0,9,254,4,0,8,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,101,114,114,111,114,84,121,112,101,69,114,114,111,114,69,118,101,110,116,111,83,116,114,105,110,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,53,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,109,117,115,116,32,98,101,32,97,114,114,97,121,72,105,112,112,121,46,101,109,105,116,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,115,115,97,103,101,72,105,112,112,121,46,111,102,102,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,72,105,112,112,121,46,111,110,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,32,97,110,100,32,97,32,102,117,110,99,116,105,111,110,32,97,115,32,108,105,115,116,101,110,101,114,101,103,105,115,116,101,114,95,95,73,83,72,73,80,80,89,95,95,71,76,79,66,65,76,95,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,95,116,111,80,114,105,109,105,116,105,118,101,95,116,111,80,114,111,112,101,114,116,121,75,101,121,102,111,114,69,97,99,104,105,112,112,121,82,101,103,105,115,116,101,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,99,111,108,110,111,98,106,101,99,116,115,121,109,98,111,108,105,110,101,110,111,65,114,114,97,121,74,83,79,78,117,109,98,101,114,117,110,79,98,106,101,99,116,83,101,116,83,121,109,98,111,108,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,97,112,112,82,101,103,105,115,116,101,114,97,112,112,108,121,98,114,105,100,103,101,99,108,101,97,114,99,111,110,115,111,108,101,100,101,102,105,110,101,80,114,111,112,101,114,116,121,100,101,108,101,116,101,100,101,118,105,99,101,102,105,108,101,110,97,109,101,112,114,111,116,111,116,121,112,101,115,116,114,105,110,103,105,102,121,119,114,105,116,97,98,108,101,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,1,0,100,0,1,3,0,42,1,2,0,100,0,1,4,0,42,1,3,0,100,3,1,6,0,100,2,1,7,0,48,0,57,5,0,1,25,0,120,4,59,5,4,1,35,0,57,5,0,1,25,0,3,4,3,6,63,4,6,26,59,5,4,2,36,0,100,4,1,11,0,42,1,4,4,57,8,0,2,45,0,54,7,8,3,55,3,6,121,5,63,6,5,61,115,5,59,0,85,5,7,8,4,5,6,42,1,0,4,57,5,0,4,27,0,3,4,59,5,4,3,57,0,57,5,0,4,27,0,3,4,59,5,4,4,52,0,57,5,0,4,27,0,3,4,100,6,1,5,0,63,4,6,33,59,5,4,5,34,0,57,4,0,4,27,0,59,4,3,6,19,0,57,4,0,4,27,0,59,4,2,7,32,0,57,4,0,4,27,0,100,1,1,8,0,59,4,1,8,28,0,57,1,0,4,27,0,59,1,3,9,49,0,57,1,0,4,27,0,59,1,2,10,38,0,57,1,0,4,27,0,118,0,59,1,0,11,20,0,92,0,41,0,0,46,3,0,2,118,2,108,1,1,115,0,8,0,84,1,3,2,1,0,115,3,16,0,13,2,1,8,0,1,188,7,3,2,128,0,1,92,0,108,0,1,115,4,15,0,13,1,0,190,115,4,1,146,111,0,48,2,57,1,2,1,47,0,54,1,1,2,17,73,5,0,1,118,3,190,33,3,5,115,1,8,0,188,12,1,1,57,1,2,3,43,0,142,8,57,1,2,4,24,0,83,1,1,3,0,92,1,54,3,5,5,18,115,1,8,0,84,1,3,5,0,1,13,3,1,190,36,4,3,57,4,2,6,21,0,54,2,4,7,59,106,3,2,4,115,8,1,0,8,9,3,80,2,4,2,107,2,3,2,95,2,92,1,92,0,108,1,1,108,0,2,39,0,1,0,144,37,0,48,0,57,2,0,1,21,0,54,0,2,2,59,106,1,0,2,115,3,2,0,8,4,1,80,0,2,2,107,0,1,0,95,0,118,0,92,0,48,0,57,0,0,1,36,0,54,2,0,2,50,3,1,108,0,2,63,1,0,44,108,0,1,74,2,0,1,118,0,92,0,108,3,1,108,2,2,13,1,3,115,0,8,0,190,113,1,0,13,1,2,115,0,3,0,190,102,1,0,48,1,57,0,1,1,36,0,54,0,0,2,26,73,0,0,3,57,4,1,3,46,0,39,4,0,4,144,59,4,57,4,1,1,36,0,54,5,4,2,26,57,4,1,3,46,0,54,6,4,4,59,106,6,6,4,8,8,6,80,4,4,1,107,4,6,4,74,5,3,4,57,1,1,1,36,0,54,1,1,2,26,73,0,1,3,54,1,0,5,48,83,1,1,0,2,92,0,48,0,57,2,0,6,21,0,54,0,2,4,59,106,1,0,2,115,7,10,0,8,8,1,80,0,2,2,107,0,1,0,95,0,108,3,1,108,2,2,13,1,3,115,0,8,0,190,66,1,0,48,1,57,0,1,1,36,0,54,0,0,2,26,73,0,0,3,57,1,1,3,46,0,39,1,0,1,144,7,1,119,1,92,1,144,16,2,54,1,0,4,53,81,1,1,0,119,1,92,1,54,1,0,5,56,83,1,1,0,2,92,0,48,0,57,2,0,6,21,0,54,0,2,7,59,106,1,0,2,115,4,9,0,8,5,1,80,0,2,2,107,0,1,0,95,0,108,10,1,50,2,118,1,118,12,118,6,118,8,118,4,118,3,130,11,12,48,0,57,14,0,1,41,0,110,5,1,20,13,11,5,122,7,122,9,146,7,13,29,9,11,5,54,13,14,2,59,106,13,13,14,8,22,13,8,21,9,80,9,14,2,107,9,13,9,8,6,9,42,2,0,9,18,13,5,11,8,9,5,146,25,13,8,15,6,29,14,9,5,129,13,9,12,74,15,14,13,37,9,9,152,238,9,11,13,11,10,115,9,8,0,191,170,1,0,0,11,9,115,9,29,0,15,9,10,9,8,8,9,57,11,0,3,22,0,54,12,11,2,59,106,12,12,11,8,22,12,80,11,11,1,107,4,12,11,147,162,0,0,0,9,8,9,6,73,11,9,7,57,9,0,1,41,0,39,9,11,9,144,35,9,57,13,0,4,21,0,54,9,13,2,59,106,12,9,13,115,21,6,0,8,22,12,80,9,13,2,107,9,12,9,95,9,54,12,11,5,30,110,9,5,191,28,1,0,0,12,9,8,12,4,57,14,0,6,42,0,54,13,14,7,60,110,9,4,73,9,11,9,83,9,13,14,9,59,12,9,1,31,0,57,9,0,8,27,0,54,9,9,9,20,146,46,9,57,16,0,8,27,0,54,15,16,9,20,73,21,11,7,73,20,11,5,110,9,2,73,19,11,9,110,9,3,73,18,11,9,8,17,4,8,22,16,79,9,15,6,57,9,0,10,36,0,54,9,9,11,26,73,9,9,10,8,3,9,144,47,9,8,9,6,73,9,9,7,146,35,9,57,11,0,12,54,0,54,10,11,13,29,8,9,6,73,12,9,7,54,9,12,14,23,81,9,9,12,83,9,10,11,9,92,1,144,23,8,8,10,3,54,9,10,15,37,100,8,2,10,0,83,8,9,10,8,142,80,73,6,6,7,41,8,0,46,10,8,0,73,21,6,7,73,20,6,5,110,5,2,73,19,6,5,110,5,3,73,18,6,5,8,17,4,54,5,10,2,59,106,5,5,10,8,22,5,80,4,10,6,107,4,5,4,42,2,1,4,8,4,3,54,3,4,15,37,100,2,2,9,0,83,2,3,4,2,142,20,93,4,57,3,0,12,54,0,54,2,3,13,29,83,2,2,3,4,92,1,57,3,0,4,21,0,54,1,3,2,59,106,2,1,3,115,21,5,0,8,22,2,80,1,3,2,107,1,2,1,95,1,57,2,0,4,21,0,54,0,2,2,59,106,1,0,2,115,21,7,0,8,22,1,80,0,2,2,107,0,1,0,95,0,41,0,0,46,2,0,1,108,1,1,118,0,83,0,1,0,2,92,0,108,3,1,54,2,3,1,51,41,0,0,46,1,0,0,118,0,84,0,2,3,0,1,92,0,108,2,0,41,0,0,46,3,0,3,46,1,0,4,118,0,84,1,3,0,2,1,108,1,1,59,2,1,1,31,0,108,1,2,59,2,1,2,58,0,108,1,3,59,2,1,3,40,0,108,1,4,59,2,1,4,39,0,108,1,5,59,2,1,5,29,0,92,0,0,0,1,0,0,0,130,1,0,0,231,1,0,0,233,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,75,10,73,87,84,250,104,182,61,71,233,42,138,216,249,55,58,41,226,0 }; // NOLINT + const uint8_t k_DynamicLoad[] = { 198,31,188,3,193,3,25,31,96,0,0,0,191,103,246,55,102,154,234,35,224,138,75,59,243,10,172,130,92,134,225,184,68,2,0,0,0,0,0,0,3,0,0,0,2,0,0,0,5,0,0,0,8,0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,1,0,2,9,128,3,0,20,2,0,2,0,0,0,2,149,1,0,8,41,0,0,0,20,2,0,24,1,1,1,6,190,1,0,8,86,0,0,0,20,2,0,30,0,4,0,6,3,0,0,0,5,0,0,128,204,107,89,252,16,69,221,128,172,182,0,17,66,136,175,172,135,68,180,36,0,0,0,0,0,0,0,16,32,0,0,18,68,0,0,11,82,0,0,20,120,0,0,4,128,0,0,15,158,0,0,6,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,94,40,46,43,58,92,47,92,47,41,124,94,40,92,47,92,47,41,100,121,110,97,109,105,99,76,111,97,100,85,110,116,114,117,115,116,101,100,67,111,110,116,101,110,116,101,115,116,95,95,72,73,80,80,89,67,85,82,68,73,82,95,95,103,108,111,98,97,108,0,0,0,0,0,0,0,61,0,0,0,2,0,1,0,0,6,15,43,0,0,0,6,6,1,19,0,0,28,0,0,0,0,1,0,0,0,255,255,255,255,1,30,0,0,0,5,10,3,58,47,47,20,0,0,16,54,0,0,0,1,19,1,0,7,47,7,47,20,1,0,0,0,0,0,50,0,100,0,0,1,0,92,0,50,1,108,3,3,118,0,115,2,1,0,83,2,3,0,2,42,1,0,2,48,2,57,2,2,1,7,0,100,1,1,2,0,59,2,1,1,3,0,92,0,108,1,1,8,4,1,144,7,4,115,4,0,0,132,2,2,0,0,0,0,0,0,0,0,0,0,0,54,0,2,1,5,83,0,0,2,1,144,20,0,48,0,57,0,0,2,7,0,54,0,0,3,6,22,4,0,1,41,0,0,46,3,0,0,54,2,3,4,4,108,1,2,108,0,3,85,0,2,3,4,1,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,6,221,42,149,84,50,228,223,84,100,42,33,87,244,240,89,226,21,135,0 }; // NOLINT + const uint8_t k_Platform[] = { 198,31,188,3,193,3,25,31,96,0,0,0,141,245,239,204,131,16,47,34,180,61,155,134,86,191,170,54,134,146,43,64,144,3,0,0,0,0,0,0,2,0,0,0,2,0,0,0,14,0,0,0,18,0,0,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,1,0,2,9,128,0,0,96,3,0,2,0,0,0,2,197,1,0,8,154,1,0,0,96,3,0,10,0,11,7,6,4,0,0,0,14,0,0,128,30,82,43,96,206,64,66,42,200,29,99,21,114,209,161,177,117,156,159,56,202,93,183,58,229,232,246,4,116,127,176,2,215,68,112,101,229,42,156,128,89,16,127,229,106,208,129,187,56,71,164,11,170,248,246,235,0,0,0,0,0,0,0,6,26,0,0,3,32,0,0,9,10,0,0,8,48,0,0,6,60,0,0,8,76,0,0,6,88,0,0,5,98,0,0,12,122,0,0,2,122,0,0,9,140,0,0,8,156,0,0,10,176,0,0,21,218,0,0,7,232,0,0,9,250,0,0,8,103,108,111,98,97,108,97,110,103,117,97,103,101,105,111,115,117,110,100,101,102,105,110,101,100,101,118,105,99,101,65,80,73,76,101,118,101,108,68,101,118,105,99,101,72,105,112,112,121,76,111,99,97,108,105,122,97,116,105,111,110,79,83,86,101,114,115,105,111,110,80,108,97,116,102,111,114,109,83,68,75,86,101,114,115,105,111,110,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,99,111,117,110,116,114,121,100,105,114,101,99,116,105,111,110,112,108,97,116,102,111,114,109,0,0,0,99,15,4,16,98,0,0,113,0,0,0,0,50,0,100,0,0,1,0,92,0,48,0,57,1,0,1,8,0,54,2,1,2,5,3,1,59,2,1,1,17,0,54,1,0,3,14,13,2,1,115,1,3,0,189,117,1,0,0,2,1,1,2,3,0,3,0,0,0,0,0,57,1,0,3,14,0,54,3,1,4,10,115,1,2,0,189,170,0,0,0,3,1,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,4,10,59,3,1,2,10,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,7,6,59,3,1,3,6,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,8,13,59,3,1,4,13,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,9,9,144,6,1,8,1,2,59,3,1,5,9,0,143,176,0,0,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,4,10,59,3,1,2,10,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,10,7,59,3,1,6,7,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,11,11,59,3,1,7,11,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,8,13,59,3,1,4,13,0,57,1,0,1,8,0,54,1,1,2,5,54,1,1,5,17,57,0,0,3,14,0,54,0,0,9,9,144,6,0,8,0,2,59,1,0,5,9,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,26,226,85,121,151,92,102,77,139,164,1,38,67,46,237,176,99,97,252,0 }; // NOLINT + const uint8_t k_UIManagerModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,91,118,229,148,131,162,124,21,112,108,2,216,152,172,103,24,243,59,129,40,36,3,0,0,0,0,0,0,10,0,0,0,2,0,0,0,11,0,0,0,15,0,0,0,0,0,0,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,2,0,2,9,128,1,0,244,2,0,2,0,0,0,2,49,2,0,8,123,0,0,0,244,2,0,26,2,1,1,6,172,2,0,2,4,128,4,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,7,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,5,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,6,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,2,0,244,2,0,2,0,0,0,6,176,2,0,10,35,0,4,0,244,2,0,34,0,1,0,6,211,2,0,2,20,128,3,0,244,2,0,18,0,1,0,6,231,2,0,4,12,128,6,0,244,2,0,4,0,0,0,6,4,0,0,0,11,0,0,128,131,196,115,11,23,36,244,238,117,156,159,56,243,225,151,216,183,148,255,237,18,236,232,22,44,178,62,176,23,209,169,253,221,230,234,44,18,202,201,225,169,59,249,95,0,0,0,0,0,0,0,12,38,0,0,15,68,0,0,6,22,0,0,8,80,0,0,14,108,0,0,5,118,0,0,16,150,0,0,14,178,0,0,10,194,0,0,10,214,0,0,8,230,0,0,10,250,0,0,15,24,1,0,10,76,97,121,111,117,116,77,111,100,117,108,101,110,100,66,97,116,99,104,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,103,108,111,98,97,108,67,97,108,108,85,73,70,117,110,99,116,105,111,110,72,105,112,112,121,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,99,97,108,108,85,73,70,117,110,99,116,105,111,110,99,114,101,97,116,101,78,111,100,101,108,101,116,101,78,111,100,101,100,111,99,117,109,101,110,116,102,108,117,115,104,66,97,116,99,104,115,101,110,100,82,101,110,100,101,114,69,114,114,111,114,117,112,100,97,116,101,78,111,100,101,0,0,50,0,100,0,0,1,0,92,0,50,3,108,2,3,118,0,115,1,2,0,83,1,2,0,1,42,3,0,1,115,1,1,0,83,1,2,0,1,42,3,1,1,48,1,57,2,1,1,6,0,3,1,100,4,3,2,0,63,1,4,9,100,4,3,3,0,63,1,4,14,100,4,3,4,0,63,1,4,10,100,4,3,5,0,63,1,4,12,100,4,3,6,0,63,1,4,4,100,4,3,7,0,63,1,4,8,100,4,3,8,0,63,1,4,7,100,3,3,9,0,63,1,3,13,59,2,1,1,11,0,92,0,118,0,92,0,41,0,0,46,5,0,0,54,4,5,1,5,108,9,1,108,8,2,108,7,3,108,6,4,8,10,5,79,0,4,5,118,0,92,0,41,0,0,46,1,0,1,54,0,1,1,7,81,0,0,1,118,0,92,0,108,0,1,144,7,0,118,1,92,1,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,61,188,49,15,163,238,169,33,236,255,37,248,152,195,126,87,230,43,130,0 }; // NOLINT + const uint8_t k_js2native[] = { 198,31,188,3,193,3,25,31,96,0,0,0,239,28,216,83,98,60,129,15,200,192,163,193,63,174,161,86,227,46,39,180,200,10,0,0,0,0,0,0,7,0,0,0,2,0,0,0,24,0,0,0,42,0,0,0,0,0,0,0,13,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,4,0,2,9,128,11,0,152,10,0,2,0,0,0,2,29,4,0,8,96,0,0,0,152,10,0,8,0,2,4,6,125,4,0,2,202,1,0,0,152,10,0,64,0,15,1,6,71,6,0,2,229,0,0,0,152,10,0,30,1,9,0,6,44,7,0,6,252,0,0,0,152,10,0,62,0,8,1,6,40,8,0,2,177,1,0,0,152,10,0,62,0,12,1,6,217,9,0,4,189,0,0,0,152,10,0,26,0,6,0,6,18,0,0,0,24,0,0,128,222,235,52,6,106,246,111,114,249,107,235,204,86,255,169,21,202,217,230,186,135,68,180,36,98,143,185,172,134,113,0,157,134,184,33,63,176,199,134,132,23,209,169,253,32,149,1,30,191,23,101,91,175,90,44,68,171,186,118,185,117,156,159,56,186,38,19,147,32,55,49,47,104,90,135,68,123,147,228,226,183,148,255,237,57,223,109,254,61,95,124,128,167,87,89,102,0,0,0,0,0,0,0,15,32,0,0,7,44,0,0,6,54,0,0,38,130,0,0,49,228,0,0,63,98,1,0,42,180,1,0,6,202,1,0,60,66,2,0,8,88,2,0,28,158,2,0,7,158,2,0,18,194,2,0,15,224,2,0,6,20,3,0,47,114,3,0,9,30,0,0,2,54,0,0,20,130,0,0,10,172,0,0,6,228,0,0,24,190,1,0,6,202,1,0,21,230,1,0,7,82,2,0,4,88,2,0,16,142,2,0,8,234,2,0,8,250,2,0,14,62,3,0,14,132,3,0,5,142,3,0,5,152,3,0,9,168,3,0,6,180,3,0,10,200,3,0,6,212,3,0,14,240,3,0,12,8,4,0,9,18,4,0,4,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,99,98,111,111,108,101,97,110,117,109,98,101,114,101,109,111,118,101,78,97,116,105,118,101,67,97,108,108,98,97,99,107,32,105,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,115,99,97,108,108,78,97,116,105,118,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,51,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,105,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,115,116,114,105,110,103,108,111,98,97,108,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,102,117,110,99,116,105,111,110,112,117,115,104,105,112,112,121,67,97,108,108,78,97,116,105,118,101,115,32,110,111,116,32,100,101,102,105,110,101,100,111,99,117,109,101,110,116,109,101,97,115,117,114,101,73,110,65,112,112,87,105,110,100,111,119,109,101,97,115,117,114,101,73,110,87,105,110,100,111,119,111,98,106,101,99,116,111,83,116,114,105,110,103,82,101,102,101,114,101,110,99,101,69,114,114,111,114,101,109,111,118,101,78,97,116,105,118,101,67,97,108,108,98,97,99,107,32,109,111,100,117,108,101,67,97,108,108,76,105,115,116,32,110,111,116,32,100,101,102,105,110,101,100,117,110,100,101,102,105,110,101,100,65,114,114,97,121,72,105,112,112,121,84,121,112,101,69,114,114,111,114,101,106,101,99,116,95,95,71,76,79,66,65,76,95,95,98,114,105,100,103,101,99,97,108,108,85,73,70,117,110,99,116,105,111,110,109,111,100,117,108,101,67,97,108,108,73,100,112,114,111,116,111,116,121,112,101,0,0,0,48,0,0,0,50,0,100,0,0,1,0,92,0,50,0,48,1,57,2,1,1,33,0,54,3,2,2,37,100,2,0,2,0,59,3,2,1,20,0,57,2,1,1,33,0,54,3,2,2,37,100,2,0,3,0,59,3,2,2,24,0,57,2,1,1,33,0,54,3,2,2,37,100,2,0,5,0,59,3,2,3,22,0,57,1,1,1,33,0,54,1,1,2,37,100,0,0,6,0,59,1,0,4,19,0,118,0,92,0,118,3,118,5,48,0,57,1,0,1,23,0,54,1,1,2,27,13,2,1,115,1,17,0,189,146,1,0,0,2,1,130,4,5,57,1,0,3,32,0,54,2,1,4,40,106,2,2,1,8,25,2,8,24,4,80,1,1,2,107,2,2,1,122,15,18,6,15,4,122,1,146,18,6,129,6,1,5,74,2,1,6,37,1,1,152,245,1,4,54,4,2,5,21,110,1,2,153,41,1,0,0,4,1,73,9,2,15,110,14,1,73,6,2,14,115,4,1,0,190,37,9,4,115,4,12,0,189,219,0,0,0,6,4,115,4,14,0,189,208,0,0,0,6,4,115,4,13,0,189,197,0,0,0,6,4,57,4,0,6,36,0,54,4,4,7,39,57,7,0,6,36,0,54,5,7,7,39,22,5,5,14,59,7,5,1,39,0,7,8,0,0,54,5,2,5,21,18,7,1,5,121,11,115,12,10,0,8,10,1,121,5,146,84,7,73,19,2,10,13,17,19,8,16,11,8,7,10,190,36,17,12,144,32,16,57,17,0,6,36,0,54,18,17,8,31,3,17,63,17,19,18,63,17,15,41,74,18,4,17,120,17,142,15,54,18,8,9,26,83,18,18,8,19,8,17,16,22,10,7,14,54,7,2,5,21,8,11,17,8,5,11,152,179,10,7,111,10,255,255,255,255,146,6,5,8,10,4,57,7,0,1,23,0,54,5,7,2,27,54,4,10,10,29,81,22,4,10,8,25,7,8,24,9,8,23,6,8,21,8,79,4,5,5,92,3,73,24,2,1,110,1,3,73,21,2,1,57,1,0,1,23,0,54,1,1,11,33,54,3,1,12,28,54,2,3,13,38,7,22,0,0,8,25,3,8,23,6,79,1,2,5,92,1,57,3,0,14,34,0,54,1,3,4,40,106,2,1,3,115,24,5,0,8,25,2,80,1,3,2,107,1,2,1,95,1,57,2,0,15,30,0,54,0,2,4,40,106,1,0,2,115,24,11,0,8,25,1,80,0,2,2,107,0,1,0,95,0,50,1,118,5,130,4,5,48,0,57,2,0,1,32,0,54,3,2,2,40,106,3,3,2,8,8,3,8,7,4,80,2,2,2,107,2,3,2,42,1,0,2,122,3,18,6,3,4,146,18,6,129,6,3,5,74,2,3,6,37,3,3,152,245,3,4,57,3,0,3,23,0,54,3,3,4,27,13,4,3,115,3,17,0,188,97,4,3,54,3,2,5,21,110,2,2,152,37,3,2,57,3,0,6,25,0,54,2,3,2,40,106,2,2,3,100,7,1,4,0,8,8,2,80,1,3,2,107,1,2,1,92,1,57,3,0,6,25,0,54,2,3,7,35,57,5,0,8,34,0,54,1,5,2,40,106,4,1,5,115,7,9,0,8,8,4,80,1,5,2,107,1,4,1,83,1,2,3,1,92,1,57,2,0,6,25,0,54,1,2,7,35,57,4,0,9,30,0,54,0,4,2,40,106,3,0,4,115,7,11,0,8,8,3,80,0,4,2,107,0,3,0,83,0,1,2,0,92,0,108,8,2,41,14,0,46,1,14,0,122,7,73,5,1,7,110,13,1,73,4,1,13,48,0,57,2,0,1,36,0,54,6,2,2,39,57,3,0,1,36,0,54,2,3,2,39,22,2,2,13,59,3,2,1,39,0,7,3,0,0,54,1,1,3,21,110,12,2,18,2,12,1,121,9,115,10,10,0,121,1,146,96,2,46,2,14,0,73,18,2,12,13,16,18,8,15,9,8,2,12,190,40,16,10,144,36,15,57,16,0,1,36,0,54,17,16,4,31,3,16,63,16,8,35,63,16,18,18,63,16,7,41,74,17,6,16,120,16,142,15,54,17,3,5,26,83,17,17,3,18,8,16,15,22,12,2,13,46,2,14,0,54,2,2,3,21,8,9,16,8,1,9,152,167,12,2,144,35,1,57,1,0,1,36,0,54,2,1,4,31,3,1,63,1,8,35,108,8,1,63,1,8,18,63,1,7,41,74,2,6,1,57,2,0,6,23,0,54,1,2,7,27,54,0,6,8,29,81,21,0,6,8,24,2,8,23,5,8,22,4,8,20,3,79,0,1,5,118,0,92,0,118,4,48,0,57,1,0,1,23,0,54,1,1,2,27,13,2,1,115,1,17,0,189,123,1,0,0,2,1,130,3,4,57,1,0,3,32,0,54,2,1,4,40,106,2,2,1,8,24,2,8,23,3,80,1,1,2,107,13,2,1,122,1,18,5,1,3,122,2,146,18,5,129,5,2,4,74,13,2,5,37,2,2,152,245,2,3,54,2,13,5,21,110,12,3,153,18,1,0,0,2,12,73,7,13,1,110,11,1,73,6,13,11,110,10,2,73,9,13,10,13,1,7,115,2,8,0,191,210,0,0,0,1,2,13,1,6,191,200,0,0,0,1,2,13,2,9,115,1,2,0,191,186,0,0,0,2,1,57,1,0,6,36,0,54,1,1,7,39,57,3,0,6,36,0,54,2,3,7,39,22,2,2,11,59,3,2,1,39,0,7,5,0,0,54,2,13,5,21,18,2,12,2,115,3,10,0,121,8,146,90,2,73,17,13,12,13,15,17,8,14,8,8,2,12,190,45,15,3,144,41,14,57,15,0,6,36,0,54,16,15,8,31,3,15,63,15,17,18,8,18,10,146,6,9,8,18,11,63,15,18,41,74,16,1,15,120,15,142,15,54,16,5,9,26,83,16,16,5,17,8,15,14,22,12,2,11,54,2,13,5,21,8,8,15,152,173,12,2,57,4,0,1,23,0,54,3,4,2,27,54,2,1,10,29,81,21,2,1,8,24,4,8,23,7,8,22,6,8,20,5,79,2,3,5,92,1,57,3,0,11,34,0,54,1,3,4,40,106,2,1,3,115,23,7,0,8,24,2,80,1,3,2,107,1,2,1,95,1,57,3,0,11,34,0,54,1,3,4,40,106,2,1,3,115,23,6,0,8,24,2,80,1,3,2,107,1,2,1,95,1,57,2,0,12,30,0,54,0,2,4,40,106,1,0,2,115,23,11,0,8,24,1,80,0,2,2,107,0,1,0,95,0,108,2,1,13,1,2,115,0,3,0,191,145,0,0,0,1,0,122,0,153,136,0,0,0,2,0,48,0,54,1,0,1,36,13,1,1,115,3,15,0,190,83,1,3,57,1,0,1,36,0,54,1,1,2,31,13,1,1,190,65,1,3,57,1,0,1,36,0,54,1,1,2,31,73,1,1,2,146,42,1,54,4,1,3,41,110,3,1,188,16,4,3,54,3,1,3,41,110,1,2,190,19,3,1,57,1,0,1,36,0,54,1,1,2,31,75,1,1,2,118,1,92,1,57,2,0,4,30,0,54,0,2,5,40,106,1,0,2,115,5,16,0,8,6,1,80,0,2,2,107,0,1,0,95,0,48,0,57,2,0,6,34,0,54,0,2,5,40,106,1,0,2,115,5,4,0,8,6,1,80,0,2,2,107,0,1,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,133,147,73,239,60,33,206,174,165,51,120,224,72,234,33,237,112,91,58,0 }; // NOLINT + const uint8_t k_TimerModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,66,50,225,120,190,183,211,88,157,63,204,53,11,89,181,106,161,32,51,251,184,5,0,0,0,0,0,0,12,0,0,0,2,0,0,0,24,0,0,0,26,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,3,0,2,9,128,3,0,136,5,0,2,0,0,0,2,25,3,0,8,126,0,0,0,136,5,0,26,1,1,6,6,151,3,0,6,80,0,0,0,136,5,0,28,2,5,0,6,231,3,0,2,26,0,0,0,136,5,0,26,0,1,0,6,1,4,0,4,51,0,0,0,136,5,0,22,0,3,0,6,52,4,0,6,80,0,0,0,136,5,0,28,2,5,0,6,231,3,0,2,26,0,0,0,136,5,0,26,0,1,0,6,132,4,0,4,51,0,0,0,136,5,0,22,0,3,0,6,183,4,0,6,37,0,0,0,136,5,0,26,1,1,0,6,220,4,0,4,71,0,0,0,136,5,0,24,2,4,0,6,35,5,0,2,47,0,3,0,136,5,0,22,0,2,0,6,82,5,0,4,51,0,0,0,136,5,0,22,0,3,0,6,2,0,0,0,24,0,0,128,171,186,118,185,54,214,238,134,126,117,229,60,23,191,121,130,228,219,24,40,135,68,180,36,102,114,52,205,240,49,222,168,206,119,223,217,228,154,17,179,208,84,119,196,230,147,217,236,52,82,183,227,132,179,196,162,180,218,129,50,103,30,150,231,98,242,76,209,178,163,245,173,253,16,11,73,94,18,151,157,61,95,124,128,246,86,103,237,247,80,11,80,9,248,128,22,0,0,0,0,0,0,0,11,22,0,0,5,32,0,0,18,68,0,0,13,94,0,0,12,116,0,0,13,140,0,0,6,152,0,0,4,160,0,0,6,170,0,0,19,208,0,0,19,246,0,0,11,12,1,0,10,32,1,0,5,42,1,0,4,50,1,0,18,86,1,0,13,112,1,0,12,136,1,0,10,156,1,0,9,174,1,0,3,180,1,0,9,198,1,0,11,220,1,0,10,240,1,0,5,84,105,109,101,114,77,111,100,117,108,101,65,114,114,97,121,67,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,67,108,101,97,114,73,110,116,101,114,118,97,108,67,108,101,97,114,84,105,109,101,111,117,116,105,109,101,82,101,109,97,105,110,105,110,103,108,111,98,97,108,68,97,116,101,78,117,109,98,101,114,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,82,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,83,101,116,73,110,116,101,114,118,97,108,83,101,116,84,105,109,101,111,117,116,97,112,112,108,121,99,97,108,108,99,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,99,108,101,97,114,73,110,116,101,114,118,97,108,99,108,101,97,114,84,105,109,101,111,117,116,100,105,100,84,105,109,101,111,117,116,105,115,73,110,116,101,103,101,114,110,111,119,112,114,111,116,111,116,121,112,101,115,101,116,73,110,116,101,114,118,97,108,115,101,116,84,105,109,101,111,117,116,115,108,105,99,101,0,0,0,50,0,100,0,0,1,0,92,0,50,1,108,3,3,118,0,115,2,1,0,83,2,3,0,2,42,1,0,2,48,2,57,4,2,1,7,0,100,3,1,2,0,59,4,3,1,24,0,57,4,2,1,7,0,100,3,1,4,0,59,4,3,2,18,0,57,4,2,1,7,0,100,3,1,5,0,59,4,3,3,23,0,57,4,2,1,7,0,100,3,1,7,0,59,4,3,4,17,0,57,4,2,1,7,0,100,3,1,8,0,59,4,3,5,10,0,57,2,2,1,7,0,100,1,1,11,0,59,2,1,6,16,0,92,0,50,0,118,1,108,2,1,42,0,0,2,48,2,57,2,2,1,2,0,54,2,2,2,22,54,4,2,3,25,54,3,4,4,15,131,1,8,2,1,110,1,2,84,1,3,4,2,1,42,0,1,1,41,1,0,46,3,1,0,54,2,3,5,13,100,1,0,3,0,108,0,2,84,0,2,3,1,0,92,0,41,0,0,46,3,0,0,54,2,3,1,14,46,1,0,1,119,0,84,0,2,3,0,1,92,0,108,2,1,48,0,57,1,0,1,9,0,54,0,1,2,20,83,0,0,1,2,146,26,0,122,0,170,21,2,0,41,0,0,46,1,0,0,54,0,1,3,5,83,0,0,1,2,118,0,92,0,50,0,118,1,108,2,1,42,0,0,2,48,2,57,2,2,1,2,0,54,2,2,2,22,54,4,2,3,25,54,3,4,4,15,131,1,8,2,1,110,1,2,84,1,3,4,2,1,42,0,1,1,41,1,0,46,3,1,0,54,2,3,5,12,100,1,0,6,0,108,0,2,84,0,2,3,1,0,92,0,108,2,1,48,0,57,1,0,1,9,0,54,0,1,2,20,83,0,0,1,2,146,26,0,122,0,170,21,2,0,41,0,0,46,1,0,0,54,0,1,3,4,83,0,0,1,2,118,0,92,0,50,0,108,1,1,42,0,0,1,41,1,0,46,3,1,0,54,2,3,1,11,100,1,0,9,0,108,0,2,84,0,2,3,1,0,92,0,50,0,108,3,1,48,1,57,2,1,1,8,0,54,1,2,2,21,81,1,1,2,42,0,0,1,54,1,3,3,6,42,0,1,1,41,1,0,46,2,1,0,3,1,54,3,3,4,19,63,1,3,19,100,0,0,10,0,63,1,0,6,118,0,83,1,2,0,1,92,0,41,0,0,46,1,0,1,48,2,57,3,2,1,8,0,54,2,3,2,21,81,2,2,3,46,0,0,0,29,0,2,0,29,1,1,0,122,0,152,7,1,0,8,0,1,92,0,108,2,1,48,0,57,1,0,1,9,0,54,0,1,2,20,83,0,0,1,2,146,26,0,122,0,170,21,2,0,41,0,0,46,1,0,0,54,0,1,3,3,83,0,0,1,2,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,193,244,215,156,146,236,124,186,22,61,238,51,177,92,118,241,20,220,219,0 }; // NOLINT + const uint8_t k_promise[] = { 198,31,188,3,193,3,25,31,96,0,0,0,150,232,96,222,75,189,62,200,228,9,155,212,42,131,168,27,43,131,138,224,32,20,0,0,0,0,0,0,44,0,0,0,2,0,0,0,33,0,0,0,52,0,0,0,0,0,0,0,114,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,6,0,2,9,0,24,0,164,19,0,2,0,0,0,2,29,6,0,8,101,1,0,0,164,19,0,28,23,2,12,6,130,7,0,2,4,0,7,0,164,19,0,2,0,0,0,6,134,7,0,4,25,0,6,0,164,19,0,4,0,1,0,14,159,7,0,6,36,128,8,0,180,19,0,22,0,0,0,14,195,7,0,8,43,128,7,0,196,19,0,26,0,0,0,14,238,7,0,4,153,0,12,0,212,19,0,26,0,2,4,6,135,8,0,8,55,0,9,0,212,19,0,22,3,2,0,6,190,8,0,6,104,0,0,0,212,19,0,34,0,2,0,6,38,9,0,6,193,0,4,0,212,19,0,30,0,6,2,6,231,9,0,6,41,128,4,0,212,19,0,26,2,1,0,6,16,10,0,2,208,0,0,0,212,19,0,32,0,5,0,6,224,10,0,6,232,0,10,0,212,19,0,32,0,4,2,6,200,11,0,6,64,0,17,0,212,19,0,28,0,1,2,6,8,12,0,4,127,128,5,0,212,19,0,30,0,3,1,6,135,12,0,8,62,128,1,0,212,19,0,14,0,0,3,6,197,12,0,6,81,0,5,0,212,19,0,36,2,0,0,6,22,13,0,4,44,0,0,0,212,19,0,26,0,0,0,6,66,13,0,4,44,0,0,0,212,19,0,26,0,0,0,6,110,13,0,4,52,0,2,0,212,19,0,22,0,2,2,6,162,13,0,6,115,0,0,0,212,19,0,36,0,2,0,6,21,14,0,6,56,0,0,0,212,19,0,32,0,2,0,6,77,14,0,4,34,0,0,0,212,19,0,26,1,1,0,6,111,14,0,2,9,0,0,0,212,19,0,2,0,0,0,6,120,14,0,4,35,0,0,0,212,19,0,26,1,1,0,6,155,14,0,4,56,0,0,0,212,19,0,26,1,2,0,6,211,14,0,2,9,0,0,0,212,19,0,2,0,0,0,6,220,14,0,4,56,0,0,0,212,19,0,26,1,2,0,6,111,14,0,2,9,0,0,0,212,19,0,2,0,0,0,6,20,15,0,4,23,1,0,0,212,19,0,32,1,3,0,14,43,16,0,6,19,0,0,0,240,19,0,22,0,0,0,6,62,16,0,4,105,128,6,0,240,19,0,24,0,5,0,6,167,16,0,4,33,128,6,0,240,19,0,22,0,4,0,6,200,16,0,4,54,0,0,0,240,19,0,26,1,1,0,6,254,16,0,6,113,0,0,0,240,19,0,32,4,1,0,6,111,17,0,6,75,1,1,0,240,19,0,36,1,5,0,6,186,18,0,4,27,0,0,0,240,19,0,26,0,0,0,6,186,18,0,4,27,0,0,0,240,19,0,26,0,0,0,6,213,18,0,4,43,0,0,0,240,19,0,22,1,1,0,6,43,16,0,6,19,0,0,0,240,19,0,22,0,0,0,6,0,19,0,4,43,0,0,0,240,19,0,22,1,1,0,6,43,19,0,6,54,0,0,0,240,19,0,24,2,1,0,6,97,19,0,4,46,0,0,0,240,19,0,26,0,2,0,6,143,19,0,4,21,0,0,0,240,19,0,26,0,1,0,6,19,0,0,0,33,0,0,128,58,189,42,136,1,68,164,178,235,242,154,240,5,115,81,0,126,251,17,101,134,113,0,157,127,147,209,126,110,212,109,117,114,224,8,140,86,255,169,21,18,136,156,63,171,186,118,185,230,109,38,50,61,95,124,128,186,38,19,147,32,55,49,47,181,166,126,88,150,170,96,249,212,253,129,106,255,26,4,193,74,234,31,170,122,152,39,42,52,82,183,227,155,34,212,135,189,231,83,181,132,179,196,162,227,201,203,133,241,210,24,42,102,54,240,234,135,68,180,36,134,184,33,63,247,80,11,80,9,248,128,22,0,0,0,0,0,0,0,41,40,0,0,3,88,0,0,7,110,0,0,12,120,0,0,48,200,0,0,8,234,0,0,36,58,1,0,6,58,1,0,14,84,1,0,9,102,1,0,6,126,1,0,7,140,1,0,15,172,1,0,4,222,1,0,10,240,1,0,6,250,1,0,10,32,2,0,8,4,0,0,7,40,0,0,7,82,0,0,9,100,0,0,4,108,0,0,6,120,0,0,7,136,0,0,11,212,0,0,11,50,1,0,5,110,1,0,6,118,1,0,4,160,1,0,5,170,1,0,5,178,1,0,9,196,1,0,9,212,1,0,6,2,2,0,3,14,2,0,10,48,2,0,14,76,2,0,9,78,2,0,10,98,2,0,6,110,2,0,5,120,2,0,4,126,2,0,4,134,2,0,4,142,2,0,7,156,2,0,7,170,2,0,4,178,2,0,6,190,2,0,4,198,2,0,10,218,2,0,5,65,32,112,114,111,109,105,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,115,111,108,118,101,100,32,119,105,116,104,32,105,116,115,101,108,102,46,95,111,110,72,97,110,100,108,101,114,97,99,101,95,118,97,108,117,101,80,114,111,109,105,115,101,32,99,111,110,115,116,114,117,99,116,111,114,39,115,32,97,114,103,117,109,101,110,116,32,105,115,32,110,111,116,32,97,32,102,117,110,99,116,105,111,110,70,117,108,102,105,108,108,101,100,80,114,111,109,105,115,101,115,32,109,117,115,116,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,118,105,97,32,110,101,119,99,97,116,99,104,97,110,100,108,101,82,101,115,111,108,118,101,100,111,82,101,115,111,108,118,101,102,105,110,97,108,101,110,103,116,104,101,110,103,101,116,84,104,101,110,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,95,110,111,111,112,114,111,116,111,116,121,112,101,84,121,112,101,69,114,114,111,114,101,106,101,99,116,114,121,67,97,108,108,84,119,111,98,106,101,99,116,114,121,67,97,108,108,79,110,101,95,100,101,102,101,114,114,101,100,115,97,102,101,84,104,101,110,95,100,101,102,101,114,114,101,100,83,116,97,116,101,95,111,110,82,101,106,101,99,116,101,100,95,115,116,97,116,101,97,112,112,108,121,98,105,110,100,111,110,101,99,97,108,108,102,105,110,97,108,108,121,102,111,114,69,97,99,104,102,114,111,109,103,108,111,98,97,108,112,117,115,104,115,101,116,84,105,109,101,111,117,116,115,108,105,99,101,0,0,48,0,0,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,9,0,100,2,1,3,0,42,1,10,2,100,2,1,4,0,42,1,11,2,100,2,1,5,0,42,1,12,2,100,2,1,6,0,42,1,13,2,100,3,1,7,0,42,1,14,3,100,3,1,9,0,42,1,15,3,100,3,1,10,0,42,1,16,3,100,3,1,12,0,42,1,17,3,100,3,1,13,0,42,1,18,3,100,3,1,14,0,42,1,19,3,100,3,1,15,0,42,1,20,3,100,3,1,16,0,42,1,21,3,100,4,1,19,0,42,1,22,4,119,3,44,1,0,3,3,5,42,1,1,5,59,2,3,1,21,0,59,2,3,2,38,0,59,2,0,3,31,0,54,5,2,1,32,100,0,1,20,0,59,5,0,4,29,0,54,5,2,1,32,100,0,1,21,0,59,5,0,5,43,0,54,5,2,1,32,100,0,1,24,0,59,5,0,6,45,0,118,0,120,5,83,5,4,0,5,42,1,2,5,121,5,83,5,4,0,5,42,1,3,5,83,3,4,0,3,42,1,4,3,83,3,4,0,0,42,1,5,3,122,3,83,3,4,0,3,42,1,6,3,115,3,0,0,83,3,4,0,3,42,1,7,3,100,3,1,29,0,59,2,3,7,20,0,100,3,1,31,0,42,1,8,3,100,3,1,33,0,59,2,3,8,35,0,100,3,1,38,0,59,2,3,9,34,0,100,3,1,40,0,59,2,3,10,22,0,54,3,2,1,32,100,1,1,43,0,59,3,1,11,27,0,48,1,57,1,1,2,48,0,59,1,2,12,24,0,92,0,118,0,92,0,108,0,1,54,0,0,1,29,92,0,93,1,41,0,0,42,0,0,1,46,0,0,1,92,0,108,1,1,108,0,2,8,2,1,8,1,0,118,0,83,0,2,0,1,92,0,93,1,41,0,0,42,0,0,1,46,0,0,1,92,0,108,2,1,108,1,2,108,0,3,8,3,2,8,2,1,8,1,0,118,0,84,1,3,0,2,1,92,0,93,1,41,0,0,42,0,0,1,46,0,0,1,92,0,108,3,1,108,2,0,13,1,2,115,0,16,0,190,106,1,0,13,1,3,115,0,6,0,190,61,1,0,122,0,59,2,0,1,37,0,59,2,0,2,40,0,119,0,59,2,0,3,23,0,59,2,0,4,36,0,41,0,0,46,1,0,9,188,18,3,1,46,1,0,21,118,0,84,1,1,0,3,2,92,0,118,0,92,0,48,0,57,2,0,1,33,0,54,0,2,2,32,106,1,0,2,115,5,5,0,8,6,1,80,0,2,2,107,0,1,0,95,0,48,0,57,2,0,1,33,0,54,0,2,2,32,106,1,0,2,115,5,7,0,8,6,1,80,0,2,2,107,0,1,0,95,0,50,0,108,1,1,42,0,0,1,108,2,2,42,0,1,2,108,2,3,42,0,2,2,54,2,1,1,25,54,1,2,2,32,106,1,1,2,100,3,0,8,0,8,4,1,80,0,2,2,107,0,1,0,92,0,41,1,1,46,3,1,13,46,9,1,9,54,2,3,1,32,106,2,2,3,8,10,2,80,0,3,2,107,6,2,0,54,3,6,2,29,108,2,1,108,0,2,84,0,3,6,2,0,46,3,1,15,41,0,0,46,2,0,0,46,5,1,20,46,9,0,1,46,8,0,2,54,1,5,1,32,106,1,1,5,8,10,1,8,7,6,80,0,5,4,107,1,1,0,118,0,84,1,3,0,2,1,92,0,108,0,1,108,1,2,54,2,0,1,40,110,4,3,8,3,0,8,0,3,190,24,2,4,54,5,3,2,23,54,2,5,1,40,8,3,5,8,0,3,188,240,2,4,41,2,0,46,3,2,13,54,3,3,3,21,146,17,3,46,4,2,13,54,3,4,3,21,83,3,3,4,0,54,4,0,1,40,122,3,188,18,4,3,46,4,2,16,118,2,84,4,4,2,0,1,92,2,54,2,0,4,37,188,71,2,3,54,3,0,4,37,110,2,1,188,23,3,2,54,3,0,5,36,54,2,3,6,49,83,2,2,3,1,118,2,92,2,110,2,2,59,0,2,1,37,0,54,3,0,5,36,7,2,2,0,68,2,3,0,68,2,1,1,59,0,2,2,36,0,118,2,92,2,110,2,1,59,0,2,1,37,0,59,0,1,2,36,0,118,0,92,0,50,1,108,0,1,42,1,0,0,108,0,2,42,1,1,0,48,0,57,3,0,1,50,0,118,0,100,2,1,11,0,122,1,84,1,3,0,2,1,92,0,41,0,0,46,1,0,0,54,1,1,1,40,110,2,1,188,15,1,2,46,1,0,1,54,6,1,2,39,142,11,46,1,0,1,54,6,1,3,26,119,1,188,82,6,1,41,3,1,46,5,3,11,46,1,0,0,54,4,1,4,23,118,1,84,6,5,1,6,4,46,4,3,1,188,25,6,4,46,5,3,17,46,4,0,1,54,4,4,5,19,84,4,5,1,4,6,142,25,46,5,3,18,46,4,0,1,54,4,4,5,19,46,3,3,0,84,3,5,1,4,3,92,1,46,1,0,0,54,1,1,1,40,188,39,1,2,41,1,1,46,4,1,18,46,1,0,1,54,3,1,5,19,46,1,0,0,54,2,1,4,23,118,1,84,1,4,1,3,2,142,35,41,1,1,46,3,1,17,46,1,0,1,54,2,1,5,19,46,0,0,0,54,1,0,4,23,118,0,84,0,3,0,2,1,118,0,92,0,108,3,1,108,2,2,189,177,0,0,0,2,3,146,75,2,13,1,2,115,0,16,0,188,12,1,0,115,0,6,0,190,57,1,0,41,1,0,46,4,1,10,118,0,83,6,4,0,2,46,4,1,1,188,114,6,4,54,4,3,1,29,190,15,6,4,46,4,1,13,39,4,2,4,144,67,4,13,5,6,115,4,6,0,188,35,5,4,110,4,1,59,3,4,1,40,0,59,3,2,2,23,0,41,4,0,46,5,4,19,118,4,83,5,5,4,3,92,4,46,5,1,21,54,4,6,2,42,83,4,4,6,2,84,4,5,0,4,3,92,0,110,4,3,59,3,4,1,40,0,59,3,2,2,23,0,46,2,1,19,83,2,2,0,3,92,0,46,2,1,18,46,1,1,0,84,1,2,0,3,1,92,0,41,0,0,46,2,0,18,48,0,57,4,0,3,33,0,54,0,4,4,32,106,1,0,4,115,8,1,0,8,9,1,80,0,4,2,107,1,1,0,118,0,84,1,2,0,3,1,92,0,108,2,1,108,4,2,110,0,2,59,2,0,1,40,0,59,2,4,2,23,0,41,0,0,46,1,0,13,54,1,1,1,38,146,18,1,46,3,0,13,54,1,3,1,38,84,1,1,3,2,4,46,1,0,19,118,0,83,1,1,0,2,92,0,108,1,1,54,2,1,1,37,110,0,1,190,32,2,0,41,0,0,46,3,0,15,54,2,1,2,36,118,0,84,0,3,0,1,2,119,0,59,1,0,1,36,0,54,2,1,1,37,110,0,2,190,72,2,0,54,0,1,2,36,54,0,0,3,28,122,4,18,0,4,0,41,3,0,118,2,146,39,0,46,5,3,15,54,0,1,2,36,73,0,0,4,84,0,5,2,1,0,37,4,4,54,0,1,2,36,54,0,0,3,28,152,224,4,0,119,0,59,1,0,1,36,0,118,0,92,0,108,5,1,108,2,2,108,1,0,13,6,5,115,4,6,0,119,3,190,7,6,4,8,3,5,59,1,3,1,26,0,13,3,2,119,0,190,7,3,4,8,0,2,59,1,0,2,39,0,108,0,3,59,1,0,3,19,0,118,0,92,0,50,4,108,3,2,42,4,0,3,121,0,44,4,1,0,41,1,0,46,7,1,12,118,0,108,6,1,100,5,4,17,0,100,2,4,18,0,85,5,7,0,6,5,2,46,2,4,1,144,31,2,46,2,1,1,190,24,5,2,120,2,44,4,1,2,46,2,1,18,46,1,1,0,84,1,2,0,3,1,92,0,41,0,0,46,1,0,1,144,33,1,120,1,44,0,1,1,41,1,1,46,3,1,17,46,2,0,0,118,0,108,1,1,84,1,3,0,2,1,92,0,118,0,92,0,41,0,0,46,1,0,1,144,33,1,120,1,44,0,1,1,41,1,1,46,3,1,18,46,2,0,0,118,0,108,1,1,84,1,3,0,2,1,92,0,118,0,92,0,41,0,0,46,2,0,13,54,3,2,1,31,54,1,2,2,32,106,1,1,2,8,4,1,80,0,2,2,107,0,1,0,110,1,1,59,0,1,1,40,0,108,1,1,59,0,1,2,23,0,92,0,108,4,1,108,3,2,108,2,0,54,5,2,1,25,41,0,0,46,1,0,13,190,79,5,1,46,6,0,13,46,10,0,9,54,5,6,2,32,106,5,5,6,8,11,5,80,1,6,2,107,1,5,1,46,7,0,15,46,5,0,20,54,6,5,2,32,106,6,6,5,8,11,6,8,10,4,8,9,3,8,8,1,80,5,5,4,107,6,6,5,118,5,84,5,7,5,2,6,92,1,46,1,0,14,118,0,85,0,1,0,2,4,3,92,0,108,5,0,118,0,118,1,130,2,1,8,4,5,146,21,2,54,3,5,1,29,54,2,3,2,41,131,1,84,4,2,3,5,1,54,3,4,1,29,119,2,50,1,100,1,1,22,0,84,1,3,4,2,1,92,0,50,1,108,0,1,42,1,0,0,48,0,57,3,0,1,50,0,118,0,100,2,1,23,0,122,1,84,1,3,0,2,1,92,0,41,0,0,46,0,0,0,95,0,50,0,108,3,0,108,1,1,42,0,0,1,54,2,3,1,29,100,1,0,25,0,100,0,0,27,0,84,0,2,3,1,0,92,0,50,0,108,1,1,42,0,0,1,41,1,1,46,3,1,13,54,2,3,1,20,41,1,0,46,4,1,0,118,1,81,1,4,1,83,2,2,3,1,54,1,2,2,29,100,0,0,26,0,83,0,1,2,0,92,0,41,0,0,46,0,0,0,92,0,50,0,108,1,1,42,0,0,1,41,1,1,46,3,1,13,54,2,3,1,20,41,1,0,46,4,1,0,118,1,81,1,4,1,83,2,2,3,1,54,1,2,2,29,100,0,0,28,0,83,0,1,2,0,92,0,108,5,1,50,2,8,3,5,118,7,118,4,41,1,0,46,0,1,13,39,5,5,0,8,0,3,145,251,0,0,0,5,119,5,189,237,0,0,0,0,5,8,5,3,189,221,0,0,0,5,7,8,6,3,120,5,189,203,0,0,0,6,5,8,6,3,121,5,189,185,0,0,0,6,5,8,6,3,122,5,189,167,0,0,0,6,5,8,6,3,115,5,0,0,189,147,0,0,0,6,5,8,5,3,13,6,5,115,5,16,0,188,18,6,5,8,5,3,13,6,5,115,5,6,0,190,26,6,5,8,5,3,54,5,5,1,29,8,4,5,13,6,5,115,5,6,0,188,18,6,5,46,6,1,22,8,5,3,83,5,6,7,5,92,5,46,5,1,13,8,6,4,54,4,6,2,42,83,8,4,6,3,54,4,5,3,32,106,4,4,5,8,9,4,80,3,5,2,107,3,4,3,92,3,93,3,42,2,0,3,46,4,1,13,54,3,4,3,32,106,3,3,4,100,8,2,30,0,8,9,3,80,2,4,2,107,2,3,2,92,2,46,2,1,7,92,2,46,2,1,6,92,2,46,2,1,3,92,2,46,2,1,2,92,2,46,2,1,5,92,2,46,1,1,4,92,1,92,0,41,0,0,46,2,0,0,108,1,2,118,0,83,1,1,0,2,92,0,108,2,1,48,0,57,1,0,1,30,0,54,1,1,2,47,13,3,1,115,1,6,0,188,46,3,1,41,3,0,50,1,100,1,1,32,0,42,3,8,1,57,1,0,1,30,0,54,1,1,3,32,54,3,1,4,51,54,1,3,5,44,83,1,1,3,2,92,1,57,1,0,1,30,0,54,3,1,2,47,41,1,0,42,1,8,3,57,1,0,1,30,0,54,0,1,2,47,83,0,0,1,2,92,0,48,0,57,0,0,1,30,0,54,0,0,2,32,54,2,0,3,51,54,1,2,4,44,108,0,1,83,0,1,2,0,92,0,50,0,41,1,0,46,4,1,8,118,3,108,2,1,83,2,4,3,2,42,0,0,2,46,2,1,13,54,1,2,1,32,106,1,1,2,100,5,0,34,0,8,6,1,80,0,2,2,107,0,1,0,92,0,50,6,108,2,1,42,6,0,2,108,0,2,42,6,1,0,100,5,6,35,0,42,6,3,5,41,4,0,46,0,4,0,54,0,0,1,28,122,3,188,61,0,3,46,0,4,0,54,1,0,1,28,42,6,2,1,54,0,0,1,28,18,1,3,0,118,0,122,3,146,29,1,46,1,4,0,73,6,1,3,84,6,5,0,3,6,37,3,3,54,1,1,1,28,152,234,3,1,92,0,118,1,7,0,0,0,83,0,2,1,0,92,0,50,1,108,3,1,108,0,2,42,1,0,3,146,78,0,13,4,0,115,2,16,0,188,12,4,2,115,2,6,0,190,60,4,2,41,2,2,46,4,2,13,39,4,0,4,146,29,4,54,5,0,1,29,46,4,2,13,54,4,4,2,32,54,4,4,1,29,189,134,0,0,0,5,4,54,4,0,1,29,13,6,4,115,5,6,0,188,54,6,5,41,5,1,46,6,5,0,74,6,3,0,41,6,0,46,7,6,2,38,8,7,42,6,2,8,122,7,190,19,8,7,46,7,6,0,46,6,5,0,118,5,83,5,7,5,6,118,5,92,5,46,5,2,13,54,2,4,3,42,83,10,2,4,0,54,4,5,2,32,106,4,4,5,8,11,4,80,2,5,2,107,6,4,2,54,5,6,1,29,41,2,0,46,4,2,1,100,2,1,37,0,84,2,5,6,2,4,118,2,92,2,54,2,0,4,40,110,5,3,8,4,0,8,0,4,190,24,2,5,54,6,4,5,23,54,2,6,4,40,8,4,6,8,0,4,188,240,2,5,54,4,0,4,40,110,2,1,188,62,4,2,54,4,0,4,40,110,2,2,190,23,4,2,41,2,0,46,5,2,1,54,4,0,5,23,118,2,83,2,5,2,4,54,4,0,1,29,41,2,0,46,2,2,1,100,1,1,36,0,84,1,4,0,1,2,118,1,92,1,41,1,0,46,2,1,3,54,1,0,5,23,118,0,84,0,2,0,3,1,92,0,41,0,1,46,3,0,3,41,0,0,46,2,0,0,118,0,108,1,1,84,1,3,0,2,1,92,0,50,0,108,1,1,42,0,0,1,41,1,0,46,2,1,13,54,1,2,1,32,106,1,1,2,100,3,0,39,0,8,4,1,80,0,2,2,107,0,1,0,92,0,50,0,108,1,1,42,0,0,1,41,1,0,46,2,1,13,54,1,2,1,32,106,1,1,2,100,3,0,41,0,8,4,1,80,0,2,2,107,0,1,0,92,0,50,1,108,0,1,42,1,0,0,108,0,2,42,1,1,0,41,0,1,46,3,0,8,41,0,0,46,2,0,0,118,0,83,3,3,0,2,54,2,3,1,46,100,1,1,42,0,83,1,2,3,1,92,0,41,0,2,46,2,0,13,54,1,2,1,20,108,0,1,83,3,1,2,0,54,2,3,2,29,41,0,0,46,1,0,0,46,0,0,1,84,0,2,3,1,0,118,0,92,0,108,3,0,54,2,3,1,29,119,1,108,0,1,84,0,2,3,1,0,92,0,1,0,0,0,3,0,0,0,8,0,0,0,10,0,0,0,1,0,0,0,6,0,0,0,19,0,0,0,21,0,0,0,1,0,0,0,9,0,0,0,26,0,0,0,28,0,0,0,2,0,0,0,129,0,0,0,151,0,0,0,204,0,0,0,165,0,0,0,202,0,0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,220,115,6,113,29,209,154,37,48,211,242,58,168,35,18,134,250,185,0 }; // NOLINT + const uint8_t k_ConsoleModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,28,178,171,24,124,248,30,50,160,230,245,220,127,221,48,82,60,223,17,41,120,18,0,0,0,0,0,0,22,0,0,0,2,0,0,0,37,0,0,0,98,0,0,0,0,0,0,0,28,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,109,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,7,0,2,9,128,31,0,72,18,0,2,0,0,0,2,169,7,0,8,239,0,0,0,72,18,0,30,12,5,2,6,152,8,0,4,56,128,23,0,72,18,0,26,0,0,0,6,208,8,0,2,34,0,22,0,72,18,0,22,0,2,0,6,242,8,0,6,200,0,24,0,72,18,0,28,0,8,0,6,186,9,0,4,75,128,21,0,72,18,0,24,0,5,0,6,5,10,0,4,42,0,21,0,72,18,0,22,0,2,0,6,47,10,0,6,73,128,20,0,72,18,0,26,0,2,0,6,120,10,0,4,54,0,23,0,72,18,0,26,3,3,0,6,174,10,0,6,53,0,0,0,72,18,0,32,0,2,0,6,227,10,0,4,61,128,27,0,72,18,0,16,0,1,0,6,32,11,0,4,255,2,29,0,72,18,0,46,6,17,0,6,31,14,0,4,43,0,0,0,72,18,0,30,0,0,0,6,74,14,0,4,44,0,0,0,72,18,0,34,0,0,0,6,118,14,0,6,116,0,0,0,72,18,0,44,0,3,0,6,234,14,0,4,0,1,0,0,72,18,0,48,0,6,0,6,234,15,0,4,113,129,28,0,72,18,0,42,0,4,0,6,91,17,0,4,35,0,0,0,72,18,0,6,1,2,0,6,126,17,0,2,120,0,0,0,72,18,0,30,0,5,0,6,246,17,0,4,19,0,0,0,72,18,0,22,0,0,0,6,9,18,0,4,27,0,37,0,72,18,0,4,0,1,0,6,36,18,0,4,35,0,0,0,72,18,0,6,0,2,0,6,61,0,0,0,37,0,0,128,50,61,140,251,134,23,31,31,135,68,180,36,250,233,21,150,102,114,52,205,208,163,2,145,67,104,191,78,171,186,118,185,199,71,32,187,213,214,41,204,191,150,147,166,9,248,128,22,172,182,0,17,231,176,143,227,182,215,236,231,169,119,79,135,234,200,210,219,241,210,24,42,32,149,1,30,20,224,34,154,201,31,122,142,86,255,169,21,249,246,187,133,245,239,243,30,186,38,19,147,132,179,196,162,101,250,141,203,253,43,154,98,127,147,209,126,102,54,240,234,126,176,57,90,61,95,124,128,232,1,98,83,60,99,79,131,245,18,55,151,134,184,33,63,61,105,80,223,0,0,0,0,0,0,0,1,2,0,0,2,4,0,0,4,10,0,0,3,12,0,0,2,14,0,0,1,14,0,0,2,16,0,0,2,18,0,0,1,20,0,0,27,28,0,0,3,28,0,0,6,36,0,0,1,70,0,0,2,72,0,0,1,74,0,0,1,76,0,0,9,92,0,0,6,104,0,0,131,16,1,0,6,110,1,0,27,118,1,0,3,118,1,0,6,164,1,0,2,168,1,0,9,184,1,0,1,184,1,0,4,190,1,0,3,206,1,0,15,236,1,0,8,252,1,0,8,12,2,0,8,28,2,0,13,54,2,0,14,82,2,0,12,106,2,0,15,136,2,0,12,160,2,0,16,192,2,0,16,224,2,0,40,48,3,0,17,82,3,0,18,122,3,0,16,154,3,0,18,188,3,0,5,196,3,0,25,254,3,0,18,34,4,0,27,88,4,0,6,102,4,0,6,114,4,0,7,126,4,0,6,134,4,0,5,188,4,0,8,214,4,0,6,246,4,0,4,8,5,0,7,8,5,0,13,48,5,0,9,66,5,0,4,58,1,0,6,72,1,0,8,194,1,0,6,254,1,0,6,44,2,0,4,70,2,0,5,122,2,0,6,36,3,0,5,116,3,0,3,196,3,0,3,196,3,0,24,244,3,0,5,98,4,0,4,142,4,0,23,202,4,0,4,210,4,0,4,224,4,0,11,250,4,0,7,32,5,0,8,74,5,0,10,94,5,0,13,116,5,0,6,128,5,0,14,156,5,0,3,162,5,0,9,180,5,0,4,188,5,0,6,200,5,0,7,214,5,0,11,236,5,0,4,242,5,0,3,246,5,0,9,8,6,0,7,22,6,0,5,30,6,0,4,38,6,0,4,46,6,0,5,10,44,32,61,62,32,58,32,32,93,87,101,97,107,77,97,112,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,39,65,114,103,117,109,101,110,116,115,121,109,98,111,108,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,10,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,87,101,97,107,83,101,116,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,91,32,91,70,117,110,99,116,105,111,110,117,108,108,111,103,108,111,98,97,108,91,71,101,116,116,101,114,47,83,101,116,116,101,114,93,91,71,101,116,116,101,114,93,91,79,98,106,101,99,116,93,91,83,101,116,116,101,114,93,91,111,98,106,101,99,116,32,68,97,116,101,93,91,111,98,106,101,99,116,32,69,114,114,111,114,93,91,111,98,106,101,99,116,32,77,97,112,93,91,111,98,106,101,99,116,32,82,101,103,69,120,112,93,91,111,98,106,101,99,116,32,83,101,116,93,91,111,98,106,101,99,116,32,87,101,97,107,77,97,112,93,91,111,98,106,101,99,116,32,87,101,97,107,83,101,116,93,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,101,116,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,101,98,117,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,108,105,99,101,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,98,105,103,105,110,116,101,115,116,114,105,110,103,98,111,111,108,101,97,110,117,109,98,101,114,114,111,114,101,112,111,114,116,85,110,99,97,117,103,104,116,69,120,99,101,112,116,105,111,110,102,117,110,99,116,105,111,110,97,109,101,106,111,105,110,100,101,110,116,111,73,83,79,83,116,114,105,110,103,105,110,102,111,114,69,97,99,104,105,110,115,112,101,99,116,79,98,106,101,99,116,111,83,116,114,105,110,103,117,110,100,101,102,105,110,101,100,119,97,114,110,64,64,105,116,101,114,97,116,111,114,67,111,110,115,111,108,101,77,111,100,117,108,101,110,103,116,104,72,101,114,109,101,115,73,110,116,101,114,110,97,108,76,111,103,84,121,112,101,69,114,114,111,114,99,97,108,108,99,111,110,99,97,116,99,111,110,115,111,108,101,99,111,110,115,116,114,117,99,116,111,114,102,114,111,109,97,112,114,111,116,111,116,121,112,101,105,115,65,114,114,97,121,115,116,97,99,107,101,121,115,112,117,115,104,118,97,108,117,101,101,28,56,60,53,45,48,0,0,0,0,0,109,0,0,0,0,0,1,0,0,6,1,15,17,0,0,0,4,4,7,85,7,105,16,19,0,0,0,7,73,7,110,7,116,15,37,0,0,0,4,4,7,56,16,57,0,0,0,15,53,0,0,0,4,4,7,49,7,54,16,57,0,0,0,7,51,7,50,24,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,4,94,0,0,0,10,7,67,108,97,109,112,101,100,25,57,0,0,0,10,5,65,114,114,97,121,2,0,0,0,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,5,0,100,0,1,3,0,42,1,6,0,100,0,1,4,0,42,1,7,0,100,0,1,5,0,42,1,8,0,100,0,1,6,0,42,1,9,0,100,0,1,7,0,42,1,10,0,100,0,1,8,0,42,1,11,0,108,3,3,118,0,115,2,81,0,83,2,3,0,2,42,1,0,2,100,2,1,10,0,42,1,1,2,100,2,1,11,0,42,1,2,2,100,2,1,16,0,42,1,3,2,48,2,54,3,2,1,88,13,5,3,115,3,59,0,118,4,188,17,5,3,57,3,2,1,88,0,42,1,4,3,8,4,3,5,6,5,0,5,0,0,0,57,5,2,2,63,0,3,3,59,5,3,1,81,0,54,5,6,3,78,100,3,1,17,0,83,3,5,6,3,57,5,2,2,63,0,3,3,100,6,1,20,0,63,3,6,74,59,5,3,2,88,0,146,34,4,57,3,2,4,64,0,54,2,3,5,95,83,3,2,3,4,54,2,3,3,78,100,1,1,21,0,83,1,2,3,1,92,0,108,4,1,41,2,0,46,0,2,9,118,1,83,0,0,1,4,144,12,0,46,3,2,8,83,0,3,1,4,144,12,0,46,3,2,7,83,0,3,1,4,144,13,0,46,2,2,6,81,2,2,1,118,0,92,0,48,0,57,2,0,1,85,0,54,0,2,2,92,106,1,0,2,115,3,19,0,8,4,1,80,0,2,2,107,0,1,0,95,0,108,2,1,144,7,2,118,0,92,0,115,1,50,0,13,0,2,189,166,0,0,0,1,0,3,0,54,1,0,1,79,54,0,1,2,86,83,4,0,1,2,54,3,4,3,72,110,1,8,111,0,255,255,255,255,84,1,3,4,1,0,115,0,64,0,15,0,0,1,146,8,0,54,0,2,4,89,8,3,1,146,13,0,54,0,2,4,89,54,3,0,5,75,115,0,11,0,188,66,0,3,115,0,22,0,188,58,0,3,115,0,17,0,188,33,0,3,132,1,40,0,0,0,0,0,0,0,0,0,0,0,54,0,1,6,73,83,1,0,1,3,118,0,146,18,1,41,1,0,46,3,1,10,118,1,84,0,3,1,2,1,142,20,48,1,57,3,1,7,68,0,54,1,3,8,90,83,0,1,3,2,92,0,41,0,0,46,1,0,10,118,0,84,0,1,0,2,0,92,0,108,2,1,48,0,54,1,0,1,61,115,3,59,0,13,1,1,188,25,3,1,57,1,0,1,61,0,54,1,1,2,62,73,3,2,1,119,1,186,19,1,3,54,3,2,3,80,119,1,186,8,1,3,118,1,92,1,57,1,0,4,68,0,54,0,1,5,90,83,0,0,1,2,92,0,108,2,1,48,0,57,1,0,1,68,0,54,0,1,2,93,83,0,0,1,2,118,1,144,5,0,92,1,41,0,0,46,0,0,10,83,0,0,1,2,92,0,108,3,1,108,1,2,119,0,14,0,0,1,144,12,0,54,2,3,1,82,20,0,1,2,146,8,0,54,1,3,1,82,48,0,57,2,0,2,68,0,118,0,83,0,2,0,1,122,2,18,4,2,1,146,18,4,73,4,3,2,74,0,2,4,37,2,2,152,245,2,1,92,0,50,1,108,4,1,42,1,0,4,3,0,42,1,1,0,48,2,57,3,2,1,64,0,54,2,3,2,95,83,3,2,3,4,42,1,2,3,54,2,3,3,78,100,1,1,9,0,83,1,2,3,1,92,0,108,6,2,41,3,0,46,2,3,1,46,0,3,2,73,1,0,6,48,4,57,5,4,1,64,0,54,4,5,2,71,46,3,3,0,73,0,0,6,84,0,4,5,3,0,74,2,1,0,118,0,92,0,108,6,1,115,0,0,0,54,2,0,1,82,110,5,2,24,1,6,5,18,1,2,1,115,4,7,0,8,3,0,8,0,3,146,26,1,22,7,3,4,54,2,7,1,82,24,1,6,5,8,3,7,8,0,3,152,237,2,1,92,0,50,1,108,3,1,118,4,118,2,130,5,2,110,0,1,20,6,5,0,122,5,146,17,6,129,6,0,2,122,5,188,8,6,4,129,5,0,2,42,1,0,5,130,0,2,110,6,2,20,7,0,6,8,0,6,146,18,7,129,7,6,2,8,0,6,188,8,7,4,129,0,6,2,42,1,1,0,130,6,2,110,0,3,20,6,6,0,115,7,1,0,8,9,7,146,18,6,129,6,0,2,8,9,7,188,8,6,4,129,9,0,2,42,1,2,9,119,0,189,131,2,0,0,3,0,48,0,57,6,0,1,68,0,54,2,6,2,93,83,2,2,6,3,145,50,2,0,0,2,57,2,0,3,64,0,54,2,2,4,92,54,6,2,5,79,54,2,6,6,86,83,6,2,6,3,115,2,33,0,189,242,1,0,0,2,6,115,2,36,0,189,203,1,0,0,2,6,115,2,34,0,189,136,1,0,0,2,6,115,2,37,0,189,57,1,0,0,2,6,115,2,39,0,189,40,1,0,0,2,6,115,2,35,0,189,221,0,0,0,2,6,115,2,38,0,189,204,0,0,0,2,6,57,2,0,7,66,0,39,2,3,2,145,131,0,0,0,2,41,2,0,46,6,2,11,83,8,6,4,3,42,1,4,8,57,7,0,3,64,0,54,6,7,8,95,83,10,6,7,8,7,8,0,0,42,1,5,8,54,7,10,9,78,100,6,1,15,0,83,6,7,10,6,54,7,8,10,76,57,6,0,11,83,0,54,10,6,12,87,115,6,2,0,83,6,10,6,9,83,14,7,8,6,46,2,2,1,83,12,2,4,5,57,2,0,11,83,0,54,6,2,12,87,115,16,13,0,115,11,15,0,8,15,9,8,13,9,79,2,6,6,92,2,54,6,3,13,94,144,29,6,57,2,0,7,66,0,54,2,2,4,92,54,5,2,5,79,54,2,5,6,86,83,6,2,5,3,57,2,0,11,83,0,54,5,2,12,87,115,2,0,0,83,2,5,2,6,92,2,115,2,10,0,92,2,7,6,0,0,42,1,3,6,54,5,3,9,78,100,2,1,14,0,83,2,5,3,2,54,5,6,10,76,115,2,2,0,83,7,5,6,2,57,2,0,11,83,0,54,6,2,12,87,115,5,12,0,115,2,14,0,84,2,6,5,7,2,92,2,115,2,21,0,92,2,41,2,0,46,2,2,5,83,5,2,4,3,54,4,5,14,91,100,2,1,13,0,83,5,4,5,2,54,4,5,10,76,115,2,2,0,83,6,4,5,2,57,2,0,11,83,0,54,5,2,12,87,115,4,23,0,115,2,14,0,84,2,5,4,6,2,92,2,54,5,3,13,94,144,29,5,57,2,0,7,66,0,54,2,2,4,92,54,4,2,5,79,54,2,4,6,86,83,5,2,4,3,57,2,0,11,83,0,54,4,2,12,87,115,2,0,0,83,2,4,2,5,92,2,57,2,0,15,67,0,54,2,2,4,92,54,4,2,5,79,54,2,4,6,86,83,2,2,4,3,92,2,57,2,0,16,65,0,54,2,2,4,92,54,4,2,17,77,54,2,4,6,86,83,2,2,4,3,92,2,54,2,3,14,91,100,1,1,12,0,83,3,2,3,1,54,2,3,10,76,115,1,2,0,83,3,2,3,1,57,0,0,11,83,0,54,2,0,12,87,115,1,24,0,115,0,8,0,84,0,2,1,3,0,92,0,115,0,27,0,92,0,41,0,1,46,4,0,3,41,0,0,46,2,0,0,110,1,1,22,3,2,1,46,0,0,1,29,2,0,1,118,1,108,0,1,85,0,4,1,0,3,2,92,0,41,0,1,46,5,0,3,41,0,0,46,1,0,0,110,2,1,22,8,1,2,46,1,0,1,29,7,1,2,46,6,0,2,118,10,108,9,1,79,0,5,5,92,0,41,1,0,46,3,1,3,54,2,3,1,96,41,0,1,46,8,0,3,46,0,1,1,111,9,255,255,255,255,24,13,0,9,46,0,1,1,110,4,1,29,12,0,4,118,0,108,14,2,115,7,0,0,118,15,8,11,7,79,6,8,5,46,5,1,1,24,13,5,9,46,1,1,1,29,12,1,4,108,14,1,79,5,8,5,48,1,57,1,1,2,83,0,54,4,1,3,87,115,1,3,0,85,1,4,7,6,1,5,83,1,2,3,1,92,0,108,8,1,41,2,0,46,0,2,4,73,3,0,8,41,10,1,46,4,10,1,46,0,2,0,110,9,1,22,1,0,9,118,0,83,7,4,0,1,48,4,57,1,4,1,83,0,54,5,1,2,87,115,6,0,0,115,1,4,0,85,5,5,6,7,8,1,54,7,3,3,70,54,1,3,4,69,144,122,7,144,82,1,54,7,3,5,97,147,166,0,0,0,7,46,8,2,5,54,7,8,6,96,46,12,10,3,54,16,3,5,97,46,3,2,0,22,15,3,9,46,3,2,1,29,14,3,9,46,13,2,2,118,17,79,9,12,5,57,3,4,1,83,0,54,3,3,2,87,84,3,3,6,5,9,83,3,7,8,3,142,94,46,8,2,5,54,7,8,6,96,57,3,4,1,83,0,54,9,3,2,87,115,3,32,0,84,3,9,6,5,3,83,3,7,8,3,142,57,46,3,2,5,54,2,3,6,96,57,4,4,1,83,0,54,4,4,2,87,144,20,1,115,1,30,0,84,1,4,6,5,1,83,1,2,3,1,142,17,115,1,29,0,84,1,4,6,5,1,83,1,2,3,1,92,0,108,2,1,118,5,118,7,130,0,7,110,1,1,20,3,0,1,122,0,122,4,146,17,3,129,3,1,7,122,4,188,8,3,5,129,4,1,7,130,3,7,110,1,2,20,6,3,1,8,3,1,146,18,6,129,6,1,7,8,3,1,188,8,6,5,129,3,1,7,130,1,7,110,6,3,20,8,1,6,115,9,1,0,8,1,9,146,18,8,129,8,6,7,8,1,9,188,8,8,5,129,1,6,7,13,7,2,115,6,50,0,189,233,0,0,0,6,7,115,6,18,0,189,211,0,0,0,6,7,115,6,54,0,189,132,0,0,0,6,7,115,6,20,0,188,84,6,7,115,6,49,0,188,52,6,7,115,6,59,0,188,20,6,7,115,6,52,0,188,12,6,7,115,6,51,0,190,4,6,7,48,6,57,6,6,1,83,0,54,7,6,2,87,115,6,0,0,83,6,7,6,2,92,6,48,6,57,6,6,1,83,0,54,7,6,2,87,115,6,26,0,83,6,7,6,2,92,6,152,31,3,0,41,0,0,46,0,0,2,118,14,8,13,2,8,12,4,8,11,3,8,10,1,79,0,0,5,92,0,115,0,31,0,92,0,54,0,2,3,75,115,4,0,0,146,30,0,54,3,2,3,75,48,0,57,0,0,1,83,0,54,1,0,2,87,115,0,5,0,83,4,1,0,3,48,0,57,0,0,1,83,0,54,3,0,2,87,115,1,25,0,115,0,9,0,84,0,3,1,4,0,92,0,54,0,2,4,79,81,0,0,2,92,0,48,0,57,0,0,1,83,0,54,1,0,2,87,115,0,16,0,84,0,1,0,2,0,92,0,50,0,108,2,1,42,0,0,2,48,1,57,1,1,1,63,0,54,1,1,2,81,100,0,0,18,0,74,1,2,0,118,0,92,0,118,0,118,4,130,2,4,48,1,57,1,1,1,68,0,54,3,1,2,92,106,3,3,1,8,8,3,8,7,2,80,1,1,2,107,3,3,1,122,1,18,5,1,2,146,18,5,129,5,1,4,74,3,1,5,37,1,1,152,245,1,2,54,2,3,3,91,50,1,100,1,1,19,0,83,3,2,3,1,54,2,3,4,76,115,1,6,0,83,4,2,3,1,41,1,1,46,3,1,0,54,2,3,5,84,41,1,0,46,1,1,0,84,1,2,3,4,1,92,0,41,0,2,46,2,0,3,118,1,108,0,1,83,0,2,1,0,92,0,108,0,1,146,18,0,48,1,57,1,1,1,66,0,39,1,0,1,144,7,1,118,1,92,1,95,0,108,2,1,48,0,57,0,0,1,63,0,54,1,0,2,88,41,0,0,46,0,0,4,73,0,0,2,74,1,2,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,124,173,130,251,66,176,11,33,138,156,6,123,60,68,201,247,116,187,196,0 }; // NOLINT + const uint8_t k_Network[] = { 198,31,188,3,193,3,25,31,96,0,0,0,8,120,207,75,17,36,210,144,202,15,80,195,80,137,36,39,161,211,31,225,180,20,0,0,0,0,0,0,35,0,0,0,2,0,0,0,66,0,0,0,101,0,0,0,0,0,0,0,39,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,5,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,8,0,2,9,0,46,0,116,20,0,2,0,0,0,2,161,8,0,8,190,0,0,0,116,20,0,24,13,1,3,6,95,9,0,6,99,128,16,0,116,20,0,28,1,6,0,6,194,9,0,4,36,0,0,0,116,20,0,26,0,3,0,6,230,9,0,4,208,128,12,0,116,20,0,50,2,4,0,6,182,10,0,4,36,0,0,0,116,20,0,30,0,0,0,6,218,10,0,4,55,0,0,0,116,20,0,34,0,3,0,6,17,11,0,8,74,0,10,0,116,20,0,32,0,2,1,6,91,11,0,6,143,0,13,0,116,20,0,36,0,6,0,6,234,11,0,6,87,128,13,0,116,20,0,40,0,3,0,6,65,12,0,6,51,128,7,0,116,20,0,22,0,2,0,6,116,12,0,6,121,128,8,0,116,20,0,50,0,5,3,6,237,12,0,8,63,0,8,0,116,20,0,30,0,3,0,6,44,13,0,4,41,128,14,0,116,20,0,26,0,0,0,6,85,13,0,6,127,0,14,0,116,20,0,32,0,7,0,6,212,13,0,4,44,0,6,0,116,20,0,24,0,2,0,6,0,14,0,2,170,0,0,0,116,20,0,30,1,0,0,6,170,14,0,4,92,128,20,0,116,20,0,30,2,3,1,6,6,15,0,4,71,0,0,0,116,20,0,28,1,3,0,6,77,15,0,4,32,0,0,0,116,20,0,26,0,1,0,6,109,15,0,6,90,0,37,0,116,20,0,28,0,3,0,6,199,15,0,6,52,128,25,0,116,20,0,8,0,1,0,6,251,15,0,2,76,128,27,0,116,20,0,26,0,5,1,6,71,16,0,4,55,128,10,0,116,20,0,8,0,1,0,6,126,16,0,4,32,128,15,0,116,20,0,6,0,1,0,6,158,16,0,4,43,0,39,0,116,20,0,6,0,1,0,6,201,16,0,2,78,0,0,0,116,20,0,30,1,0,0,6,23,17,0,4,146,128,33,0,116,20,0,30,0,5,5,6,169,17,0,2,44,0,16,0,116,20,0,22,1,2,0,6,213,17,0,6,96,0,0,0,116,20,0,26,0,5,0,14,53,18,0,2,28,128,11,0,132,20,0,22,0,3,0,6,81,18,0,6,95,1,0,0,132,20,0,48,1,12,0,6,176,19,0,6,90,0,0,0,132,20,0,32,2,5,0,6,10,20,0,4,84,0,0,0,132,20,0,22,0,3,0,6,94,20,0,4,19,0,0,0,132,20,0,22,0,0,0,6,35,0,0,0,66,0,0,128,230,245,66,248,61,105,80,223,132,179,196,162,232,66,53,201,74,20,8,60,199,229,28,151,11,78,198,102,27,73,242,252,36,60,112,212,245,18,55,151,29,222,241,106,168,184,216,94,191,150,147,166,78,158,35,247,162,150,187,245,74,7,116,249,199,71,32,187,240,49,222,168,206,107,58,113,123,147,228,226,41,134,167,34,182,215,236,231,125,235,142,91,171,186,118,185,171,70,238,67,186,38,19,147,208,163,2,145,32,55,49,47,117,156,159,56,250,233,21,150,98,143,185,172,134,113,0,157,206,7,225,44,73,227,235,17,50,61,140,251,84,2,217,226,23,246,158,172,235,170,51,8,86,172,71,141,197,66,174,192,52,82,183,227,56,242,50,53,114,224,8,140,153,61,61,25,239,241,49,3,67,86,25,162,86,255,169,21,18,136,156,63,176,142,99,223,127,147,209,126,1,68,164,178,189,67,130,232,174,227,77,147,89,241,235,207,133,140,116,108,176,165,50,180,241,210,24,42,135,68,180,36,37,31,239,143,117,104,246,6,2,219,142,149,86,78,8,180,61,95,124,128,134,184,33,63,69,171,220,227,120,180,59,55,0,0,0,0,0,0,0,44,88,0,0,33,150,0,0,25,200,0,0,4,206,0,0,6,218,0,0,3,230,0,0,9,242,0,0,9,4,1,0,7,18,1,0,71,82,1,0,6,158,1,0,15,188,1,0,4,196,1,0,3,202,1,0,15,238,1,0,12,12,2,0,17,44,2,0,6,118,2,0,7,132,2,0,15,162,2,0,7,164,2,0,6,172,2,0,4,172,2,0,24,220,2,0,13,246,2,0,24,246,2,0,29,48,3,0,12,72,3,0,14,108,3,0,20,176,3,0,3,188,3,0,4,210,3,0,7,222,3,0,6,4,0,0,11,76,0,0,5,102,0,0,4,160,0,0,6,174,0,0,3,224,0,0,4,28,1,0,7,132,1,0,7,230,1,0,3,230,1,0,4,0,2,0,6,14,2,0,16,54,2,0,24,54,2,0,25,102,2,0,10,134,2,0,14,202,2,0,3,100,3,0,6,146,3,0,11,168,3,0,6,176,3,0,6,194,3,0,4,198,3,0,6,234,3,0,5,244,3,0,12,4,4,0,9,12,4,0,5,20,4,0,6,32,4,0,5,42,4,0,6,54,4,0,21,82,4,0,7,96,4,0,8,112,4,0,21,140,4,0,6,152,4,0,10,172,4,0,8,186,4,0,6,186,4,0,10,206,4,0,6,218,4,0,5,228,4,0,4,236,4,0,5,244,4,0,3,244,4,0,14,16,5,0,12,36,5,0,6,44,5,0,4,48,5,0,10,68,5,0,11,88,5,0,7,102,5,0,12,126,5,0,7,138,5,0,5,148,5,0,6,158,5,0,8,174,5,0,7,188,5,0,6,200,5,0,8,216,5,0,2,220,5,0,5,230,5,0,20,14,6,0,9,32,6,0,4,40,6,0,11,62,6,0,8,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,108,121,32,83,116,114,105,110,103,32,117,114,108,32,115,117,112,112,111,114,116,101,100,72,69,65,68,69,76,69,84,69,71,69,84,74,83,79,78,111,116,32,70,111,117,110,100,101,102,105,110,101,100,79,80,84,73,79,78,83,79,110,108,121,32,72,101,97,100,101,114,115,32,105,110,115,116,97,110,99,101,32,111,114,32,97,32,112,117,114,101,32,111,98,106,101,99,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,102,111,114,32,104,101,97,100,101,114,115,32,111,112,116,105,111,110,111,114,109,97,108,105,122,101,77,101,116,104,111,100,80,79,83,84,80,85,84,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,101,121,115,95,99,114,101,97,116,101,67,108,97,115,115,105,103,110,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,116,114,105,110,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,116,97,116,117,115,76,105,110,101,116,119,111,114,107,95,100,101,102,105,110,101,80,114,111,112,101,114,116,121,95,100,101,108,101,116,101,120,116,47,112,108,97,105,110,59,99,104,97,114,115,101,116,61,85,84,70,45,56,95,111,98,106,101,99,116,83,112,114,101,97,100,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,76,111,111,115,101,95,116,111,80,114,105,109,105,116,105,118,101,95,116,111,80,114,111,112,101,114,116,121,75,101,121,78,117,109,98,101,114,114,111,114,32,112,97,114,115,105,110,103,32,111,98,106,101,99,116,111,85,112,112,101,114,67,97,115,101,98,114,105,100,103,101,116,65,108,108,106,115,111,110,97,109,101,116,104,111,100,111,119,110,75,101,121,115,121,109,98,111,108,65,114,114,97,121,67,111,110,116,101,110,116,45,84,121,112,101,69,114,114,111,114,101,106,101,99,116,72,105,112,112,121,79,98,106,101,99,116,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,82,101,115,112,111,110,115,101,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,116,97,116,117,115,84,101,120,116,95,104,101,97,100,101,114,115,116,97,116,117,115,67,111,100,101,97,112,112,101,110,100,97,112,112,108,121,98,111,100,121,99,97,116,99,104,97,115,79,119,110,80,114,111,112,101,114,116,121,99,111,110,102,105,103,117,114,97,98,108,101,110,103,116,104,101,110,117,109,101,114,97,98,108,101,99,111,110,115,116,114,117,99,116,111,114,101,115,111,108,118,101,99,111,110,116,101,110,116,45,116,121,112,101,105,110,100,101,120,79,102,101,116,99,104,102,105,108,116,101,114,101,115,112,66,111,100,121,102,111,114,69,97,99,104,103,108,111,98,97,108,105,110,99,108,117,100,101,115,111,107,112,97,114,115,101,112,114,111,112,101,114,116,121,73,115,69,110,117,109,101,114,97,98,108,101,112,114,111,116,111,116,121,112,101,112,117,115,104,114,101,115,112,72,101,97,100,101,114,115,119,114,105,116,97,98,108,101,0,99,57,42,76,102,5,6,4,9,13,14,48,97,24,0,0,100,36,83,80,100,0,0,0,1,19,0,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,2,0,100,0,1,4,0,42,1,3,0,100,0,1,7,0,42,1,4,0,100,0,1,8,0,42,1,5,0,100,0,1,9,0,42,1,6,0,100,0,1,10,0,42,1,7,0,100,0,1,11,0,42,1,8,0,100,0,1,12,0,42,1,9,0,100,0,1,13,0,42,1,10,0,100,0,1,14,0,42,1,11,0,100,0,1,15,0,42,1,12,0,5,0,3,0,3,0,0,0,42,1,0,0,48,2,57,4,2,1,92,0,100,3,1,16,0,118,0,81,3,3,0,59,4,3,1,41,0,57,4,2,1,92,0,100,3,1,26,0,81,3,3,0,59,4,3,2,67,0,5,3,6,0,6,0,4,0,42,1,1,3,57,2,2,1,92,0,100,1,1,31,0,59,2,1,3,88,0,92,0,50,1,108,4,1,42,1,0,4,48,2,57,3,2,1,64,0,54,0,3,2,44,83,0,0,3,4,57,3,2,1,64,0,54,3,3,3,68,146,59,3,57,3,2,1,64,0,54,2,3,3,68,83,4,2,3,4,108,2,2,8,3,4,146,18,2,54,2,4,4,89,100,1,1,3,0,83,3,2,4,1,54,2,0,5,98,54,1,2,6,75,84,1,1,2,0,3,92,0,48,0,57,3,0,1,64,0,54,2,3,2,47,41,0,0,46,1,0,0,108,0,1,84,0,2,3,1,0,54,0,0,3,83,92,0,50,10,108,0,1,118,8,118,9,42,10,0,0,130,1,9,110,7,1,18,1,7,1,41,6,0,120,5,48,4,110,3,2,119,2,147,171,0,0,0,1,129,11,7,9,8,1,7,186,8,2,11,3,13,142,6,129,13,1,9,42,10,1,13,28,11,1,3,144,89,11,57,11,4,1,64,0,54,11,11,2,48,144,40,11,46,12,6,2,57,11,4,1,64,0,83,11,11,8,13,83,14,12,8,11,54,12,14,3,91,100,11,10,6,0,83,11,12,14,11,142,73,57,14,4,1,64,0,54,12,14,4,46,57,15,4,1,64,0,54,11,15,2,48,83,11,11,15,13,84,11,12,14,0,11,142,38,46,12,6,2,57,11,4,1,64,0,83,11,11,8,13,84,13,12,8,11,5,54,12,13,3,91,100,11,10,5,0,83,11,12,13,11,37,7,1,130,1,9,153,98,255,255,255,7,1,92,0,108,4,1,41,0,1,46,3,0,4,41,0,0,46,2,0,0,46,0,0,1,73,1,0,4,118,0,85,1,3,0,2,4,1,92,0,108,4,1,48,5,57,3,5,1,64,0,54,2,3,2,50,41,0,0,46,1,0,0,57,6,5,1,64,0,54,5,6,3,47,46,0,0,1,84,0,5,6,0,4,85,0,2,3,1,4,0,118,0,92,0,108,0,1,108,5,3,41,1,0,46,3,1,10,118,2,108,1,2,83,4,3,2,1,40,1,4,0,144,9,1,74,0,4,5,142,38,48,1,57,3,1,1,64,0,54,2,3,2,50,1,1,4,0,4,0,0,0,0,0,59,1,5,1,36,0,85,1,2,3,0,4,1,92,0,108,5,1,108,4,2,119,0,185,131,0,0,0,0,5,41,0,0,46,1,0,6,118,0,84,0,1,0,5,4,48,1,57,2,1,1,64,0,54,2,2,2,68,146,94,2,57,2,1,1,64,0,54,1,2,2,68,83,3,1,2,5,54,1,3,3,81,122,2,18,1,2,1,146,64,1,73,7,3,2,54,1,4,4,93,83,6,1,4,7,8,1,2,144,32,6,3,6,54,8,6,5,96,54,6,8,6,37,84,6,6,8,5,7,146,11,6,73,6,5,7,74,0,7,6,37,2,1,54,1,3,3,81,152,199,2,1,92,0,3,0,92,0,108,7,1,108,6,2,119,0,184,75,0,7,3,0,8,4,7,77,5,4,3,2,148,59,5,78,1,5,4,3,2,148,50,1,8,9,1,3,8,54,10,8,1,79,54,8,10,2,37,84,8,8,10,7,9,146,226,8,54,8,6,3,93,83,8,8,6,9,144,213,8,73,8,7,9,74,0,9,8,142,202,92,0,3,0,92,0,108,1,1,108,0,2,39,0,1,0,144,37,0,48,0,57,2,0,1,60,0,54,0,2,2,97,106,1,0,2,115,3,2,0,8,4,1,80,0,2,2,107,0,1,0,95,0,118,0,92,0,108,9,1,108,8,2,54,0,8,1,81,122,7,18,1,7,0,48,6,41,5,0,118,0,120,4,115,3,36,0,146,89,1,73,13,8,7,54,10,13,2,83,8,1,7,144,5,10,121,10,59,13,10,1,83,0,59,13,4,2,80,0,40,10,3,13,146,9,10,59,13,4,3,100,0,57,12,6,3,64,0,54,11,12,4,50,46,14,5,10,54,10,13,5,43,83,10,14,0,10,85,10,11,12,9,10,13,37,7,1,54,1,8,1,81,152,174,7,1,92,0,108,0,1,108,4,2,146,23,4,41,1,0,46,3,1,8,54,2,0,1,97,118,1,84,1,3,1,2,4,48,1,57,4,1,2,64,0,54,3,4,3,50,3,2,121,1,63,2,1,100,115,1,97,0,85,1,3,4,0,1,2,92,0,41,0,0,46,3,0,11,118,2,108,1,1,115,0,18,0,84,1,3,2,1,0,115,3,34,0,13,2,1,8,0,1,188,7,3,2,128,0,1,92,0,108,0,1,115,4,11,0,13,1,0,190,115,4,1,146,111,0,48,2,57,1,2,1,69,0,54,1,1,2,35,73,5,0,1,118,3,190,33,3,5,115,1,18,0,188,12,1,1,57,1,2,3,52,0,142,8,57,1,2,4,38,0,83,1,1,3,0,92,1,54,3,5,5,37,115,1,18,0,84,1,3,5,0,1,13,3,1,190,36,4,3,57,4,2,6,60,0,54,2,4,7,97,106,3,2,4,115,8,1,0,8,9,3,80,2,4,2,107,2,3,2,95,2,92,1,92,0,108,0,1,54,1,0,1,53,81,1,1,0,41,2,0,46,3,2,1,54,2,3,2,87,83,3,2,3,1,111,2,255,255,255,255,170,7,3,2,8,0,1,92,0,50,4,100,0,4,17,0,42,4,0,0,41,1,0,46,3,1,9,3,1,115,2,74,0,63,1,2,43,100,2,4,20,0,63,1,2,36,7,2,6,0,68,2,1,0,3,1,115,5,51,0,63,1,5,43,100,5,4,21,0,63,1,5,36,68,2,1,1,3,1,115,5,55,0,63,1,5,43,100,5,4,22,0,63,1,5,36,68,2,1,2,3,1,115,5,22,0,63,1,5,43,100,5,4,23,0,63,1,5,36,68,2,1,3,3,1,115,5,31,0,63,1,5,43,100,5,4,24,0,63,1,5,36,68,2,1,4,3,1,115,5,78,0,63,1,5,43,100,4,4,25,0,63,1,4,36,68,2,1,5,118,1,84,1,3,1,0,2,92,0,50,1,108,4,1,108,3,0,42,1,0,4,42,1,1,3,41,0,1,46,5,0,7,41,0,0,46,2,0,0,118,0,84,2,5,0,3,2,3,2,59,3,2,1,71,0,13,3,4,115,2,11,0,190,37,3,2,48,2,57,3,2,1,64,0,54,2,3,2,44,83,3,2,3,4,54,2,3,3,91,100,1,1,18,0,83,1,2,3,1,92,0,50,0,108,4,1,42,0,0,4,41,1,0,46,2,1,0,73,2,2,4,48,3,57,3,3,1,58,0,39,3,2,3,144,20,3,46,3,1,1,54,1,3,2,51,84,1,1,3,4,2,142,17,54,1,2,3,91,100,0,0,19,0,83,0,1,2,0,118,0,92,0,41,0,1,46,3,0,1,54,2,3,1,74,41,0,0,46,1,0,0,108,0,1,84,0,2,3,1,0,118,0,92,0,108,2,1,108,4,2,108,0,0,13,1,2,115,3,18,0,190,70,1,3,13,1,4,190,63,1,3,54,1,0,1,78,83,3,1,0,2,54,1,0,2,71,144,17,3,7,3,1,0,68,3,4,0,74,1,2,3,142,25,73,1,1,2,54,3,1,3,98,83,3,3,1,4,54,0,0,2,71,74,0,2,1,118,0,92,0,118,0,92,0,108,2,1,108,3,2,13,0,2,115,1,18,0,190,35,0,1,13,0,3,190,28,0,1,108,0,0,54,1,0,1,71,7,0,1,0,68,0,3,0,74,1,2,0,118,0,92,0,118,0,92,0,108,0,0,54,1,0,1,71,54,1,1,2,59,144,35,1,54,1,0,1,71,54,1,1,3,86,144,22,1,54,2,0,1,71,5,1,1,0,1,0,12,0,59,2,1,1,86,0,48,1,57,3,1,4,64,0,54,2,3,5,45,54,1,0,1,71,3,0,84,0,2,3,0,1,92,0,108,2,1,108,0,0,13,3,2,115,1,18,0,190,38,3,1,54,1,0,1,71,73,1,1,2,13,2,1,115,1,8,0,188,14,2,1,54,0,0,1,71,71,0,0,56,0,118,0,92,0,118,0,92,0,108,1,1,13,2,1,115,0,18,0,190,18,2,0,108,0,0,54,0,0,1,71,73,0,0,1,92,0,118,0,92,0,108,1,1,13,2,1,115,0,18,0,190,29,2,0,108,0,0,54,0,0,1,71,73,0,0,1,13,1,0,115,0,8,0,17,0,1,0,92,0,121,0,92,0,50,4,100,0,4,27,0,42,4,0,0,41,1,0,46,3,1,9,3,1,115,2,32,0,63,1,2,43,100,2,4,28,0,63,1,2,36,7,2,2,0,68,2,1,0,3,1,115,5,23,0,63,1,5,43,100,4,4,30,0,63,1,4,36,68,2,1,1,118,1,84,1,3,1,0,2,92,0,108,1,1,108,2,0,41,0,1,46,4,0,7,41,0,0,46,3,0,0,118,0,84,3,4,0,2,3,144,5,1,3,1,54,5,1,1,73,110,3,200,8,4,3,188,9,5,0,54,4,1,1,73,59,2,4,1,72,0,54,4,1,2,49,144,7,4,115,4,7,0,59,2,4,2,70,0,54,4,1,3,99,144,5,4,3,4,59,2,4,3,42,0,54,1,1,4,90,144,7,1,115,1,0,0,59,2,1,4,76,0,54,1,2,5,72,21,1,1,3,146,18,1,54,4,2,5,72,111,3,43,1,0,0,19,1,4,3,59,2,1,5,94,0,92,0,50,0,108,1,0,42,0,0,1,48,1,57,2,1,1,66,0,54,1,2,2,97,106,1,1,2,100,3,0,29,0,8,4,1,80,0,2,2,107,0,1,0,92,0,108,1,1,108,0,2,48,2,57,4,2,1,40,0,54,3,4,2,95,41,2,0,46,2,2,0,54,2,2,3,76,83,3,3,4,2,8,2,1,118,1,83,1,2,1,3,142,46,93,1,8,2,0,48,0,57,3,0,4,61,0,54,0,3,5,97,106,1,0,3,115,5,30,0,8,6,1,80,0,3,2,107,1,1,0,118,0,83,0,2,0,1,118,0,92,0,48,0,57,2,0,1,66,0,54,1,2,2,85,108,0,0,54,0,0,3,76,83,0,1,2,0,92,0,50,0,108,9,1,108,6,2,13,2,9,115,1,18,0,191,30,1,0,0,2,1,144,5,6,3,6,54,8,6,1,57,54,2,6,2,42,54,5,6,3,76,41,7,0,46,3,7,5,46,1,7,0,118,4,84,3,3,4,6,1,3,6,147,143,0,0,0,2,48,1,57,10,1,4,92,0,54,10,10,5,41,39,10,2,10,144,111,10,54,11,2,6,84,57,10,1,7,64,0,188,52,11,10,57,12,1,8,66,0,54,11,12,9,62,57,14,1,10,61,0,54,10,14,11,97,106,13,10,14,115,16,10,0,8,17,13,80,10,14,2,107,10,13,10,83,10,11,12,10,92,10,57,1,1,4,92,0,54,1,1,5,41,54,10,1,11,97,106,10,10,1,8,17,10,8,16,2,80,1,1,2,107,10,10,1,54,1,10,12,55,81,6,1,10,142,11,54,1,2,12,55,81,6,1,2,46,2,7,3,3,1,63,1,9,39,46,7,7,12,144,7,8,115,8,6,0,83,7,7,4,8,63,1,7,57,144,5,6,3,6,63,1,6,42,144,7,5,115,5,0,0,63,1,5,76,84,2,2,4,1,3,42,0,0,1,48,1,57,2,1,8,66,0,54,1,2,11,97,106,1,1,2,100,16,0,32,0,8,17,1,80,0,2,2,107,0,1,0,92,0,48,0,57,2,0,8,66,0,54,1,2,9,62,57,4,0,10,61,0,54,0,4,11,97,106,3,0,4,115,16,3,0,8,17,3,80,0,4,2,107,0,3,0,83,0,1,2,0,92,0,50,0,108,1,1,42,0,0,1,108,1,2,42,0,1,1,48,1,57,1,1,1,63,0,54,5,1,2,54,54,4,5,3,65,41,1,0,46,3,1,0,115,2,19,0,115,1,88,0,85,3,4,5,2,1,3,54,2,3,4,82,100,1,0,33,0,83,2,2,3,1,54,1,2,5,77,100,0,0,34,0,83,0,1,2,0,118,0,92,0,108,2,1,13,1,2,115,0,11,0,188,20,1,0,41,0,0,46,1,0,1,118,0,83,0,1,0,2,142,52,48,0,57,0,0,1,92,0,54,0,0,2,67,54,1,0,3,97,106,1,1,0,8,4,1,8,3,2,80,0,0,2,107,2,1,0,41,0,0,46,1,0,0,118,0,83,0,1,0,2,118,0,92,0,41,0,0,46,2,0,1,118,0,108,1,1,83,1,2,0,1,92,0,0,0,0,1,0,0,0,6,0,0,0,46,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,219,19,145,168,191,75,27,63,185,170,33,139,226,8,57,190,86,73,116,0 }; // NOLINT + const uint8_t k_Storage[] = { 198,31,188,3,193,3,25,31,96,0,0,0,124,108,16,201,95,208,246,23,72,228,184,202,18,28,253,247,240,147,116,65,188,5,0,0,0,0,0,0,14,0,0,0,2,0,0,0,21,0,0,0,27,0,0,0,0,0,0,0,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,2,0,2,9,128,2,0,124,5,0,2,0,0,0,2,221,2,0,8,103,0,0,0,124,5,0,8,2,1,1,6,68,3,0,4,56,0,1,0,124,5,0,24,0,4,1,6,124,3,0,4,67,128,1,0,124,5,0,22,0,3,0,6,191,3,0,4,19,0,0,0,124,5,0,22,0,0,0,6,210,3,0,2,34,0,6,0,124,5,0,26,0,3,0,6,244,3,0,6,91,0,7,0,124,5,0,30,0,4,0,14,79,4,0,4,78,0,10,0,140,5,0,32,0,5,0,6,157,4,0,4,43,0,0,0,140,5,0,8,0,0,0,6,200,4,0,4,19,0,0,0,140,5,0,22,0,0,0,6,219,4,0,4,46,0,9,0,140,5,0,30,0,3,0,6,9,5,0,4,38,128,7,0,140,5,0,30,0,3,0,6,47,5,0,4,38,128,12,0,140,5,0,30,0,3,0,6,85,5,0,4,38,0,12,0,140,5,0,30,0,3,0,6,6,0,0,0,21,0,0,128,130,51,197,247,208,163,2,145,232,1,98,83,171,186,118,185,117,156,159,56,123,147,228,226,123,231,84,128,98,143,185,172,61,6,65,120,115,194,167,102,18,136,156,63,114,224,8,140,158,180,129,242,28,124,216,99,230,233,56,33,126,176,57,90,61,95,124,128,36,60,112,212,185,127,61,252,166,205,200,155,32,149,1,30,0,0,0,0,10,0,0,13,36,0,0,12,36,0,0,13,60,0,0,6,70,0,0,6,0,0,0,12,50,0,0,5,82,0,0,7,86,0,0,5,96,0,0,5,106,0,0,6,114,0,0,10,134,0,0,21,172,0,0,7,184,0,0,8,198,0,0,4,206,0,0,5,216,0,0,10,234,0,0,7,244,0,0,7,0,1,0,3,4,1,0,9,22,1,0,3,28,1,0,11,50,1,0,8,64,1,0,8,97,115,121,110,99,83,116,111,114,97,103,101,77,111,100,117,108,101,99,111,110,118,101,114,116,69,114,114,111,114,115,116,114,105,110,103,108,111,98,97,108,105,115,65,114,114,97,121,72,105,112,112,121,98,114,105,100,103,101,116,65,108,108,75,101,121,115,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,116,73,116,101,109,117,108,116,105,71,101,116,104,101,110,99,97,116,99,104,114,101,109,111,118,101,73,116,101,109,101,115,115,97,103,101,116,73,116,101,109,97,112,114,111,116,111,116,121,112,101,107,101,121,109,117,108,116,105,82,101,109,111,118,101,109,117,108,116,105,83,101,116,111,83,116,114,105,110,103,48,0,0,0,50,0,100,0,0,1,0,92,0,50,2,100,0,2,2,0,42,2,0,0,100,0,2,3,0,42,2,1,0,48,0,57,1,0,1,10,0,3,0,100,3,2,5,0,63,0,3,12,100,3,2,6,0,63,0,3,14,100,3,2,7,0,63,0,3,20,100,3,2,10,0,63,0,3,18,100,3,2,11,0,63,0,3,15,100,3,2,12,0,63,0,3,25,100,2,2,13,0,63,0,2,24,59,1,0,1,6,0,118,0,92,0,108,1,1,144,7,1,119,0,92,0,48,0,57,3,0,1,7,0,54,4,1,2,19,54,2,3,3,22,106,2,2,3,8,5,2,80,0,3,2,107,0,2,0,54,1,1,4,23,59,0,1,1,23,0,92,0,108,2,1,144,7,2,119,0,92,0,48,0,57,1,0,1,9,0,54,0,1,2,8,83,1,0,1,2,8,0,2,144,14,1,7,1,1,0,68,1,2,0,8,0,1,146,20,0,54,2,0,3,21,50,1,100,1,1,4,0,83,1,2,0,1,92,0,41,0,1,46,2,0,0,118,1,108,0,1,83,0,2,1,0,92,0,48,0,57,0,0,1,10,0,54,3,0,2,11,54,2,3,3,13,115,1,1,0,115,0,12,0,84,0,2,3,1,0,92,0,108,0,2,8,1,0,13,2,0,115,0,4,0,188,16,2,0,8,2,1,54,0,2,1,26,81,1,0,2,48,0,57,0,0,2,10,0,54,4,0,3,11,54,3,4,4,13,7,0,2,0,108,2,1,68,0,2,0,68,0,1,1,7,2,1,0,68,2,0,0,115,1,1,0,115,0,25,0,85,0,3,4,1,0,2,92,0,93,0,95,0,50,0,48,1,57,1,1,1,10,0,54,5,1,2,11,54,4,5,3,13,7,3,1,0,108,1,1,68,3,1,0,115,2,1,0,115,1,15,0,85,3,4,5,2,1,3,54,2,3,4,16,100,1,0,8,0,83,2,2,3,1,54,1,2,5,17,100,0,0,9,0,83,0,1,2,0,92,0,108,2,1,146,26,2,122,0,73,1,2,0,146,17,1,73,3,2,0,110,1,1,73,3,3,1,144,7,3,119,3,92,3,73,0,2,0,73,0,0,1,92,0,41,0,1,46,2,0,1,118,1,108,0,1,83,0,2,1,0,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,7,2,1,0,108,0,1,68,2,0,0,115,1,1,0,115,0,24,0,85,0,3,4,1,0,2,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,115,2,1,0,115,1,15,0,108,0,1,85,0,3,4,2,1,0,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,115,2,1,0,115,1,25,0,108,0,1,85,0,3,4,2,1,0,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,115,2,1,0,115,1,24,0,108,0,1,85,0,3,4,2,1,0,92,0,0,1,0,0,0,17,0,0,0,29,0,0,0,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,13,141,138,234,80,8,175,218,126,72,220,225,67,104,173,165,182,157,121,0 }; // NOLINT + const uint8_t k_Dimensions[] = { 198,31,188,3,193,3,25,31,96,0,0,0,103,246,76,225,190,54,133,120,78,234,101,13,136,226,60,1,48,28,202,28,36,5,0,0,0,0,0,0,7,0,0,0,2,0,0,0,25,0,0,0,29,0,0,0,0,0,0,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,2,0,2,9,128,10,0,244,4,0,2,0,0,0,2,221,2,0,8,82,0,0,0,244,4,0,20,2,2,1,6,47,3,0,4,63,128,1,0,244,4,0,8,0,7,0,6,110,3,0,4,225,128,0,0,244,4,0,28,0,11,0,6,79,4,0,4,27,0,2,0,244,4,0,4,0,2,0,6,106,4,0,4,108,0,7,0,244,4,0,26,0,5,3,6,214,4,0,2,30,0,11,0,244,4,0,22,0,3,0,6,4,0,0,0,25,0,0,128,213,214,41,204,120,152,84,251,103,145,213,162,191,144,178,208,10,200,0,252,217,231,45,100,127,241,42,211,209,40,69,117,28,25,154,3,229,52,184,251,199,71,32,187,117,156,159,56,229,232,246,4,89,16,127,229,104,90,135,68,206,64,66,42,114,105,111,64,135,68,180,36,27,75,189,208,169,50,70,244,228,69,17,186,30,45,81,53,238,3,226,154,3,136,19,79,107,239,211,232,0,0,0,0,0,0,0,22,68,0,0,3,174,0,0,27,0,0,0,3,24,0,0,10,42,0,0,5,52,0,0,10,72,0,0,6,72,0,0,20,112,0,0,12,134,0,0,12,156,0,0,5,164,0,0,6,226,0,0,3,232,0,0,5,242,0,0,2,246,0,0,21,28,1,0,10,48,1,0,6,60,1,0,9,78,1,0,6,90,1,0,4,98,1,0,12,118,1,0,15,148,1,0,19,186,1,0,18,222,1,0,6,222,1,0,20,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,110,115,99,97,108,101,112,105,120,101,108,82,97,116,105,111,115,99,114,101,101,110,80,104,121,115,105,99,97,108,80,105,120,101,108,115,110,97,116,105,118,101,83,99,114,101,101,110,97,116,105,118,101,87,105,110,100,111,119,105,100,116,104,101,105,103,104,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,101,110,115,105,111,110,115,101,116,72,105,112,112,121,79,83,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,71,76,79,66,65,76,95,95,100,101,118,105,99,101,102,111,110,116,83,99,97,108,101,103,108,111,98,97,108,105,110,105,116,106,115,77,111,100,117,108,101,76,105,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,110,97,118,105,103,97,116,105,111,110,66,97,114,72,101,105,103,104,116,110,97,118,105,103,97,116,111,114,66,97,114,72,101,105,103,104,116,119,105,110,100,111,119,80,104,121,115,105,99,97,108,80,105,120,101,108,115,0,50,0,100,0,0,1,0,92,0,50,0,100,1,0,2,0,42,0,0,1,100,1,0,3,0,42,0,1,1,3,2,100,1,0,4,0,63,2,1,4,100,1,0,5,0,63,2,1,14,100,0,0,6,0,63,2,0,22,54,0,2,1,22,81,0,0,2,48,0,57,1,0,2,18,0,3,0,63,0,2,5,59,1,0,1,23,0,118,0,92,0,108,0,1,48,1,57,1,1,1,21,0,54,1,1,2,17,54,2,1,3,16,115,1,2,0,188,16,2,1,54,2,0,4,28,54,1,0,5,9,142,12,54,2,0,6,27,54,1,0,7,8,3,0,63,0,2,11,63,0,1,10,92,0,3,2,3,1,41,0,0,46,4,0,0,118,3,108,0,1,83,0,4,3,0,54,4,0,1,11,54,3,0,2,10,146,91,4,48,0,57,0,0,3,21,0,54,0,0,4,17,54,5,0,5,16,115,0,2,0,8,2,4,188,63,5,0,3,0,54,5,4,6,12,63,0,5,12,54,5,4,7,13,63,0,5,13,54,5,4,8,6,63,0,5,6,54,5,4,9,20,63,0,5,20,54,5,4,10,24,63,0,5,24,54,4,4,11,25,63,0,4,26,8,2,0,146,91,3,48,0,57,0,0,3,21,0,54,0,0,4,17,54,4,0,5,16,115,0,2,0,8,1,3,188,63,4,0,3,0,54,4,3,6,12,63,0,4,12,54,4,3,7,13,63,0,4,13,54,4,3,8,6,63,0,4,6,54,4,3,9,20,63,0,4,20,54,4,3,10,24,63,0,4,24,54,3,3,11,25,63,0,3,26,8,1,0,3,0,63,0,2,27,63,0,1,8,92,0,48,0,57,0,0,1,15,0,54,1,0,2,19,144,5,1,3,1,108,0,1,73,0,1,0,92,0,108,2,1,118,0,144,5,2,92,0,41,1,0,46,1,1,1,83,1,1,0,2,54,4,1,1,27,54,3,1,2,8,48,1,57,2,1,3,15,0,54,2,2,4,19,59,2,4,1,27,0,57,2,1,3,15,0,54,2,2,4,19,59,2,3,2,8,0,57,2,1,3,15,0,54,2,2,4,19,57,1,1,3,15,0,54,1,1,4,19,54,1,1,1,27,54,1,1,5,6,59,2,1,3,7,0,92,0,108,2,0,54,1,2,1,14,48,0,57,0,0,2,17,0,54,0,0,3,5,83,0,1,2,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,65,194,83,40,228,233,156,195,240,157,136,18,165,208,148,109,44,185,241,0 }; // NOLINT + const uint8_t k_UtilsModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,97,164,160,26,162,203,181,5,24,87,107,102,218,96,39,242,56,34,117,119,16,3,0,0,0,0,0,0,6,0,0,0,2,0,0,0,8,0,0,0,15,0,0,0,0,0,0,0,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,1,0,2,9,0,2,0,224,2,0,2,0,0,0,2,189,1,0,8,156,0,0,0,224,2,0,8,0,4,2,6,89,2,0,6,90,0,0,0,224,2,0,40,0,3,0,6,179,2,0,2,39,0,0,0,224,2,0,30,0,3,0,6,218,2,0,2,4,0,0,0,224,2,0,2,0,0,0,6,218,2,0,2,4,0,0,0,224,2,0,2,0,0,0,6,7,0,0,0,8,0,0,128,206,64,66,42,13,171,119,215,117,156,159,56,229,232,246,4,123,147,228,226,202,217,230,186,170,248,246,235,237,14,158,97,0,0,0,0,0,0,0,11,22,0,0,7,46,0,0,6,72,0,0,6,84,0,0,3,90,0,0,6,34,0,0,6,46,0,0,13,102,0,0,5,112,0,0,2,116,0,0,6,128,0,0,24,176,0,0,8,192,0,0,7,85,116,105,108,115,77,111,100,117,108,101,97,110,100,114,111,105,100,101,118,105,99,101,99,97,110,99,101,108,86,105,98,114,97,116,101,103,108,111,98,97,108,105,111,115,110,117,109,98,101,114,72,105,112,112,121,79,83,98,114,105,100,103,101,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,112,108,97,116,102,111,114,109,118,105,98,114,97,116,101,0,113,0,0,0,0,0,0,0,50,0,100,0,0,1,0,92,0,50,0,48,1,57,2,1,1,9,0,54,2,2,2,7,54,2,2,3,13,54,3,2,4,10,115,2,2,0,188,79,3,2,57,2,1,1,9,0,54,2,2,2,7,54,2,2,3,13,54,3,2,4,10,115,2,5,0,190,94,3,2,57,2,1,1,9,0,54,3,2,2,7,100,2,0,4,0,59,3,2,1,14,0,57,2,1,1,9,0,54,3,2,2,7,100,2,0,5,0,59,3,2,2,8,0,142,46,57,2,1,1,9,0,54,3,2,2,7,100,2,0,2,0,59,3,2,1,14,0,57,1,1,1,9,0,54,1,1,2,7,100,0,0,3,0,59,1,0,2,8,0,118,0,92,0,108,1,1,108,7,2,13,2,1,115,0,6,0,8,6,1,190,19,2,0,5,0,2,0,1,0,0,0,68,0,1,1,8,6,0,118,0,190,10,7,0,111,7,255,255,255,255,48,1,57,1,1,1,9,0,54,5,1,2,11,54,4,5,3,12,115,12,1,0,115,11,14,0,120,10,8,13,5,8,9,6,8,8,7,79,1,4,6,92,0,48,0,57,0,0,1,9,0,54,4,0,2,11,54,3,4,3,12,115,2,1,0,115,1,3,0,120,0,85,0,3,4,2,1,0,118,0,92,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,6,6,27,25,247,140,70,16,154,33,199,180,196,171,80,5,136,128,68,0 }; // NOLINT + const uint8_t k_global[] = { 198,31,188,3,193,3,25,31,96,0,0,0,3,39,180,136,173,32,46,98,35,230,192,239,155,27,32,91,13,14,17,119,252,1,0,0,0,0,0,0,2,0,0,0,2,0,0,0,7,0,0,0,9,0,0,0,0,0,0,0,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,1,0,2,9,128,0,0,204,1,0,2,0,0,0,2,113,1,0,8,88,0,0,0,204,1,0,8,0,1,6,6,2,0,0,0,7,0,0,128,104,90,135,68,26,125,172,32,215,251,84,184,199,211,94,16,57,223,109,254,175,90,44,68,33,19,225,126,0,0,0,0,0,0,0,6,12,0,0,10,32,0,0,11,52,0,0,23,98,0,0,24,146,0,0,12,170,0,0,14,198,0,0,26,103,108,111,98,97,108,95,95,71,76,79,66,65,76,95,95,97,112,112,82,101,103,105,115,116,101,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,109,111,100,117,108,101,67,97,108,108,73,100,109,111,100,117,108,101,67,97,108,108,76,105,115,116,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,0,0,0,50,0,100,0,0,1,0,92,0,48,0,57,2,0,1,2,0,3,1,59,2,1,1,3,0,57,1,0,1,2,0,122,2,59,1,2,2,6,0,57,3,0,1,2,0,3,1,59,3,1,3,7,0,57,3,0,1,2,0,120,1,59,3,1,4,5,0,57,1,0,1,2,0,59,1,2,5,4,0,57,1,0,1,2,0,3,0,59,1,0,6,8,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,119,136,122,49,55,111,118,204,202,251,30,109,252,54,99,230,125,8,40,0 }; // NOLINT + const uint8_t k_native2js[] = { 198,31,188,3,193,3,25,31,96,0,0,0,209,220,160,20,70,254,144,42,30,161,223,48,152,107,56,224,166,180,117,248,160,6,0,0,0,0,0,0,4,0,0,0,2,0,0,0,18,0,0,0,36,0,0,0,0,0,0,0,51,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,3,0,2,9,128,15,0,112,6,0,2,0,0,0,2,237,3,0,8,25,0,0,0,112,6,0,4,0,1,1,6,6,4,0,6,69,2,0,0,112,6,0,32,1,15,1,6,75,6,0,4,37,0,0,0,112,6,0,22,0,1,0,6,18,0,0,0,18,0,0,128,32,55,49,47,196,226,100,187,202,31,163,59,169,50,70,244,167,87,89,102,228,81,148,108,104,90,135,68,180,34,223,206,199,211,94,16,222,235,52,6,241,210,24,42,103,244,74,87,14,211,91,170,135,68,180,36,175,90,44,68,246,161,84,64,33,19,225,126,238,143,169,209,0,0,0,0,0,0,0,20,14,0,0,13,40,0,0,21,54,0,0,14,82,0,0,83,160,0,0,20,202,0,0,21,248,0,0,18,18,1,0,15,76,1,0,8,92,1,0,8,106,1,0,72,140,1,0,12,2,2,0,46,94,2,0,59,238,2,0,48,88,3,0,7,46,1,0,6,58,1,0,10,238,1,0,10,208,2,0,12,230,2,0,4,78,3,0,6,102,3,0,10,122,3,0,6,134,3,0,24,182,3,0,2,186,3,0,7,198,3,0,11,220,3,0,7,234,3,0,6,246,3,0,14,18,4,0,10,38,4,0,26,90,4,0,6,64,104,105,112,112,121,58,112,97,117,115,101,73,110,115,116,97,110,99,101,64,104,105,112,112,121,58,114,101,115,117,109,101,73,110,115,116,97,110,99,101,110,97,116,105,118,101,50,106,115,32,101,114,114,111,114,58,32,110,97,116,105,118,101,32,102,97,105,108,101,100,32,116,111,32,99,97,108,108,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,32,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,41,114,101,99,101,105,118,101,78,97,116,105,118,101,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,101,106,101,99,116,109,111,100,117,108,101,70,117,110,99,97,108,108,66,97,99,107,102,117,110,99,116,105,111,110,97,116,105,118,101,50,106,115,32,101,114,114,111,114,58,32,99,97,108,108,74,115,77,111,100,117,108,101,32,105,115,32,116,97,114,103,101,116,105,110,103,32,97,110,32,117,110,100,101,102,105,110,101,100,32,109,111,100,117,108,101,32,111,114,32,109,101,116,104,111,100,78,97,109,101,110,97,116,105,118,101,50,106,115,32,101,114,114,111,114,58,32,99,97,108,108,74,115,77,111,100,117,108,101,32,112,97,114,97,109,32,105,115,32,105,110,118,97,108,105,100,110,97,116,105,118,101,50,106,115,32,101,114,114,111,114,58,32,110,97,116,105,118,101,32,99,97,108,108,98,97,99,107,32,105,100,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,32,105,110,32,106,115,77,111,100,117,108,101,76,105,115,116,121,112,101,110,97,116,105,118,101,50,106,115,32,101,114,114,111,114,58,32,110,97,116,105,118,101,50,106,115,32,97,99,116,105,111,110,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,112,97,114,97,109,115,117,99,99,101,115,115,95,95,71,76,79,66,65,76,95,95,99,97,108,108,73,100,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,99,98,102,111,114,69,97,99,104,105,112,112,121,66,114,105,100,103,101,102,114,97,109,101,73,100,103,108,111,98,97,108,109,111,100,117,108,101,67,97,108,108,76,105,115,116,109,111,100,117,108,101,78,97,109,101,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,114,101,115,117,108,116,0,97,1,1,97,3,1,0,0,98,20,33,0,98,8,9,0,50,0,100,0,0,1,0,92,0,48,0,57,1,0,1,31,0,50,0,100,0,0,2,0,59,1,0,1,29,0,118,0,92,0,50,4,108,3,1,108,2,2,42,4,0,2,115,0,2,0,190,37,3,0,1,0,3,0,2,0,0,0,0,0,5,1,2,0,2,0,0,0,63,0,1,23,42,4,0,0,115,3,13,0,8,2,0,115,0,4,0,190,37,3,0,1,0,3,0,2,0,0,0,0,0,5,1,2,0,2,0,3,0,63,0,1,23,42,4,0,0,115,3,13,0,8,2,0,115,0,10,0,189,152,0,0,0,0,3,115,0,16,0,115,1,13,0,191,210,1,0,0,1,3,115,3,14,0,8,0,3,147,196,1,0,0,2,54,1,2,1,33,8,0,3,147,182,1,0,0,1,54,1,2,2,20,8,0,3,147,168,1,0,0,1,48,1,57,1,1,3,24,0,54,3,1,4,21,54,1,2,1,33,73,5,3,1,115,6,12,0,8,0,6,147,133,1,0,0,5,54,1,2,2,20,73,1,5,1,13,3,1,115,1,11,0,8,0,6,191,108,1,0,0,3,1,54,1,2,2,20,73,3,5,1,54,1,2,5,23,83,1,3,5,1,115,0,17,0,143,78,1,0,0,54,3,2,1,33,115,1,6,0,190,20,3,1,54,3,2,6,19,115,1,7,0,189,188,0,0,0,3,1,48,1,57,3,1,3,24,0,54,5,3,7,32,54,3,2,8,25,73,3,5,3,115,0,15,0,147,18,1,0,0,3,57,3,1,3,24,0,54,5,3,7,32,54,3,2,8,25,73,3,5,3,54,5,2,9,35,122,6,188,20,5,6,54,5,3,10,18,13,7,5,115,5,11,0,188,37,7,5,54,5,3,11,27,13,7,5,115,5,11,0,190,36,7,5,54,7,3,11,27,54,5,2,5,23,83,5,7,3,5,142,17,54,7,3,10,18,54,5,2,5,23,83,5,7,3,5,54,5,3,12,22,188,23,5,6,54,5,3,12,22,115,0,17,0,110,3,1,191,152,0,0,0,5,3,57,1,1,3,24,0,54,3,1,7,32,54,1,2,8,25,75,1,3,1,115,0,17,0,142,121,54,3,2,9,35,115,0,5,0,122,1,190,108,3,1,48,3,57,5,3,3,24,0,120,1,59,5,1,1,26,0,57,1,3,3,24,0,54,5,1,13,34,54,1,2,14,30,73,5,5,1,115,1,17,0,8,0,1,146,61,5,57,5,3,3,24,0,54,6,5,13,34,54,5,2,14,30,73,6,6,5,54,5,6,15,28,100,4,4,3,0,83,4,5,6,4,57,3,3,3,24,0,54,3,3,13,34,54,2,2,14,30,75,2,3,2,8,0,1,92,0,108,2,1,13,1,2,115,0,11,0,190,23,1,0,41,0,0,46,0,0,0,54,1,0,1,23,118,0,83,0,2,0,1,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,50,167,232,74,214,47,239,156,15,102,138,211,175,63,121,175,25,181,67,0 }; // NOLINT + const uint8_t k_Event[] = { 198,31,188,3,193,3,25,31,96,0,0,0,248,240,189,168,45,230,19,190,184,156,37,201,49,211,226,145,47,67,101,146,8,5,0,0,0,0,0,0,5,0,0,0,2,0,0,0,26,0,0,0,35,0,0,0,0,0,0,0,72,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,3,0,2,9,128,15,0,216,4,0,2,0,0,0,2,33,3,0,8,59,0,0,0,216,4,0,8,0,1,3,6,92,3,0,2,45,0,0,0,216,4,0,22,0,3,0,6,137,3,0,4,1,1,0,0,216,4,0,36,0,15,0,6,138,4,0,4,76,0,0,0,216,4,0,30,0,6,0,6,9,0,0,0,26,0,0,128,229,122,148,194,208,163,2,145,142,5,4,142,154,102,238,157,230,198,237,126,169,50,70,244,17,47,149,6,249,107,235,204,182,215,236,231,249,246,187,133,117,156,159,56,9,205,100,85,101,250,141,203,250,233,21,150,231,141,206,154,90,35,1,231,185,10,124,114,89,218,72,162,104,90,135,68,26,125,172,32,29,222,241,106,123,147,228,226,135,68,180,36,228,81,148,108,123,169,253,143,61,95,124,128,0,0,0,0,0,0,0,16,46,0,0,14,58,0,0,15,146,0,0,25,218,0,0,7,250,0,0,15,24,1,0,8,72,1,0,22,30,0,0,4,38,0,0,5,86,0,0,18,112,0,0,15,140,0,0,3,192,0,0,12,216,0,0,2,230,0,0,10,38,1,0,4,46,1,0,14,116,1,0,5,116,1,0,12,138,1,0,6,150,1,0,6,162,1,0,18,194,1,0,16,222,1,0,16,250,1,0,14,18,2,0,10,38,2,0,11,60,2,0,6,72,2,0,6,84,2,0,6,96,2,0,6,106,2,0,10,126,2,0,9,64,104,112,58,108,111,97,100,73,110,115,116,97,110,99,101,109,105,116,69,114,114,111,114,101,109,111,118,101,82,111,111,116,86,105,101,119,77,97,110,97,103,101,114,101,99,101,105,118,101,78,97,116,105,118,101,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,117,110,93,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,32,105,110,32,106,115,77,111,100,117,108,101,76,105,115,116,105,100,101,97,108,108,111,99,97,108,108,78,97,116,105,118,101,100,101,115,116,114,111,121,73,110,115,116,97,110,99,101,102,117,110,99,116,105,111,110,97,109,101,72,101,114,109,101,115,73,110,116,101,114,110,97,108,111,97,100,32,105,110,115,116,97,110,99,101,32,101,114,114,111,114,58,32,91,72,105,112,112,121,68,101,97,108,108,111,99,111,110,99,97,116,79,98,106,101,99,116,95,95,117,110,108,111,97,100,73,110,115,116,97,110,99,101,95,95,108,111,97,100,73,110,115,116,97,110,99,101,95,95,105,110,115,116,97,110,99,101,78,97,109,101,95,95,105,110,115,116,97,110,99,101,73,100,95,95,71,76,79,66,65,76,95,95,97,112,112,82,101,103,105,115,116,101,114,97,115,115,105,103,110,98,114,105,100,103,101,103,108,111,98,97,108,112,97,114,97,109,115,117,112,101,114,80,114,111,112,115,112,114,111,116,111,116,121,112,101,97,1,0,0,50,0,100,0,0,1,0,92,0,50,0,48,1,57,3,1,1,31,0,100,2,0,2,0,59,3,2,1,20,0,57,3,1,1,31,0,100,2,0,3,0,59,3,2,2,24,0,57,1,1,1,31,0,100,0,0,4,0,59,1,0,3,23,0,118,0,92,0,48,0,57,1,0,1,31,0,54,1,1,2,19,146,28,1,57,0,0,1,31,0,54,2,0,2,19,54,1,2,3,9,115,0,5,0,83,0,1,2,0,118,0,92,0,108,0,1,144,5,0,3,0,54,2,0,1,17,54,8,0,2,15,54,3,0,3,32,118,0,190,6,3,0,3,3,48,1,57,4,1,4,27,0,54,4,4,5,28,73,4,4,2,144,56,4,57,6,1,6,10,0,57,4,1,7,18,0,54,7,4,8,21,115,5,8,0,115,4,4,0,84,10,7,5,2,4,54,5,6,9,34,106,5,5,6,8,11,5,80,4,6,2,107,4,5,4,95,4,57,6,1,10,22,0,54,5,6,11,29,3,4,63,4,2,25,63,4,8,26,84,4,5,6,3,4,57,7,1,10,22,0,54,6,7,11,29,57,4,1,4,27,0,54,4,4,5,28,73,5,4,2,3,4,63,4,8,15,63,4,3,33,84,4,6,7,5,4,57,4,1,4,27,0,54,4,4,12,14,54,6,4,13,12,146,41,6,54,4,6,14,11,13,5,4,115,4,7,0,190,26,5,4,54,5,6,14,11,5,4,2,0,1,0,0,0,68,4,3,1,83,4,5,6,4,57,1,1,4,27,0,54,1,1,5,28,73,2,1,2,54,1,2,15,13,83,1,1,2,3,92,0,108,0,1,144,5,0,3,0,54,4,0,1,15,48,0,57,1,0,2,31,0,54,3,1,3,19,54,2,3,4,9,115,1,6,0,84,1,2,3,1,4,57,0,0,3,19,0,54,3,0,5,30,54,2,3,6,16,115,1,3,0,115,0,2,0,85,0,2,3,1,0,4,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,227,162,170,25,142,9,153,57,0,93,186,66,235,125,240,161,27,92,44,17,0 }; // NOLINT + const uint8_t k_AnimationFrameModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,33,23,121,34,75,72,252,3,189,43,126,232,117,59,223,70,213,31,122,124,116,3,0,0,0,0,0,0,4,0,0,0,2,0,0,0,12,0,0,0,15,0,0,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,1,0,2,9,128,5,0,68,3,0,2,0,0,0,2,241,1,0,8,58,0,0,0,68,3,0,26,1,1,2,6,43,2,0,4,3,1,0,0,68,3,0,26,0,8,2,6,46,3,0,2,20,0,0,0,68,3,0,18,0,1,0,6,3,0,0,0,12,0,0,128,67,20,162,123,199,211,94,16,81,163,231,0,186,38,19,147,207,186,65,249,215,251,84,184,104,90,135,68,82,150,87,134,135,68,180,36,61,95,124,128,134,184,33,63,33,19,225,126,0,0,0,0,12,0,0,20,52,0,0,17,0,0,0,20,86,0,0,24,92,0,0,21,134,0,0,9,150,0,0,21,150,0,0,23,196,0,0,10,216,0,0,20,0,1,0,6,12,1,0,9,30,1,0,4,38,1,0,26,67,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,115,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,84,121,112,101,69,114,114,111,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,95,95,71,76,79,66,65,76,95,95,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,103,108,111,98,97,108,112,114,111,116,111,116,121,112,101,112,117,115,104,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,0,0,0,48,0,0,0,50,0,100,0,0,1,0,92,0,50,1,108,3,3,118,0,115,2,1,0,83,2,3,0,2,42,1,0,2,48,2,57,4,2,1,11,0,100,3,1,2,0,59,4,3,1,7,0,57,2,2,1,11,0,100,1,1,3,0,59,2,1,2,10,0,92,0,108,3,1,48,0,144,35,3,57,4,0,1,6,0,54,1,4,2,12,106,2,1,4,115,5,2,0,8,6,2,80,1,4,2,107,1,2,1,95,1,57,1,0,3,9,0,54,1,1,4,4,57,2,0,3,9,0,144,70,1,54,4,2,5,14,57,1,0,3,9,0,54,1,1,6,8,73,1,4,1,147,173,0,0,0,1,57,1,0,3,9,0,54,4,1,5,14,57,1,0,3,9,0,54,1,1,6,8,73,4,4,1,54,1,4,7,13,83,1,1,4,3,143,131,0,0,0,121,1,59,2,1,1,4,0,57,2,0,3,9,0,54,4,2,6,8,110,1,1,22,1,4,1,59,2,1,2,8,0,57,1,0,3,9,0,54,4,1,5,14,57,1,0,3,9,0,54,2,1,6,8,7,1,0,0,74,4,2,1,57,1,0,3,9,0,54,2,1,5,14,57,1,0,3,9,0,54,1,1,6,8,73,2,2,1,54,1,2,7,13,83,1,1,2,3,41,1,0,46,2,1,0,54,1,2,8,5,57,0,0,3,9,0,54,0,0,6,8,83,0,1,2,0,115,0,0,0,92,0,41,0,0,46,1,0,0,54,0,1,1,3,81,0,0,1,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,248,199,103,46,134,168,86,88,238,238,186,44,29,52,254,164,163,78,165,0 }; // NOLINT + const uint8_t k_Turbo[] = { 198,31,188,3,193,3,25,31,96,0,0,0,206,241,125,207,99,224,130,228,43,204,250,250,15,132,233,114,118,15,213,180,80,3,0,0,0,0,0,0,6,0,0,0,2,0,0,0,14,0,0,0,16,0,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,1,0,2,9,128,0,0,32,3,0,2,0,0,0,2,217,1,0,8,25,0,0,0,32,3,0,4,0,1,1,6,242,1,0,4,16,0,3,0,32,3,0,4,1,0,0,6,2,2,0,2,106,0,0,0,32,3,0,30,2,3,0,6,108,2,0,6,161,0,0,0,32,3,0,36,1,6,1,6,13,3,0,4,19,0,5,0,32,3,0,22,0,0,0,6,2,0,0,0,14,0,0,128,171,186,118,185,249,246,187,133,117,156,159,56,101,250,141,203,181,173,102,157,134,113,0,157,104,90,135,68,52,82,183,227,222,235,52,6,57,223,109,254,175,90,44,68,61,95,124,128,167,87,89,102,32,55,49,47,0,0,0,0,0,0,0,6,12,0,0,5,22,0,0,14,50,0,0,5,60,0,0,6,70,0,0,12,80,0,0,7,94,0,0,10,114,0,0,5,124,0,0,2,128,0,0,12,152,0,0,14,180,0,0,9,190,0,0,4,198,0,0,6,103,108,111,98,97,108,65,114,114,97,121,72,101,114,109,101,115,73,110,116,101,114,110,97,108,72,105,112,112,121,99,111,110,99,97,116,117,114,98,111,80,114,111,109,105,115,101,95,95,71,76,79,66,65,76,95,95,97,112,112,108,121,99,98,109,111,100,117,108,101,67,97,108,108,73,100,109,111,100,117,108,101,67,97,108,108,76,105,115,116,112,114,111,116,111,116,121,112,101,114,101,106,101,99,116,0,0,0,48,0,0,0,50,0,100,0,0,1,0,92,0,48,0,57,1,0,1,4,0,50,0,100,0,0,2,0,59,1,0,1,6,0,118,0,92,0,50,0,108,1,1,42,0,0,1,100,0,0,3,0,92,0,50,0,118,5,108,1,0,42,0,0,1,130,4,5,48,1,57,2,1,1,2,0,54,3,2,2,13,106,3,3,2,8,8,3,8,7,4,80,2,2,2,107,3,3,2,42,0,1,3,122,2,18,6,2,4,146,18,6,129,6,2,5,74,3,2,6,37,2,2,152,245,2,4,57,2,1,3,7,0,54,1,2,2,13,106,1,1,2,100,7,0,4,0,8,8,1,80,0,2,2,107,0,1,0,92,0,50,3,108,0,1,42,3,0,0,48,0,57,1,0,1,8,0,54,8,1,2,11,57,2,0,1,8,0,54,4,2,2,11,110,1,1,22,1,4,1,59,2,1,1,11,0,57,1,0,1,8,0,54,2,1,3,12,3,1,100,3,3,5,0,63,1,3,10,108,3,2,63,1,3,15,122,3,63,1,3,14,74,2,8,1,41,1,1,46,3,1,0,54,2,3,4,9,41,4,0,46,1,4,0,7,6,0,0,54,5,6,5,5,46,4,4,1,57,0,0,6,3,0,54,7,0,5,5,115,0,0,0,83,7,7,0,8,7,0,1,0,68,0,7,0,84,0,5,6,4,0,84,0,2,3,1,0,118,0,92,0,41,0,0,46,2,0,0,118,1,108,0,1,83,0,2,1,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,34,74,48,208,156,150,3,111,158,78,112,91,179,152,236,77,90,75,159,0 }; // NOLINT +} // namespace + +namespace hippy { +inline namespace driver { + +static const std::unordered_map global_base_js_source_map{ + {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT + {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT + {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT + {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT + {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT + {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT + {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT + {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT + {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT + {"promise.js", {k_promise, ARRAY_SIZE(k_promise) - 1}}, // NOLINT + {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT + {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT + {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT + {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT + {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT + {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT + {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT + {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT + {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT + {"Turbo.js", {k_Turbo, ARRAY_SIZE(k_Turbo) - 1}}, // NOLINT +}; + +static NativeSourceCode GetNativeSourceCodeImp(const std::string& filename) { + const auto it = global_base_js_source_map.find(filename); + return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; +} + +NativeSourceCode NativeSourceCodeProviderHermes::GetNativeSourceCode(const std::string &filename) const { + return GetNativeSourceCodeImp(filename); +} + +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/vm/hermes/native_source_code_hermes_ios.cc b/driver/js/src/vm/hermes/native_source_code_hermes_ios.cc new file mode 100644 index 00000000000..b293a976aa7 --- /dev/null +++ b/driver/js/src/vm/hermes/native_source_code_hermes_ios.cc @@ -0,0 +1,87 @@ +/* + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2017-2024 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "driver/vm/native_source_code.h" +#include "footstone/macros.h" +#include "driver/vm/hermes/native_source_code_hermes.h" + + +namespace { + const uint8_t k_bootstrap[] = { 198,31,188,3,193,3,25,31,96,0,0,0,15,179,236,212,230,191,10,1,16,147,142,110,143,82,173,158,16,63,11,70,20,8,0,0,0,0,0,0,13,0,0,0,2,0,0,0,29,0,0,0,41,0,0,0,0,0,0,0,111,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,3,0,2,91,0,9,0,228,7,0,6,0,0,5,6,63,4,0,6,51,128,13,0,228,7,0,22,0,2,0,6,114,4,0,6,119,128,14,0,228,7,0,48,0,6,3,6,233,4,0,8,84,128,9,0,228,7,0,32,0,4,0,6,61,5,0,4,41,128,16,0,228,7,0,26,0,1,0,6,102,5,0,6,133,128,15,0,228,7,0,34,0,7,0,6,235,5,0,4,102,0,0,0,228,7,0,24,4,3,2,6,81,6,0,4,54,128,4,0,228,7,0,26,0,0,0,6,135,6,0,2,106,0,0,0,228,7,0,32,1,1,0,6,241,6,0,4,44,128,3,0,228,7,0,26,0,1,2,6,29,7,0,2,57,128,17,0,228,7,0,30,0,4,0,6,86,7,0,2,28,0,17,0,228,7,0,6,0,2,0,6,114,7,0,4,111,0,11,0,228,7,0,24,0,6,0,6,12,0,0,0,29,0,0,128,230,245,66,248,61,105,80,223,132,179,196,162,188,63,131,252,86,255,169,21,176,142,99,223,135,68,180,36,65,204,196,184,117,156,159,56,240,49,222,168,50,202,117,235,250,233,21,150,232,66,53,201,50,61,140,251,186,38,19,147,191,240,222,38,36,60,112,212,44,104,208,95,248,105,196,14,59,222,166,211,6,215,101,199,113,227,189,164,0,227,118,208,175,63,246,178,67,86,25,162,74,7,116,249,67,58,217,69,61,95,124,128,120,180,59,55,0,0,0,0,0,0,0,1,2,0,0,44,90,0,0,33,174,0,0,16,212,0,0,8,226,0,0,6,238,0,0,12,24,1,0,7,38,1,0,15,78,1,0,6,112,1,0,6,6,0,0,11,78,0,0,5,104,0,0,4,156,0,0,16,202,0,0,6,4,1,0,10,66,1,0,6,90,1,0,12,124,1,0,5,134,1,0,6,144,1,0,7,158,1,0,6,170,1,0,6,182,1,0,6,194,1,0,9,212,1,0,15,240,1,0,3,246,1,0,17,22,2,0,5,32,2,0,12,54,2,0,7,68,2,0,14,96,2,0,5,106,2,0,7,120,2,0,12,144,2,0,14,172,2,0,8,188,2,0,9,206,2,0,8,47,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,82,117,110,73,110,84,104,105,115,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,110,103,116,104,105,112,112,121,46,106,115,116,114,105,110,103,78,97,116,105,118,101,77,111,100,117,108,101,110,117,109,101,114,97,98,108,101,100,101,102,97,117,108,116,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,108,111,98,97,108,111,98,106,101,99,116,95,99,114,101,97,116,101,67,108,97,115,115,121,109,98,111,108,72,105,112,112,121,78,117,109,98,101,114,101,113,117,105,114,101,79,98,106,101,99,116,83,116,114,105,110,103,83,121,109,98,111,108,84,121,112,101,69,114,114,111,114,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,101,121,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,112,108,105,116,95,116,111,80,114,105,109,105,116,105,118,101,120,112,111,114,116,115,95,116,111,80,114,111,112,101,114,116,121,75,101,121,99,97,99,104,101,99,111,109,112,105,108,101,99,111,110,102,105,103,117,114,97,98,108,101,100,101,102,105,110,101,80,114,111,112,101,114,116,121,102,105,108,101,110,97,109,101,112,114,111,116,111,116,121,112,101,119,114,105,116,97,98,108,101,0,48,0,0,0,52,27,0,0,0,52,29,0,0,0,52,19,0,0,0,52,33,0,0,0,52,31,0,0,0,50,0,100,1,0,1,0,48,2,59,2,1,1,27,0,100,1,0,2,0,59,2,1,2,29,0,100,1,0,3,0,59,2,1,3,19,0,100,1,0,4,0,59,2,1,4,33,0,100,1,0,5,0,59,2,1,5,31,0,100,0,0,6,0,92,0,108,1,1,108,0,2,39,0,1,0,144,37,0,48,0,57,2,0,1,26,0,54,0,2,2,39,106,1,0,2,115,3,3,0,8,4,1,80,0,2,2,107,0,1,0,95,0,118,0,92,0,108,8,1,108,7,2,54,0,7,1,16,122,6,18,1,6,0,48,5,118,0,120,4,115,3,13,0,146,90,1,73,12,7,6,54,9,12,2,17,8,1,6,144,5,9,121,9,59,12,9,1,17,0,59,12,4,2,36,0,40,9,3,12,146,9,9,59,12,4,3,40,0,57,11,5,3,23,0,54,10,11,4,37,54,13,5,5,33,54,9,12,6,28,83,9,13,0,9,85,9,10,11,8,9,12,37,6,1,54,1,7,1,16,152,173,6,1,92,0,108,0,1,108,5,2,108,3,3,146,23,5,48,1,54,4,1,1,29,54,2,0,2,39,118,1,84,1,4,1,2,5,146,18,3,48,1,54,2,1,1,29,118,1,84,1,2,1,0,3,48,1,57,4,1,3,23,0,54,3,4,4,37,3,2,121,1,63,2,1,40,115,1,39,0,85,1,3,4,0,1,2,92,0,48,0,54,3,0,1,31,118,2,108,1,1,115,0,6,0,84,1,3,2,1,0,115,3,11,0,13,2,1,8,0,1,188,7,3,2,128,0,1,92,0,108,0,1,108,5,2,115,4,10,0,13,1,0,190,118,4,1,146,114,0,48,2,57,1,2,1,25,0,54,1,1,2,12,73,3,0,1,118,6,190,33,6,3,115,1,6,0,188,12,1,5,57,1,2,3,21,0,142,8,57,1,2,4,24,0,83,1,1,6,0,92,1,54,1,3,5,14,144,7,5,115,5,8,0,84,1,1,3,0,5,13,3,1,190,36,4,3,57,4,2,6,26,0,54,2,4,7,39,106,3,2,4,115,9,2,0,8,10,3,80,2,4,2,107,2,3,2,95,2,92,1,92,0,50,1,108,0,1,42,1,0,0,48,0,57,2,0,1,18,0,57,0,0,1,18,0,54,0,0,2,20,144,5,0,3,0,59,2,0,1,20,0,3,0,42,1,1,0,100,3,1,7,0,42,1,2,3,118,0,115,2,4,0,83,2,3,0,2,42,1,3,2,100,1,1,8,0,81,3,1,0,3,1,59,3,1,2,34,0,54,2,3,3,22,115,1,5,0,83,1,2,3,1,92,0,108,1,1,41,0,0,46,2,0,1,73,2,2,1,13,3,2,115,2,10,0,188,23,3,2,46,3,0,1,46,4,0,0,118,2,83,2,4,2,1,74,3,1,2,46,0,0,1,73,0,0,1,92,0,50,2,100,0,2,9,0,42,2,0,0,48,1,54,4,1,1,19,3,1,115,3,35,0,63,1,3,28,100,3,2,10,0,63,1,3,13,7,3,2,0,68,3,1,0,3,1,115,5,34,0,63,1,5,28,100,5,2,11,0,63,1,5,13,68,3,1,1,3,1,115,5,22,0,63,1,5,28,100,2,2,12,0,63,1,2,13,7,2,1,0,68,2,1,0,118,1,85,1,4,1,0,3,2,92,0,108,2,0,48,0,54,3,0,1,27,41,0,0,46,1,0,0,118,0,84,1,3,0,2,1,108,1,1,59,2,1,1,38,0,3,1,59,2,1,2,32,0,92,0,108,1,0,41,0,1,46,4,0,3,54,3,4,1,15,54,2,1,2,38,83,4,3,4,2,54,3,1,3,32,41,1,0,46,1,1,0,54,2,1,4,22,46,1,0,2,118,0,85,1,4,0,3,2,1,92,0,108,2,0,41,0,0,46,0,0,0,54,1,0,1,34,54,0,2,2,38,74,1,0,2,118,0,92,0,108,2,1,54,1,2,1,30,115,0,1,0,83,1,1,2,0,54,2,1,2,16,110,0,1,29,0,2,0,73,3,1,0,41,1,0,46,0,1,0,54,0,0,3,34,73,0,0,3,144,55,0,46,1,1,0,54,2,1,4,39,106,2,2,1,8,5,2,8,4,3,80,1,1,2,107,1,2,1,54,2,1,3,34,81,2,2,1,54,2,1,5,35,81,2,2,1,54,1,1,6,32,92,1,54,0,0,6,32,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,92,56,9,243,78,38,41,82,208,99,123,249,205,156,122,146,143,224,3,0 }; // NOLINT + const uint8_t k_hippy[] = { 198,31,188,3,193,3,25,31,96,0,0,0,35,100,116,103,129,207,137,231,4,114,52,59,87,222,240,210,159,96,107,219,20,4,0,0,0,0,0,0,2,0,0,0,2,0,0,0,5,0,0,0,23,0,0,0,0,0,0,0,237,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,3,0,2,9,0,9,0,228,3,0,2,0,0,0,2,17,3,0,8,208,0,0,0,228,3,0,24,0,4,2,6,18,0,0,0,5,0,0,128,135,68,180,36,117,156,159,56,130,51,197,247,79,185,224,129,181,173,102,157,0,0,0,0,0,0,0,29,58,0,0,29,116,0,0,36,188,0,0,29,246,0,0,26,42,1,0,27,96,1,0,21,138,1,0,23,184,1,0,22,228,1,0,24,20,2,0,23,66,2,0,27,120,2,0,31,182,2,0,27,236,2,0,25,30,3,0,26,82,3,0,27,128,0,0,6,136,3,0,5,146,3,0,12,170,3,0,12,194,3,0,12,46,46,47,46,46,47,98,114,105,100,103,101,47,105,111,115,47,106,115,50,110,97,116,105,118,101,46,106,115,46,46,47,46,46,47,98,114,105,100,103,101,47,105,111,115,47,110,97,116,105,118,101,50,106,115,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,67,111,110,115,111,108,101,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,68,105,109,101,110,115,105,111,110,115,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,68,121,110,97,109,105,99,76,111,97,100,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,69,118,101,110,116,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,78,101,116,119,111,114,107,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,79,116,104,101,114,115,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,80,108,97,116,102,111,114,109,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,83,116,111,114,97,103,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,84,105,109,101,114,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,85,116,105,108,115,77,111,100,117,108,101,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,84,117,114,98,111,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,103,108,111,98,97,108,46,106,115,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,112,114,111,109,105,115,101,46,106,115,72,105,112,112,121,97,115,121,110,99,83,116,111,114,97,103,101,108,111,99,97,108,83,116,111,114,97,103,101,116,117,114,98,111,80,114,111,109,105,115,101,0,0,0,50,0,100,0,0,1,0,92,0,108,2,2,118,0,115,1,9,0,83,1,2,0,1,115,1,6,0,83,1,2,0,1,115,1,10,0,83,1,2,0,1,115,1,13,0,83,1,2,0,1,115,1,1,0,83,1,2,0,1,115,1,12,0,83,1,2,0,1,115,1,17,0,83,1,2,0,1,115,1,4,0,83,1,2,0,1,115,1,8,0,83,1,2,0,1,115,1,11,0,83,1,2,0,1,115,1,5,0,83,1,2,0,1,115,1,14,0,83,1,2,0,1,115,1,16,0,83,1,2,0,1,115,1,2,0,83,1,2,0,1,115,1,7,0,83,1,2,0,1,115,1,3,0,83,1,2,0,1,115,1,15,0,83,1,2,0,1,48,1,57,3,1,1,18,0,57,2,1,2,19,0,54,2,2,3,20,59,3,2,1,21,0,57,2,1,1,18,0,57,1,1,2,19,0,54,1,1,4,22,59,2,1,2,22,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,168,36,165,5,8,2,155,252,166,218,128,220,240,67,182,180,204,44,96,0 }; // NOLINT + const uint8_t k_ExceptionHandle[] = { 198,31,188,3,193,3,25,31,96,0,0,0,181,41,204,244,139,187,39,199,97,86,95,225,15,37,42,20,140,252,219,7,120,1,0,0,0,0,0,0,2,0,0,0,2,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,2,9,128,2,0,72,1,0,2,0,0,0,6,5,1,0,6,67,0,0,0,72,1,0,28,0,5,0,6,1,0,0,0,5,0,0,128,253,43,154,98,218,176,194,44,117,156,159,56,229,122,148,194,135,68,180,36,12,0,0,16,0,0,0,7,40,0,0,5,50,0,0,5,60,0,0,4,68,0,0,6,99,111,110,115,111,108,101,120,99,101,112,116,105,111,110,72,97,110,100,108,101,114,114,111,114,72,105,112,112,121,101,109,105,116,103,108,111,98,97,108,50,0,100,0,0,1,0,92,0,108,3,1,108,2,2,48,0,57,1,0,1,5,0,54,1,1,2,3,144,22,1,57,4,0,3,1,0,54,1,4,4,2,84,1,1,4,3,2,142,24,57,0,0,1,5,0,54,1,0,2,3,54,0,1,5,4,84,0,0,1,3,2,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,122,78,91,52,111,211,36,74,100,149,4,99,179,111,217,128,199,181,12,0 }; // NOLINT + const uint8_t k_Others[] = { 198,31,188,3,193,3,25,31,96,0,0,0,103,253,225,17,245,193,62,86,8,176,5,250,32,190,200,220,226,74,236,235,124,11,0,0,0,0,0,0,12,0,0,0,2,0,0,0,45,0,0,0,62,0,0,0,0,0,0,0,135,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,5,0,2,9,128,12,0,60,11,0,2,0,0,0,2,133,5,0,8,250,0,0,0,60,11,0,38,5,4,11,6,127,6,0,4,41,128,6,0,60,11,0,26,0,0,0,6,168,6,0,6,127,0,6,0,60,11,0,32,0,7,0,6,39,7,0,6,51,128,5,0,60,11,0,22,0,2,0,6,90,7,0,6,33,0,7,0,60,11,0,6,0,2,0,6,123,7,0,6,160,128,9,0,60,11,0,30,0,6,0,6,27,8,0,6,113,0,16,0,60,11,0,24,0,7,0,6,140,8,0,4,61,2,14,0,60,11,0,58,2,15,1,14,201,10,0,4,19,0,0,0,76,11,0,22,0,0,0,6,220,10,0,4,25,0,0,0,76,11,0,26,0,1,0,6,245,10,0,12,69,0,2,0,76,11,0,26,0,0,5,6,17,0,0,0,45,0,0,128,230,245,66,248,132,179,196,162,160,92,246,6,41,197,223,245,186,38,19,147,208,163,2,145,32,149,1,30,232,66,53,201,135,68,180,36,167,254,158,171,117,156,159,56,229,122,148,194,218,176,194,44,86,255,169,21,28,124,216,99,92,22,107,227,17,214,19,149,52,153,0,219,202,9,200,48,104,90,135,68,241,210,24,42,134,69,233,56,45,75,172,4,155,26,103,129,171,186,118,185,199,229,28,151,240,49,222,168,230,198,237,126,250,233,21,150,151,235,174,251,50,61,140,251,187,157,250,88,253,235,117,18,26,125,172,32,52,82,183,227,123,147,228,226,60,135,224,144,253,43,154,98,74,7,116,249,227,205,72,220,206,64,66,42,67,58,217,69,61,95,124,128,189,67,21,141,120,180,59,55,0,0,0,0,0,0,0,44,88,0,0,33,138,0,0,8,172,0,0,10,238,0,0,48,78,1,0,45,168,1,0,47,222,1,0,6,16,2,0,46,108,2,0,72,46,3,0,15,76,3,0,12,100,3,0,14,140,3,0,13,210,3,0,6,222,3,0,6,4,0,0,11,102,0,0,4,150,0,0,2,150,0,0,7,164,0,0,9,172,0,0,5,190,0,0,8,194,0,0,6,204,0,0,6,204,0,0,17,238,0,0,5,250,0,0,4,8,1,0,5,46,1,0,6,2,2,0,7,28,2,0,3,250,2,0,6,250,2,0,8,10,3,0,11,28,3,0,10,128,3,0,7,164,3,0,19,202,3,0,5,232,3,0,6,244,3,0,5,254,3,0,4,4,4,0,6,14,4,0,3,20,4,0,6,32,4,0,3,38,4,0,6,50,4,0,3,50,4,0,16,82,4,0,11,104,4,0,5,114,4,0,6,126,4,0,5,136,4,0,7,150,4,0,14,178,4,0,6,190,4,0,6,202,4,0,8,218,4,0,9,236,4,0,9,254,4,0,8,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,101,114,114,111,114,84,121,112,101,69,114,114,111,114,69,118,101,110,116,111,83,116,114,105,110,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,53,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,109,117,115,116,32,98,101,32,97,114,114,97,121,72,105,112,112,121,46,101,109,105,116,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,115,115,97,103,101,72,105,112,112,121,46,111,102,102,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,72,105,112,112,121,46,111,110,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,32,97,110,100,32,97,32,102,117,110,99,116,105,111,110,32,97,115,32,108,105,115,116,101,110,101,114,101,103,105,115,116,101,114,95,95,73,83,72,73,80,80,89,95,95,71,76,79,66,65,76,95,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,95,116,111,80,114,105,109,105,116,105,118,101,95,116,111,80,114,111,112,101,114,116,121,75,101,121,102,111,114,69,97,99,104,105,112,112,121,82,101,103,105,115,116,101,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,99,111,108,110,111,98,106,101,99,116,115,121,109,98,111,108,105,110,101,110,111,65,114,114,97,121,74,83,79,78,117,109,98,101,114,117,110,79,98,106,101,99,116,83,101,116,83,121,109,98,111,108,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,97,112,112,82,101,103,105,115,116,101,114,97,112,112,108,121,98,114,105,100,103,101,99,108,101,97,114,99,111,110,115,111,108,101,100,101,102,105,110,101,80,114,111,112,101,114,116,121,100,101,108,101,116,101,100,101,118,105,99,101,102,105,108,101,110,97,109,101,112,114,111,116,111,116,121,112,101,115,116,114,105,110,103,105,102,121,119,114,105,116,97,98,108,101,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,1,0,100,0,1,3,0,42,1,2,0,100,0,1,4,0,42,1,3,0,100,3,1,6,0,100,2,1,7,0,48,0,57,5,0,1,25,0,120,4,59,5,4,1,35,0,57,5,0,1,25,0,3,4,3,6,63,4,6,26,59,5,4,2,36,0,100,4,1,11,0,42,1,4,4,57,8,0,2,45,0,54,7,8,3,55,3,6,121,5,63,6,5,61,115,5,59,0,85,5,7,8,4,5,6,42,1,0,4,57,5,0,4,27,0,3,4,59,5,4,3,57,0,57,5,0,4,27,0,3,4,59,5,4,4,52,0,57,5,0,4,27,0,3,4,100,6,1,5,0,63,4,6,33,59,5,4,5,34,0,57,4,0,4,27,0,59,4,3,6,19,0,57,4,0,4,27,0,59,4,2,7,32,0,57,4,0,4,27,0,100,1,1,8,0,59,4,1,8,28,0,57,1,0,4,27,0,59,1,3,9,49,0,57,1,0,4,27,0,59,1,2,10,38,0,57,1,0,4,27,0,118,0,59,1,0,11,20,0,92,0,41,0,0,46,3,0,2,118,2,108,1,1,115,0,8,0,84,1,3,2,1,0,115,3,16,0,13,2,1,8,0,1,188,7,3,2,128,0,1,92,0,108,0,1,115,4,15,0,13,1,0,190,115,4,1,146,111,0,48,2,57,1,2,1,47,0,54,1,1,2,17,73,5,0,1,118,3,190,33,3,5,115,1,8,0,188,12,1,1,57,1,2,3,43,0,142,8,57,1,2,4,24,0,83,1,1,3,0,92,1,54,3,5,5,18,115,1,8,0,84,1,3,5,0,1,13,3,1,190,36,4,3,57,4,2,6,21,0,54,2,4,7,59,106,3,2,4,115,8,1,0,8,9,3,80,2,4,2,107,2,3,2,95,2,92,1,92,0,108,1,1,108,0,2,39,0,1,0,144,37,0,48,0,57,2,0,1,21,0,54,0,2,2,59,106,1,0,2,115,3,2,0,8,4,1,80,0,2,2,107,0,1,0,95,0,118,0,92,0,48,0,57,0,0,1,36,0,54,2,0,2,50,3,1,108,0,2,63,1,0,44,108,0,1,74,2,0,1,118,0,92,0,108,3,1,108,2,2,13,1,3,115,0,8,0,190,113,1,0,13,1,2,115,0,3,0,190,102,1,0,48,1,57,0,1,1,36,0,54,0,0,2,26,73,0,0,3,57,4,1,3,46,0,39,4,0,4,144,59,4,57,4,1,1,36,0,54,5,4,2,26,57,4,1,3,46,0,54,6,4,4,59,106,6,6,4,8,8,6,80,4,4,1,107,4,6,4,74,5,3,4,57,1,1,1,36,0,54,1,1,2,26,73,0,1,3,54,1,0,5,48,83,1,1,0,2,92,0,48,0,57,2,0,6,21,0,54,0,2,4,59,106,1,0,2,115,7,10,0,8,8,1,80,0,2,2,107,0,1,0,95,0,108,3,1,108,2,2,13,1,3,115,0,8,0,190,66,1,0,48,1,57,0,1,1,36,0,54,0,0,2,26,73,0,0,3,57,1,1,3,46,0,39,1,0,1,144,7,1,119,1,92,1,144,16,2,54,1,0,4,53,81,1,1,0,119,1,92,1,54,1,0,5,56,83,1,1,0,2,92,0,48,0,57,2,0,6,21,0,54,0,2,7,59,106,1,0,2,115,4,9,0,8,5,1,80,0,2,2,107,0,1,0,95,0,108,10,1,50,2,118,1,118,12,118,6,118,8,118,4,118,3,130,11,12,48,0,57,14,0,1,41,0,110,5,1,20,13,11,5,122,7,122,9,146,7,13,29,9,11,5,54,13,14,2,59,106,13,13,14,8,22,13,8,21,9,80,9,14,2,107,9,13,9,8,6,9,42,2,0,9,18,13,5,11,8,9,5,146,25,13,8,15,6,29,14,9,5,129,13,9,12,74,15,14,13,37,9,9,152,238,9,11,13,11,10,115,9,8,0,191,170,1,0,0,11,9,115,9,29,0,15,9,10,9,8,8,9,57,11,0,3,22,0,54,12,11,2,59,106,12,12,11,8,22,12,80,11,11,1,107,4,12,11,147,162,0,0,0,9,8,9,6,73,11,9,7,57,9,0,1,41,0,39,9,11,9,144,35,9,57,13,0,4,21,0,54,9,13,2,59,106,12,9,13,115,21,6,0,8,22,12,80,9,13,2,107,9,12,9,95,9,54,12,11,5,30,110,9,5,191,28,1,0,0,12,9,8,12,4,57,14,0,6,42,0,54,13,14,7,60,110,9,4,73,9,11,9,83,9,13,14,9,59,12,9,1,31,0,57,9,0,8,27,0,54,9,9,9,20,146,46,9,57,16,0,8,27,0,54,15,16,9,20,73,21,11,7,73,20,11,5,110,9,2,73,19,11,9,110,9,3,73,18,11,9,8,17,4,8,22,16,79,9,15,6,57,9,0,10,36,0,54,9,9,11,26,73,9,9,10,8,3,9,144,47,9,8,9,6,73,9,9,7,146,35,9,57,11,0,12,54,0,54,10,11,13,29,8,9,6,73,12,9,7,54,9,12,14,23,81,9,9,12,83,9,10,11,9,92,1,144,23,8,8,10,3,54,9,10,15,37,100,8,2,10,0,83,8,9,10,8,142,80,73,6,6,7,41,8,0,46,10,8,0,73,21,6,7,73,20,6,5,110,5,2,73,19,6,5,110,5,3,73,18,6,5,8,17,4,54,5,10,2,59,106,5,5,10,8,22,5,80,4,10,6,107,4,5,4,42,2,1,4,8,4,3,54,3,4,15,37,100,2,2,9,0,83,2,3,4,2,142,20,93,4,57,3,0,12,54,0,54,2,3,13,29,83,2,2,3,4,92,1,57,3,0,4,21,0,54,1,3,2,59,106,2,1,3,115,21,5,0,8,22,2,80,1,3,2,107,1,2,1,95,1,57,2,0,4,21,0,54,0,2,2,59,106,1,0,2,115,21,7,0,8,22,1,80,0,2,2,107,0,1,0,95,0,41,0,0,46,2,0,1,108,1,1,118,0,83,0,1,0,2,92,0,108,3,1,54,2,3,1,51,41,0,0,46,1,0,0,118,0,84,0,2,3,0,1,92,0,108,2,0,41,0,0,46,3,0,3,46,1,0,4,118,0,84,1,3,0,2,1,108,1,1,59,2,1,1,31,0,108,1,2,59,2,1,2,58,0,108,1,3,59,2,1,3,40,0,108,1,4,59,2,1,4,39,0,108,1,5,59,2,1,5,29,0,92,0,0,0,1,0,0,0,130,1,0,0,231,1,0,0,233,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,75,10,73,87,84,250,104,182,61,71,233,42,138,216,249,55,58,41,226,0 }; // NOLINT + const uint8_t k_DynamicLoad[] = { 198,31,188,3,193,3,25,31,96,0,0,0,191,103,246,55,102,154,234,35,224,138,75,59,243,10,172,130,92,134,225,184,68,2,0,0,0,0,0,0,3,0,0,0,2,0,0,0,5,0,0,0,8,0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,1,0,2,9,128,3,0,20,2,0,2,0,0,0,2,149,1,0,8,41,0,0,0,20,2,0,24,1,1,1,6,190,1,0,8,86,0,0,0,20,2,0,30,0,4,0,6,3,0,0,0,5,0,0,128,204,107,89,252,16,69,221,128,172,182,0,17,66,136,175,172,135,68,180,36,0,0,0,0,0,0,0,16,32,0,0,18,68,0,0,11,82,0,0,20,120,0,0,4,128,0,0,15,158,0,0,6,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,94,40,46,43,58,92,47,92,47,41,124,94,40,92,47,92,47,41,100,121,110,97,109,105,99,76,111,97,100,85,110,116,114,117,115,116,101,100,67,111,110,116,101,110,116,101,115,116,95,95,72,73,80,80,89,67,85,82,68,73,82,95,95,103,108,111,98,97,108,0,0,0,0,0,0,0,61,0,0,0,2,0,1,0,0,6,15,43,0,0,0,6,6,1,19,0,0,28,0,0,0,0,1,0,0,0,255,255,255,255,1,30,0,0,0,5,10,3,58,47,47,20,0,0,16,54,0,0,0,1,19,1,0,7,47,7,47,20,1,0,0,0,0,0,50,0,100,0,0,1,0,92,0,50,1,108,3,3,118,0,115,2,1,0,83,2,3,0,2,42,1,0,2,48,2,57,2,2,1,7,0,100,1,1,2,0,59,2,1,1,3,0,92,0,108,1,1,8,4,1,144,7,4,115,4,0,0,132,2,2,0,0,0,0,0,0,0,0,0,0,0,54,0,2,1,5,83,0,0,2,1,144,20,0,48,0,57,0,0,2,7,0,54,0,0,3,6,22,4,0,1,41,0,0,46,3,0,0,54,2,3,4,4,108,1,2,108,0,3,85,0,2,3,4,1,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,6,221,42,149,84,50,228,223,84,100,42,33,87,244,240,89,226,21,135,0 }; // NOLINT + const uint8_t k_Platform[] = { 198,31,188,3,193,3,25,31,96,0,0,0,141,245,239,204,131,16,47,34,180,61,155,134,86,191,170,54,134,146,43,64,144,3,0,0,0,0,0,0,2,0,0,0,2,0,0,0,14,0,0,0,18,0,0,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,1,0,2,9,128,0,0,96,3,0,2,0,0,0,2,197,1,0,8,154,1,0,0,96,3,0,10,0,11,7,6,4,0,0,0,14,0,0,128,30,82,43,96,206,64,66,42,200,29,99,21,114,209,161,177,117,156,159,56,202,93,183,58,229,232,246,4,116,127,176,2,215,68,112,101,229,42,156,128,89,16,127,229,106,208,129,187,56,71,164,11,170,248,246,235,0,0,0,0,0,0,0,6,26,0,0,3,32,0,0,9,10,0,0,8,48,0,0,6,60,0,0,8,76,0,0,6,88,0,0,5,98,0,0,12,122,0,0,2,122,0,0,9,140,0,0,8,156,0,0,10,176,0,0,21,218,0,0,7,232,0,0,9,250,0,0,8,103,108,111,98,97,108,97,110,103,117,97,103,101,105,111,115,117,110,100,101,102,105,110,101,100,101,118,105,99,101,65,80,73,76,101,118,101,108,68,101,118,105,99,101,72,105,112,112,121,76,111,99,97,108,105,122,97,116,105,111,110,79,83,86,101,114,115,105,111,110,80,108,97,116,102,111,114,109,83,68,75,86,101,114,115,105,111,110,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,99,111,117,110,116,114,121,100,105,114,101,99,116,105,111,110,112,108,97,116,102,111,114,109,0,0,0,99,15,4,16,98,0,0,113,0,0,0,0,50,0,100,0,0,1,0,92,0,48,0,57,1,0,1,8,0,54,2,1,2,5,3,1,59,2,1,1,17,0,54,1,0,3,14,13,2,1,115,1,3,0,189,117,1,0,0,2,1,1,2,3,0,3,0,0,0,0,0,57,1,0,3,14,0,54,3,1,4,10,115,1,2,0,189,170,0,0,0,3,1,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,4,10,59,3,1,2,10,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,7,6,59,3,1,3,6,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,8,13,59,3,1,4,13,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,6,12,54,1,1,9,9,144,6,1,8,1,2,59,3,1,5,9,0,143,176,0,0,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,4,10,59,3,1,2,10,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,10,7,59,3,1,6,7,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,11,11,59,3,1,7,11,0,57,1,0,1,8,0,54,1,1,2,5,54,3,1,5,17,57,1,0,3,14,0,54,1,1,8,13,59,3,1,4,13,0,57,1,0,1,8,0,54,1,1,2,5,54,1,1,5,17,57,0,0,3,14,0,54,0,0,9,9,144,6,0,8,0,2,59,1,0,5,9,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,26,226,85,121,151,92,102,77,139,164,1,38,67,46,237,176,99,97,252,0 }; // NOLINT + const uint8_t k_UIManagerModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,91,118,229,148,131,162,124,21,112,108,2,216,152,172,103,24,243,59,129,40,36,3,0,0,0,0,0,0,10,0,0,0,2,0,0,0,11,0,0,0,15,0,0,0,0,0,0,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,2,0,2,9,128,1,0,244,2,0,2,0,0,0,2,49,2,0,8,123,0,0,0,244,2,0,26,2,1,1,6,172,2,0,2,4,128,4,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,7,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,5,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,6,0,244,2,0,2,0,0,0,6,172,2,0,2,4,0,2,0,244,2,0,2,0,0,0,6,176,2,0,10,35,0,4,0,244,2,0,34,0,1,0,6,211,2,0,2,20,128,3,0,244,2,0,18,0,1,0,6,231,2,0,4,12,128,6,0,244,2,0,4,0,0,0,6,4,0,0,0,11,0,0,128,131,196,115,11,23,36,244,238,117,156,159,56,243,225,151,216,183,148,255,237,18,236,232,22,44,178,62,176,23,209,169,253,221,230,234,44,18,202,201,225,169,59,249,95,0,0,0,0,0,0,0,12,38,0,0,15,68,0,0,6,22,0,0,8,80,0,0,14,108,0,0,5,118,0,0,16,150,0,0,14,178,0,0,10,194,0,0,10,214,0,0,8,230,0,0,10,250,0,0,15,24,1,0,10,76,97,121,111,117,116,77,111,100,117,108,101,110,100,66,97,116,99,104,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,103,108,111,98,97,108,67,97,108,108,85,73,70,117,110,99,116,105,111,110,72,105,112,112,121,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,99,97,108,108,85,73,70,117,110,99,116,105,111,110,99,114,101,97,116,101,78,111,100,101,108,101,116,101,78,111,100,101,100,111,99,117,109,101,110,116,102,108,117,115,104,66,97,116,99,104,115,101,110,100,82,101,110,100,101,114,69,114,114,111,114,117,112,100,97,116,101,78,111,100,101,0,0,50,0,100,0,0,1,0,92,0,50,3,108,2,3,118,0,115,1,2,0,83,1,2,0,1,42,3,0,1,115,1,1,0,83,1,2,0,1,42,3,1,1,48,1,57,2,1,1,6,0,3,1,100,4,3,2,0,63,1,4,9,100,4,3,3,0,63,1,4,14,100,4,3,4,0,63,1,4,10,100,4,3,5,0,63,1,4,12,100,4,3,6,0,63,1,4,4,100,4,3,7,0,63,1,4,8,100,4,3,8,0,63,1,4,7,100,3,3,9,0,63,1,3,13,59,2,1,1,11,0,92,0,118,0,92,0,41,0,0,46,5,0,0,54,4,5,1,5,108,9,1,108,8,2,108,7,3,108,6,4,8,10,5,79,0,4,5,118,0,92,0,41,0,0,46,1,0,1,54,0,1,1,7,81,0,0,1,118,0,92,0,108,0,1,144,7,0,118,1,92,1,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,61,188,49,15,163,238,169,33,236,255,37,248,152,195,126,87,230,43,130,0 }; // NOLINT + const uint8_t k_js2native[] = { 198,31,188,3,193,3,25,31,96,0,0,0,203,115,174,81,234,187,157,221,85,30,8,55,155,246,174,208,53,67,39,156,228,9,0,0,0,0,0,0,8,0,0,0,2,0,0,0,25,0,0,0,43,0,0,0,0,0,0,0,16,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,4,0,2,9,0,19,0,180,9,0,2,0,0,0,2,53,4,0,8,105,0,0,0,180,9,0,8,1,2,4,6,158,4,0,6,30,0,6,0,180,9,0,6,0,0,0,6,188,4,0,2,125,1,0,0,180,9,0,50,0,15,0,6,57,6,0,2,110,1,0,0,180,9,0,52,5,14,0,6,167,7,0,6,88,0,0,0,180,9,0,28,0,2,0,6,255,7,0,2,175,1,0,0,180,9,0,46,0,12,1,6,174,9,0,2,4,0,0,0,180,9,0,2,0,0,0,6,18,0,0,0,25,0,0,128,23,209,169,253,249,107,235,204,86,255,169,21,202,217,230,186,98,143,185,172,134,113,0,157,171,186,118,185,249,246,187,133,117,156,159,56,133,100,111,25,191,23,101,91,32,55,49,47,186,38,19,147,106,246,111,114,104,90,135,68,52,82,183,227,123,147,228,226,183,148,255,237,176,249,94,147,101,250,141,203,135,68,180,36,57,223,109,254,61,95,124,128,167,87,89,102,134,184,33,63,0,0,0,0,0,0,0,12,38,0,0,1,40,0,0,13,66,0,0,15,96,0,0,18,132,0,0,49,230,0,0,32,38,1,0,63,164,1,0,29,222,1,0,60,86,2,0,8,100,2,0,10,120,2,0,7,120,2,0,18,156,2,0,15,186,2,0,8,202,2,0,7,22,0,0,8,96,0,0,10,174,0,0,6,230,0,0,24,164,1,0,21,192,1,0,7,216,2,0,5,226,2,0,14,254,2,0,5,8,3,0,13,34,3,0,14,60,3,0,6,72,3,0,9,88,3,0,20,128,3,0,10,148,3,0,5,158,3,0,6,170,3,0,14,196,3,0,9,214,3,0,6,226,3,0,6,238,3,0,12,6,4,0,9,16,4,0,4,24,4,0,4,40,41,32,110,111,116,32,102,111,117,110,100,111,99,117,109,101,110,116,46,83,116,111,114,97,103,101,77,111,100,117,108,101,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,99,97,108,108,78,97,116,105,118,101,32,78,97,116,105,118,101,32,99,97,108,108,78,97,116,105,118,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,78,97,116,105,118,101,32,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,51,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,78,97,116,105,118,101,32,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,102,117,110,99,116,105,111,110,101,101,100,82,101,106,101,99,116,109,101,97,115,117,114,101,73,110,65,112,112,87,105,110,100,111,119,109,101,97,115,117,114,101,73,110,87,105,110,100,111,119,109,117,108,116,105,71,101,116,112,114,111,109,105,115,101,65,114,114,97,121,72,101,114,109,101,115,73,110,116,101,114,110,97,108,72,105,112,112,121,78,97,116,105,118,101,77,111,100,117,108,101,115,82,101,102,101,114,101,110,99,101,69,114,114,111,114,101,106,101,99,116,84,121,112,101,69,114,114,111,114,101,109,111,118,101,78,97,116,105,118,101,67,97,108,108,98,97,99,107,95,95,71,76,79,66,65,76,95,95,97,112,112,108,121,98,114,105,100,103,101,99,97,108,108,85,73,70,117,110,99,116,105,111,110,111,116,68,101,108,101,116,101,99,111,110,99,97,116,103,108,111,98,97,108,109,111,100,117,108,101,67,97,108,108,73,100,112,114,111,116,111,116,121,112,101,112,117,115,104,48,0,0,0,50,0,100,0,0,1,0,92,0,50,0,100,1,0,2,0,42,0,0,1,48,1,57,2,1,1,26,0,54,3,2,2,34,100,2,0,3,0,59,3,2,1,19,0,57,2,1,1,26,0,54,3,2,2,34,100,2,0,4,0,59,3,2,2,22,0,57,2,1,1,26,0,54,3,2,2,34,100,2,0,6,0,59,3,2,3,21,0,57,1,1,1,26,0,54,1,1,2,34,100,0,0,7,0,59,1,0,4,31,0,118,0,92,0,108,1,1,115,0,3,0,15,0,1,0,144,14,0,108,2,2,115,1,16,0,15,0,2,1,11,0,0,92,0,118,3,118,6,130,5,6,48,0,57,1,0,1,24,0,54,2,1,2,40,106,2,2,1,8,18,2,8,17,5,80,1,1,2,107,2,2,1,122,4,18,7,4,5,122,1,146,18,7,129,7,1,6,74,2,1,7,37,1,1,152,245,1,5,54,5,2,3,20,110,1,2,153,21,1,0,0,5,1,73,13,2,4,110,10,1,73,6,2,10,115,4,4,0,190,37,13,4,115,4,13,0,189,199,0,0,0,6,4,115,4,15,0,189,188,0,0,0,6,4,115,4,14,0,189,177,0,0,0,6,4,57,4,0,4,32,0,54,4,4,5,27,73,8,4,13,73,7,8,6,146,18,8,73,4,8,6,13,5,4,115,4,11,0,188,65,5,4,57,9,0,6,28,0,57,4,0,7,25,0,54,12,4,8,37,115,18,5,0,115,16,2,0,115,14,1,0,8,17,13,8,15,6,79,17,12,5,54,5,9,2,40,106,5,5,9,8,18,5,80,4,9,2,107,4,5,4,95,4,7,9,0,0,54,4,2,3,20,18,4,1,4,8,5,1,146,30,4,54,11,9,9,42,73,4,2,5,83,4,11,9,4,22,5,5,10,54,4,2,3,20,152,233,5,4,54,5,7,10,33,54,10,9,3,20,118,4,146,6,10,8,4,9,84,4,5,7,8,4,92,3,73,17,2,1,110,1,3,73,14,2,1,57,1,0,11,38,0,54,1,1,12,26,54,3,1,13,18,54,2,3,14,35,7,15,0,0,8,18,3,8,16,6,79,1,2,5,92,1,57,2,0,15,30,0,54,0,2,2,40,106,1,0,2,115,17,6,0,8,18,1,80,0,2,2,107,0,1,0,95,0,50,1,118,5,130,4,5,48,0,57,2,0,1,24,0,54,3,2,2,40,106,3,3,2,8,19,3,8,18,4,80,2,2,2,107,8,3,2,122,2,18,6,2,4,122,3,146,18,6,129,6,3,5,74,8,3,6,37,3,3,152,245,3,4,54,3,8,3,20,110,7,2,153,246,0,0,0,3,7,73,14,8,2,42,1,0,14,110,6,1,73,2,8,6,42,1,1,2,57,3,0,4,32,0,54,3,3,5,27,73,4,3,14,42,1,2,4,146,10,4,73,3,4,2,144,80,3,57,9,0,6,23,0,54,5,9,7,29,57,11,0,8,28,0,57,3,0,9,25,0,54,13,3,10,37,115,19,9,0,115,17,2,0,115,15,1,0,8,18,14,8,16,2,79,18,13,5,54,10,11,2,40,106,10,10,11,8,19,10,80,3,11,2,107,3,10,3,83,3,5,9,3,92,3,73,3,4,2,42,1,3,3,7,2,0,0,42,1,4,2,54,5,8,3,20,18,5,7,5,146,30,5,54,9,2,11,42,73,5,8,7,83,5,9,2,5,22,7,7,6,54,5,8,3,20,152,233,7,5,54,6,3,12,41,115,5,17,0,188,37,6,5,57,6,0,6,23,0,54,5,6,2,40,106,5,5,6,100,18,1,5,0,8,19,5,80,1,6,2,107,1,5,1,92,1,54,1,3,13,33,84,1,1,3,4,2,92,1,57,2,0,6,23,0,54,1,2,7,29,57,4,0,14,30,0,54,0,4,2,40,106,3,0,4,115,18,10,0,8,19,3,80,0,4,2,107,0,3,0,83,0,1,2,0,92,0,41,0,1,46,4,0,0,41,1,0,46,3,1,0,46,2,1,1,118,0,84,2,4,0,3,2,146,20,2,46,4,1,4,54,3,4,1,42,108,2,2,83,2,3,4,2,46,4,1,4,54,3,4,1,42,108,2,1,83,2,3,4,2,46,4,1,3,54,3,4,2,33,46,2,1,2,46,1,1,4,84,1,3,4,2,1,92,0,118,4,130,3,4,48,0,57,1,0,1,24,0,54,2,1,2,40,106,2,2,1,8,16,2,8,15,3,80,1,1,2,107,5,2,1,122,1,18,6,1,3,122,2,146,18,6,129,6,2,4,74,5,2,6,37,2,2,152,245,2,3,54,2,5,3,20,110,3,3,153,73,1,0,0,2,3,73,9,5,1,110,10,1,73,1,5,10,110,2,2,73,4,5,2,54,2,5,3,20,189,178,0,0,0,2,3,57,2,0,4,32,0,54,2,2,5,27,73,7,2,9,147,181,0,0,0,7,73,2,7,1,147,171,0,0,0,2,73,6,7,1,7,8,0,0,54,2,5,3,20,18,2,3,2,146,30,2,54,11,8,6,42,73,2,5,3,83,2,11,8,2,22,3,3,10,54,2,5,3,20,152,233,3,2,57,2,0,4,32,0,54,2,2,7,39,57,5,0,4,32,0,54,3,5,7,39,22,3,3,10,59,5,3,1,39,0,7,5,0,0,121,3,190,22,4,3,54,10,5,6,42,3,3,120,11,63,3,11,36,83,3,10,5,3,54,3,5,6,42,83,3,3,5,2,54,3,5,8,37,83,5,3,5,8,54,3,6,9,33,84,3,3,6,7,5,92,2,57,2,0,4,32,0,54,2,2,5,27,73,3,2,9,146,10,3,73,2,3,1,144,64,2,57,6,0,10,28,0,57,2,0,11,25,0,54,8,2,8,37,115,16,7,0,115,14,2,0,115,12,1,0,8,15,9,8,13,1,79,15,8,5,54,5,6,2,40,106,5,5,6,8,16,5,80,2,6,2,107,2,5,2,95,2,121,2,188,14,4,2,73,2,3,1,81,2,2,3,92,2,73,2,3,1,3,1,120,4,63,1,4,36,83,1,2,3,1,92,1,57,2,0,12,30,0,54,0,2,2,40,106,1,0,2,115,15,8,0,8,16,1,80,0,2,2,107,0,1,0,95,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,127,123,26,5,151,107,170,22,105,211,80,222,171,190,181,158,159,76,73,0 }; // NOLINT + const uint8_t k_TimerModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,66,50,225,120,190,183,211,88,157,63,204,53,11,89,181,106,161,32,51,251,184,5,0,0,0,0,0,0,12,0,0,0,2,0,0,0,24,0,0,0,26,0,0,0,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,3,0,2,9,128,3,0,136,5,0,2,0,0,0,2,25,3,0,8,126,0,0,0,136,5,0,26,1,1,6,6,151,3,0,6,80,0,0,0,136,5,0,28,2,5,0,6,231,3,0,2,26,0,0,0,136,5,0,26,0,1,0,6,1,4,0,4,51,0,0,0,136,5,0,22,0,3,0,6,52,4,0,6,80,0,0,0,136,5,0,28,2,5,0,6,231,3,0,2,26,0,0,0,136,5,0,26,0,1,0,6,132,4,0,4,51,0,0,0,136,5,0,22,0,3,0,6,183,4,0,6,37,0,0,0,136,5,0,26,1,1,0,6,220,4,0,4,71,0,0,0,136,5,0,24,2,4,0,6,35,5,0,2,47,0,3,0,136,5,0,22,0,2,0,6,82,5,0,4,51,0,0,0,136,5,0,22,0,3,0,6,2,0,0,0,24,0,0,128,171,186,118,185,54,214,238,134,126,117,229,60,23,191,121,130,228,219,24,40,135,68,180,36,102,114,52,205,240,49,222,168,206,119,223,217,228,154,17,179,208,84,119,196,230,147,217,236,52,82,183,227,132,179,196,162,180,218,129,50,103,30,150,231,98,242,76,209,178,163,245,173,253,16,11,73,94,18,151,157,61,95,124,128,246,86,103,237,247,80,11,80,9,248,128,22,0,0,0,0,0,0,0,11,22,0,0,5,32,0,0,18,68,0,0,13,94,0,0,12,116,0,0,13,140,0,0,6,152,0,0,4,160,0,0,6,170,0,0,19,208,0,0,19,246,0,0,11,12,1,0,10,32,1,0,5,42,1,0,4,50,1,0,18,86,1,0,13,112,1,0,12,136,1,0,10,156,1,0,9,174,1,0,3,180,1,0,9,198,1,0,11,220,1,0,10,240,1,0,5,84,105,109,101,114,77,111,100,117,108,101,65,114,114,97,121,67,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,67,108,101,97,114,73,110,116,101,114,118,97,108,67,108,101,97,114,84,105,109,101,111,117,116,105,109,101,82,101,109,97,105,110,105,110,103,108,111,98,97,108,68,97,116,101,78,117,109,98,101,114,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,82,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,83,101,116,73,110,116,101,114,118,97,108,83,101,116,84,105,109,101,111,117,116,97,112,112,108,121,99,97,108,108,99,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,99,108,101,97,114,73,110,116,101,114,118,97,108,99,108,101,97,114,84,105,109,101,111,117,116,100,105,100,84,105,109,101,111,117,116,105,115,73,110,116,101,103,101,114,110,111,119,112,114,111,116,111,116,121,112,101,115,101,116,73,110,116,101,114,118,97,108,115,101,116,84,105,109,101,111,117,116,115,108,105,99,101,0,0,0,50,0,100,0,0,1,0,92,0,50,1,108,3,3,118,0,115,2,1,0,83,2,3,0,2,42,1,0,2,48,2,57,4,2,1,7,0,100,3,1,2,0,59,4,3,1,24,0,57,4,2,1,7,0,100,3,1,4,0,59,4,3,2,18,0,57,4,2,1,7,0,100,3,1,5,0,59,4,3,3,23,0,57,4,2,1,7,0,100,3,1,7,0,59,4,3,4,17,0,57,4,2,1,7,0,100,3,1,8,0,59,4,3,5,10,0,57,2,2,1,7,0,100,1,1,11,0,59,2,1,6,16,0,92,0,50,0,118,1,108,2,1,42,0,0,2,48,2,57,2,2,1,2,0,54,2,2,2,22,54,4,2,3,25,54,3,4,4,15,131,1,8,2,1,110,1,2,84,1,3,4,2,1,42,0,1,1,41,1,0,46,3,1,0,54,2,3,5,13,100,1,0,3,0,108,0,2,84,0,2,3,1,0,92,0,41,0,0,46,3,0,0,54,2,3,1,14,46,1,0,1,119,0,84,0,2,3,0,1,92,0,108,2,1,48,0,57,1,0,1,9,0,54,0,1,2,20,83,0,0,1,2,146,26,0,122,0,170,21,2,0,41,0,0,46,1,0,0,54,0,1,3,5,83,0,0,1,2,118,0,92,0,50,0,118,1,108,2,1,42,0,0,2,48,2,57,2,2,1,2,0,54,2,2,2,22,54,4,2,3,25,54,3,4,4,15,131,1,8,2,1,110,1,2,84,1,3,4,2,1,42,0,1,1,41,1,0,46,3,1,0,54,2,3,5,12,100,1,0,6,0,108,0,2,84,0,2,3,1,0,92,0,108,2,1,48,0,57,1,0,1,9,0,54,0,1,2,20,83,0,0,1,2,146,26,0,122,0,170,21,2,0,41,0,0,46,1,0,0,54,0,1,3,4,83,0,0,1,2,118,0,92,0,50,0,108,1,1,42,0,0,1,41,1,0,46,3,1,0,54,2,3,1,11,100,1,0,9,0,108,0,2,84,0,2,3,1,0,92,0,50,0,108,3,1,48,1,57,2,1,1,8,0,54,1,2,2,21,81,1,1,2,42,0,0,1,54,1,3,3,6,42,0,1,1,41,1,0,46,2,1,0,3,1,54,3,3,4,19,63,1,3,19,100,0,0,10,0,63,1,0,6,118,0,83,1,2,0,1,92,0,41,0,0,46,1,0,1,48,2,57,3,2,1,8,0,54,2,3,2,21,81,2,2,3,46,0,0,0,29,0,2,0,29,1,1,0,122,0,152,7,1,0,8,0,1,92,0,108,2,1,48,0,57,1,0,1,9,0,54,0,1,2,20,83,0,0,1,2,146,26,0,122,0,170,21,2,0,41,0,0,46,1,0,0,54,0,1,3,3,83,0,0,1,2,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,193,244,215,156,146,236,124,186,22,61,238,51,177,92,118,241,20,220,219,0 }; // NOLINT + const uint8_t k_promise[] = { 198,31,188,3,193,3,25,31,96,0,0,0,150,232,96,222,75,189,62,200,228,9,155,212,42,131,168,27,43,131,138,224,32,20,0,0,0,0,0,0,44,0,0,0,2,0,0,0,33,0,0,0,52,0,0,0,0,0,0,0,114,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,6,0,2,9,0,24,0,164,19,0,2,0,0,0,2,29,6,0,8,101,1,0,0,164,19,0,28,23,2,12,6,130,7,0,2,4,0,7,0,164,19,0,2,0,0,0,6,134,7,0,4,25,0,6,0,164,19,0,4,0,1,0,14,159,7,0,6,36,128,8,0,180,19,0,22,0,0,0,14,195,7,0,8,43,128,7,0,196,19,0,26,0,0,0,14,238,7,0,4,153,0,12,0,212,19,0,26,0,2,4,6,135,8,0,8,55,0,9,0,212,19,0,22,3,2,0,6,190,8,0,6,104,0,0,0,212,19,0,34,0,2,0,6,38,9,0,6,193,0,4,0,212,19,0,30,0,6,2,6,231,9,0,6,41,128,4,0,212,19,0,26,2,1,0,6,16,10,0,2,208,0,0,0,212,19,0,32,0,5,0,6,224,10,0,6,232,0,10,0,212,19,0,32,0,4,2,6,200,11,0,6,64,0,17,0,212,19,0,28,0,1,2,6,8,12,0,4,127,128,5,0,212,19,0,30,0,3,1,6,135,12,0,8,62,128,1,0,212,19,0,14,0,0,3,6,197,12,0,6,81,0,5,0,212,19,0,36,2,0,0,6,22,13,0,4,44,0,0,0,212,19,0,26,0,0,0,6,66,13,0,4,44,0,0,0,212,19,0,26,0,0,0,6,110,13,0,4,52,0,2,0,212,19,0,22,0,2,2,6,162,13,0,6,115,0,0,0,212,19,0,36,0,2,0,6,21,14,0,6,56,0,0,0,212,19,0,32,0,2,0,6,77,14,0,4,34,0,0,0,212,19,0,26,1,1,0,6,111,14,0,2,9,0,0,0,212,19,0,2,0,0,0,6,120,14,0,4,35,0,0,0,212,19,0,26,1,1,0,6,155,14,0,4,56,0,0,0,212,19,0,26,1,2,0,6,211,14,0,2,9,0,0,0,212,19,0,2,0,0,0,6,220,14,0,4,56,0,0,0,212,19,0,26,1,2,0,6,111,14,0,2,9,0,0,0,212,19,0,2,0,0,0,6,20,15,0,4,23,1,0,0,212,19,0,32,1,3,0,14,43,16,0,6,19,0,0,0,240,19,0,22,0,0,0,6,62,16,0,4,105,128,6,0,240,19,0,24,0,5,0,6,167,16,0,4,33,128,6,0,240,19,0,22,0,4,0,6,200,16,0,4,54,0,0,0,240,19,0,26,1,1,0,6,254,16,0,6,113,0,0,0,240,19,0,32,4,1,0,6,111,17,0,6,75,1,1,0,240,19,0,36,1,5,0,6,186,18,0,4,27,0,0,0,240,19,0,26,0,0,0,6,186,18,0,4,27,0,0,0,240,19,0,26,0,0,0,6,213,18,0,4,43,0,0,0,240,19,0,22,1,1,0,6,43,16,0,6,19,0,0,0,240,19,0,22,0,0,0,6,0,19,0,4,43,0,0,0,240,19,0,22,1,1,0,6,43,19,0,6,54,0,0,0,240,19,0,24,2,1,0,6,97,19,0,4,46,0,0,0,240,19,0,26,0,2,0,6,143,19,0,4,21,0,0,0,240,19,0,26,0,1,0,6,19,0,0,0,33,0,0,128,58,189,42,136,1,68,164,178,235,242,154,240,5,115,81,0,126,251,17,101,134,113,0,157,127,147,209,126,110,212,109,117,114,224,8,140,86,255,169,21,18,136,156,63,171,186,118,185,230,109,38,50,61,95,124,128,186,38,19,147,32,55,49,47,181,166,126,88,150,170,96,249,212,253,129,106,255,26,4,193,74,234,31,170,122,152,39,42,52,82,183,227,155,34,212,135,189,231,83,181,132,179,196,162,227,201,203,133,241,210,24,42,102,54,240,234,135,68,180,36,134,184,33,63,247,80,11,80,9,248,128,22,0,0,0,0,0,0,0,41,40,0,0,3,88,0,0,7,110,0,0,12,120,0,0,48,200,0,0,8,234,0,0,36,58,1,0,6,58,1,0,14,84,1,0,9,102,1,0,6,126,1,0,7,140,1,0,15,172,1,0,4,222,1,0,10,240,1,0,6,250,1,0,10,32,2,0,8,4,0,0,7,40,0,0,7,82,0,0,9,100,0,0,4,108,0,0,6,120,0,0,7,136,0,0,11,212,0,0,11,50,1,0,5,110,1,0,6,118,1,0,4,160,1,0,5,170,1,0,5,178,1,0,9,196,1,0,9,212,1,0,6,2,2,0,3,14,2,0,10,48,2,0,14,76,2,0,9,78,2,0,10,98,2,0,6,110,2,0,5,120,2,0,4,126,2,0,4,134,2,0,4,142,2,0,7,156,2,0,7,170,2,0,4,178,2,0,6,190,2,0,4,198,2,0,10,218,2,0,5,65,32,112,114,111,109,105,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,115,111,108,118,101,100,32,119,105,116,104,32,105,116,115,101,108,102,46,95,111,110,72,97,110,100,108,101,114,97,99,101,95,118,97,108,117,101,80,114,111,109,105,115,101,32,99,111,110,115,116,114,117,99,116,111,114,39,115,32,97,114,103,117,109,101,110,116,32,105,115,32,110,111,116,32,97,32,102,117,110,99,116,105,111,110,70,117,108,102,105,108,108,101,100,80,114,111,109,105,115,101,115,32,109,117,115,116,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,118,105,97,32,110,101,119,99,97,116,99,104,97,110,100,108,101,82,101,115,111,108,118,101,100,111,82,101,115,111,108,118,101,102,105,110,97,108,101,110,103,116,104,101,110,103,101,116,84,104,101,110,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,95,110,111,111,112,114,111,116,111,116,121,112,101,84,121,112,101,69,114,114,111,114,101,106,101,99,116,114,121,67,97,108,108,84,119,111,98,106,101,99,116,114,121,67,97,108,108,79,110,101,95,100,101,102,101,114,114,101,100,115,97,102,101,84,104,101,110,95,100,101,102,101,114,114,101,100,83,116,97,116,101,95,111,110,82,101,106,101,99,116,101,100,95,115,116,97,116,101,97,112,112,108,121,98,105,110,100,111,110,101,99,97,108,108,102,105,110,97,108,108,121,102,111,114,69,97,99,104,102,114,111,109,103,108,111,98,97,108,112,117,115,104,115,101,116,84,105,109,101,111,117,116,115,108,105,99,101,0,0,48,0,0,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,9,0,100,2,1,3,0,42,1,10,2,100,2,1,4,0,42,1,11,2,100,2,1,5,0,42,1,12,2,100,2,1,6,0,42,1,13,2,100,3,1,7,0,42,1,14,3,100,3,1,9,0,42,1,15,3,100,3,1,10,0,42,1,16,3,100,3,1,12,0,42,1,17,3,100,3,1,13,0,42,1,18,3,100,3,1,14,0,42,1,19,3,100,3,1,15,0,42,1,20,3,100,3,1,16,0,42,1,21,3,100,4,1,19,0,42,1,22,4,119,3,44,1,0,3,3,5,42,1,1,5,59,2,3,1,21,0,59,2,3,2,38,0,59,2,0,3,31,0,54,5,2,1,32,100,0,1,20,0,59,5,0,4,29,0,54,5,2,1,32,100,0,1,21,0,59,5,0,5,43,0,54,5,2,1,32,100,0,1,24,0,59,5,0,6,45,0,118,0,120,5,83,5,4,0,5,42,1,2,5,121,5,83,5,4,0,5,42,1,3,5,83,3,4,0,3,42,1,4,3,83,3,4,0,0,42,1,5,3,122,3,83,3,4,0,3,42,1,6,3,115,3,0,0,83,3,4,0,3,42,1,7,3,100,3,1,29,0,59,2,3,7,20,0,100,3,1,31,0,42,1,8,3,100,3,1,33,0,59,2,3,8,35,0,100,3,1,38,0,59,2,3,9,34,0,100,3,1,40,0,59,2,3,10,22,0,54,3,2,1,32,100,1,1,43,0,59,3,1,11,27,0,48,1,57,1,1,2,48,0,59,1,2,12,24,0,92,0,118,0,92,0,108,0,1,54,0,0,1,29,92,0,93,1,41,0,0,42,0,0,1,46,0,0,1,92,0,108,1,1,108,0,2,8,2,1,8,1,0,118,0,83,0,2,0,1,92,0,93,1,41,0,0,42,0,0,1,46,0,0,1,92,0,108,2,1,108,1,2,108,0,3,8,3,2,8,2,1,8,1,0,118,0,84,1,3,0,2,1,92,0,93,1,41,0,0,42,0,0,1,46,0,0,1,92,0,108,3,1,108,2,0,13,1,2,115,0,16,0,190,106,1,0,13,1,3,115,0,6,0,190,61,1,0,122,0,59,2,0,1,37,0,59,2,0,2,40,0,119,0,59,2,0,3,23,0,59,2,0,4,36,0,41,0,0,46,1,0,9,188,18,3,1,46,1,0,21,118,0,84,1,1,0,3,2,92,0,118,0,92,0,48,0,57,2,0,1,33,0,54,0,2,2,32,106,1,0,2,115,5,5,0,8,6,1,80,0,2,2,107,0,1,0,95,0,48,0,57,2,0,1,33,0,54,0,2,2,32,106,1,0,2,115,5,7,0,8,6,1,80,0,2,2,107,0,1,0,95,0,50,0,108,1,1,42,0,0,1,108,2,2,42,0,1,2,108,2,3,42,0,2,2,54,2,1,1,25,54,1,2,2,32,106,1,1,2,100,3,0,8,0,8,4,1,80,0,2,2,107,0,1,0,92,0,41,1,1,46,3,1,13,46,9,1,9,54,2,3,1,32,106,2,2,3,8,10,2,80,0,3,2,107,6,2,0,54,3,6,2,29,108,2,1,108,0,2,84,0,3,6,2,0,46,3,1,15,41,0,0,46,2,0,0,46,5,1,20,46,9,0,1,46,8,0,2,54,1,5,1,32,106,1,1,5,8,10,1,8,7,6,80,0,5,4,107,1,1,0,118,0,84,1,3,0,2,1,92,0,108,0,1,108,1,2,54,2,0,1,40,110,4,3,8,3,0,8,0,3,190,24,2,4,54,5,3,2,23,54,2,5,1,40,8,3,5,8,0,3,188,240,2,4,41,2,0,46,3,2,13,54,3,3,3,21,146,17,3,46,4,2,13,54,3,4,3,21,83,3,3,4,0,54,4,0,1,40,122,3,188,18,4,3,46,4,2,16,118,2,84,4,4,2,0,1,92,2,54,2,0,4,37,188,71,2,3,54,3,0,4,37,110,2,1,188,23,3,2,54,3,0,5,36,54,2,3,6,49,83,2,2,3,1,118,2,92,2,110,2,2,59,0,2,1,37,0,54,3,0,5,36,7,2,2,0,68,2,3,0,68,2,1,1,59,0,2,2,36,0,118,2,92,2,110,2,1,59,0,2,1,37,0,59,0,1,2,36,0,118,0,92,0,50,1,108,0,1,42,1,0,0,108,0,2,42,1,1,0,48,0,57,3,0,1,50,0,118,0,100,2,1,11,0,122,1,84,1,3,0,2,1,92,0,41,0,0,46,1,0,0,54,1,1,1,40,110,2,1,188,15,1,2,46,1,0,1,54,6,1,2,39,142,11,46,1,0,1,54,6,1,3,26,119,1,188,82,6,1,41,3,1,46,5,3,11,46,1,0,0,54,4,1,4,23,118,1,84,6,5,1,6,4,46,4,3,1,188,25,6,4,46,5,3,17,46,4,0,1,54,4,4,5,19,84,4,5,1,4,6,142,25,46,5,3,18,46,4,0,1,54,4,4,5,19,46,3,3,0,84,3,5,1,4,3,92,1,46,1,0,0,54,1,1,1,40,188,39,1,2,41,1,1,46,4,1,18,46,1,0,1,54,3,1,5,19,46,1,0,0,54,2,1,4,23,118,1,84,1,4,1,3,2,142,35,41,1,1,46,3,1,17,46,1,0,1,54,2,1,5,19,46,0,0,0,54,1,0,4,23,118,0,84,0,3,0,2,1,118,0,92,0,108,3,1,108,2,2,189,177,0,0,0,2,3,146,75,2,13,1,2,115,0,16,0,188,12,1,0,115,0,6,0,190,57,1,0,41,1,0,46,4,1,10,118,0,83,6,4,0,2,46,4,1,1,188,114,6,4,54,4,3,1,29,190,15,6,4,46,4,1,13,39,4,2,4,144,67,4,13,5,6,115,4,6,0,188,35,5,4,110,4,1,59,3,4,1,40,0,59,3,2,2,23,0,41,4,0,46,5,4,19,118,4,83,5,5,4,3,92,4,46,5,1,21,54,4,6,2,42,83,4,4,6,2,84,4,5,0,4,3,92,0,110,4,3,59,3,4,1,40,0,59,3,2,2,23,0,46,2,1,19,83,2,2,0,3,92,0,46,2,1,18,46,1,1,0,84,1,2,0,3,1,92,0,41,0,0,46,2,0,18,48,0,57,4,0,3,33,0,54,0,4,4,32,106,1,0,4,115,8,1,0,8,9,1,80,0,4,2,107,1,1,0,118,0,84,1,2,0,3,1,92,0,108,2,1,108,4,2,110,0,2,59,2,0,1,40,0,59,2,4,2,23,0,41,0,0,46,1,0,13,54,1,1,1,38,146,18,1,46,3,0,13,54,1,3,1,38,84,1,1,3,2,4,46,1,0,19,118,0,83,1,1,0,2,92,0,108,1,1,54,2,1,1,37,110,0,1,190,32,2,0,41,0,0,46,3,0,15,54,2,1,2,36,118,0,84,0,3,0,1,2,119,0,59,1,0,1,36,0,54,2,1,1,37,110,0,2,190,72,2,0,54,0,1,2,36,54,0,0,3,28,122,4,18,0,4,0,41,3,0,118,2,146,39,0,46,5,3,15,54,0,1,2,36,73,0,0,4,84,0,5,2,1,0,37,4,4,54,0,1,2,36,54,0,0,3,28,152,224,4,0,119,0,59,1,0,1,36,0,118,0,92,0,108,5,1,108,2,2,108,1,0,13,6,5,115,4,6,0,119,3,190,7,6,4,8,3,5,59,1,3,1,26,0,13,3,2,119,0,190,7,3,4,8,0,2,59,1,0,2,39,0,108,0,3,59,1,0,3,19,0,118,0,92,0,50,4,108,3,2,42,4,0,3,121,0,44,4,1,0,41,1,0,46,7,1,12,118,0,108,6,1,100,5,4,17,0,100,2,4,18,0,85,5,7,0,6,5,2,46,2,4,1,144,31,2,46,2,1,1,190,24,5,2,120,2,44,4,1,2,46,2,1,18,46,1,1,0,84,1,2,0,3,1,92,0,41,0,0,46,1,0,1,144,33,1,120,1,44,0,1,1,41,1,1,46,3,1,17,46,2,0,0,118,0,108,1,1,84,1,3,0,2,1,92,0,118,0,92,0,41,0,0,46,1,0,1,144,33,1,120,1,44,0,1,1,41,1,1,46,3,1,18,46,2,0,0,118,0,108,1,1,84,1,3,0,2,1,92,0,118,0,92,0,41,0,0,46,2,0,13,54,3,2,1,31,54,1,2,2,32,106,1,1,2,8,4,1,80,0,2,2,107,0,1,0,110,1,1,59,0,1,1,40,0,108,1,1,59,0,1,2,23,0,92,0,108,4,1,108,3,2,108,2,0,54,5,2,1,25,41,0,0,46,1,0,13,190,79,5,1,46,6,0,13,46,10,0,9,54,5,6,2,32,106,5,5,6,8,11,5,80,1,6,2,107,1,5,1,46,7,0,15,46,5,0,20,54,6,5,2,32,106,6,6,5,8,11,6,8,10,4,8,9,3,8,8,1,80,5,5,4,107,6,6,5,118,5,84,5,7,5,2,6,92,1,46,1,0,14,118,0,85,0,1,0,2,4,3,92,0,108,5,0,118,0,118,1,130,2,1,8,4,5,146,21,2,54,3,5,1,29,54,2,3,2,41,131,1,84,4,2,3,5,1,54,3,4,1,29,119,2,50,1,100,1,1,22,0,84,1,3,4,2,1,92,0,50,1,108,0,1,42,1,0,0,48,0,57,3,0,1,50,0,118,0,100,2,1,23,0,122,1,84,1,3,0,2,1,92,0,41,0,0,46,0,0,0,95,0,50,0,108,3,0,108,1,1,42,0,0,1,54,2,3,1,29,100,1,0,25,0,100,0,0,27,0,84,0,2,3,1,0,92,0,50,0,108,1,1,42,0,0,1,41,1,1,46,3,1,13,54,2,3,1,20,41,1,0,46,4,1,0,118,1,81,1,4,1,83,2,2,3,1,54,1,2,2,29,100,0,0,26,0,83,0,1,2,0,92,0,41,0,0,46,0,0,0,92,0,50,0,108,1,1,42,0,0,1,41,1,1,46,3,1,13,54,2,3,1,20,41,1,0,46,4,1,0,118,1,81,1,4,1,83,2,2,3,1,54,1,2,2,29,100,0,0,28,0,83,0,1,2,0,92,0,108,5,1,50,2,8,3,5,118,7,118,4,41,1,0,46,0,1,13,39,5,5,0,8,0,3,145,251,0,0,0,5,119,5,189,237,0,0,0,0,5,8,5,3,189,221,0,0,0,5,7,8,6,3,120,5,189,203,0,0,0,6,5,8,6,3,121,5,189,185,0,0,0,6,5,8,6,3,122,5,189,167,0,0,0,6,5,8,6,3,115,5,0,0,189,147,0,0,0,6,5,8,5,3,13,6,5,115,5,16,0,188,18,6,5,8,5,3,13,6,5,115,5,6,0,190,26,6,5,8,5,3,54,5,5,1,29,8,4,5,13,6,5,115,5,6,0,188,18,6,5,46,6,1,22,8,5,3,83,5,6,7,5,92,5,46,5,1,13,8,6,4,54,4,6,2,42,83,8,4,6,3,54,4,5,3,32,106,4,4,5,8,9,4,80,3,5,2,107,3,4,3,92,3,93,3,42,2,0,3,46,4,1,13,54,3,4,3,32,106,3,3,4,100,8,2,30,0,8,9,3,80,2,4,2,107,2,3,2,92,2,46,2,1,7,92,2,46,2,1,6,92,2,46,2,1,3,92,2,46,2,1,2,92,2,46,2,1,5,92,2,46,1,1,4,92,1,92,0,41,0,0,46,2,0,0,108,1,2,118,0,83,1,1,0,2,92,0,108,2,1,48,0,57,1,0,1,30,0,54,1,1,2,47,13,3,1,115,1,6,0,188,46,3,1,41,3,0,50,1,100,1,1,32,0,42,3,8,1,57,1,0,1,30,0,54,1,1,3,32,54,3,1,4,51,54,1,3,5,44,83,1,1,3,2,92,1,57,1,0,1,30,0,54,3,1,2,47,41,1,0,42,1,8,3,57,1,0,1,30,0,54,0,1,2,47,83,0,0,1,2,92,0,48,0,57,0,0,1,30,0,54,0,0,2,32,54,2,0,3,51,54,1,2,4,44,108,0,1,83,0,1,2,0,92,0,50,0,41,1,0,46,4,1,8,118,3,108,2,1,83,2,4,3,2,42,0,0,2,46,2,1,13,54,1,2,1,32,106,1,1,2,100,5,0,34,0,8,6,1,80,0,2,2,107,0,1,0,92,0,50,6,108,2,1,42,6,0,2,108,0,2,42,6,1,0,100,5,6,35,0,42,6,3,5,41,4,0,46,0,4,0,54,0,0,1,28,122,3,188,61,0,3,46,0,4,0,54,1,0,1,28,42,6,2,1,54,0,0,1,28,18,1,3,0,118,0,122,3,146,29,1,46,1,4,0,73,6,1,3,84,6,5,0,3,6,37,3,3,54,1,1,1,28,152,234,3,1,92,0,118,1,7,0,0,0,83,0,2,1,0,92,0,50,1,108,3,1,108,0,2,42,1,0,3,146,78,0,13,4,0,115,2,16,0,188,12,4,2,115,2,6,0,190,60,4,2,41,2,2,46,4,2,13,39,4,0,4,146,29,4,54,5,0,1,29,46,4,2,13,54,4,4,2,32,54,4,4,1,29,189,134,0,0,0,5,4,54,4,0,1,29,13,6,4,115,5,6,0,188,54,6,5,41,5,1,46,6,5,0,74,6,3,0,41,6,0,46,7,6,2,38,8,7,42,6,2,8,122,7,190,19,8,7,46,7,6,0,46,6,5,0,118,5,83,5,7,5,6,118,5,92,5,46,5,2,13,54,2,4,3,42,83,10,2,4,0,54,4,5,2,32,106,4,4,5,8,11,4,80,2,5,2,107,6,4,2,54,5,6,1,29,41,2,0,46,4,2,1,100,2,1,37,0,84,2,5,6,2,4,118,2,92,2,54,2,0,4,40,110,5,3,8,4,0,8,0,4,190,24,2,5,54,6,4,5,23,54,2,6,4,40,8,4,6,8,0,4,188,240,2,5,54,4,0,4,40,110,2,1,188,62,4,2,54,4,0,4,40,110,2,2,190,23,4,2,41,2,0,46,5,2,1,54,4,0,5,23,118,2,83,2,5,2,4,54,4,0,1,29,41,2,0,46,2,2,1,100,1,1,36,0,84,1,4,0,1,2,118,1,92,1,41,1,0,46,2,1,3,54,1,0,5,23,118,0,84,0,2,0,3,1,92,0,41,0,1,46,3,0,3,41,0,0,46,2,0,0,118,0,108,1,1,84,1,3,0,2,1,92,0,50,0,108,1,1,42,0,0,1,41,1,0,46,2,1,13,54,1,2,1,32,106,1,1,2,100,3,0,39,0,8,4,1,80,0,2,2,107,0,1,0,92,0,50,0,108,1,1,42,0,0,1,41,1,0,46,2,1,13,54,1,2,1,32,106,1,1,2,100,3,0,41,0,8,4,1,80,0,2,2,107,0,1,0,92,0,50,1,108,0,1,42,1,0,0,108,0,2,42,1,1,0,41,0,1,46,3,0,8,41,0,0,46,2,0,0,118,0,83,3,3,0,2,54,2,3,1,46,100,1,1,42,0,83,1,2,3,1,92,0,41,0,2,46,2,0,13,54,1,2,1,20,108,0,1,83,3,1,2,0,54,2,3,2,29,41,0,0,46,1,0,0,46,0,0,1,84,0,2,3,1,0,118,0,92,0,108,3,0,54,2,3,1,29,119,1,108,0,1,84,0,2,3,1,0,92,0,1,0,0,0,3,0,0,0,8,0,0,0,10,0,0,0,1,0,0,0,6,0,0,0,19,0,0,0,21,0,0,0,1,0,0,0,9,0,0,0,26,0,0,0,28,0,0,0,2,0,0,0,129,0,0,0,151,0,0,0,204,0,0,0,165,0,0,0,202,0,0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,220,115,6,113,29,209,154,37,48,211,242,58,168,35,18,134,250,185,0 }; // NOLINT + const uint8_t k_ConsoleModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,28,178,171,24,124,248,30,50,160,230,245,220,127,221,48,82,60,223,17,41,120,18,0,0,0,0,0,0,22,0,0,0,2,0,0,0,37,0,0,0,98,0,0,0,0,0,0,0,28,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,109,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,7,0,2,9,128,31,0,72,18,0,2,0,0,0,2,169,7,0,8,239,0,0,0,72,18,0,30,12,5,2,6,152,8,0,4,56,128,23,0,72,18,0,26,0,0,0,6,208,8,0,2,34,0,22,0,72,18,0,22,0,2,0,6,242,8,0,6,200,0,24,0,72,18,0,28,0,8,0,6,186,9,0,4,75,128,21,0,72,18,0,24,0,5,0,6,5,10,0,4,42,0,21,0,72,18,0,22,0,2,0,6,47,10,0,6,73,128,20,0,72,18,0,26,0,2,0,6,120,10,0,4,54,0,23,0,72,18,0,26,3,3,0,6,174,10,0,6,53,0,0,0,72,18,0,32,0,2,0,6,227,10,0,4,61,128,27,0,72,18,0,16,0,1,0,6,32,11,0,4,255,2,29,0,72,18,0,46,6,17,0,6,31,14,0,4,43,0,0,0,72,18,0,30,0,0,0,6,74,14,0,4,44,0,0,0,72,18,0,34,0,0,0,6,118,14,0,6,116,0,0,0,72,18,0,44,0,3,0,6,234,14,0,4,0,1,0,0,72,18,0,48,0,6,0,6,234,15,0,4,113,129,28,0,72,18,0,42,0,4,0,6,91,17,0,4,35,0,0,0,72,18,0,6,1,2,0,6,126,17,0,2,120,0,0,0,72,18,0,30,0,5,0,6,246,17,0,4,19,0,0,0,72,18,0,22,0,0,0,6,9,18,0,4,27,0,37,0,72,18,0,4,0,1,0,6,36,18,0,4,35,0,0,0,72,18,0,6,0,2,0,6,61,0,0,0,37,0,0,128,50,61,140,251,134,23,31,31,135,68,180,36,250,233,21,150,102,114,52,205,208,163,2,145,67,104,191,78,171,186,118,185,199,71,32,187,213,214,41,204,191,150,147,166,9,248,128,22,172,182,0,17,231,176,143,227,182,215,236,231,169,119,79,135,234,200,210,219,241,210,24,42,32,149,1,30,20,224,34,154,201,31,122,142,86,255,169,21,249,246,187,133,245,239,243,30,186,38,19,147,132,179,196,162,101,250,141,203,253,43,154,98,127,147,209,126,102,54,240,234,126,176,57,90,61,95,124,128,232,1,98,83,60,99,79,131,245,18,55,151,134,184,33,63,61,105,80,223,0,0,0,0,0,0,0,1,2,0,0,2,4,0,0,4,10,0,0,3,12,0,0,2,14,0,0,1,14,0,0,2,16,0,0,2,18,0,0,1,20,0,0,27,28,0,0,3,28,0,0,6,36,0,0,1,70,0,0,2,72,0,0,1,74,0,0,1,76,0,0,9,92,0,0,6,104,0,0,131,16,1,0,6,110,1,0,27,118,1,0,3,118,1,0,6,164,1,0,2,168,1,0,9,184,1,0,1,184,1,0,4,190,1,0,3,206,1,0,15,236,1,0,8,252,1,0,8,12,2,0,8,28,2,0,13,54,2,0,14,82,2,0,12,106,2,0,15,136,2,0,12,160,2,0,16,192,2,0,16,224,2,0,40,48,3,0,17,82,3,0,18,122,3,0,16,154,3,0,18,188,3,0,5,196,3,0,25,254,3,0,18,34,4,0,27,88,4,0,6,102,4,0,6,114,4,0,7,126,4,0,6,134,4,0,5,188,4,0,8,214,4,0,6,246,4,0,4,8,5,0,7,8,5,0,13,48,5,0,9,66,5,0,4,58,1,0,6,72,1,0,8,194,1,0,6,254,1,0,6,44,2,0,4,70,2,0,5,122,2,0,6,36,3,0,5,116,3,0,3,196,3,0,3,196,3,0,24,244,3,0,5,98,4,0,4,142,4,0,23,202,4,0,4,210,4,0,4,224,4,0,11,250,4,0,7,32,5,0,8,74,5,0,10,94,5,0,13,116,5,0,6,128,5,0,14,156,5,0,3,162,5,0,9,180,5,0,4,188,5,0,6,200,5,0,7,214,5,0,11,236,5,0,4,242,5,0,3,246,5,0,9,8,6,0,7,22,6,0,5,30,6,0,4,38,6,0,4,46,6,0,5,10,44,32,61,62,32,58,32,32,93,87,101,97,107,77,97,112,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,39,65,114,103,117,109,101,110,116,115,121,109,98,111,108,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,10,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,87,101,97,107,83,101,116,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,91,32,91,70,117,110,99,116,105,111,110,117,108,108,111,103,108,111,98,97,108,91,71,101,116,116,101,114,47,83,101,116,116,101,114,93,91,71,101,116,116,101,114,93,91,79,98,106,101,99,116,93,91,83,101,116,116,101,114,93,91,111,98,106,101,99,116,32,68,97,116,101,93,91,111,98,106,101,99,116,32,69,114,114,111,114,93,91,111,98,106,101,99,116,32,77,97,112,93,91,111,98,106,101,99,116,32,82,101,103,69,120,112,93,91,111,98,106,101,99,116,32,83,101,116,93,91,111,98,106,101,99,116,32,87,101,97,107,77,97,112,93,91,111,98,106,101,99,116,32,87,101,97,107,83,101,116,93,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,101,116,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,101,98,117,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,108,105,99,101,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,98,105,103,105,110,116,101,115,116,114,105,110,103,98,111,111,108,101,97,110,117,109,98,101,114,114,111,114,101,112,111,114,116,85,110,99,97,117,103,104,116,69,120,99,101,112,116,105,111,110,102,117,110,99,116,105,111,110,97,109,101,106,111,105,110,100,101,110,116,111,73,83,79,83,116,114,105,110,103,105,110,102,111,114,69,97,99,104,105,110,115,112,101,99,116,79,98,106,101,99,116,111,83,116,114,105,110,103,117,110,100,101,102,105,110,101,100,119,97,114,110,64,64,105,116,101,114,97,116,111,114,67,111,110,115,111,108,101,77,111,100,117,108,101,110,103,116,104,72,101,114,109,101,115,73,110,116,101,114,110,97,108,76,111,103,84,121,112,101,69,114,114,111,114,99,97,108,108,99,111,110,99,97,116,99,111,110,115,111,108,101,99,111,110,115,116,114,117,99,116,111,114,102,114,111,109,97,112,114,111,116,111,116,121,112,101,105,115,65,114,114,97,121,115,116,97,99,107,101,121,115,112,117,115,104,118,97,108,117,101,101,28,56,60,53,45,48,0,0,0,0,0,109,0,0,0,0,0,1,0,0,6,1,15,17,0,0,0,4,4,7,85,7,105,16,19,0,0,0,7,73,7,110,7,116,15,37,0,0,0,4,4,7,56,16,57,0,0,0,15,53,0,0,0,4,4,7,49,7,54,16,57,0,0,0,7,51,7,50,24,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,4,94,0,0,0,10,7,67,108,97,109,112,101,100,25,57,0,0,0,10,5,65,114,114,97,121,2,0,0,0,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,5,0,100,0,1,3,0,42,1,6,0,100,0,1,4,0,42,1,7,0,100,0,1,5,0,42,1,8,0,100,0,1,6,0,42,1,9,0,100,0,1,7,0,42,1,10,0,100,0,1,8,0,42,1,11,0,108,3,3,118,0,115,2,81,0,83,2,3,0,2,42,1,0,2,100,2,1,10,0,42,1,1,2,100,2,1,11,0,42,1,2,2,100,2,1,16,0,42,1,3,2,48,2,54,3,2,1,88,13,5,3,115,3,59,0,118,4,188,17,5,3,57,3,2,1,88,0,42,1,4,3,8,4,3,5,6,5,0,5,0,0,0,57,5,2,2,63,0,3,3,59,5,3,1,81,0,54,5,6,3,78,100,3,1,17,0,83,3,5,6,3,57,5,2,2,63,0,3,3,100,6,1,20,0,63,3,6,74,59,5,3,2,88,0,146,34,4,57,3,2,4,64,0,54,2,3,5,95,83,3,2,3,4,54,2,3,3,78,100,1,1,21,0,83,1,2,3,1,92,0,108,4,1,41,2,0,46,0,2,9,118,1,83,0,0,1,4,144,12,0,46,3,2,8,83,0,3,1,4,144,12,0,46,3,2,7,83,0,3,1,4,144,13,0,46,2,2,6,81,2,2,1,118,0,92,0,48,0,57,2,0,1,85,0,54,0,2,2,92,106,1,0,2,115,3,19,0,8,4,1,80,0,2,2,107,0,1,0,95,0,108,2,1,144,7,2,118,0,92,0,115,1,50,0,13,0,2,189,166,0,0,0,1,0,3,0,54,1,0,1,79,54,0,1,2,86,83,4,0,1,2,54,3,4,3,72,110,1,8,111,0,255,255,255,255,84,1,3,4,1,0,115,0,64,0,15,0,0,1,146,8,0,54,0,2,4,89,8,3,1,146,13,0,54,0,2,4,89,54,3,0,5,75,115,0,11,0,188,66,0,3,115,0,22,0,188,58,0,3,115,0,17,0,188,33,0,3,132,1,40,0,0,0,0,0,0,0,0,0,0,0,54,0,1,6,73,83,1,0,1,3,118,0,146,18,1,41,1,0,46,3,1,10,118,1,84,0,3,1,2,1,142,20,48,1,57,3,1,7,68,0,54,1,3,8,90,83,0,1,3,2,92,0,41,0,0,46,1,0,10,118,0,84,0,1,0,2,0,92,0,108,2,1,48,0,54,1,0,1,61,115,3,59,0,13,1,1,188,25,3,1,57,1,0,1,61,0,54,1,1,2,62,73,3,2,1,119,1,186,19,1,3,54,3,2,3,80,119,1,186,8,1,3,118,1,92,1,57,1,0,4,68,0,54,0,1,5,90,83,0,0,1,2,92,0,108,2,1,48,0,57,1,0,1,68,0,54,0,1,2,93,83,0,0,1,2,118,1,144,5,0,92,1,41,0,0,46,0,0,10,83,0,0,1,2,92,0,108,3,1,108,1,2,119,0,14,0,0,1,144,12,0,54,2,3,1,82,20,0,1,2,146,8,0,54,1,3,1,82,48,0,57,2,0,2,68,0,118,0,83,0,2,0,1,122,2,18,4,2,1,146,18,4,73,4,3,2,74,0,2,4,37,2,2,152,245,2,1,92,0,50,1,108,4,1,42,1,0,4,3,0,42,1,1,0,48,2,57,3,2,1,64,0,54,2,3,2,95,83,3,2,3,4,42,1,2,3,54,2,3,3,78,100,1,1,9,0,83,1,2,3,1,92,0,108,6,2,41,3,0,46,2,3,1,46,0,3,2,73,1,0,6,48,4,57,5,4,1,64,0,54,4,5,2,71,46,3,3,0,73,0,0,6,84,0,4,5,3,0,74,2,1,0,118,0,92,0,108,6,1,115,0,0,0,54,2,0,1,82,110,5,2,24,1,6,5,18,1,2,1,115,4,7,0,8,3,0,8,0,3,146,26,1,22,7,3,4,54,2,7,1,82,24,1,6,5,8,3,7,8,0,3,152,237,2,1,92,0,50,1,108,3,1,118,4,118,2,130,5,2,110,0,1,20,6,5,0,122,5,146,17,6,129,6,0,2,122,5,188,8,6,4,129,5,0,2,42,1,0,5,130,0,2,110,6,2,20,7,0,6,8,0,6,146,18,7,129,7,6,2,8,0,6,188,8,7,4,129,0,6,2,42,1,1,0,130,6,2,110,0,3,20,6,6,0,115,7,1,0,8,9,7,146,18,6,129,6,0,2,8,9,7,188,8,6,4,129,9,0,2,42,1,2,9,119,0,189,131,2,0,0,3,0,48,0,57,6,0,1,68,0,54,2,6,2,93,83,2,2,6,3,145,50,2,0,0,2,57,2,0,3,64,0,54,2,2,4,92,54,6,2,5,79,54,2,6,6,86,83,6,2,6,3,115,2,33,0,189,242,1,0,0,2,6,115,2,36,0,189,203,1,0,0,2,6,115,2,34,0,189,136,1,0,0,2,6,115,2,37,0,189,57,1,0,0,2,6,115,2,39,0,189,40,1,0,0,2,6,115,2,35,0,189,221,0,0,0,2,6,115,2,38,0,189,204,0,0,0,2,6,57,2,0,7,66,0,39,2,3,2,145,131,0,0,0,2,41,2,0,46,6,2,11,83,8,6,4,3,42,1,4,8,57,7,0,3,64,0,54,6,7,8,95,83,10,6,7,8,7,8,0,0,42,1,5,8,54,7,10,9,78,100,6,1,15,0,83,6,7,10,6,54,7,8,10,76,57,6,0,11,83,0,54,10,6,12,87,115,6,2,0,83,6,10,6,9,83,14,7,8,6,46,2,2,1,83,12,2,4,5,57,2,0,11,83,0,54,6,2,12,87,115,16,13,0,115,11,15,0,8,15,9,8,13,9,79,2,6,6,92,2,54,6,3,13,94,144,29,6,57,2,0,7,66,0,54,2,2,4,92,54,5,2,5,79,54,2,5,6,86,83,6,2,5,3,57,2,0,11,83,0,54,5,2,12,87,115,2,0,0,83,2,5,2,6,92,2,115,2,10,0,92,2,7,6,0,0,42,1,3,6,54,5,3,9,78,100,2,1,14,0,83,2,5,3,2,54,5,6,10,76,115,2,2,0,83,7,5,6,2,57,2,0,11,83,0,54,6,2,12,87,115,5,12,0,115,2,14,0,84,2,6,5,7,2,92,2,115,2,21,0,92,2,41,2,0,46,2,2,5,83,5,2,4,3,54,4,5,14,91,100,2,1,13,0,83,5,4,5,2,54,4,5,10,76,115,2,2,0,83,6,4,5,2,57,2,0,11,83,0,54,5,2,12,87,115,4,23,0,115,2,14,0,84,2,5,4,6,2,92,2,54,5,3,13,94,144,29,5,57,2,0,7,66,0,54,2,2,4,92,54,4,2,5,79,54,2,4,6,86,83,5,2,4,3,57,2,0,11,83,0,54,4,2,12,87,115,2,0,0,83,2,4,2,5,92,2,57,2,0,15,67,0,54,2,2,4,92,54,4,2,5,79,54,2,4,6,86,83,2,2,4,3,92,2,57,2,0,16,65,0,54,2,2,4,92,54,4,2,17,77,54,2,4,6,86,83,2,2,4,3,92,2,54,2,3,14,91,100,1,1,12,0,83,3,2,3,1,54,2,3,10,76,115,1,2,0,83,3,2,3,1,57,0,0,11,83,0,54,2,0,12,87,115,1,24,0,115,0,8,0,84,0,2,1,3,0,92,0,115,0,27,0,92,0,41,0,1,46,4,0,3,41,0,0,46,2,0,0,110,1,1,22,3,2,1,46,0,0,1,29,2,0,1,118,1,108,0,1,85,0,4,1,0,3,2,92,0,41,0,1,46,5,0,3,41,0,0,46,1,0,0,110,2,1,22,8,1,2,46,1,0,1,29,7,1,2,46,6,0,2,118,10,108,9,1,79,0,5,5,92,0,41,1,0,46,3,1,3,54,2,3,1,96,41,0,1,46,8,0,3,46,0,1,1,111,9,255,255,255,255,24,13,0,9,46,0,1,1,110,4,1,29,12,0,4,118,0,108,14,2,115,7,0,0,118,15,8,11,7,79,6,8,5,46,5,1,1,24,13,5,9,46,1,1,1,29,12,1,4,108,14,1,79,5,8,5,48,1,57,1,1,2,83,0,54,4,1,3,87,115,1,3,0,85,1,4,7,6,1,5,83,1,2,3,1,92,0,108,8,1,41,2,0,46,0,2,4,73,3,0,8,41,10,1,46,4,10,1,46,0,2,0,110,9,1,22,1,0,9,118,0,83,7,4,0,1,48,4,57,1,4,1,83,0,54,5,1,2,87,115,6,0,0,115,1,4,0,85,5,5,6,7,8,1,54,7,3,3,70,54,1,3,4,69,144,122,7,144,82,1,54,7,3,5,97,147,166,0,0,0,7,46,8,2,5,54,7,8,6,96,46,12,10,3,54,16,3,5,97,46,3,2,0,22,15,3,9,46,3,2,1,29,14,3,9,46,13,2,2,118,17,79,9,12,5,57,3,4,1,83,0,54,3,3,2,87,84,3,3,6,5,9,83,3,7,8,3,142,94,46,8,2,5,54,7,8,6,96,57,3,4,1,83,0,54,9,3,2,87,115,3,32,0,84,3,9,6,5,3,83,3,7,8,3,142,57,46,3,2,5,54,2,3,6,96,57,4,4,1,83,0,54,4,4,2,87,144,20,1,115,1,30,0,84,1,4,6,5,1,83,1,2,3,1,142,17,115,1,29,0,84,1,4,6,5,1,83,1,2,3,1,92,0,108,2,1,118,5,118,7,130,0,7,110,1,1,20,3,0,1,122,0,122,4,146,17,3,129,3,1,7,122,4,188,8,3,5,129,4,1,7,130,3,7,110,1,2,20,6,3,1,8,3,1,146,18,6,129,6,1,7,8,3,1,188,8,6,5,129,3,1,7,130,1,7,110,6,3,20,8,1,6,115,9,1,0,8,1,9,146,18,8,129,8,6,7,8,1,9,188,8,8,5,129,1,6,7,13,7,2,115,6,50,0,189,233,0,0,0,6,7,115,6,18,0,189,211,0,0,0,6,7,115,6,54,0,189,132,0,0,0,6,7,115,6,20,0,188,84,6,7,115,6,49,0,188,52,6,7,115,6,59,0,188,20,6,7,115,6,52,0,188,12,6,7,115,6,51,0,190,4,6,7,48,6,57,6,6,1,83,0,54,7,6,2,87,115,6,0,0,83,6,7,6,2,92,6,48,6,57,6,6,1,83,0,54,7,6,2,87,115,6,26,0,83,6,7,6,2,92,6,152,31,3,0,41,0,0,46,0,0,2,118,14,8,13,2,8,12,4,8,11,3,8,10,1,79,0,0,5,92,0,115,0,31,0,92,0,54,0,2,3,75,115,4,0,0,146,30,0,54,3,2,3,75,48,0,57,0,0,1,83,0,54,1,0,2,87,115,0,5,0,83,4,1,0,3,48,0,57,0,0,1,83,0,54,3,0,2,87,115,1,25,0,115,0,9,0,84,0,3,1,4,0,92,0,54,0,2,4,79,81,0,0,2,92,0,48,0,57,0,0,1,83,0,54,1,0,2,87,115,0,16,0,84,0,1,0,2,0,92,0,50,0,108,2,1,42,0,0,2,48,1,57,1,1,1,63,0,54,1,1,2,81,100,0,0,18,0,74,1,2,0,118,0,92,0,118,0,118,4,130,2,4,48,1,57,1,1,1,68,0,54,3,1,2,92,106,3,3,1,8,8,3,8,7,2,80,1,1,2,107,3,3,1,122,1,18,5,1,2,146,18,5,129,5,1,4,74,3,1,5,37,1,1,152,245,1,2,54,2,3,3,91,50,1,100,1,1,19,0,83,3,2,3,1,54,2,3,4,76,115,1,6,0,83,4,2,3,1,41,1,1,46,3,1,0,54,2,3,5,84,41,1,0,46,1,1,0,84,1,2,3,4,1,92,0,41,0,2,46,2,0,3,118,1,108,0,1,83,0,2,1,0,92,0,108,0,1,146,18,0,48,1,57,1,1,1,66,0,39,1,0,1,144,7,1,118,1,92,1,95,0,108,2,1,48,0,57,0,0,1,63,0,54,1,0,2,88,41,0,0,46,0,0,4,73,0,0,2,74,1,2,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,124,173,130,251,66,176,11,33,138,156,6,123,60,68,201,247,116,187,196,0 }; // NOLINT + const uint8_t k_Network[] = { 198,31,188,3,193,3,25,31,96,0,0,0,8,120,207,75,17,36,210,144,202,15,80,195,80,137,36,39,161,211,31,225,180,20,0,0,0,0,0,0,35,0,0,0,2,0,0,0,66,0,0,0,101,0,0,0,0,0,0,0,39,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,5,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,8,0,2,9,0,46,0,116,20,0,2,0,0,0,2,161,8,0,8,190,0,0,0,116,20,0,24,13,1,3,6,95,9,0,6,99,128,16,0,116,20,0,28,1,6,0,6,194,9,0,4,36,0,0,0,116,20,0,26,0,3,0,6,230,9,0,4,208,128,12,0,116,20,0,50,2,4,0,6,182,10,0,4,36,0,0,0,116,20,0,30,0,0,0,6,218,10,0,4,55,0,0,0,116,20,0,34,0,3,0,6,17,11,0,8,74,0,10,0,116,20,0,32,0,2,1,6,91,11,0,6,143,0,13,0,116,20,0,36,0,6,0,6,234,11,0,6,87,128,13,0,116,20,0,40,0,3,0,6,65,12,0,6,51,128,7,0,116,20,0,22,0,2,0,6,116,12,0,6,121,128,8,0,116,20,0,50,0,5,3,6,237,12,0,8,63,0,8,0,116,20,0,30,0,3,0,6,44,13,0,4,41,128,14,0,116,20,0,26,0,0,0,6,85,13,0,6,127,0,14,0,116,20,0,32,0,7,0,6,212,13,0,4,44,0,6,0,116,20,0,24,0,2,0,6,0,14,0,2,170,0,0,0,116,20,0,30,1,0,0,6,170,14,0,4,92,128,20,0,116,20,0,30,2,3,1,6,6,15,0,4,71,0,0,0,116,20,0,28,1,3,0,6,77,15,0,4,32,0,0,0,116,20,0,26,0,1,0,6,109,15,0,6,90,0,37,0,116,20,0,28,0,3,0,6,199,15,0,6,52,128,25,0,116,20,0,8,0,1,0,6,251,15,0,2,76,128,27,0,116,20,0,26,0,5,1,6,71,16,0,4,55,128,10,0,116,20,0,8,0,1,0,6,126,16,0,4,32,128,15,0,116,20,0,6,0,1,0,6,158,16,0,4,43,0,39,0,116,20,0,6,0,1,0,6,201,16,0,2,78,0,0,0,116,20,0,30,1,0,0,6,23,17,0,4,146,128,33,0,116,20,0,30,0,5,5,6,169,17,0,2,44,0,16,0,116,20,0,22,1,2,0,6,213,17,0,6,96,0,0,0,116,20,0,26,0,5,0,14,53,18,0,2,28,128,11,0,132,20,0,22,0,3,0,6,81,18,0,6,95,1,0,0,132,20,0,48,1,12,0,6,176,19,0,6,90,0,0,0,132,20,0,32,2,5,0,6,10,20,0,4,84,0,0,0,132,20,0,22,0,3,0,6,94,20,0,4,19,0,0,0,132,20,0,22,0,0,0,6,35,0,0,0,66,0,0,128,230,245,66,248,61,105,80,223,132,179,196,162,232,66,53,201,74,20,8,60,199,229,28,151,11,78,198,102,27,73,242,252,36,60,112,212,245,18,55,151,29,222,241,106,168,184,216,94,191,150,147,166,78,158,35,247,162,150,187,245,74,7,116,249,199,71,32,187,240,49,222,168,206,107,58,113,123,147,228,226,41,134,167,34,182,215,236,231,125,235,142,91,171,186,118,185,171,70,238,67,186,38,19,147,208,163,2,145,32,55,49,47,117,156,159,56,250,233,21,150,98,143,185,172,134,113,0,157,206,7,225,44,73,227,235,17,50,61,140,251,84,2,217,226,23,246,158,172,235,170,51,8,86,172,71,141,197,66,174,192,52,82,183,227,56,242,50,53,114,224,8,140,153,61,61,25,239,241,49,3,67,86,25,162,86,255,169,21,18,136,156,63,176,142,99,223,127,147,209,126,1,68,164,178,189,67,130,232,174,227,77,147,89,241,235,207,133,140,116,108,176,165,50,180,241,210,24,42,135,68,180,36,37,31,239,143,117,104,246,6,2,219,142,149,86,78,8,180,61,95,124,128,134,184,33,63,69,171,220,227,120,180,59,55,0,0,0,0,0,0,0,44,88,0,0,33,150,0,0,25,200,0,0,4,206,0,0,6,218,0,0,3,230,0,0,9,242,0,0,9,4,1,0,7,18,1,0,71,82,1,0,6,158,1,0,15,188,1,0,4,196,1,0,3,202,1,0,15,238,1,0,12,12,2,0,17,44,2,0,6,118,2,0,7,132,2,0,15,162,2,0,7,164,2,0,6,172,2,0,4,172,2,0,24,220,2,0,13,246,2,0,24,246,2,0,29,48,3,0,12,72,3,0,14,108,3,0,20,176,3,0,3,188,3,0,4,210,3,0,7,222,3,0,6,4,0,0,11,76,0,0,5,102,0,0,4,160,0,0,6,174,0,0,3,224,0,0,4,28,1,0,7,132,1,0,7,230,1,0,3,230,1,0,4,0,2,0,6,14,2,0,16,54,2,0,24,54,2,0,25,102,2,0,10,134,2,0,14,202,2,0,3,100,3,0,6,146,3,0,11,168,3,0,6,176,3,0,6,194,3,0,4,198,3,0,6,234,3,0,5,244,3,0,12,4,4,0,9,12,4,0,5,20,4,0,6,32,4,0,5,42,4,0,6,54,4,0,21,82,4,0,7,96,4,0,8,112,4,0,21,140,4,0,6,152,4,0,10,172,4,0,8,186,4,0,6,186,4,0,10,206,4,0,6,218,4,0,5,228,4,0,4,236,4,0,5,244,4,0,3,244,4,0,14,16,5,0,12,36,5,0,6,44,5,0,4,48,5,0,10,68,5,0,11,88,5,0,7,102,5,0,12,126,5,0,7,138,5,0,5,148,5,0,6,158,5,0,8,174,5,0,7,188,5,0,6,200,5,0,8,216,5,0,2,220,5,0,5,230,5,0,20,14,6,0,9,32,6,0,4,40,6,0,11,62,6,0,8,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,108,121,32,83,116,114,105,110,103,32,117,114,108,32,115,117,112,112,111,114,116,101,100,72,69,65,68,69,76,69,84,69,71,69,84,74,83,79,78,111,116,32,70,111,117,110,100,101,102,105,110,101,100,79,80,84,73,79,78,83,79,110,108,121,32,72,101,97,100,101,114,115,32,105,110,115,116,97,110,99,101,32,111,114,32,97,32,112,117,114,101,32,111,98,106,101,99,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,102,111,114,32,104,101,97,100,101,114,115,32,111,112,116,105,111,110,111,114,109,97,108,105,122,101,77,101,116,104,111,100,80,79,83,84,80,85,84,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,101,121,115,95,99,114,101,97,116,101,67,108,97,115,115,105,103,110,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,116,114,105,110,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,116,97,116,117,115,76,105,110,101,116,119,111,114,107,95,100,101,102,105,110,101,80,114,111,112,101,114,116,121,95,100,101,108,101,116,101,120,116,47,112,108,97,105,110,59,99,104,97,114,115,101,116,61,85,84,70,45,56,95,111,98,106,101,99,116,83,112,114,101,97,100,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,76,111,111,115,101,95,116,111,80,114,105,109,105,116,105,118,101,95,116,111,80,114,111,112,101,114,116,121,75,101,121,78,117,109,98,101,114,114,111,114,32,112,97,114,115,105,110,103,32,111,98,106,101,99,116,111,85,112,112,101,114,67,97,115,101,98,114,105,100,103,101,116,65,108,108,106,115,111,110,97,109,101,116,104,111,100,111,119,110,75,101,121,115,121,109,98,111,108,65,114,114,97,121,67,111,110,116,101,110,116,45,84,121,112,101,69,114,114,111,114,101,106,101,99,116,72,105,112,112,121,79,98,106,101,99,116,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,82,101,115,112,111,110,115,101,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,116,97,116,117,115,84,101,120,116,95,104,101,97,100,101,114,115,116,97,116,117,115,67,111,100,101,97,112,112,101,110,100,97,112,112,108,121,98,111,100,121,99,97,116,99,104,97,115,79,119,110,80,114,111,112,101,114,116,121,99,111,110,102,105,103,117,114,97,98,108,101,110,103,116,104,101,110,117,109,101,114,97,98,108,101,99,111,110,115,116,114,117,99,116,111,114,101,115,111,108,118,101,99,111,110,116,101,110,116,45,116,121,112,101,105,110,100,101,120,79,102,101,116,99,104,102,105,108,116,101,114,101,115,112,66,111,100,121,102,111,114,69,97,99,104,103,108,111,98,97,108,105,110,99,108,117,100,101,115,111,107,112,97,114,115,101,112,114,111,112,101,114,116,121,73,115,69,110,117,109,101,114,97,98,108,101,112,114,111,116,111,116,121,112,101,112,117,115,104,114,101,115,112,72,101,97,100,101,114,115,119,114,105,116,97,98,108,101,0,99,57,42,76,102,5,6,4,9,13,14,48,97,24,0,0,100,36,83,80,100,0,0,0,1,19,0,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,2,0,100,0,1,4,0,42,1,3,0,100,0,1,7,0,42,1,4,0,100,0,1,8,0,42,1,5,0,100,0,1,9,0,42,1,6,0,100,0,1,10,0,42,1,7,0,100,0,1,11,0,42,1,8,0,100,0,1,12,0,42,1,9,0,100,0,1,13,0,42,1,10,0,100,0,1,14,0,42,1,11,0,100,0,1,15,0,42,1,12,0,5,0,3,0,3,0,0,0,42,1,0,0,48,2,57,4,2,1,92,0,100,3,1,16,0,118,0,81,3,3,0,59,4,3,1,41,0,57,4,2,1,92,0,100,3,1,26,0,81,3,3,0,59,4,3,2,67,0,5,3,6,0,6,0,4,0,42,1,1,3,57,2,2,1,92,0,100,1,1,31,0,59,2,1,3,88,0,92,0,50,1,108,4,1,42,1,0,4,48,2,57,3,2,1,64,0,54,0,3,2,44,83,0,0,3,4,57,3,2,1,64,0,54,3,3,3,68,146,59,3,57,3,2,1,64,0,54,2,3,3,68,83,4,2,3,4,108,2,2,8,3,4,146,18,2,54,2,4,4,89,100,1,1,3,0,83,3,2,4,1,54,2,0,5,98,54,1,2,6,75,84,1,1,2,0,3,92,0,48,0,57,3,0,1,64,0,54,2,3,2,47,41,0,0,46,1,0,0,108,0,1,84,0,2,3,1,0,54,0,0,3,83,92,0,50,10,108,0,1,118,8,118,9,42,10,0,0,130,1,9,110,7,1,18,1,7,1,41,6,0,120,5,48,4,110,3,2,119,2,147,171,0,0,0,1,129,11,7,9,8,1,7,186,8,2,11,3,13,142,6,129,13,1,9,42,10,1,13,28,11,1,3,144,89,11,57,11,4,1,64,0,54,11,11,2,48,144,40,11,46,12,6,2,57,11,4,1,64,0,83,11,11,8,13,83,14,12,8,11,54,12,14,3,91,100,11,10,6,0,83,11,12,14,11,142,73,57,14,4,1,64,0,54,12,14,4,46,57,15,4,1,64,0,54,11,15,2,48,83,11,11,15,13,84,11,12,14,0,11,142,38,46,12,6,2,57,11,4,1,64,0,83,11,11,8,13,84,13,12,8,11,5,54,12,13,3,91,100,11,10,5,0,83,11,12,13,11,37,7,1,130,1,9,153,98,255,255,255,7,1,92,0,108,4,1,41,0,1,46,3,0,4,41,0,0,46,2,0,0,46,0,0,1,73,1,0,4,118,0,85,1,3,0,2,4,1,92,0,108,4,1,48,5,57,3,5,1,64,0,54,2,3,2,50,41,0,0,46,1,0,0,57,6,5,1,64,0,54,5,6,3,47,46,0,0,1,84,0,5,6,0,4,85,0,2,3,1,4,0,118,0,92,0,108,0,1,108,5,3,41,1,0,46,3,1,10,118,2,108,1,2,83,4,3,2,1,40,1,4,0,144,9,1,74,0,4,5,142,38,48,1,57,3,1,1,64,0,54,2,3,2,50,1,1,4,0,4,0,0,0,0,0,59,1,5,1,36,0,85,1,2,3,0,4,1,92,0,108,5,1,108,4,2,119,0,185,131,0,0,0,0,5,41,0,0,46,1,0,6,118,0,84,0,1,0,5,4,48,1,57,2,1,1,64,0,54,2,2,2,68,146,94,2,57,2,1,1,64,0,54,1,2,2,68,83,3,1,2,5,54,1,3,3,81,122,2,18,1,2,1,146,64,1,73,7,3,2,54,1,4,4,93,83,6,1,4,7,8,1,2,144,32,6,3,6,54,8,6,5,96,54,6,8,6,37,84,6,6,8,5,7,146,11,6,73,6,5,7,74,0,7,6,37,2,1,54,1,3,3,81,152,199,2,1,92,0,3,0,92,0,108,7,1,108,6,2,119,0,184,75,0,7,3,0,8,4,7,77,5,4,3,2,148,59,5,78,1,5,4,3,2,148,50,1,8,9,1,3,8,54,10,8,1,79,54,8,10,2,37,84,8,8,10,7,9,146,226,8,54,8,6,3,93,83,8,8,6,9,144,213,8,73,8,7,9,74,0,9,8,142,202,92,0,3,0,92,0,108,1,1,108,0,2,39,0,1,0,144,37,0,48,0,57,2,0,1,60,0,54,0,2,2,97,106,1,0,2,115,3,2,0,8,4,1,80,0,2,2,107,0,1,0,95,0,118,0,92,0,108,9,1,108,8,2,54,0,8,1,81,122,7,18,1,7,0,48,6,41,5,0,118,0,120,4,115,3,36,0,146,89,1,73,13,8,7,54,10,13,2,83,8,1,7,144,5,10,121,10,59,13,10,1,83,0,59,13,4,2,80,0,40,10,3,13,146,9,10,59,13,4,3,100,0,57,12,6,3,64,0,54,11,12,4,50,46,14,5,10,54,10,13,5,43,83,10,14,0,10,85,10,11,12,9,10,13,37,7,1,54,1,8,1,81,152,174,7,1,92,0,108,0,1,108,4,2,146,23,4,41,1,0,46,3,1,8,54,2,0,1,97,118,1,84,1,3,1,2,4,48,1,57,4,1,2,64,0,54,3,4,3,50,3,2,121,1,63,2,1,100,115,1,97,0,85,1,3,4,0,1,2,92,0,41,0,0,46,3,0,11,118,2,108,1,1,115,0,18,0,84,1,3,2,1,0,115,3,34,0,13,2,1,8,0,1,188,7,3,2,128,0,1,92,0,108,0,1,115,4,11,0,13,1,0,190,115,4,1,146,111,0,48,2,57,1,2,1,69,0,54,1,1,2,35,73,5,0,1,118,3,190,33,3,5,115,1,18,0,188,12,1,1,57,1,2,3,52,0,142,8,57,1,2,4,38,0,83,1,1,3,0,92,1,54,3,5,5,37,115,1,18,0,84,1,3,5,0,1,13,3,1,190,36,4,3,57,4,2,6,60,0,54,2,4,7,97,106,3,2,4,115,8,1,0,8,9,3,80,2,4,2,107,2,3,2,95,2,92,1,92,0,108,0,1,54,1,0,1,53,81,1,1,0,41,2,0,46,3,2,1,54,2,3,2,87,83,3,2,3,1,111,2,255,255,255,255,170,7,3,2,8,0,1,92,0,50,4,100,0,4,17,0,42,4,0,0,41,1,0,46,3,1,9,3,1,115,2,74,0,63,1,2,43,100,2,4,20,0,63,1,2,36,7,2,6,0,68,2,1,0,3,1,115,5,51,0,63,1,5,43,100,5,4,21,0,63,1,5,36,68,2,1,1,3,1,115,5,55,0,63,1,5,43,100,5,4,22,0,63,1,5,36,68,2,1,2,3,1,115,5,22,0,63,1,5,43,100,5,4,23,0,63,1,5,36,68,2,1,3,3,1,115,5,31,0,63,1,5,43,100,5,4,24,0,63,1,5,36,68,2,1,4,3,1,115,5,78,0,63,1,5,43,100,4,4,25,0,63,1,4,36,68,2,1,5,118,1,84,1,3,1,0,2,92,0,50,1,108,4,1,108,3,0,42,1,0,4,42,1,1,3,41,0,1,46,5,0,7,41,0,0,46,2,0,0,118,0,84,2,5,0,3,2,3,2,59,3,2,1,71,0,13,3,4,115,2,11,0,190,37,3,2,48,2,57,3,2,1,64,0,54,2,3,2,44,83,3,2,3,4,54,2,3,3,91,100,1,1,18,0,83,1,2,3,1,92,0,50,0,108,4,1,42,0,0,4,41,1,0,46,2,1,0,73,2,2,4,48,3,57,3,3,1,58,0,39,3,2,3,144,20,3,46,3,1,1,54,1,3,2,51,84,1,1,3,4,2,142,17,54,1,2,3,91,100,0,0,19,0,83,0,1,2,0,118,0,92,0,41,0,1,46,3,0,1,54,2,3,1,74,41,0,0,46,1,0,0,108,0,1,84,0,2,3,1,0,118,0,92,0,108,2,1,108,4,2,108,0,0,13,1,2,115,3,18,0,190,70,1,3,13,1,4,190,63,1,3,54,1,0,1,78,83,3,1,0,2,54,1,0,2,71,144,17,3,7,3,1,0,68,3,4,0,74,1,2,3,142,25,73,1,1,2,54,3,1,3,98,83,3,3,1,4,54,0,0,2,71,74,0,2,1,118,0,92,0,118,0,92,0,108,2,1,108,3,2,13,0,2,115,1,18,0,190,35,0,1,13,0,3,190,28,0,1,108,0,0,54,1,0,1,71,7,0,1,0,68,0,3,0,74,1,2,0,118,0,92,0,118,0,92,0,108,0,0,54,1,0,1,71,54,1,1,2,59,144,35,1,54,1,0,1,71,54,1,1,3,86,144,22,1,54,2,0,1,71,5,1,1,0,1,0,12,0,59,2,1,1,86,0,48,1,57,3,1,4,64,0,54,2,3,5,45,54,1,0,1,71,3,0,84,0,2,3,0,1,92,0,108,2,1,108,0,0,13,3,2,115,1,18,0,190,38,3,1,54,1,0,1,71,73,1,1,2,13,2,1,115,1,8,0,188,14,2,1,54,0,0,1,71,71,0,0,56,0,118,0,92,0,118,0,92,0,108,1,1,13,2,1,115,0,18,0,190,18,2,0,108,0,0,54,0,0,1,71,73,0,0,1,92,0,118,0,92,0,108,1,1,13,2,1,115,0,18,0,190,29,2,0,108,0,0,54,0,0,1,71,73,0,0,1,13,1,0,115,0,8,0,17,0,1,0,92,0,121,0,92,0,50,4,100,0,4,27,0,42,4,0,0,41,1,0,46,3,1,9,3,1,115,2,32,0,63,1,2,43,100,2,4,28,0,63,1,2,36,7,2,2,0,68,2,1,0,3,1,115,5,23,0,63,1,5,43,100,4,4,30,0,63,1,4,36,68,2,1,1,118,1,84,1,3,1,0,2,92,0,108,1,1,108,2,0,41,0,1,46,4,0,7,41,0,0,46,3,0,0,118,0,84,3,4,0,2,3,144,5,1,3,1,54,5,1,1,73,110,3,200,8,4,3,188,9,5,0,54,4,1,1,73,59,2,4,1,72,0,54,4,1,2,49,144,7,4,115,4,7,0,59,2,4,2,70,0,54,4,1,3,99,144,5,4,3,4,59,2,4,3,42,0,54,1,1,4,90,144,7,1,115,1,0,0,59,2,1,4,76,0,54,1,2,5,72,21,1,1,3,146,18,1,54,4,2,5,72,111,3,43,1,0,0,19,1,4,3,59,2,1,5,94,0,92,0,50,0,108,1,0,42,0,0,1,48,1,57,2,1,1,66,0,54,1,2,2,97,106,1,1,2,100,3,0,29,0,8,4,1,80,0,2,2,107,0,1,0,92,0,108,1,1,108,0,2,48,2,57,4,2,1,40,0,54,3,4,2,95,41,2,0,46,2,2,0,54,2,2,3,76,83,3,3,4,2,8,2,1,118,1,83,1,2,1,3,142,46,93,1,8,2,0,48,0,57,3,0,4,61,0,54,0,3,5,97,106,1,0,3,115,5,30,0,8,6,1,80,0,3,2,107,1,1,0,118,0,83,0,2,0,1,118,0,92,0,48,0,57,2,0,1,66,0,54,1,2,2,85,108,0,0,54,0,0,3,76,83,0,1,2,0,92,0,50,0,108,9,1,108,6,2,13,2,9,115,1,18,0,191,30,1,0,0,2,1,144,5,6,3,6,54,8,6,1,57,54,2,6,2,42,54,5,6,3,76,41,7,0,46,3,7,5,46,1,7,0,118,4,84,3,3,4,6,1,3,6,147,143,0,0,0,2,48,1,57,10,1,4,92,0,54,10,10,5,41,39,10,2,10,144,111,10,54,11,2,6,84,57,10,1,7,64,0,188,52,11,10,57,12,1,8,66,0,54,11,12,9,62,57,14,1,10,61,0,54,10,14,11,97,106,13,10,14,115,16,10,0,8,17,13,80,10,14,2,107,10,13,10,83,10,11,12,10,92,10,57,1,1,4,92,0,54,1,1,5,41,54,10,1,11,97,106,10,10,1,8,17,10,8,16,2,80,1,1,2,107,10,10,1,54,1,10,12,55,81,6,1,10,142,11,54,1,2,12,55,81,6,1,2,46,2,7,3,3,1,63,1,9,39,46,7,7,12,144,7,8,115,8,6,0,83,7,7,4,8,63,1,7,57,144,5,6,3,6,63,1,6,42,144,7,5,115,5,0,0,63,1,5,76,84,2,2,4,1,3,42,0,0,1,48,1,57,2,1,8,66,0,54,1,2,11,97,106,1,1,2,100,16,0,32,0,8,17,1,80,0,2,2,107,0,1,0,92,0,48,0,57,2,0,8,66,0,54,1,2,9,62,57,4,0,10,61,0,54,0,4,11,97,106,3,0,4,115,16,3,0,8,17,3,80,0,4,2,107,0,3,0,83,0,1,2,0,92,0,50,0,108,1,1,42,0,0,1,108,1,2,42,0,1,1,48,1,57,1,1,1,63,0,54,5,1,2,54,54,4,5,3,65,41,1,0,46,3,1,0,115,2,19,0,115,1,88,0,85,3,4,5,2,1,3,54,2,3,4,82,100,1,0,33,0,83,2,2,3,1,54,1,2,5,77,100,0,0,34,0,83,0,1,2,0,118,0,92,0,108,2,1,13,1,2,115,0,11,0,188,20,1,0,41,0,0,46,1,0,1,118,0,83,0,1,0,2,142,52,48,0,57,0,0,1,92,0,54,0,0,2,67,54,1,0,3,97,106,1,1,0,8,4,1,8,3,2,80,0,0,2,107,2,1,0,41,0,0,46,1,0,0,118,0,83,0,1,0,2,118,0,92,0,41,0,0,46,2,0,1,118,0,108,1,1,83,1,2,0,1,92,0,0,0,0,1,0,0,0,6,0,0,0,46,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,219,19,145,168,191,75,27,63,185,170,33,139,226,8,57,190,86,73,116,0 }; // NOLINT + const uint8_t k_Storage[] = { 198,31,188,3,193,3,25,31,96,0,0,0,124,108,16,201,95,208,246,23,72,228,184,202,18,28,253,247,240,147,116,65,188,5,0,0,0,0,0,0,14,0,0,0,2,0,0,0,21,0,0,0,27,0,0,0,0,0,0,0,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,2,0,2,9,128,2,0,124,5,0,2,0,0,0,2,221,2,0,8,103,0,0,0,124,5,0,8,2,1,1,6,68,3,0,4,56,0,1,0,124,5,0,24,0,4,1,6,124,3,0,4,67,128,1,0,124,5,0,22,0,3,0,6,191,3,0,4,19,0,0,0,124,5,0,22,0,0,0,6,210,3,0,2,34,0,6,0,124,5,0,26,0,3,0,6,244,3,0,6,91,0,7,0,124,5,0,30,0,4,0,14,79,4,0,4,78,0,10,0,140,5,0,32,0,5,0,6,157,4,0,4,43,0,0,0,140,5,0,8,0,0,0,6,200,4,0,4,19,0,0,0,140,5,0,22,0,0,0,6,219,4,0,4,46,0,9,0,140,5,0,30,0,3,0,6,9,5,0,4,38,128,7,0,140,5,0,30,0,3,0,6,47,5,0,4,38,128,12,0,140,5,0,30,0,3,0,6,85,5,0,4,38,0,12,0,140,5,0,30,0,3,0,6,6,0,0,0,21,0,0,128,130,51,197,247,208,163,2,145,232,1,98,83,171,186,118,185,117,156,159,56,123,147,228,226,123,231,84,128,98,143,185,172,61,6,65,120,115,194,167,102,18,136,156,63,114,224,8,140,158,180,129,242,28,124,216,99,230,233,56,33,126,176,57,90,61,95,124,128,36,60,112,212,185,127,61,252,166,205,200,155,32,149,1,30,0,0,0,0,10,0,0,13,36,0,0,12,36,0,0,13,60,0,0,6,70,0,0,6,0,0,0,12,50,0,0,5,82,0,0,7,86,0,0,5,96,0,0,5,106,0,0,6,114,0,0,10,134,0,0,21,172,0,0,7,184,0,0,8,198,0,0,4,206,0,0,5,216,0,0,10,234,0,0,7,244,0,0,7,0,1,0,3,4,1,0,9,22,1,0,3,28,1,0,11,50,1,0,8,64,1,0,8,97,115,121,110,99,83,116,111,114,97,103,101,77,111,100,117,108,101,99,111,110,118,101,114,116,69,114,114,111,114,115,116,114,105,110,103,108,111,98,97,108,105,115,65,114,114,97,121,72,105,112,112,121,98,114,105,100,103,101,116,65,108,108,75,101,121,115,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,116,73,116,101,109,117,108,116,105,71,101,116,104,101,110,99,97,116,99,104,114,101,109,111,118,101,73,116,101,109,101,115,115,97,103,101,116,73,116,101,109,97,112,114,111,116,111,116,121,112,101,107,101,121,109,117,108,116,105,82,101,109,111,118,101,109,117,108,116,105,83,101,116,111,83,116,114,105,110,103,48,0,0,0,50,0,100,0,0,1,0,92,0,50,2,100,0,2,2,0,42,2,0,0,100,0,2,3,0,42,2,1,0,48,0,57,1,0,1,10,0,3,0,100,3,2,5,0,63,0,3,12,100,3,2,6,0,63,0,3,14,100,3,2,7,0,63,0,3,20,100,3,2,10,0,63,0,3,18,100,3,2,11,0,63,0,3,15,100,3,2,12,0,63,0,3,25,100,2,2,13,0,63,0,2,24,59,1,0,1,6,0,118,0,92,0,108,1,1,144,7,1,119,0,92,0,48,0,57,3,0,1,7,0,54,4,1,2,19,54,2,3,3,22,106,2,2,3,8,5,2,80,0,3,2,107,0,2,0,54,1,1,4,23,59,0,1,1,23,0,92,0,108,2,1,144,7,2,119,0,92,0,48,0,57,1,0,1,9,0,54,0,1,2,8,83,1,0,1,2,8,0,2,144,14,1,7,1,1,0,68,1,2,0,8,0,1,146,20,0,54,2,0,3,21,50,1,100,1,1,4,0,83,1,2,0,1,92,0,41,0,1,46,2,0,0,118,1,108,0,1,83,0,2,1,0,92,0,48,0,57,0,0,1,10,0,54,3,0,2,11,54,2,3,3,13,115,1,1,0,115,0,12,0,84,0,2,3,1,0,92,0,108,0,2,8,1,0,13,2,0,115,0,4,0,188,16,2,0,8,2,1,54,0,2,1,26,81,1,0,2,48,0,57,0,0,2,10,0,54,4,0,3,11,54,3,4,4,13,7,0,2,0,108,2,1,68,0,2,0,68,0,1,1,7,2,1,0,68,2,0,0,115,1,1,0,115,0,25,0,85,0,3,4,1,0,2,92,0,93,0,95,0,50,0,48,1,57,1,1,1,10,0,54,5,1,2,11,54,4,5,3,13,7,3,1,0,108,1,1,68,3,1,0,115,2,1,0,115,1,15,0,85,3,4,5,2,1,3,54,2,3,4,16,100,1,0,8,0,83,2,2,3,1,54,1,2,5,17,100,0,0,9,0,83,0,1,2,0,92,0,108,2,1,146,26,2,122,0,73,1,2,0,146,17,1,73,3,2,0,110,1,1,73,3,3,1,144,7,3,119,3,92,3,73,0,2,0,73,0,0,1,92,0,41,0,1,46,2,0,1,118,1,108,0,1,83,0,2,1,0,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,7,2,1,0,108,0,1,68,2,0,0,115,1,1,0,115,0,24,0,85,0,3,4,1,0,2,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,115,2,1,0,115,1,15,0,108,0,1,85,0,3,4,2,1,0,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,115,2,1,0,115,1,25,0,108,0,1,85,0,3,4,2,1,0,92,0,48,0,57,0,0,1,10,0,54,4,0,2,11,54,3,4,3,13,115,2,1,0,115,1,24,0,108,0,1,85,0,3,4,2,1,0,92,0,0,1,0,0,0,17,0,0,0,29,0,0,0,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,13,141,138,234,80,8,175,218,126,72,220,225,67,104,173,165,182,157,121,0 }; // NOLINT + const uint8_t k_Dimensions[] = { 198,31,188,3,193,3,25,31,96,0,0,0,103,246,76,225,190,54,133,120,78,234,101,13,136,226,60,1,48,28,202,28,36,5,0,0,0,0,0,0,7,0,0,0,2,0,0,0,25,0,0,0,29,0,0,0,0,0,0,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,2,0,2,9,128,10,0,244,4,0,2,0,0,0,2,221,2,0,8,82,0,0,0,244,4,0,20,2,2,1,6,47,3,0,4,63,128,1,0,244,4,0,8,0,7,0,6,110,3,0,4,225,128,0,0,244,4,0,28,0,11,0,6,79,4,0,4,27,0,2,0,244,4,0,4,0,2,0,6,106,4,0,4,108,0,7,0,244,4,0,26,0,5,3,6,214,4,0,2,30,0,11,0,244,4,0,22,0,3,0,6,4,0,0,0,25,0,0,128,213,214,41,204,120,152,84,251,103,145,213,162,191,144,178,208,10,200,0,252,217,231,45,100,127,241,42,211,209,40,69,117,28,25,154,3,229,52,184,251,199,71,32,187,117,156,159,56,229,232,246,4,89,16,127,229,104,90,135,68,206,64,66,42,114,105,111,64,135,68,180,36,27,75,189,208,169,50,70,244,228,69,17,186,30,45,81,53,238,3,226,154,3,136,19,79,107,239,211,232,0,0,0,0,0,0,0,22,68,0,0,3,174,0,0,27,0,0,0,3,24,0,0,10,42,0,0,5,52,0,0,10,72,0,0,6,72,0,0,20,112,0,0,12,134,0,0,12,156,0,0,5,164,0,0,6,226,0,0,3,232,0,0,5,242,0,0,2,246,0,0,21,28,1,0,10,48,1,0,6,60,1,0,9,78,1,0,6,90,1,0,4,98,1,0,12,118,1,0,15,148,1,0,19,186,1,0,18,222,1,0,6,222,1,0,20,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,110,115,99,97,108,101,112,105,120,101,108,82,97,116,105,111,115,99,114,101,101,110,80,104,121,115,105,99,97,108,80,105,120,101,108,115,110,97,116,105,118,101,83,99,114,101,101,110,97,116,105,118,101,87,105,110,100,111,119,105,100,116,104,101,105,103,104,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,101,110,115,105,111,110,115,101,116,72,105,112,112,121,79,83,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,71,76,79,66,65,76,95,95,100,101,118,105,99,101,102,111,110,116,83,99,97,108,101,103,108,111,98,97,108,105,110,105,116,106,115,77,111,100,117,108,101,76,105,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,110,97,118,105,103,97,116,105,111,110,66,97,114,72,101,105,103,104,116,110,97,118,105,103,97,116,111,114,66,97,114,72,101,105,103,104,116,119,105,110,100,111,119,80,104,121,115,105,99,97,108,80,105,120,101,108,115,0,50,0,100,0,0,1,0,92,0,50,0,100,1,0,2,0,42,0,0,1,100,1,0,3,0,42,0,1,1,3,2,100,1,0,4,0,63,2,1,4,100,1,0,5,0,63,2,1,14,100,0,0,6,0,63,2,0,22,54,0,2,1,22,81,0,0,2,48,0,57,1,0,2,18,0,3,0,63,0,2,5,59,1,0,1,23,0,118,0,92,0,108,0,1,48,1,57,1,1,1,21,0,54,1,1,2,17,54,2,1,3,16,115,1,2,0,188,16,2,1,54,2,0,4,28,54,1,0,5,9,142,12,54,2,0,6,27,54,1,0,7,8,3,0,63,0,2,11,63,0,1,10,92,0,3,2,3,1,41,0,0,46,4,0,0,118,3,108,0,1,83,0,4,3,0,54,4,0,1,11,54,3,0,2,10,146,91,4,48,0,57,0,0,3,21,0,54,0,0,4,17,54,5,0,5,16,115,0,2,0,8,2,4,188,63,5,0,3,0,54,5,4,6,12,63,0,5,12,54,5,4,7,13,63,0,5,13,54,5,4,8,6,63,0,5,6,54,5,4,9,20,63,0,5,20,54,5,4,10,24,63,0,5,24,54,4,4,11,25,63,0,4,26,8,2,0,146,91,3,48,0,57,0,0,3,21,0,54,0,0,4,17,54,4,0,5,16,115,0,2,0,8,1,3,188,63,4,0,3,0,54,4,3,6,12,63,0,4,12,54,4,3,7,13,63,0,4,13,54,4,3,8,6,63,0,4,6,54,4,3,9,20,63,0,4,20,54,4,3,10,24,63,0,4,24,54,3,3,11,25,63,0,3,26,8,1,0,3,0,63,0,2,27,63,0,1,8,92,0,48,0,57,0,0,1,15,0,54,1,0,2,19,144,5,1,3,1,108,0,1,73,0,1,0,92,0,108,2,1,118,0,144,5,2,92,0,41,1,0,46,1,1,1,83,1,1,0,2,54,4,1,1,27,54,3,1,2,8,48,1,57,2,1,3,15,0,54,2,2,4,19,59,2,4,1,27,0,57,2,1,3,15,0,54,2,2,4,19,59,2,3,2,8,0,57,2,1,3,15,0,54,2,2,4,19,57,1,1,3,15,0,54,1,1,4,19,54,1,1,1,27,54,1,1,5,6,59,2,1,3,7,0,92,0,108,2,0,54,1,2,1,14,48,0,57,0,0,2,17,0,54,0,0,3,5,83,0,1,2,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,65,194,83,40,228,233,156,195,240,157,136,18,165,208,148,109,44,185,241,0 }; // NOLINT + const uint8_t k_UtilsModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,97,164,160,26,162,203,181,5,24,87,107,102,218,96,39,242,56,34,117,119,16,3,0,0,0,0,0,0,6,0,0,0,2,0,0,0,8,0,0,0,15,0,0,0,0,0,0,0,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,1,0,2,9,0,2,0,224,2,0,2,0,0,0,2,189,1,0,8,156,0,0,0,224,2,0,8,0,4,2,6,89,2,0,6,90,0,0,0,224,2,0,40,0,3,0,6,179,2,0,2,39,0,0,0,224,2,0,30,0,3,0,6,218,2,0,2,4,0,0,0,224,2,0,2,0,0,0,6,218,2,0,2,4,0,0,0,224,2,0,2,0,0,0,6,7,0,0,0,8,0,0,128,206,64,66,42,13,171,119,215,117,156,159,56,229,232,246,4,123,147,228,226,202,217,230,186,170,248,246,235,237,14,158,97,0,0,0,0,0,0,0,11,22,0,0,7,46,0,0,6,72,0,0,6,84,0,0,3,90,0,0,6,34,0,0,6,46,0,0,13,102,0,0,5,112,0,0,2,116,0,0,6,128,0,0,24,176,0,0,8,192,0,0,7,85,116,105,108,115,77,111,100,117,108,101,97,110,100,114,111,105,100,101,118,105,99,101,99,97,110,99,101,108,86,105,98,114,97,116,101,103,108,111,98,97,108,105,111,115,110,117,109,98,101,114,72,105,112,112,121,79,83,98,114,105,100,103,101,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,112,108,97,116,102,111,114,109,118,105,98,114,97,116,101,0,113,0,0,0,0,0,0,0,50,0,100,0,0,1,0,92,0,50,0,48,1,57,2,1,1,9,0,54,2,2,2,7,54,2,2,3,13,54,3,2,4,10,115,2,2,0,188,79,3,2,57,2,1,1,9,0,54,2,2,2,7,54,2,2,3,13,54,3,2,4,10,115,2,5,0,190,94,3,2,57,2,1,1,9,0,54,3,2,2,7,100,2,0,4,0,59,3,2,1,14,0,57,2,1,1,9,0,54,3,2,2,7,100,2,0,5,0,59,3,2,2,8,0,142,46,57,2,1,1,9,0,54,3,2,2,7,100,2,0,2,0,59,3,2,1,14,0,57,1,1,1,9,0,54,1,1,2,7,100,0,0,3,0,59,1,0,2,8,0,118,0,92,0,108,1,1,108,7,2,13,2,1,115,0,6,0,8,6,1,190,19,2,0,5,0,2,0,1,0,0,0,68,0,1,1,8,6,0,118,0,190,10,7,0,111,7,255,255,255,255,48,1,57,1,1,1,9,0,54,5,1,2,11,54,4,5,3,12,115,12,1,0,115,11,14,0,120,10,8,13,5,8,9,6,8,8,7,79,1,4,6,92,0,48,0,57,0,0,1,9,0,54,4,0,2,11,54,3,4,3,12,115,2,1,0,115,1,3,0,120,0,85,0,3,4,2,1,0,118,0,92,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,6,6,27,25,247,140,70,16,154,33,199,180,196,171,80,5,136,128,68,0 }; // NOLINT + const uint8_t k_global[] = { 198,31,188,3,193,3,25,31,96,0,0,0,192,139,227,23,245,216,117,151,125,97,179,246,219,201,9,162,80,236,46,120,192,23,0,0,0,0,0,0,29,0,0,0,2,0,0,0,65,0,0,0,92,0,0,0,0,0,0,0,80,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,109,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,9,0,2,9,128,24,0,68,23,0,2,0,0,0,2,161,9,0,8,7,2,0,0,68,23,0,30,10,8,19,6,168,11,0,6,64,128,8,0,68,23,0,30,0,0,0,6,232,11,0,2,34,128,6,0,68,23,0,22,0,2,0,6,10,12,0,6,43,2,6,0,68,23,0,46,0,11,0,14,53,14,0,4,30,128,4,0,144,23,0,22,0,2,0,6,83,14,0,4,56,0,9,0,144,23,0,26,0,0,0,6,139,14,0,2,34,0,8,0,144,23,0,22,0,2,0,6,173,14,0,6,203,128,9,0,144,23,0,30,0,8,0,6,120,15,0,4,75,128,5,0,144,23,0,24,0,5,0,6,195,15,0,4,42,0,5,0,144,23,0,22,0,2,0,6,237,15,0,6,73,0,4,0,144,23,0,26,0,2,0,6,54,16,0,6,28,0,0,0,144,23,0,22,0,1,0,6,82,16,0,8,118,0,0,0,144,23,0,36,8,5,0,6,200,16,0,4,74,128,12,0,144,23,0,36,0,2,0,6,18,17,0,2,35,128,7,0,144,23,0,24,0,0,0,6,53,17,0,12,218,1,0,0,144,23,0,28,0,11,3,6,15,19,0,6,148,0,0,0,144,23,0,30,4,3,0,6,163,19,0,6,123,0,0,0,144,23,0,34,0,3,0,6,30,20,0,6,71,0,0,0,144,23,0,26,0,4,0,6,101,20,0,8,62,0,0,0,144,23,0,8,2,0,1,6,163,20,0,2,99,0,11,0,144,23,0,30,1,3,0,6,6,21,0,6,68,0,0,0,144,23,0,38,2,2,0,6,74,21,0,4,19,0,0,0,144,23,0,22,0,0,0,6,93,21,0,4,19,0,0,0,144,23,0,22,0,0,0,6,112,21,0,2,88,0,11,0,144,23,0,34,0,3,0,6,200,21,0,2,222,0,11,0,144,23,0,46,0,6,0,6,166,22,0,6,120,0,0,0,144,23,0,34,2,6,0,6,30,23,0,2,37,0,17,0,144,23,0,26,0,3,0,6,27,0,0,0,65,0,0,128,50,61,140,251,134,23,31,31,26,125,172,32,219,32,177,68,34,47,145,40,32,149,1,30,171,186,118,185,213,214,41,204,106,91,189,17,196,246,27,31,105,55,193,146,250,233,21,150,9,248,128,22,199,211,94,16,174,227,77,147,182,215,236,231,248,224,162,176,199,71,32,187,176,142,99,223,74,7,116,249,20,224,34,154,17,14,70,55,135,68,180,36,252,130,149,208,132,179,196,162,120,152,84,251,104,90,135,68,47,89,204,22,133,100,111,25,134,113,0,157,186,38,19,147,215,251,84,184,9,174,236,145,33,19,225,126,27,142,235,1,62,21,243,163,189,231,83,181,200,8,34,198,112,91,127,104,101,158,200,66,62,10,199,213,176,249,94,147,127,137,213,91,71,36,229,130,29,222,241,106,5,104,246,70,172,182,0,17,67,86,25,162,86,255,169,21,127,147,209,126,241,210,24,42,102,54,240,234,110,44,50,42,57,223,109,254,195,186,146,138,206,148,247,146,232,1,98,83,175,90,44,68,61,95,124,128,167,87,89,102,134,184,33,63,56,145,128,90,61,105,80,223,3,136,19,79,120,180,59,55,0,0,0,0,0,0,0,9,18,0,0,136,196,0,0,6,34,1,0,131,40,2,0,3,106,2,0,3,126,2,0,40,206,2,0,17,240,2,0,15,14,3,0,18,50,3,0,16,50,3,0,21,92,3,0,16,120,3,0,6,130,3,0,8,196,3,0,18,22,4,0,14,50,4,0,18,86,4,0,27,140,4,0,5,142,4,0,4,208,4,0,2,218,4,0,8,12,5,0,7,22,5,0,8,56,5,0,9,238,0,0,6,252,0,0,8,42,2,0,11,62,2,0,6,72,2,0,17,110,2,0,8,194,2,0,5,130,3,0,3,144,3,0,17,176,3,0,10,230,3,0,24,250,3,0,6,24,4,0,5,148,4,0,24,196,4,0,7,210,4,0,4,232,4,0,18,22,5,0,3,36,5,0,10,72,5,0,14,100,5,0,10,118,5,0,18,152,5,0,6,164,5,0,7,166,5,0,4,176,5,0,10,196,5,0,10,212,5,0,19,226,5,0,13,252,5,0,7,10,6,0,9,26,6,0,23,72,6,0,9,88,6,0,26,140,6,0,23,184,6,0,9,200,6,0,4,204,6,0,4,212,6,0,11,234,6,0,10,254,6,0,21,0,7,0,9,40,7,0,6,52,7,0,13,78,7,0,6,88,7,0,25,134,7,0,4,142,7,0,12,162,7,0,6,174,7,0,11,196,7,0,7,210,7,0,4,216,7,0,6,216,7,0,12,240,7,0,25,32,8,0,9,50,8,0,7,64,8,0,14,92,8,0,9,102,8,0,4,110,8,0,4,114,8,0,5,124,8,0,5,134,8,0,6,144,8,0,8,65,114,103,117,109,101,110,116,115,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,100,101,115,116,114,117,99,116,117,114,101,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,10,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,10,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,77,97,112,112,82,101,103,105,115,116,101,114,101,116,117,114,110,97,116,105,118,101,77,111,100,117,108,101,80,114,111,120,121,83,101,116,111,83,116,114,105,110,103,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,95,97,114,114,97,121,87,105,116,104,72,111,108,101,115,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,76,105,109,105,116,95,110,111,110,73,116,101,114,97,98,108,101,82,101,115,116,114,105,110,103,101,116,86,97,108,117,101,110,113,117,101,117,101,78,97,116,105,118,101,67,97,108,108,111,97,100,77,111,100,117,108,101,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,101,102,105,110,101,76,97,122,121,79,98,106,101,99,116,80,114,111,112,101,114,116,121,95,115,108,105,99,101,100,84,111,65,114,114,97,121,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,97,115,121,110,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,105,110,100,101,120,79,102,110,97,109,101,102,117,110,99,116,105,111,110,97,116,105,118,101,67,97,108,108,83,121,110,99,72,111,111,107,112,114,111,109,105,115,101,116,86,97,108,117,101,110,117,109,101,114,97,98,108,101,117,110,100,101,102,105,110,101,100,101,102,105,110,101,80,114,111,112,101,114,116,121,64,64,105,116,101,114,97,116,111,114,101,109,111,116,101,77,111,100,117,108,101,67,111,110,102,105,103,108,111,98,97,108,95,99,97,108,108,73,68,105,109,101,110,115,105,111,110,115,95,95,71,76,79,66,65,76,95,95,102,98,71,101,110,78,97,116,105,118,101,77,111,100,117,108,101,115,80,114,111,109,105,115,101,84,121,112,101,69,114,114,111,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,85,73,77,97,110,97,103,101,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,67,111,110,102,105,103,101,110,77,101,116,104,111,100,111,110,101,120,116,95,99,97,108,108,98,97,99,107,73,68,95,99,97,108,108,98,97,99,107,115,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,95,113,117,101,117,101,97,114,114,97,121,67,111,110,116,97,105,110,115,97,115,115,105,103,110,97,116,105,118,101,70,108,117,115,104,81,117,101,117,101,73,109,109,101,100,105,97,116,101,115,116,99,111,110,102,105,103,117,114,97,98,108,101,110,103,116,104,99,111,110,115,116,114,117,99,116,111,114,102,111,114,69,97,99,104,102,114,111,109,111,100,117,108,101,67,97,108,108,73,100,110,97,116,105,118,101,82,101,113,117,105,114,101,77,111,100,117,108,101,67,111,110,102,105,103,101,110,77,111,100,117,108,101,105,115,65,114,114,97,121,109,111,100,117,108,101,67,97,108,108,76,105,115,116,112,114,111,116,111,116,121,112,101,112,117,115,104,105,102,116,118,97,108,117,101,119,105,110,100,111,119,114,105,116,97,98,108,101,48,0,0,0,0,0,0,0,109,0,0,0,0,0,1,0,0,6,1,15,17,0,0,0,4,4,7,85,7,105,16,19,0,0,0,7,73,7,110,7,116,15,37,0,0,0,4,4,7,56,16,57,0,0,0,15,53,0,0,0,4,4,7,49,7,54,16,57,0,0,0,7,51,7,50,24,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,4,94,0,0,0,10,7,67,108,97,109,112,101,100,25,57,0,0,0,10,5,65,114,114,97,121,2,0,0,0,0,50,0,100,0,0,1,0,92,0,50,1,100,0,1,2,0,42,1,0,0,100,0,1,3,0,42,1,1,0,100,0,1,4,0,42,1,2,0,100,0,1,5,0,42,1,3,0,100,0,1,6,0,42,1,4,0,100,0,1,7,0,42,1,5,0,100,0,1,8,0,42,1,6,0,100,0,1,9,0,42,1,7,0,100,0,1,10,0,42,1,8,0,100,0,1,11,0,42,1,9,0,48,0,57,3,0,1,53,0,3,2,59,3,2,1,29,0,57,2,0,1,53,0,122,3,59,2,3,2,80,0,57,4,0,1,53,0,3,2,59,4,2,3,84,0,57,4,0,1,53,0,120,2,59,4,2,4,40,0,57,2,0,1,53,0,59,2,3,5,58,0,57,4,0,1,53,0,3,2,59,4,2,6,60,0,57,2,0,1,53,0,59,2,3,7,50,0,57,2,0,1,53,0,59,2,3,8,65,0,57,3,0,1,53,0,3,2,59,3,2,9,66,0,57,3,0,1,53,0,3,2,59,3,2,10,67,0,57,3,0,1,53,0,7,2,4,0,7,4,0,0,68,2,4,0,7,4,0,0,68,2,4,1,7,4,0,0,68,2,4,2,57,4,0,1,53,0,54,4,4,2,50,68,2,4,3,59,3,2,11,69,0,57,3,0,1,53,0,100,2,1,12,0,59,3,2,12,70,0,57,3,0,1,53,0,100,2,1,13,0,59,3,2,13,37,0,57,3,0,1,53,0,100,2,1,16,0,59,3,2,14,35,0,57,3,0,1,53,0,100,2,1,17,0,59,3,2,15,82,0,57,3,0,3,49,0,57,2,0,1,53,0,54,2,2,4,82,59,3,2,16,54,0,57,3,0,1,53,0,100,2,1,19,0,59,3,2,17,36,0,57,3,0,1,53,0,100,2,1,20,0,59,3,2,18,62,0,57,3,0,1,53,0,3,2,3,4,3,5,3,6,63,5,6,90,63,4,5,52,63,2,4,59,59,3,2,19,55,0,54,2,0,5,31,13,3,2,115,2,26,0,190,45,3,2,57,2,0,6,61,0,8,3,2,146,8,3,54,3,2,7,48,144,7,3,7,3,0,0,54,2,3,8,77,100,1,1,27,0,83,1,2,3,1,142,20,57,1,0,1,53,0,57,0,0,5,31,0,59,1,0,19,55,0,118,0,92,0,108,5,1,41,2,0,46,0,2,3,118,1,83,0,0,1,5,144,16,0,46,4,2,2,110,3,5,84,0,4,1,5,3,144,16,0,46,4,2,6,110,3,5,84,0,4,1,5,3,144,13,0,46,2,2,1,81,2,2,1,118,0,92,0,48,0,57,2,0,1,57,0,54,0,2,2,85,106,1,0,2,115,3,2,0,8,4,1,80,0,2,2,107,0,1,0,95,0,108,8,1,8,7,8,108,11,2,118,3,118,4,118,12,118,0,118,13,118,1,118,5,118,2,119,6,14,9,6,8,119,8,144,56,9,48,10,54,9,10,1,27,115,14,26,0,13,9,9,17,9,14,9,146,21,9,8,14,7,57,10,10,1,27,0,54,10,10,2,28,73,9,14,10,144,11,9,8,10,7,54,9,10,3,47,8,8,9,8,4,8,186,6,6,8,92,3,7,1,0,0,120,5,121,2,8,14,4,54,10,14,4,51,83,7,10,14,7,8,4,7,54,13,7,5,64,8,10,11,122,7,189,140,0,0,0,7,10,8,14,13,54,10,14,4,51,8,7,4,83,7,10,14,7,8,12,7,54,7,7,6,63,8,5,7,145,128,0,0,0,7,8,7,1,54,14,7,7,87,8,10,12,54,10,10,8,89,83,10,14,7,10,54,10,7,9,75,8,7,11,188,93,10,7,120,5,8,14,13,54,10,14,4,51,8,7,4,83,7,10,14,7,8,12,7,54,7,7,6,63,8,5,7,144,60,7,8,7,1,54,14,7,7,87,8,10,12,54,10,10,8,89,83,10,14,7,10,54,10,7,9,75,8,7,11,190,195,10,7,142,24,48,7,57,10,7,10,38,0,8,11,4,83,10,10,3,11,190,8,10,11,121,5,142,92,8,9,5,144,55,9,8,9,4,54,9,9,11,30,184,44,6,9,8,10,4,54,9,10,11,30,81,9,9,10,57,7,7,10,38,0,83,7,7,3,9,188,17,7,9,8,7,2,144,5,7,92,3,8,7,0,95,7,8,7,2,144,5,7,92,3,8,7,0,95,7,93,7,8,9,2,144,5,9,95,7,8,7,0,95,7,93,0,120,2,8,7,5,144,57,7,8,7,4,54,7,7,11,30,184,46,6,7,8,8,4,54,7,8,11,30,81,8,7,8,48,7,57,7,7,10,38,0,83,7,7,3,8,188,17,7,8,8,7,2,144,5,7,92,3,8,7,0,95,7,8,7,2,144,5,7,92,1,8,1,0,95,1,93,1,8,7,2,144,5,7,95,1,8,1,0,95,1,93,1,144,57,5,8,5,4,54,5,5,11,30,184,46,6,5,8,5,4,54,4,5,11,30,81,5,4,5,48,4,57,4,4,10,38,0,83,4,4,3,5,188,17,4,5,8,4,2,144,5,4,92,3,8,3,0,95,3,8,3,2,144,5,3,95,1,8,1,0,95,1,93,1,144,5,2,95,1,95,0,108,0,1,48,1,57,2,1,1,33,0,54,1,2,2,83,83,1,1,2,0,144,7,1,118,1,92,1,92,0,108,4,1,41,2,0,46,0,2,8,118,1,83,0,0,1,4,144,12,0,46,3,2,7,83,0,3,1,4,144,12,0,46,3,2,6,83,0,3,1,4,144,13,0,46,2,2,5,81,2,2,1,118,0,92,0,48,0,57,2,0,1,57,0,54,0,2,2,85,106,1,0,2,115,3,4,0,8,4,1,80,0,2,2,107,0,1,0,95,0,108,3,1,108,2,2,144,7,3,118,0,92,0,115,1,14,0,13,0,3,189,166,0,0,0,1,0,3,0,54,1,0,1,32,54,0,1,2,51,83,5,0,1,3,54,4,5,3,39,110,1,8,111,0,255,255,255,255,84,1,4,5,1,0,115,0,38,0,15,0,0,1,146,8,0,54,0,3,4,76,8,4,1,146,13,0,54,0,3,4,76,54,4,0,5,42,115,0,5,0,188,66,0,4,115,0,6,0,188,58,0,4,115,0,1,0,188,33,0,4,132,1,7,0,0,0,0,0,0,0,0,0,0,0,54,0,1,6,73,83,1,0,1,4,118,0,146,18,1,41,1,0,46,4,1,9,118,1,84,0,4,1,3,2,142,20,48,1,57,4,1,7,33,0,54,1,4,8,78,83,0,1,4,3,92,0,41,0,0,46,1,0,9,118,0,84,0,1,0,3,2,92,0,108,2,1,48,0,54,1,0,1,27,115,3,26,0,13,1,1,188,25,3,1,57,1,0,1,27,0,54,1,1,2,28,73,3,2,1,119,1,186,19,1,3,54,3,2,3,47,119,1,186,8,1,3,118,1,92,1,57,1,0,4,33,0,54,0,1,5,78,83,0,0,1,2,92,0,108,2,1,48,0,57,1,0,1,33,0,54,0,1,2,83,83,0,0,1,2,118,1,144,5,0,92,1,41,0,0,46,0,0,9,83,0,0,1,2,92,0,108,3,1,108,1,2,119,0,14,0,0,1,144,12,0,54,2,3,1,75,20,0,1,2,146,8,0,54,1,3,1,75,48,0,57,2,0,2,33,0,118,0,83,0,2,0,1,122,2,18,4,2,1,146,18,4,73,4,3,2,74,0,2,4,37,2,2,152,245,2,1,92,0,108,2,1,54,1,2,1,41,108,0,2,83,1,1,2,0,111,0,255,255,255,255,17,0,1,0,92,0,50,7,108,4,1,108,3,2,108,1,3,42,7,0,4,42,7,1,3,54,0,1,1,34,42,7,2,0,54,2,1,2,45,121,0,17,5,2,0,44,7,3,5,54,1,1,3,91,17,1,1,0,44,7,4,1,44,7,6,0,100,6,7,14,0,42,7,7,6,48,0,57,2,0,4,38,0,54,1,2,5,46,3,0,100,7,7,15,0,63,0,7,34,63,0,6,44,120,6,63,0,6,74,63,0,5,45,85,0,1,2,4,3,0,118,0,92,0,108,7,1,41,5,0,42,5,5,7,120,6,44,5,6,6,48,0,57,4,0,1,38,0,54,3,4,2,46,46,2,5,0,46,1,5,1,3,0,63,0,7,89,63,0,6,74,46,6,5,3,63,0,6,45,46,5,5,4,63,0,5,91,85,0,3,4,2,1,0,118,0,92,0,41,0,0,46,1,0,6,144,22,1,46,3,0,7,46,1,0,2,118,2,81,1,1,2,83,1,3,2,1,46,0,0,5,92,0,108,3,3,108,4,4,108,5,5,144,9,4,147,239,0,0,0,5,13,0,3,115,2,3,0,190,77,0,2,54,1,3,1,75,122,0,170,66,1,0,73,1,3,0,13,1,1,190,55,1,2,73,0,3,0,54,0,0,2,68,146,42,0,54,0,3,3,88,81,0,0,3,48,0,57,1,0,4,53,0,54,2,1,5,67,57,0,0,4,53,0,54,1,0,6,65,120,0,74,2,1,0,146,26,4,54,1,3,7,87,48,0,57,0,0,4,53,0,54,0,0,6,65,83,0,1,3,0,48,0,57,1,0,4,53,0,54,2,1,8,66,57,1,0,4,53,0,54,1,1,6,65,74,2,1,4,57,4,0,4,53,0,54,1,4,6,65,110,2,1,22,1,1,2,59,4,1,1,65,0,146,24,5,54,4,3,7,87,57,1,0,4,53,0,54,1,1,6,65,83,1,4,3,1,57,1,0,4,53,0,54,4,1,8,66,57,1,0,4,53,0,54,1,1,6,65,74,4,1,5,57,1,0,4,53,0,54,0,1,6,65,22,0,0,2,59,1,0,1,65,0,48,0,57,4,0,4,53,0,54,1,4,9,50,110,2,1,22,1,1,2,59,4,1,2,50,0,57,1,0,4,53,0,54,4,1,10,69,122,1,73,5,4,1,54,4,5,7,87,108,1,1,83,1,4,5,1,57,1,0,4,53,0,54,1,1,10,69,73,4,1,2,54,2,4,7,87,108,1,2,83,1,2,4,1,57,1,0,4,53,0,54,2,1,10,69,110,1,2,73,2,2,1,54,1,2,7,87,83,1,1,2,3,54,1,0,11,72,13,2,1,115,1,26,0,188,95,2,1,41,1,0,46,3,1,4,57,1,0,4,53,0,54,1,1,10,69,118,2,83,1,3,2,1,57,4,0,4,53,0,7,3,4,0,7,5,0,0,68,3,5,0,7,5,0,0,68,3,5,1,7,5,0,0,68,3,5,2,57,5,0,4,53,0,54,5,5,9,50,68,3,5,3,59,4,3,3,69,0,57,0,0,11,72,0,83,0,0,2,1,118,0,92,0,50,0,108,4,1,108,1,2,42,0,0,1,144,7,4,119,1,92,1,41,1,0,46,3,1,0,118,2,110,1,5,84,3,3,2,4,1,122,1,73,2,3,1,110,1,1,73,4,3,1,110,1,2,73,5,3,1,110,1,3,73,1,3,1,42,0,1,1,110,1,4,73,1,3,1,42,0,2,1,144,14,4,144,11,5,3,1,63,1,2,42,92,1,3,1,42,0,3,1,146,18,5,54,3,5,1,77,100,0,0,18,0,83,0,3,5,0,48,0,57,3,0,2,38,0,54,0,3,3,71,84,0,0,3,1,4,3,0,63,0,2,42,63,0,1,79,92,0,108,5,2,41,0,0,46,2,0,1,146,26,2,48,1,57,4,1,1,53,0,54,3,4,2,70,46,1,0,1,84,2,3,4,1,5,46,1,0,2,146,26,1,48,3,57,6,3,1,53,0,54,4,6,2,70,46,3,0,2,84,1,4,6,3,5,115,4,24,0,144,14,2,115,4,20,0,146,7,1,115,4,21,0,46,2,0,3,48,1,57,3,1,1,53,0,54,1,3,3,62,46,0,0,0,85,1,1,3,0,5,4,108,0,1,74,2,0,1,118,0,92,0,48,0,54,1,0,1,81,13,2,1,115,1,26,0,190,8,2,1,119,1,92,1,57,3,0,1,81,0,118,2,108,1,1,83,3,3,2,1,57,2,0,2,53,0,54,1,2,3,82,108,0,2,84,1,1,2,3,0,8,0,1,146,8,0,54,0,1,4,79,92,0,50,2,108,1,3,108,0,1,42,2,0,0,108,0,2,42,2,1,0,115,0,24,0,188,26,1,0,115,0,21,0,188,11,1,0,100,0,2,26,0,142,14,100,0,2,25,0,142,7,100,0,2,21,0,59,0,1,1,86,0,92,0,50,0,118,5,130,4,5,48,1,57,2,1,1,33,0,54,3,2,2,85,106,3,3,2,8,8,3,8,7,4,80,2,2,2,107,3,3,2,42,0,0,3,122,2,18,6,2,4,146,18,6,129,6,2,5,74,3,2,6,37,2,2,152,245,2,4,57,2,1,3,56,0,54,1,2,2,85,106,1,1,2,100,7,0,22,0,8,8,1,80,0,2,2,107,0,1,0,92,0,50,0,108,1,1,42,0,0,1,108,1,2,42,0,1,1,48,1,57,6,1,1,53,0,54,5,6,2,35,41,1,1,46,11,1,0,46,10,1,1,41,1,0,46,9,1,0,100,8,0,23,0,100,7,0,24,0,8,12,6,79,0,5,6,118,0,92,0,41,0,0,46,2,0,0,118,0,108,1,1,83,1,2,0,1,92,0,41,0,0,46,2,0,1,118,0,108,1,1,83,1,2,0,1,92,0,118,4,118,5,130,2,5,48,0,57,1,0,1,33,0,54,3,1,2,85,106,3,3,1,8,10,3,8,9,2,80,1,1,2,107,3,3,1,122,1,18,6,1,2,146,18,6,129,6,1,5,74,3,1,6,37,1,1,152,245,1,2,57,2,0,3,43,0,41,0,0,46,1,0,0,46,0,0,1,85,0,2,4,1,0,3,92,0,118,0,118,6,130,3,6,48,1,57,2,1,1,33,0,54,4,2,2,85,106,4,4,2,8,16,4,8,15,3,80,2,2,2,107,5,4,2,122,4,18,7,4,3,122,2,146,18,7,129,7,2,6,74,5,2,7,37,2,2,152,245,2,3,54,2,5,3,75,20,2,2,4,119,8,146,19,2,54,3,5,3,75,110,2,1,29,2,3,2,73,8,5,2,54,3,5,3,75,110,2,1,20,2,3,2,119,3,146,19,2,54,6,5,3,75,110,2,2,29,2,6,2,73,3,5,2,13,2,8,115,6,23,0,15,9,2,6,13,2,3,15,2,2,6,119,6,146,6,9,8,6,8,119,7,146,6,2,8,7,3,54,3,5,4,39,54,8,5,3,75,22,2,9,2,29,2,8,2,84,13,3,5,4,2,57,4,1,5,53,0,54,3,4,6,35,41,1,0,46,15,1,0,46,14,1,1,8,16,4,8,12,7,8,11,6,79,1,3,6,92,0,50,6,108,4,2,42,6,0,4,48,2,57,3,2,1,53,0,54,1,3,2,82,108,0,1,84,0,1,3,0,4,42,6,1,0,144,7,0,118,1,92,1,54,3,0,3,79,57,1,2,1,53,0,144,44,3,54,5,1,4,37,57,2,2,1,53,0,54,4,2,5,55,54,3,0,6,42,3,2,100,6,6,28,0,63,2,6,34,85,2,5,1,4,3,2,142,21,54,2,1,5,55,54,1,0,6,42,54,0,0,3,79,74,2,1,0,118,0,92,0,48,0,57,3,0,1,53,0,54,2,3,2,36,41,0,0,46,1,0,1,54,1,1,3,42,46,0,0,0,84,0,2,3,1,0,92,0,0,6,0,0,0,106,0,0,0,38,1,0,0,126,1,0,0,106,0,0,0,40,1,0,0,218,1,0,0,40,1,0,0,85,1,0,0,111,1,0,0,126,1,0,0,130,1,0,0,218,1,0,0,130,1,0,0,177,1,0,0,203,1,0,0,220,1,0,0,8,2,0,0,34,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,179,249,48,63,138,108,29,119,221,233,146,22,86,4,96,52,98,14,82,0 }; // NOLINT + const uint8_t k_native2js[] = { 198,31,188,3,193,3,25,31,96,0,0,0,210,159,155,50,112,82,146,119,31,196,30,159,174,100,233,215,193,49,18,205,168,10,0,0,0,0,0,0,13,0,0,0,2,0,0,0,33,0,0,0,53,0,0,0,0,0,0,0,151,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,109,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,5,0,2,9,128,17,0,120,10,0,2,0,0,0,2,205,5,0,8,144,0,0,0,120,10,0,8,6,2,5,6,93,6,0,4,56,128,7,0,120,10,0,26,0,0,0,6,149,6,0,2,34,0,7,0,120,10,0,22,0,2,0,6,183,6,0,6,200,0,8,0,120,10,0,28,0,8,0,6,127,7,0,4,75,128,6,0,120,10,0,24,0,5,0,6,202,7,0,4,42,0,6,0,120,10,0,22,0,2,0,6,244,7,0,6,73,128,5,0,120,10,0,26,0,2,0,6,61,8,0,2,89,0,0,0,120,10,0,10,0,4,1,6,150,8,0,6,42,0,0,0,120,10,0,28,0,3,0,6,192,8,0,6,190,0,0,0,120,10,0,34,0,6,0,6,126,9,0,8,224,0,0,0,120,10,0,34,0,8,1,6,94,10,0,4,24,0,0,0,120,10,0,20,0,0,0,6,20,0,0,0,33,0,0,128,199,211,94,16,86,255,169,21,9,248,128,22,252,130,149,208,132,179,196,162,253,169,7,33,33,19,225,126,50,61,140,251,134,23,31,31,52,82,183,227,172,182,0,17,32,149,1,30,171,186,118,185,182,215,236,231,169,50,70,244,135,68,180,36,20,224,34,154,186,38,19,147,104,90,135,68,218,222,12,160,154,170,42,196,232,201,62,162,101,158,200,66,62,10,199,213,127,137,213,91,135,253,211,44,127,147,209,126,246,62,242,243,241,210,24,42,102,54,240,234,232,1,98,83,228,81,148,108,61,95,124,128,0,0,0,0,20,0,0,20,68,0,0,9,106,0,0,10,136,0,0,15,164,0,0,21,216,0,0,131,222,1,0,3,234,1,0,6,252,1,0,3,16,2,0,40,96,2,0,17,130,2,0,18,166,2,0,16,198,2,0,18,234,2,0,18,14,3,0,27,68,3,0,8,110,3,0,6,132,3,0,9,0,0,0,24,56,0,0,6,84,0,0,5,94,0,0,7,96,0,0,4,124,0,0,6,164,0,0,26,170,1,0,6,184,1,0,8,224,1,0,5,244,1,0,4,0,2,0,8,84,2,0,5,82,3,0,4,90,3,0,12,120,3,0,6,150,3,0,10,170,3,0,9,188,3,0,10,204,3,0,17,238,3,0,16,242,3,0,35,56,4,0,10,76,4,0,21,118,4,0,6,130,4,0,30,190,4,0,11,212,4,0,12,236,4,0,7,250,4,0,4,2,5,0,7,16,5,0,6,28,5,0,9,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,110,103,116,104,65,114,103,117,109,101,110,116,115,108,105,99,101,95,99,97,108,108,73,68,105,109,101,110,115,105,111,110,115,112,108,105,99,101,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,10,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,77,97,112,112,108,121,79,98,106,101,99,116,101,115,116,83,101,116,111,83,116,114,105,110,103,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,102,117,110,99,116,105,111,110,97,109,101,106,115,77,111,100,117,108,101,76,105,115,116,114,105,110,103,108,111,98,97,108,117,110,100,101,102,105,110,101,100,64,64,105,116,101,114,97,116,111,114,84,121,112,101,69,114,114,111,114,95,95,71,76,79,66,65,76,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,95,95,105,110,118,111,107,101,67,97,108,108,98,97,99,107,65,110,100,82,101,116,117,114,110,70,108,117,115,104,101,100,81,117,101,117,101,95,99,97,108,108,98,97,99,107,115,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,95,113,117,101,117,101,99,97,108,108,70,117,110,99,116,105,111,110,82,101,116,117,114,110,70,108,117,115,104,101,100,81,117,101,117,101,99,111,110,115,116,114,117,99,116,111,114,102,108,117,115,104,101,100,81,117,101,117,101,102,111,114,69,97,99,104,102,114,111,109,105,115,65,114,114,97,121,112,97,114,97,109,115,112,114,111,116,111,116,121,112,101,0,48,0,0,0,0,0,0,0,109,0,0,0,0,0,1,0,0,6,1,15,17,0,0,0,4,4,7,85,7,105,16,19,0,0,0,7,73,7,110,7,116,15,37,0,0,0,4,4,7,56,16,57,0,0,0,15,53,0,0,0,4,4,7,49,7,54,16,57,0,0,0,7,51,7,50,24,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,4,94,0,0,0,10,7,67,108,97,109,112,101,100,25,57,0,0,0,10,5,65,114,114,97,121,2,0,0,0,0,50,0,100,0,0,1,0,92,0,50,0,100,1,0,2,0,42,0,0,1,100,1,0,3,0,42,0,1,1,100,1,0,4,0,42,0,2,1,100,1,0,5,0,42,0,3,1,100,1,0,6,0,42,0,4,1,100,1,0,7,0,42,0,5,1,48,1,57,3,1,1,35,0,3,2,59,3,2,1,39,0,57,3,1,2,39,0,100,2,0,8,0,59,3,2,2,47,0,57,3,1,2,39,0,100,2,0,9,0,59,3,2,3,41,0,57,3,1,2,39,0,100,2,0,10,0,59,3,2,4,40,0,57,1,1,2,39,0,100,0,0,11,0,59,1,0,5,45,0,118,0,92,0,108,4,1,41,2,0,46,0,2,4,118,1,83,0,0,1,4,144,12,0,46,3,2,3,83,0,3,1,4,144,12,0,46,3,2,2,83,0,3,1,4,144,13,0,46,2,2,1,81,2,2,1,118,0,92,0,48,0,57,2,0,1,37,0,54,0,2,2,52,106,1,0,2,115,3,6,0,8,4,1,80,0,2,2,107,0,1,0,95,0,108,2,1,144,7,2,118,0,92,0,115,1,18,0,13,0,2,189,166,0,0,0,1,0,3,0,54,1,0,1,31,54,0,1,2,24,83,4,0,1,2,54,3,4,3,22,110,1,8,111,0,255,255,255,255,84,1,3,4,1,0,115,0,8,0,15,0,0,1,146,8,0,54,0,2,4,46,8,3,1,146,13,0,54,0,2,4,46,54,3,0,5,33,115,0,7,0,188,66,0,3,115,0,9,0,188,58,0,3,115,0,2,0,188,33,0,3,132,1,10,0,0,0,0,0,0,0,0,0,0,0,54,0,1,6,30,83,1,0,1,3,118,0,146,18,1,41,1,0,46,3,1,5,118,1,84,0,3,1,2,1,142,20,48,1,57,3,1,7,32,0,54,1,3,8,49,83,0,1,3,2,92,0,41,0,0,46,1,0,5,118,0,84,0,1,0,2,0,92,0,108,2,1,48,0,54,1,0,1,27,115,3,19,0,13,1,1,188,25,3,1,57,1,0,1,27,0,54,1,1,2,28,73,3,2,1,119,1,186,19,1,3,54,3,2,3,36,119,1,186,8,1,3,118,1,92,1,57,1,0,4,32,0,54,0,1,5,49,83,0,0,1,2,92,0,108,2,1,48,0,57,1,0,1,32,0,54,0,1,2,50,83,0,0,1,2,118,1,144,5,0,92,1,41,0,0,46,0,0,5,83,0,0,1,2,92,0,108,3,1,108,1,2,119,0,14,0,0,1,144,12,0,54,2,3,1,21,20,0,1,2,146,8,0,54,1,3,1,21,48,0,57,2,0,2,32,0,118,0,83,0,2,0,1,122,2,18,4,2,1,146,18,4,73,4,3,2,74,0,2,4,37,2,2,152,245,2,1,92,0,48,3,57,0,3,1,38,0,54,1,0,2,44,57,2,3,1,38,0,7,0,4,0,7,4,0,0,68,0,4,0,7,4,0,0,68,0,4,1,7,4,0,0,68,0,4,2,57,3,3,1,38,0,54,3,3,3,23,68,0,3,3,59,2,0,1,44,0,122,0,73,0,1,0,54,2,0,4,21,119,0,146,6,2,8,0,1,92,0,48,0,57,4,0,1,39,0,54,3,4,2,40,108,2,1,108,1,2,84,1,3,4,2,1,57,1,0,1,39,0,54,0,1,3,47,81,0,0,1,92,0,108,0,1,108,4,2,48,1,57,2,1,1,38,0,54,2,2,2,42,73,3,2,0,144,7,3,118,2,92,2,57,2,1,1,38,0,54,7,2,3,43,110,2,1,12,5,2,34,6,0,5,73,6,7,6,144,63,6,57,6,1,1,38,0,54,7,6,3,43,36,6,0,2,73,6,7,6,144,41,6,57,6,1,1,38,0,54,6,6,2,42,34,5,0,5,75,5,6,5,57,1,1,1,38,0,54,1,1,2,42,36,0,0,2,75,0,1,0,146,45,4,54,0,4,4,21,170,37,0,2,122,1,73,5,4,1,119,0,188,14,5,0,73,5,4,1,118,0,190,15,5,0,54,0,4,5,25,84,0,0,4,1,2,54,2,3,6,29,41,0,0,46,1,0,0,118,0,83,1,1,0,4,84,1,2,3,0,1,92,0,108,2,1,108,0,2,108,4,3,115,1,4,0,188,123,2,1,115,1,3,0,188,115,2,1,115,1,1,0,191,176,0,0,0,2,1,115,1,5,0,191,165,0,0,0,0,1,48,1,57,5,1,1,38,0,120,3,59,5,3,1,20,0,122,3,73,3,4,3,57,5,1,1,38,0,54,5,5,2,26,73,5,5,3,146,121,5,57,5,1,1,38,0,54,5,5,2,26,73,7,5,3,54,6,7,3,48,50,5,100,5,5,12,0,83,5,6,7,5,57,1,1,1,38,0,54,1,1,2,26,75,1,1,3,142,71,48,1,57,1,1,1,38,0,54,1,1,4,34,73,3,1,2,146,52,3,73,1,3,0,146,45,1,73,1,3,0,13,2,1,115,1,17,0,190,31,2,1,73,2,3,0,54,1,2,5,24,110,0,1,73,0,4,0,54,0,0,6,51,84,0,1,2,3,0,48,0,57,1,0,7,39,0,54,0,1,8,47,81,0,0,1,92,0,108,1,1,13,2,1,115,0,17,0,190,10,2,0,118,0,81,0,1,0,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,16,44,59,204,133,119,70,5,118,213,123,95,131,119,29,146,104,102,105,0 }; // NOLINT + const uint8_t k_Event[] = { 198,31,188,3,193,3,25,31,96,0,0,0,248,240,189,168,45,230,19,190,184,156,37,201,49,211,226,145,47,67,101,146,8,5,0,0,0,0,0,0,5,0,0,0,2,0,0,0,26,0,0,0,35,0,0,0,0,0,0,0,72,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,3,0,2,9,128,15,0,216,4,0,2,0,0,0,2,33,3,0,8,59,0,0,0,216,4,0,8,0,1,3,6,92,3,0,2,45,0,0,0,216,4,0,22,0,3,0,6,137,3,0,4,1,1,0,0,216,4,0,36,0,15,0,6,138,4,0,4,76,0,0,0,216,4,0,30,0,6,0,6,9,0,0,0,26,0,0,128,229,122,148,194,208,163,2,145,142,5,4,142,154,102,238,157,230,198,237,126,169,50,70,244,17,47,149,6,249,107,235,204,182,215,236,231,249,246,187,133,117,156,159,56,9,205,100,85,101,250,141,203,250,233,21,150,231,141,206,154,90,35,1,231,185,10,124,114,89,218,72,162,104,90,135,68,26,125,172,32,29,222,241,106,123,147,228,226,135,68,180,36,228,81,148,108,123,169,253,143,61,95,124,128,0,0,0,0,0,0,0,16,46,0,0,14,58,0,0,15,146,0,0,25,218,0,0,7,250,0,0,15,24,1,0,8,72,1,0,22,30,0,0,4,38,0,0,5,86,0,0,18,112,0,0,15,140,0,0,3,192,0,0,12,216,0,0,2,230,0,0,10,38,1,0,4,46,1,0,14,116,1,0,5,116,1,0,12,138,1,0,6,150,1,0,6,162,1,0,18,194,1,0,16,222,1,0,16,250,1,0,14,18,2,0,10,38,2,0,11,60,2,0,6,72,2,0,6,84,2,0,6,96,2,0,6,106,2,0,10,126,2,0,9,64,104,112,58,108,111,97,100,73,110,115,116,97,110,99,101,109,105,116,69,114,114,111,114,101,109,111,118,101,82,111,111,116,86,105,101,119,77,97,110,97,103,101,114,101,99,101,105,118,101,78,97,116,105,118,101,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,117,110,93,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,32,105,110,32,106,115,77,111,100,117,108,101,76,105,115,116,105,100,101,97,108,108,111,99,97,108,108,78,97,116,105,118,101,100,101,115,116,114,111,121,73,110,115,116,97,110,99,101,102,117,110,99,116,105,111,110,97,109,101,72,101,114,109,101,115,73,110,116,101,114,110,97,108,111,97,100,32,105,110,115,116,97,110,99,101,32,101,114,114,111,114,58,32,91,72,105,112,112,121,68,101,97,108,108,111,99,111,110,99,97,116,79,98,106,101,99,116,95,95,117,110,108,111,97,100,73,110,115,116,97,110,99,101,95,95,108,111,97,100,73,110,115,116,97,110,99,101,95,95,105,110,115,116,97,110,99,101,78,97,109,101,95,95,105,110,115,116,97,110,99,101,73,100,95,95,71,76,79,66,65,76,95,95,97,112,112,82,101,103,105,115,116,101,114,97,115,115,105,103,110,98,114,105,100,103,101,103,108,111,98,97,108,112,97,114,97,109,115,117,112,101,114,80,114,111,112,115,112,114,111,116,111,116,121,112,101,97,1,0,0,50,0,100,0,0,1,0,92,0,50,0,48,1,57,3,1,1,31,0,100,2,0,2,0,59,3,2,1,20,0,57,3,1,1,31,0,100,2,0,3,0,59,3,2,2,24,0,57,1,1,1,31,0,100,0,0,4,0,59,1,0,3,23,0,118,0,92,0,48,0,57,1,0,1,31,0,54,1,1,2,19,146,28,1,57,0,0,1,31,0,54,2,0,2,19,54,1,2,3,9,115,0,5,0,83,0,1,2,0,118,0,92,0,108,0,1,144,5,0,3,0,54,2,0,1,17,54,8,0,2,15,54,3,0,3,32,118,0,190,6,3,0,3,3,48,1,57,4,1,4,27,0,54,4,4,5,28,73,4,4,2,144,56,4,57,6,1,6,10,0,57,4,1,7,18,0,54,7,4,8,21,115,5,8,0,115,4,4,0,84,10,7,5,2,4,54,5,6,9,34,106,5,5,6,8,11,5,80,4,6,2,107,4,5,4,95,4,57,6,1,10,22,0,54,5,6,11,29,3,4,63,4,2,25,63,4,8,26,84,4,5,6,3,4,57,7,1,10,22,0,54,6,7,11,29,57,4,1,4,27,0,54,4,4,5,28,73,5,4,2,3,4,63,4,8,15,63,4,3,33,84,4,6,7,5,4,57,4,1,4,27,0,54,4,4,12,14,54,6,4,13,12,146,41,6,54,4,6,14,11,13,5,4,115,4,7,0,190,26,5,4,54,5,6,14,11,5,4,2,0,1,0,0,0,68,4,3,1,83,4,5,6,4,57,1,1,4,27,0,54,1,1,5,28,73,2,1,2,54,1,2,15,13,83,1,1,2,3,92,0,108,0,1,144,5,0,3,0,54,4,0,1,15,48,0,57,1,0,2,31,0,54,3,1,3,19,54,2,3,4,9,115,1,6,0,84,1,2,3,1,4,57,0,0,3,19,0,54,3,0,5,30,54,2,3,6,16,115,1,3,0,115,0,2,0,85,0,2,3,1,0,4,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,227,162,170,25,142,9,153,57,0,93,186,66,235,125,240,161,27,92,44,17,0 }; // NOLINT + const uint8_t k_AnimationFrameModule[] = { 198,31,188,3,193,3,25,31,96,0,0,0,33,23,121,34,75,72,252,3,189,43,126,232,117,59,223,70,213,31,122,124,116,3,0,0,0,0,0,0,4,0,0,0,2,0,0,0,12,0,0,0,15,0,0,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,1,0,2,9,128,5,0,68,3,0,2,0,0,0,2,241,1,0,8,58,0,0,0,68,3,0,26,1,1,2,6,43,2,0,4,3,1,0,0,68,3,0,26,0,8,2,6,46,3,0,2,20,0,0,0,68,3,0,18,0,1,0,6,3,0,0,0,12,0,0,128,67,20,162,123,199,211,94,16,81,163,231,0,186,38,19,147,207,186,65,249,215,251,84,184,104,90,135,68,82,150,87,134,135,68,180,36,61,95,124,128,134,184,33,63,33,19,225,126,0,0,0,0,12,0,0,20,52,0,0,17,0,0,0,20,86,0,0,24,92,0,0,21,134,0,0,9,150,0,0,21,150,0,0,23,196,0,0,10,216,0,0,20,0,1,0,6,12,1,0,9,30,1,0,4,38,1,0,26,67,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,115,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,84,121,112,101,69,114,114,111,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,95,95,71,76,79,66,65,76,95,95,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,103,108,111,98,97,108,112,114,111,116,111,116,121,112,101,112,117,115,104,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,0,0,0,48,0,0,0,50,0,100,0,0,1,0,92,0,50,1,108,3,3,118,0,115,2,1,0,83,2,3,0,2,42,1,0,2,48,2,57,4,2,1,11,0,100,3,1,2,0,59,4,3,1,7,0,57,2,2,1,11,0,100,1,1,3,0,59,2,1,2,10,0,92,0,108,3,1,48,0,144,35,3,57,4,0,1,6,0,54,1,4,2,12,106,2,1,4,115,5,2,0,8,6,2,80,1,4,2,107,1,2,1,95,1,57,1,0,3,9,0,54,1,1,4,4,57,2,0,3,9,0,144,70,1,54,4,2,5,14,57,1,0,3,9,0,54,1,1,6,8,73,1,4,1,147,173,0,0,0,1,57,1,0,3,9,0,54,4,1,5,14,57,1,0,3,9,0,54,1,1,6,8,73,4,4,1,54,1,4,7,13,83,1,1,4,3,143,131,0,0,0,121,1,59,2,1,1,4,0,57,2,0,3,9,0,54,4,2,6,8,110,1,1,22,1,4,1,59,2,1,2,8,0,57,1,0,3,9,0,54,4,1,5,14,57,1,0,3,9,0,54,2,1,6,8,7,1,0,0,74,4,2,1,57,1,0,3,9,0,54,2,1,5,14,57,1,0,3,9,0,54,1,1,6,8,73,2,2,1,54,1,2,7,13,83,1,1,2,3,41,1,0,46,2,1,0,54,1,2,8,5,57,0,0,3,9,0,54,0,0,6,8,83,0,1,2,0,115,0,0,0,92,0,41,0,0,46,1,0,0,54,0,1,1,3,81,0,0,1,118,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,248,199,103,46,134,168,86,88,238,238,186,44,29,52,254,164,163,78,165,0 }; // NOLINT + const uint8_t k_Turbo[] = { 198,31,188,3,193,3,25,31,96,0,0,0,183,93,5,196,163,159,135,149,6,174,69,63,229,118,86,249,170,172,181,158,80,3,0,0,0,0,0,0,7,0,0,0,2,0,0,0,10,0,0,0,12,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,1,0,2,9,128,0,0,32,3,0,2,0,0,0,2,173,1,0,8,25,0,0,0,32,3,0,4,0,1,1,6,198,1,0,4,16,128,2,0,32,3,0,4,1,0,0,6,214,1,0,2,106,0,0,0,32,3,0,30,2,3,0,6,64,2,0,6,185,0,0,0,32,3,0,36,2,5,1,6,249,2,0,4,19,0,0,0,32,3,0,22,0,0,0,6,12,3,0,4,19,0,0,0,32,3,0,22,0,0,0,6,2,0,0,0,10,0,0,128,171,186,118,185,117,156,159,56,101,250,141,203,181,173,102,157,134,113,0,157,104,90,135,68,112,91,127,104,101,158,200,66,52,82,183,227,61,95,124,128,0,0,0,0,0,0,0,6,12,0,0,5,22,0,0,5,32,0,0,6,42,0,0,12,52,0,0,7,66,0,0,10,84,0,0,11,106,0,0,10,126,0,0,5,136,0,0,9,103,108,111,98,97,108,65,114,114,97,121,72,105,112,112,121,99,111,110,99,97,116,117,114,98,111,80,114,111,109,105,115,101,95,95,71,76,79,66,65,76,95,95,99,97,108,108,98,97,99,107,73,68,95,99,97,108,108,98,97,99,107,115,97,112,112,108,121,112,114,111,116,111,116,121,112,101,0,0,0,48,0,0,0,50,0,100,0,0,1,0,92,0,48,0,57,1,0,1,3,0,50,0,100,0,0,2,0,59,1,0,1,5,0,118,0,92,0,50,0,108,1,1,42,0,0,1,100,0,0,3,0,92,0,50,0,118,5,108,1,0,42,0,0,1,130,4,5,48,1,57,2,1,1,2,0,54,3,2,2,11,106,3,3,2,8,8,3,8,7,4,80,2,2,2,107,3,3,2,42,0,1,3,122,2,18,6,2,4,146,18,6,129,6,2,5,74,3,2,6,37,2,2,152,245,2,4,57,2,1,3,6,0,54,1,2,2,11,106,1,1,2,100,7,0,4,0,8,8,1,80,0,2,2,107,0,1,0,92,0,50,1,108,0,1,42,1,0,0,108,0,2,42,1,1,0,48,0,57,2,0,1,7,0,54,8,2,2,8,57,2,0,1,7,0,54,3,2,3,9,100,2,1,5,0,74,3,8,2,57,4,0,1,7,0,54,3,4,2,8,110,2,1,22,3,3,2,59,4,3,1,8,0,57,3,0,1,7,0,54,7,3,2,8,57,3,0,1,7,0,54,3,3,3,9,100,1,1,6,0,74,3,7,1,57,1,0,1,7,0,54,0,1,2,8,22,0,0,2,59,1,0,1,8,0,41,0,1,46,3,0,0,54,2,3,4,10,41,0,0,46,1,0,0,7,6,0,0,54,5,6,5,4,46,4,0,1,7,0,2,0,68,0,8,0,68,0,7,1,84,0,5,6,4,0,84,0,2,3,1,0,118,0,92,0,41,0,0,46,2,0,0,118,0,108,1,1,83,1,2,0,1,92,0,41,0,0,46,2,0,1,118,0,108,1,1,83,1,2,0,1,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,141,197,127,84,242,88,172,41,206,114,63,240,226,76,178,130,90,45,178,0 }; // NOLINT +} // namespace + +namespace hippy { +inline namespace driver { + +static const std::unordered_map global_base_js_source_map{ + {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT + {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT + {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT + {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT + {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT + {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT + {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT + {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT + {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT + {"promise.js", {k_promise, ARRAY_SIZE(k_promise) - 1}}, // NOLINT + {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT + {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT + {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT + {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT + {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT + {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT + {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT + {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT + {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT + {"Turbo.js", {k_Turbo, ARRAY_SIZE(k_Turbo) - 1}}, // NOLINT +}; + +static NativeSourceCode GetNativeSourceCodeImp(const std::string& filename) { + const auto it = global_base_js_source_map.find(filename); + return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; +} + +NativeSourceCode NativeSourceCodeProviderHermes::GetNativeSourceCode(const std::string &filename) const { + return GetNativeSourceCodeImp(filename); +} + +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/vm/js_vm.cc b/driver/js/src/vm/js_vm.cc index 0b3b05725d9..a819a28a873 100644 --- a/driver/js/src/vm/js_vm.cc +++ b/driver/js/src/vm/js_vm.cc @@ -21,10 +21,30 @@ */ #include "driver/vm/js_vm.h" - -#include "footstone/string_view_utils.h" -#include "driver/vm/native_source_code.h" #include "driver/napi/js_try_catch.h" +#include "driver/vm/native_source_code.h" +#include "footstone/string_view_utils.h" + +#ifdef JS_JSC +#include "driver/vm/jsc/jsc_vm.h" +#endif /* JS_JSC */ + +#ifdef JS_HERMES +#include "driver/vm/hermes/hermes_vm.h" +#endif /* JS_HERMES */ + +#ifdef JS_V8 +#include "driver/vm/v8/v8_vm.h" +#endif /* JS_V8 */ + + +#ifdef JS_HERMES +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wextra-semi" +#pragma clang diagnostic ignored "-Wsign-conversion" +#include "hermes/hermes.h" +#pragma clang diagnostic pop +#endif namespace hippy { inline namespace driver { @@ -36,15 +56,15 @@ constexpr char kHippyExceptionHandlerName[] = "HippyExceptionHandler"; using Ctx = hippy::Ctx; using CtxValue = hippy::CtxValue; -void VM::HandleException(const std::shared_ptr& ctx, - const string_view& event_name, +void VM::HandleException(const std::shared_ptr& ctx, const string_view& event_name, const std::shared_ptr& exception) { auto global_object = ctx->GetGlobalObject(); string_view error_handle_name(kHippyExceptionHandlerName); auto error_handle_key = ctx->CreateString(error_handle_name); auto exception_handler = ctx->GetProperty(global_object, error_handle_key); if (!ctx->IsFunction(exception_handler)) { - const auto& source_code = hippy::GetNativeSourceCode(kExceptionHandlerJSName); + auto source_code_provider = ctx->GetNativeSourceCodeProvider(); + const auto &source_code = source_code_provider->GetNativeSourceCode(kExceptionHandlerJSName); FOOTSTONE_DCHECK(source_code.data_ && source_code.length_); string_view str_view(source_code.data_, source_code.length_); exception_handler = ctx->RunScript(str_view, error_handle_name); @@ -55,7 +75,7 @@ void VM::HandleException(const std::shared_ptr& ctx, argv[0] = ctx->CreateString(event_name); argv[1] = exception; - auto try_catch = CreateTryCatchScope(true, ctx); + auto try_catch = hippy::TryCatch::CreateTryCatchScope(true, ctx); auto ret_value = ctx->CallFunction(exception_handler, ctx->GetGlobalObject(), 2, argv); if (try_catch->HasCaught()) { auto message = try_catch->GetExceptionMessage(); @@ -63,6 +83,34 @@ void VM::HandleException(const std::shared_ptr& ctx, } } +std::shared_ptr VM::CreateVM(const std::shared_ptr& param) { + std::shared_ptr vm = nullptr; + + if (!param || param->vm_type.empty()) { + // Using jsc on iOS and v8 on Android by default. +#ifdef JS_JSC + vm = JSCVM::CreateVM(param); +#elif defined(JS_V8) + vm = V8VM::CreateVM(param); +#endif /* JS_JSC/JS_V8 */ + } else if (param->vm_type == kJSEngineJSC) { +#ifdef JS_JSC + vm = JSCVM::CreateVM(param); +#endif /* JS_JSC */ + } else if (param->vm_type == kJSEngineHermes) { +#ifdef JS_HERMES + vm = HermesVM::CreateVM(param); +#endif /* JS_HERMES */ + } else if (param->vm_type == kJSEngineV8) { +#ifdef JS_V8 + vm = V8VM::CreateVM(param); +#endif /* JS_V8 */ + } + + FOOTSTONE_CHECK(vm != nullptr); + return vm; } -} -} + +} // namespace vm +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/vm/jsc/jsc_vm.cc b/driver/js/src/vm/jsc/jsc_vm.cc index 6e92f5c3d40..90e2199fe80 100644 --- a/driver/js/src/vm/jsc/jsc_vm.cc +++ b/driver/js/src/vm/jsc/jsc_vm.cc @@ -54,8 +54,8 @@ std::shared_ptr JSCVM::CreateContext() { return std::make_shared(vm_, weak_from_this()); } -std::shared_ptr CreateVM(const std::shared_ptr& param) { - return std::make_shared(); +std::shared_ptr JSCVM::CreateVM(const std::shared_ptr& param) { + return std::make_shared(param); } JSStringRef JSCVM::CreateJSCString(const string_view& str_view) { diff --git a/driver/js/src/vm/jsc/native_source_code_ios.cc b/driver/js/src/vm/jsc/native_source_code_ios.cc deleted file mode 100644 index 0eb6bcfadb4..00000000000 --- a/driver/js/src/vm/jsc/native_source_code_ios.cc +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making - * Hippy available. - * - * Copyright (C) 2017-2024 THL A29 Limited, a Tencent company. - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "driver/vm/native_source_code.h" -#include "footstone/macros.h" - - -namespace { - const uint8_t k_bootstrap[] = { 34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,105,110,115,116,97,110,99,101,44,32,67,111,110,115,116,114,117,99,116,111,114,41,32,123,32,105,102,32,40,33,40,105,110,115,116,97,110,99,101,32,105,110,115,116,97,110,99,101,111,102,32,67,111,110,115,116,114,117,99,116,111,114,41,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,34,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,116,97,114,103,101,116,44,32,112,114,111,112,115,41,32,123,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,59,32,105,32,60,32,112,114,111,112,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,32,118,97,114,32,100,101,115,99,114,105,112,116,111,114,32,61,32,112,114,111,112,115,91,105,93,59,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,61,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,124,124,32,102,97,108,115,101,59,32,100,101,115,99,114,105,112,116,111,114,46,99,111,110,102,105,103,117,114,97,98,108,101,32,61,32,116,114,117,101,59,32,105,102,32,40,34,118,97,108,117,101,34,32,105,110,32,100,101,115,99,114,105,112,116,111,114,41,32,100,101,115,99,114,105,112,116,111,114,46,119,114,105,116,97,98,108,101,32,61,32,116,114,117,101,59,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,116,97,114,103,101,116,44,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,100,101,115,99,114,105,112,116,111,114,46,107,101,121,41,44,32,100,101,115,99,114,105,112,116,111,114,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,99,114,101,97,116,101,67,108,97,115,115,40,67,111,110,115,116,114,117,99,116,111,114,44,32,112,114,111,116,111,80,114,111,112,115,44,32,115,116,97,116,105,99,80,114,111,112,115,41,32,123,32,105,102,32,40,112,114,111,116,111,80,114,111,112,115,41,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,67,111,110,115,116,114,117,99,116,111,114,46,112,114,111,116,111,116,121,112,101,44,32,112,114,111,116,111,80,114,111,112,115,41,59,32,105,102,32,40,115,116,97,116,105,99,80,114,111,112,115,41,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,67,111,110,115,116,114,117,99,116,111,114,44,32,115,116,97,116,105,99,80,114,111,112,115,41,59,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,67,111,110,115,116,114,117,99,116,111,114,44,32,34,112,114,111,116,111,116,121,112,101,34,44,32,123,32,119,114,105,116,97,98,108,101,58,32,102,97,108,115,101,32,125,41,59,32,114,101,116,117,114,110,32,67,111,110,115,116,114,117,99,116,111,114,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,97,114,103,41,32,123,32,118,97,114,32,107,101,121,32,61,32,95,116,111,80,114,105,109,105,116,105,118,101,40,97,114,103,44,32,34,115,116,114,105,110,103,34,41,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,40,107,101,121,41,32,61,61,61,32,34,115,121,109,98,111,108,34,32,63,32,107,101,121,32,58,32,83,116,114,105,110,103,40,107,101,121,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,105,109,105,116,105,118,101,40,105,110,112,117,116,44,32,104,105,110,116,41,32,123,32,105,102,32,40,95,116,121,112,101,111,102,40,105,110,112,117,116,41,32,33,61,61,32,34,111,98,106,101,99,116,34,32,124,124,32,105,110,112,117,116,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,105,110,112,117,116,59,32,118,97,114,32,112,114,105,109,32,61,32,105,110,112,117,116,91,83,121,109,98,111,108,46,116,111,80,114,105,109,105,116,105,118,101,93,59,32,105,102,32,40,112,114,105,109,32,33,61,61,32,117,110,100,101,102,105,110,101,100,41,32,123,32,118,97,114,32,114,101,115,32,61,32,112,114,105,109,46,99,97,108,108,40,105,110,112,117,116,44,32,104,105,110,116,32,124,124,32,34,100,101,102,97,117,108,116,34,41,59,32,105,102,32,40,95,116,121,112,101,111,102,40,114,101,115,41,32,33,61,61,32,34,111,98,106,101,99,116,34,41,32,114,101,116,117,114,110,32,114,101,115,59,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,34,41,59,32,125,32,114,101,116,117,114,110,32,40,104,105,110,116,32,61,61,61,32,34,115,116,114,105,110,103,34,32,63,32,83,116,114,105,110,103,32,58,32,78,117,109,98,101,114,41,40,105,110,112,117,116,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,98,106,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,98,106,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,111,98,106,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,98,106,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,98,106,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,98,106,59,32,125,44,32,95,116,121,112,101,111,102,40,111,98,106,41,59,32,125,10,40,102,117,110,99,116,105,111,110,32,40,103,101,116,73,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,10,32,32,103,108,111,98,97,108,46,72,105,112,112,121,32,61,32,103,108,111,98,97,108,46,72,105,112,112,121,32,124,124,32,123,125,59,10,32,32,118,97,114,32,98,105,110,100,105,110,103,79,98,106,32,61,32,123,125,59,10,32,32,118,97,114,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,32,61,32,102,117,110,99,116,105,111,110,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,109,111,100,117,108,101,41,32,123,10,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,98,105,110,100,105,110,103,79,98,106,91,109,111,100,117,108,101,93,41,32,33,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,32,32,98,105,110,100,105,110,103,79,98,106,91,109,111,100,117,108,101,93,32,61,32,103,101,116,73,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,109,111,100,117,108,101,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,98,105,110,100,105,110,103,79,98,106,91,109,111,100,117,108,101,93,59,10,32,32,125,59,10,32,32,118,97,114,32,67,111,110,116,101,120,116,105,102,121,83,99,114,105,112,116,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,39,41,59,10,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,102,117,110,99,116,105,111,110,32,78,97,116,105,118,101,77,111,100,117,108,101,40,102,105,108,101,110,97,109,101,41,32,123,10,32,32,32,32,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,78,97,116,105,118,101,77,111,100,117,108,101,41,59,10,32,32,32,32,32,32,116,104,105,115,46,102,105,108,101,110,97,109,101,32,61,32,102,105,108,101,110,97,109,101,59,10,32,32,32,32,32,32,116,104,105,115,46,101,120,112,111,114,116,115,32,61,32,123,125,59,10,32,32,32,32,125,10,32,32,32,32,95,99,114,101,97,116,101,67,108,97,115,115,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,91,123,10,32,32,32,32,32,32,107,101,121,58,32,34,99,111,109,112,105,108,101,34,44,10,32,32,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,99,111,109,112,105,108,101,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,102,110,32,61,32,67,111,110,116,101,120,116,105,102,121,83,99,114,105,112,116,46,82,117,110,73,110,84,104,105,115,67,111,110,116,101,120,116,40,116,104,105,115,46,102,105,108,101,110,97,109,101,41,59,10,32,32,32,32,32,32,32,32,102,110,40,116,104,105,115,46,101,120,112,111,114,116,115,44,32,78,97,116,105,118,101,77,111,100,117,108,101,46,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,44,32,123,10,32,32,32,32,32,32,107,101,121,58,32,34,99,97,99,104,101,34,44,10,32,32,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,99,97,99,104,101,40,41,32,123,10,32,32,32,32,32,32,32,32,78,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,91,116,104,105,115,46,102,105,108,101,110,97,109,101,93,32,61,32,116,104,105,115,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,93,44,32,91,123,10,32,32,32,32,32,32,107,101,121,58,32,34,114,101,113,117,105,114,101,34,44,10,32,32,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,114,101,113,117,105,114,101,40,102,105,108,101,80,97,116,104,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,102,105,108,101,80,97,116,104,65,114,114,32,61,32,102,105,108,101,80,97,116,104,46,115,112,108,105,116,40,39,47,39,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,102,105,108,101,110,97,109,101,32,61,32,102,105,108,101,80,97,116,104,65,114,114,91,102,105,108,101,80,97,116,104,65,114,114,46,108,101,110,103,116,104,32,45,32,49,93,59,10,32,32,32,32,32,32,32,32,118,97,114,32,99,97,99,104,101,100,32,61,32,78,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,91,102,105,108,101,110,97,109,101,93,59,10,32,32,32,32,32,32,32,32,105,102,32,40,99,97,99,104,101,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,97,99,104,101,100,46,101,120,112,111,114,116,115,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,118,97,114,32,110,97,116,105,118,101,77,111,100,117,108,101,32,61,32,110,101,119,32,78,97,116,105,118,101,77,111,100,117,108,101,40,102,105,108,101,110,97,109,101,41,59,10,32,32,32,32,32,32,32,32,110,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,40,41,59,10,32,32,32,32,32,32,32,32,110,97,116,105,118,101,77,111,100,117,108,101,46,99,111,109,112,105,108,101,40,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,97,116,105,118,101,77,111,100,117,108,101,46,101,120,112,111,114,116,115,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,93,41,59,10,32,32,32,32,114,101,116,117,114,110,32,78,97,116,105,118,101,77,111,100,117,108,101,59,10,32,32,125,40,41,59,10,32,32,78,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,32,61,32,123,125,59,10,32,32,78,97,116,105,118,101,77,111,100,117,108,101,46,114,101,113,117,105,114,101,40,39,104,105,112,112,121,46,106,115,39,41,59,10,125,41,59,0 }; // NOLINT - const uint8_t k_hippy[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,79,116,104,101,114,115,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,68,121,110,97,109,105,99,76,111,97,100,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,80,108,97,116,102,111,114,109,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,98,114,105,100,103,101,47,105,111,115,47,106,115,50,110,97,116,105,118,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,84,105,109,101,114,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,112,114,111,109,105,115,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,67,111,110,115,111,108,101,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,78,101,116,119,111,114,107,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,83,116,111,114,97,103,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,68,105,109,101,110,115,105,111,110,115,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,85,116,105,108,115,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,103,108,111,98,97,108,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,98,114,105,100,103,101,47,105,111,115,47,110,97,116,105,118,101,50,106,115,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,69,118,101,110,116,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,84,117,114,98,111,46,106,115,39,41,59,10,103,108,111,98,97,108,46,108,111,99,97,108,83,116,111,114,97,103,101,32,61,32,72,105,112,112,121,46,97,115,121,110,99,83,116,111,114,97,103,101,59,10,103,108,111,98,97,108,46,116,117,114,98,111,80,114,111,109,105,115,101,32,61,32,72,105,112,112,121,46,116,117,114,98,111,80,114,111,109,105,115,101,59,125,41,59,0 }; // NOLINT - const uint8_t k_ExceptionHandle[] = { 34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,40,102,117,110,99,116,105,111,110,32,101,120,99,101,112,116,105,111,110,72,97,110,100,108,101,114,40,101,118,101,110,116,78,97,109,101,44,32,101,120,99,101,112,116,105,111,110,41,32,123,10,32,32,105,102,32,40,103,108,111,98,97,108,46,72,105,112,112,121,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,72,105,112,112,121,46,101,109,105,116,40,101,118,101,110,116,78,97,109,101,44,32,101,120,99,101,112,116,105,111,110,41,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,101,118,101,110,116,78,97,109,101,44,32,101,120,99,101,112,116,105,111,110,41,59,10,32,32,125,10,125,41,59,0 }; // NOLINT - const uint8_t k_Others[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,98,106,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,98,106,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,111,98,106,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,98,106,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,98,106,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,98,106,59,32,125,44,32,95,116,121,112,101,111,102,40,111,98,106,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,116,97,114,103,101,116,44,32,112,114,111,112,115,41,32,123,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,59,32,105,32,60,32,112,114,111,112,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,32,118,97,114,32,100,101,115,99,114,105,112,116,111,114,32,61,32,112,114,111,112,115,91,105,93,59,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,61,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,124,124,32,102,97,108,115,101,59,32,100,101,115,99,114,105,112,116,111,114,46,99,111,110,102,105,103,117,114,97,98,108,101,32,61,32,116,114,117,101,59,32,105,102,32,40,34,118,97,108,117,101,34,32,105,110,32,100,101,115,99,114,105,112,116,111,114,41,32,100,101,115,99,114,105,112,116,111,114,46,119,114,105,116,97,98,108,101,32,61,32,116,114,117,101,59,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,116,97,114,103,101,116,44,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,100,101,115,99,114,105,112,116,111,114,46,107,101,121,41,44,32,100,101,115,99,114,105,112,116,111,114,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,99,114,101,97,116,101,67,108,97,115,115,40,67,111,110,115,116,114,117,99,116,111,114,44,32,112,114,111,116,111,80,114,111,112,115,44,32,115,116,97,116,105,99,80,114,111,112,115,41,32,123,32,105,102,32,40,112,114,111,116,111,80,114,111,112,115,41,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,67,111,110,115,116,114,117,99,116,111,114,46,112,114,111,116,111,116,121,112,101,44,32,112,114,111,116,111,80,114,111,112,115,41,59,32,105,102,32,40,115,116,97,116,105,99,80,114,111,112,115,41,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,67,111,110,115,116,114,117,99,116,111,114,44,32,115,116,97,116,105,99,80,114,111,112,115,41,59,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,67,111,110,115,116,114,117,99,116,111,114,44,32,34,112,114,111,116,111,116,121,112,101,34,44,32,123,32,119,114,105,116,97,98,108,101,58,32,102,97,108,115,101,32,125,41,59,32,114,101,116,117,114,110,32,67,111,110,115,116,114,117,99,116,111,114,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,97,114,103,41,32,123,32,118,97,114,32,107,101,121,32,61,32,95,116,111,80,114,105,109,105,116,105,118,101,40,97,114,103,44,32,34,115,116,114,105,110,103,34,41,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,40,107,101,121,41,32,61,61,61,32,34,115,121,109,98,111,108,34,32,63,32,107,101,121,32,58,32,83,116,114,105,110,103,40,107,101,121,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,105,109,105,116,105,118,101,40,105,110,112,117,116,44,32,104,105,110,116,41,32,123,32,105,102,32,40,95,116,121,112,101,111,102,40,105,110,112,117,116,41,32,33,61,61,32,34,111,98,106,101,99,116,34,32,124,124,32,105,110,112,117,116,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,105,110,112,117,116,59,32,118,97,114,32,112,114,105,109,32,61,32,105,110,112,117,116,91,83,121,109,98,111,108,46,116,111,80,114,105,109,105,116,105,118,101,93,59,32,105,102,32,40,112,114,105,109,32,33,61,61,32,117,110,100,101,102,105,110,101,100,41,32,123,32,118,97,114,32,114,101,115,32,61,32,112,114,105,109,46,99,97,108,108,40,105,110,112,117,116,44,32,104,105,110,116,32,124,124,32,34,100,101,102,97,117,108,116,34,41,59,32,105,102,32,40,95,116,121,112,101,111,102,40,114,101,115,41,32,33,61,61,32,34,111,98,106,101,99,116,34,41,32,114,101,116,117,114,110,32,114,101,115,59,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,34,41,59,32,125,32,114,101,116,117,114,110,32,40,104,105,110,116,32,61,61,61,32,34,115,116,114,105,110,103,34,32,63,32,83,116,114,105,110,103,32,58,32,78,117,109,98,101,114,41,40,105,110,112,117,116,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,105,110,115,116,97,110,99,101,44,32,67,111,110,115,116,114,117,99,116,111,114,41,32,123,32,105,102,32,40,33,40,105,110,115,116,97,110,99,101,32,105,110,115,116,97,110,99,101,111,102,32,67,111,110,115,116,114,117,99,116,111,114,41,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,34,41,59,32,125,32,125,10,103,108,111,98,97,108,46,95,95,73,83,72,73,80,80,89,95,95,32,61,32,116,114,117,101,59,10,103,108,111,98,97,108,46,95,95,71,76,79,66,65,76,95,95,32,61,32,123,10,32,32,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,58,32,123,125,10,125,59,10,118,97,114,32,69,114,114,111,114,69,118,101,110,116,32,61,32,95,99,114,101,97,116,101,67,108,97,115,115,40,102,117,110,99,116,105,111,110,32,69,114,114,111,114,69,118,101,110,116,40,109,101,115,115,97,103,101,44,32,102,105,108,101,110,97,109,101,44,32,108,105,110,101,110,111,44,32,99,111,108,110,111,44,32,101,114,114,111,114,41,32,123,10,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,69,114,114,111,114,69,118,101,110,116,41,59,10,32,32,116,104,105,115,46,109,101,115,115,97,103,101,32,61,32,109,101,115,115,97,103,101,59,10,32,32,116,104,105,115,46,102,105,108,101,110,97,109,101,32,61,32,102,105,108,101,110,97,109,101,59,10,32,32,116,104,105,115,46,108,105,110,101,110,111,32,61,32,108,105,110,101,110,111,59,10,32,32,116,104,105,115,46,99,111,108,110,111,32,61,32,99,111,108,110,111,59,10,32,32,116,104,105,115,46,101,114,114,111,114,32,61,32,101,114,114,111,114,59,10,125,41,59,10,102,117,110,99,116,105,111,110,32,104,105,112,112,121,82,101,103,105,115,116,101,114,40,97,112,112,78,97,109,101,44,32,101,110,116,114,121,70,117,110,99,41,32,123,10,32,32,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,97,112,112,78,97,109,101,93,32,61,32,123,10,32,32,32,32,114,117,110,58,32,101,110,116,114,121,70,117,110,99,10,32,32,125,59,10,125,10,102,117,110,99,116,105,111,110,32,111,110,40,101,118,101,110,116,78,97,109,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,101,118,101,110,116,78,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,32,124,124,32,116,121,112,101,111,102,32,108,105,115,116,101,110,101,114,32,33,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,111,110,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,32,97,110,100,32,97,32,102,117,110,99,116,105,111,110,32,97,115,32,108,105,115,116,101,110,101,114,39,41,59,10,32,32,125,10,32,32,118,97,114,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,105,102,32,40,33,40,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,105,110,115,116,97,110,99,101,111,102,32,83,101,116,41,41,32,123,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,32,61,32,110,101,119,32,83,101,116,40,41,59,10,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,125,10,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,97,100,100,40,108,105,115,116,101,110,101,114,41,59,10,32,32,114,101,116,117,114,110,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,59,10,125,10,102,117,110,99,116,105,111,110,32,111,102,102,40,101,118,101,110,116,78,97,109,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,101,118,101,110,116,78,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,111,102,102,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,39,41,59,10,32,32,125,10,32,32,118,97,114,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,105,102,32,40,33,40,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,105,110,115,116,97,110,99,101,111,102,32,83,101,116,41,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,105,102,32,40,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,100,101,108,101,116,101,40,108,105,115,116,101,110,101,114,41,59,10,32,32,32,32,114,101,116,117,114,110,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,59,10,32,32,125,10,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,99,108,101,97,114,40,41,59,10,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,125,10,102,117,110,99,116,105,111,110,32,101,109,105,116,40,101,118,101,110,116,78,97,109,101,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,32,62,32,49,32,63,32,95,108,101,110,32,45,32,49,32,58,32,48,41,44,32,95,107,101,121,32,61,32,49,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,97,114,103,115,91,95,107,101,121,32,45,32,49,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,125,10,32,32,105,102,32,40,116,121,112,101,111,102,32,101,118,101,110,116,78,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,101,109,105,116,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,39,41,59,10,32,32,125,10,32,32,118,97,114,32,105,115,69,114,114,32,61,32,101,118,101,110,116,78,97,109,101,32,61,61,61,32,39,101,114,114,111,114,39,59,10,32,32,118,97,114,32,101,114,114,79,98,106,32,61,32,110,101,119,32,69,114,114,111,114,40,41,59,10,32,32,105,102,32,40,105,115,69,114,114,41,32,123,10,32,32,32,32,118,97,114,32,97,114,114,32,61,32,97,114,103,115,91,48,93,59,10,32,32,32,32,105,102,32,40,33,40,97,114,114,32,105,110,115,116,97,110,99,101,111,102,32,65,114,114,97,121,41,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,109,117,115,116,32,98,101,32,97,114,114,97,121,39,41,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,97,114,114,46,108,101,110,103,116,104,32,33,61,61,32,53,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,53,39,41,59,10,32,32,32,32,125,10,32,32,32,32,101,114,114,79,98,106,46,109,101,115,115,97,103,101,32,61,32,74,83,79,78,46,115,116,114,105,110,103,105,102,121,40,97,114,114,91,52,93,41,59,10,32,32,32,32,105,102,32,40,72,105,112,112,121,46,111,110,101,114,114,111,114,41,32,123,10,32,32,32,32,32,32,72,105,112,112,121,46,111,110,101,114,114,111,114,40,97,114,114,91,48,93,44,32,97,114,114,91,49,93,44,32,97,114,114,91,50,93,44,32,97,114,114,91,51,93,44,32,101,114,114,79,98,106,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,118,97,114,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,105,102,32,40,33,101,118,101,110,116,76,105,115,116,101,110,101,114,115,41,32,123,10,32,32,32,32,105,102,32,40,97,114,103,115,91,48,93,41,32,123,10,32,32,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,97,114,103,115,91,48,93,46,116,111,83,116,114,105,110,103,40,41,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,59,10,32,32,125,10,32,32,116,114,121,32,123,10,32,32,32,32,105,102,32,40,105,115,69,114,114,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,114,114,32,61,32,97,114,103,115,91,48,93,59,10,32,32,32,32,32,32,118,97,114,32,101,118,101,110,116,32,61,32,110,101,119,32,69,114,114,111,114,69,118,101,110,116,40,95,97,114,114,91,48,93,44,32,95,97,114,114,91,49,93,44,32,95,97,114,114,91,50,93,44,32,95,97,114,114,91,51,93,44,32,101,114,114,79,98,106,41,59,10,32,32,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,105,115,116,101,110,101,114,40,101,118,101,110,116,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,105,115,116,101,110,101,114,46,97,112,112,108,121,40,118,111,105,100,32,48,44,32,97,114,103,115,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,32,99,97,116,99,104,32,40,101,114,114,41,32,123,10,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,101,114,114,41,59,10,32,32,125,10,125,10,72,105,112,112,121,46,100,101,118,105,99,101,32,61,32,123,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,32,61,32,123,125,59,10,72,105,112,112,121,46,114,101,103,105,115,116,101,114,32,61,32,123,10,32,32,114,101,103,105,115,116,58,32,104,105,112,112,121,82,101,103,105,115,116,101,114,10,125,59,10,72,105,112,112,121,46,111,110,32,61,32,111,110,59,10,72,105,112,112,121,46,111,102,102,32,61,32,111,102,102,59,10,72,105,112,112,121,46,101,109,105,116,32,61,32,101,109,105,116,59,10,72,105,112,112,121,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,32,61,32,111,110,59,10,72,105,112,112,121,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,32,61,32,111,102,102,59,10,72,105,112,112,121,46,111,110,101,114,114,111,114,32,61,32,117,110,100,101,102,105,110,101,100,59,125,41,59,0 }; // NOLINT - const uint8_t k_DynamicLoad[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,39,41,59,10,103,108,111,98,97,108,46,100,121,110,97,109,105,99,76,111,97,100,32,61,32,102,117,110,99,116,105,111,110,32,40,112,97,116,104,44,32,101,110,99,111,100,101,44,32,99,98,41,32,123,10,32,32,118,97,114,32,114,101,113,117,101,115,116,80,97,116,104,32,61,32,112,97,116,104,32,124,124,32,39,39,59,10,32,32,118,97,114,32,105,115,83,99,104,101,109,97,32,61,32,47,94,40,46,43,58,92,47,92,47,41,124,94,40,92,47,92,47,41,47,46,116,101,115,116,40,112,97,116,104,41,59,10,32,32,105,102,32,40,33,105,115,83,99,104,101,109,97,41,32,123,10,32,32,32,32,114,101,113,117,101,115,116,80,97,116,104,32,61,32,103,108,111,98,97,108,46,95,95,72,73,80,80,89,67,85,82,68,73,82,95,95,32,43,32,112,97,116,104,59,10,32,32,125,10,32,32,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,46,76,111,97,100,85,110,116,114,117,115,116,101,100,67,111,110,116,101,110,116,40,114,101,113,117,101,115,116,80,97,116,104,44,32,101,110,99,111,100,101,44,32,99,98,41,59,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_Platform[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,32,61,32,123,125,59,10,105,102,32,40,116,121,112,101,111,102,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,118,97,114,32,76,111,99,97,108,105,122,97,116,105,111,110,32,61,32,123,10,32,32,32,32,99,111,117,110,116,114,121,58,32,39,39,44,10,32,32,32,32,108,97,110,103,117,97,103,101,58,32,39,39,44,10,32,32,32,32,100,105,114,101,99,116,105,111,110,58,32,48,10,32,32,125,59,10,32,32,105,102,32,40,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,41,32,123,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,68,101,118,105,99,101,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,68,101,118,105,99,101,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,86,101,114,115,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,86,101,114,115,105,111,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,83,68,75,86,101,114,115,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,83,68,75,86,101,114,115,105,111,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,76,111,99,97,108,105,122,97,116,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,76,111,99,97,108,105,122,97,116,105,111,110,32,124,124,32,76,111,99,97,108,105,122,97,116,105,111,110,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,79,83,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,65,80,73,76,101,118,101,108,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,65,80,73,76,101,118,101,108,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,83,68,75,86,101,114,115,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,83,68,75,86,101,114,115,105,111,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,76,111,99,97,108,105,122,97,116,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,76,111,99,97,108,105,122,97,116,105,111,110,32,124,124,32,76,111,99,97,108,105,122,97,116,105,111,110,59,10,32,32,125,10,125,125,41,59,0 }; // NOLINT - const uint8_t k_UIManagerModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,39,41,59,10,118,97,114,32,76,97,121,111,117,116,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,76,97,121,111,117,116,77,111,100,117,108,101,39,41,59,10,72,105,112,112,121,46,100,111,99,117,109,101,110,116,32,61,32,123,10,32,32,99,114,101,97,116,101,78,111,100,101,58,32,102,117,110,99,116,105,111,110,32,99,114,101,97,116,101,78,111,100,101,40,41,32,123,125,44,10,32,32,117,112,100,97,116,101,78,111,100,101,58,32,102,117,110,99,116,105,111,110,32,117,112,100,97,116,101,78,111,100,101,40,41,32,123,125,44,10,32,32,100,101,108,101,116,101,78,111,100,101,58,32,102,117,110,99,116,105,111,110,32,100,101,108,101,116,101,78,111,100,101,40,41,32,123,125,44,10,32,32,102,108,117,115,104,66,97,116,99,104,58,32,102,117,110,99,116,105,111,110,32,102,108,117,115,104,66,97,116,99,104,40,41,32,123,125,44,10,32,32,101,110,100,66,97,116,99,104,58,32,102,117,110,99,116,105,111,110,32,101,110,100,66,97,116,99,104,40,41,32,123,125,44,10,32,32,99,97,108,108,85,73,70,117,110,99,116,105,111,110,58,32,102,117,110,99,116,105,111,110,32,99,97,108,108,85,73,70,117,110,99,116,105,111,110,40,105,100,44,32,110,97,109,101,44,32,112,97,114,97,109,44,32,99,98,41,32,123,10,32,32,32,32,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,46,67,97,108,108,85,73,70,117,110,99,116,105,111,110,40,105,100,44,32,110,97,109,101,44,32,112,97,114,97,109,44,32,99,98,41,59,10,32,32,125,44,10,32,32,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,58,32,102,117,110,99,116,105,111,110,32,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,40,41,32,123,10,32,32,32,32,76,97,121,111,117,116,77,111,100,117,108,101,46,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,40,41,59,10,32,32,125,44,10,32,32,115,101,110,100,82,101,110,100,101,114,69,114,114,111,114,58,32,102,117,110,99,116,105,111,110,32,115,101,110,100,82,101,110,100,101,114,69,114,114,111,114,40,101,114,114,111,114,41,32,123,10,32,32,32,32,105,102,32,40,101,114,114,111,114,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,111,114,59,10,32,32,32,32,125,10,32,32,125,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_js2native[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,110,101,101,100,82,101,106,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,110,101,101,100,82,101,106,101,99,116,40,109,111,100,117,108,101,78,97,109,101,44,32,109,101,116,104,111,100,78,97,109,101,41,32,123,10,32,32,114,101,116,117,114,110,32,33,40,109,111,100,117,108,101,78,97,109,101,32,61,61,61,32,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,32,124,124,32,109,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,117,108,116,105,71,101,116,39,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,99,97,108,108,65,114,103,117,109,101,110,116,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,125,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,60,32,50,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,99,97,108,108,78,97,116,105,118,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,39,41,59,10,32,32,125,10,32,32,118,97,114,32,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,48,93,44,10,32,32,32,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,49,93,59,10,32,32,105,102,32,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,32,61,61,61,32,39,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,39,32,38,38,32,40,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,101,97,115,117,114,101,39,32,124,124,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,101,97,115,117,114,101,73,110,87,105,110,100,111,119,39,32,124,124,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,101,97,115,117,114,101,73,110,65,112,112,87,105,110,100,111,119,39,41,41,32,123,10,32,32,32,32,118,97,114,32,110,111,100,101,73,100,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,50,93,59,10,32,32,32,32,118,97,114,32,99,97,108,108,98,97,99,107,70,117,110,99,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,51,93,59,10,32,32,32,32,114,101,116,117,114,110,32,103,108,111,98,97,108,46,72,105,112,112,121,46,100,111,99,117,109,101,110,116,46,99,97,108,108,85,73,70,117,110,99,116,105,111,110,40,110,111,100,101,73,100,44,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,44,32,91,93,44,32,99,97,108,108,98,97,99,107,70,117,110,99,41,59,10,32,32,125,10,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,93,59,10,32,32,118,97,114,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,32,61,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,59,10,32,32,105,102,32,40,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,116,121,112,101,111,102,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,118,97,114,32,112,97,114,97,109,76,105,115,116,32,61,32,91,93,59,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,50,59,32,105,32,60,32,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,99,97,108,108,65,114,103,117,109,101,110,116,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,32,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,112,97,114,97,109,76,105,115,116,46,108,101,110,103,116,104,32,63,32,112,97,114,97,109,76,105,115,116,32,58,32,117,110,100,101,102,105,110,101,100,41,59,10,32,32,32,32,114,101,116,117,114,110,59,10,32,32,125,10,32,32,116,104,114,111,119,32,110,101,119,32,82,101,102,101,114,101,110,99,101,69,114,114,111,114,40,34,99,97,108,108,78,97,116,105,118,101,32,78,97,116,105,118,101,32,34,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,44,32,34,46,34,41,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,44,32,34,40,41,32,110,111,116,32,102,111,117,110,100,34,41,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,50,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,99,97,108,108,65,114,103,117,109,101,110,116,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,50,41,44,32,95,107,101,121,50,32,61,32,48,59,32,95,107,101,121,50,32,60,32,95,108,101,110,50,59,32,95,107,101,121,50,43,43,41,32,123,10,32,32,32,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,95,107,101,121,50,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,50,93,59,10,32,32,125,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,60,32,50,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,39,41,41,59,10,32,32,125,10,32,32,118,97,114,32,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,48,93,44,10,32,32,32,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,49,93,59,10,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,93,59,10,32,32,105,102,32,40,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,41,32,123,10,32,32,32,32,118,97,114,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,32,61,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,59,10,32,32,32,32,118,97,114,32,112,97,114,97,109,76,105,115,116,32,61,32,91,93,59,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,50,59,32,105,32,60,32,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,99,97,108,108,65,114,103,117,109,101,110,116,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,116,121,112,101,32,61,61,61,32,39,112,114,111,109,105,115,101,39,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,112,97,114,97,109,76,105,115,116,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,105,102,32,40,110,101,101,100,82,101,106,101,99,116,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,44,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,41,41,32,123,10,32,32,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,114,101,106,101,99,116,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,114,101,115,111,108,118,101,41,59,10,32,32,32,32,32,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,112,97,114,97,109,76,105,115,116,41,59,10,32,32,32,32,125,41,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,82,101,102,101,114,101,110,99,101,69,114,114,111,114,40,34,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,78,97,116,105,118,101,32,34,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,44,32,34,46,34,41,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,44,32,34,40,41,32,110,111,116,32,102,111,117,110,100,34,41,41,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,51,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,99,97,108,108,65,114,103,117,109,101,110,116,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,51,41,44,32,95,107,101,121,51,32,61,32,48,59,32,95,107,101,121,51,32,60,32,95,108,101,110,51,59,32,95,107,101,121,51,43,43,41,32,123,10,32,32,32,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,95,107,101,121,51,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,51,93,59,10,32,32,125,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,60,32,51,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,51,39,41,59,10,32,32,125,10,32,32,118,97,114,32,109,111,100,117,108,101,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,48,93,44,10,32,32,32,32,109,101,116,104,111,100,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,49,93,44,10,32,32,32,32,97,117,116,111,68,101,108,101,116,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,50,93,59,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,61,61,61,32,51,41,32,123,10,32,32,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,109,111,100,117,108,101,78,97,109,101,93,59,10,32,32,32,32,105,102,32,40,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,41,32,123,10,32,32,32,32,32,32,105,102,32,40,97,117,116,111,68,101,108,101,116,101,32,61,61,61,32,102,97,108,115,101,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,40,123,10,32,32,32,32,32,32,32,32,32,32,110,111,116,68,101,108,101,116,101,58,32,116,114,117,101,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,40,41,59,10,32,32,32,32,125,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,118,97,114,32,95,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,109,111,100,117,108,101,78,97,109,101,93,59,10,32,32,32,32,105,102,32,40,95,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,95,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,41,32,123,10,32,32,32,32,32,32,118,97,114,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,32,61,32,95,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,59,10,32,32,32,32,32,32,118,97,114,32,112,97,114,97,109,32,61,32,91,93,59,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,51,59,32,105,32,60,32,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,32,32,112,97,114,97,109,46,112,117,115,104,40,99,97,108,108,65,114,103,117,109,101,110,116,115,91,105,93,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,99,117,114,114,101,110,116,67,97,108,108,73,100,32,61,32,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,73,100,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,73,100,32,43,61,32,49,59,10,32,32,32,32,32,32,118,97,114,32,110,97,116,105,118,101,80,97,114,97,109,32,61,32,91,93,59,10,32,32,32,32,32,32,105,102,32,40,97,117,116,111,68,101,108,101,116,101,32,61,61,61,32,102,97,108,115,101,41,32,123,10,32,32,32,32,32,32,32,32,110,97,116,105,118,101,80,97,114,97,109,46,112,117,115,104,40,123,10,32,32,32,32,32,32,32,32,32,32,110,111,116,68,101,108,101,116,101,58,32,116,114,117,101,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,110,97,116,105,118,101,80,97,114,97,109,46,112,117,115,104,40,99,117,114,114,101,110,116,67,97,108,108,73,100,41,59,10,32,32,32,32,32,32,110,97,116,105,118,101,80,97,114,97,109,32,61,32,110,97,116,105,118,101,80,97,114,97,109,46,99,111,110,99,97,116,40,112,97,114,97,109,41,59,10,32,32,32,32,32,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,95,78,97,116,105,118,101,77,111,100,117,108,101,44,32,110,97,116,105,118,101,80,97,114,97,109,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,117,114,114,101,110,116,67,97,108,108,73,100,59,10,32,32,32,32,125,10,32,32,125,10,32,32,116,104,114,111,119,32,110,101,119,32,82,101,102,101,114,101,110,99,101,69,114,114,111,114,40,34,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,78,97,116,105,118,101,32,34,46,99,111,110,99,97,116,40,109,111,100,117,108,101,78,97,109,101,44,32,34,46,34,41,46,99,111,110,99,97,116,40,109,101,116,104,111,100,78,97,109,101,44,32,34,40,41,32,110,111,116,32,102,111,117,110,100,34,41,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,114,101,109,111,118,101,78,97,116,105,118,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_TimerModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,116,105,109,101,114,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,84,105,109,101,114,77,111,100,117,108,101,39,41,59,10,103,108,111,98,97,108,46,115,101,116,84,105,109,101,111,117,116,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,44,32,115,108,101,101,112,84,105,109,101,41,32,123,10,32,32,118,97,114,32,97,114,103,115,32,61,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,97,114,103,117,109,101,110,116,115,44,32,50,41,59,10,32,32,114,101,116,117,114,110,32,116,105,109,101,114,46,83,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,99,98,46,97,112,112,108,121,40,110,117,108,108,44,32,97,114,103,115,41,59,10,32,32,125,44,32,115,108,101,101,112,84,105,109,101,41,59,10,125,59,10,103,108,111,98,97,108,46,99,108,101,97,114,84,105,109,101,111,117,116,32,61,32,102,117,110,99,116,105,111,110,32,40,116,105,109,101,114,73,100,41,32,123,10,32,32,105,102,32,40,78,117,109,98,101,114,46,105,115,73,110,116,101,103,101,114,40,116,105,109,101,114,73,100,41,32,38,38,32,116,105,109,101,114,73,100,32,62,32,48,41,32,123,10,32,32,32,32,116,105,109,101,114,46,67,108,101,97,114,84,105,109,101,111,117,116,40,116,105,109,101,114,73,100,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,115,101,116,73,110,116,101,114,118,97,108,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,44,32,105,110,116,101,114,118,97,108,84,105,109,101,41,32,123,10,32,32,118,97,114,32,97,114,103,115,32,61,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,97,114,103,117,109,101,110,116,115,44,32,50,41,59,10,32,32,114,101,116,117,114,110,32,116,105,109,101,114,46,83,101,116,73,110,116,101,114,118,97,108,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,99,98,46,97,112,112,108,121,40,110,117,108,108,44,32,97,114,103,115,41,59,10,32,32,125,44,32,105,110,116,101,114,118,97,108,84,105,109,101,41,59,10,125,59,10,103,108,111,98,97,108,46,99,108,101,97,114,73,110,116,101,114,118,97,108,32,61,32,102,117,110,99,116,105,111,110,32,40,116,105,109,101,114,73,100,41,32,123,10,32,32,105,102,32,40,78,117,109,98,101,114,46,105,115,73,110,116,101,103,101,114,40,116,105,109,101,114,73,100,41,32,38,38,32,116,105,109,101,114,73,100,32,62,32,48,41,32,123,10,32,32,32,32,116,105,109,101,114,46,67,108,101,97,114,73,110,116,101,114,118,97,108,40,116,105,109,101,114,73,100,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,114,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,44,32,111,112,116,41,32,123,10,32,32,114,101,116,117,114,110,32,116,105,109,101,114,46,82,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,40,102,117,110,99,116,105,111,110,32,40,112,97,114,97,109,41,32,123,10,32,32,32,32,118,97,114,32,110,111,119,32,61,32,68,97,116,101,46,110,111,119,40,41,59,10,32,32,32,32,118,97,114,32,95,116,105,109,101,82,101,109,97,105,110,105,110,103,32,61,32,112,97,114,97,109,46,116,105,109,101,82,101,109,97,105,110,105,110,103,59,10,32,32,32,32,99,98,40,123,10,32,32,32,32,32,32,100,105,100,84,105,109,101,111,117,116,58,32,112,97,114,97,109,46,100,105,100,84,105,109,101,111,117,116,44,10,32,32,32,32,32,32,116,105,109,101,82,101,109,97,105,110,105,110,103,58,32,102,117,110,99,116,105,111,110,32,116,105,109,101,82,101,109,97,105,110,105,110,103,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,116,105,109,101,32,61,32,95,116,105,109,101,82,101,109,97,105,110,105,110,103,32,45,32,40,68,97,116,101,46,110,111,119,40,41,32,45,32,110,111,119,41,59,10,32,32,32,32,32,32,32,32,116,105,109,101,32,61,32,116,105,109,101,32,60,32,48,32,63,32,48,32,58,32,116,105,109,101,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,105,109,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,41,59,10,32,32,125,44,32,111,112,116,41,59,10,125,59,10,103,108,111,98,97,108,46,99,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,116,105,109,101,114,73,100,41,32,123,10,32,32,105,102,32,40,78,117,109,98,101,114,46,105,115,73,110,116,101,103,101,114,40,116,105,109,101,114,73,100,41,32,38,38,32,116,105,109,101,114,73,100,32,62,32,48,41,32,123,10,32,32,32,32,116,105,109,101,114,46,67,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,40,116,105,109,101,114,73,100,41,59,10,32,32,125,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_promise[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,98,106,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,98,106,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,111,98,106,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,98,106,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,98,106,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,98,106,59,32,125,44,32,95,116,121,112,101,111,102,40,111,98,106,41,59,32,125,10,102,117,110,99,116,105,111,110,32,110,111,111,112,40,41,32,123,125,10,118,97,114,32,76,65,83,84,95,69,82,82,79,82,32,61,32,110,117,108,108,59,10,118,97,114,32,73,83,95,69,82,82,79,82,32,61,32,123,125,59,10,102,117,110,99,116,105,111,110,32,103,101,116,84,104,101,110,40,111,98,106,41,32,123,10,32,32,116,114,121,32,123,10,32,32,32,32,114,101,116,117,114,110,32,111,98,106,46,116,104,101,110,59,10,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,76,65,83,84,95,69,82,82,79,82,32,61,32,101,120,59,10,32,32,32,32,114,101,116,117,114,110,32,73,83,95,69,82,82,79,82,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,116,114,121,67,97,108,108,79,110,101,40,102,110,44,32,97,41,32,123,10,32,32,116,114,121,32,123,10,32,32,32,32,114,101,116,117,114,110,32,102,110,40,97,41,59,10,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,76,65,83,84,95,69,82,82,79,82,32,61,32,101,120,59,10,32,32,32,32,114,101,116,117,114,110,32,73,83,95,69,82,82,79,82,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,116,114,121,67,97,108,108,84,119,111,40,102,110,44,32,97,44,32,98,41,32,123,10,32,32,116,114,121,32,123,10,32,32,32,32,102,110,40,97,44,32,98,41,59,10,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,76,65,83,84,95,69,82,82,79,82,32,61,32,101,120,59,10,32,32,32,32,114,101,116,117,114,110,32,73,83,95,69,82,82,79,82,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,80,114,111,109,105,115,101,40,102,110,41,32,123,10,32,32,105,102,32,40,95,116,121,112,101,111,102,40,116,104,105,115,41,32,33,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,80,114,111,109,105,115,101,115,32,109,117,115,116,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,118,105,97,32,110,101,119,39,41,59,10,32,32,125,10,32,32,105,102,32,40,116,121,112,101,111,102,32,102,110,32,33,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,80,114,111,109,105,115,101,32,99,111,110,115,116,114,117,99,116,111,114,92,39,115,32,97,114,103,117,109,101,110,116,32,105,115,32,110,111,116,32,97,32,102,117,110,99,116,105,111,110,39,41,59,10,32,32,125,10,32,32,116,104,105,115,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,32,48,59,10,32,32,116,104,105,115,46,95,115,116,97,116,101,32,61,32,48,59,10,32,32,116,104,105,115,46,95,118,97,108,117,101,32,61,32,110,117,108,108,59,10,32,32,116,104,105,115,46,95,100,101,102,101,114,114,101,100,115,32,61,32,110,117,108,108,59,10,32,32,105,102,32,40,102,110,32,61,61,61,32,110,111,111,112,41,32,114,101,116,117,114,110,59,10,32,32,100,111,82,101,115,111,108,118,101,40,102,110,44,32,116,104,105,115,41,59,10,125,10,80,114,111,109,105,115,101,46,95,111,110,72,97,110,100,108,101,32,61,32,110,117,108,108,59,10,80,114,111,109,105,115,101,46,95,111,110,82,101,106,101,99,116,32,61,32,110,117,108,108,59,10,80,114,111,109,105,115,101,46,95,110,111,111,112,32,61,32,110,111,111,112,59,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,46,116,104,101,110,32,61,32,102,117,110,99,116,105,111,110,32,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,105,102,32,40,116,104,105,115,46,99,111,110,115,116,114,117,99,116,111,114,32,33,61,61,32,80,114,111,109,105,115,101,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,115,97,102,101,84,104,101,110,40,116,104,105,115,44,32,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,59,10,32,32,125,10,32,32,118,97,114,32,114,101,115,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,110,111,111,112,41,59,10,32,32,104,97,110,100,108,101,40,116,104,105,115,44,32,110,101,119,32,72,97,110,100,108,101,114,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,44,32,114,101,115,41,41,59,10,32,32,114,101,116,117,114,110,32,114,101,115,59,10,125,59,10,102,117,110,99,116,105,111,110,32,115,97,102,101,84,104,101,110,40,115,101,108,102,44,32,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,114,101,116,117,114,110,32,110,101,119,32,115,101,108,102,46,99,111,110,115,116,114,117,99,116,111,114,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,118,97,114,32,114,101,115,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,110,111,111,112,41,59,10,32,32,32,32,114,101,115,46,116,104,101,110,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,104,97,110,100,108,101,40,115,101,108,102,44,32,110,101,119,32,72,97,110,100,108,101,114,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,44,32,114,101,115,41,41,59,10,32,32,125,41,59,10,125,10,102,117,110,99,116,105,111,110,32,104,97,110,100,108,101,40,115,101,108,102,44,32,100,101,102,101,114,114,101,100,41,32,123,10,32,32,119,104,105,108,101,32,40,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,51,41,32,123,10,32,32,32,32,115,101,108,102,32,61,32,115,101,108,102,46,95,118,97,108,117,101,59,10,32,32,125,10,32,32,105,102,32,40,80,114,111,109,105,115,101,46,95,111,110,72,97,110,100,108,101,41,32,123,10,32,32,32,32,80,114,111,109,105,115,101,46,95,111,110,72,97,110,100,108,101,40,115,101,108,102,41,59,10,32,32,125,10,32,32,105,102,32,40,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,48,41,32,123,10,32,32,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,48,41,32,123,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,32,49,59,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,100,101,102,101,114,114,101,100,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,49,41,32,123,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,32,50,59,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,91,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,44,32,100,101,102,101,114,114,101,100,93,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,46,112,117,115,104,40,100,101,102,101,114,114,101,100,41,59,10,32,32,32,32,114,101,116,117,114,110,59,10,32,32,125,10,32,32,104,97,110,100,108,101,82,101,115,111,108,118,101,100,40,115,101,108,102,44,32,100,101,102,101,114,114,101,100,41,59,10,125,10,102,117,110,99,116,105,111,110,32,104,97,110,100,108,101,82,101,115,111,108,118,101,100,40,115,101,108,102,44,32,100,101,102,101,114,114,101,100,41,32,123,10,32,32,115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,118,97,114,32,99,98,32,61,32,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,49,32,63,32,100,101,102,101,114,114,101,100,46,111,110,70,117,108,102,105,108,108,101,100,32,58,32,100,101,102,101,114,114,101,100,46,111,110,82,101,106,101,99,116,101,100,59,10,32,32,32,32,105,102,32,40,99,98,32,61,61,61,32,110,117,108,108,41,32,123,10,32,32,32,32,32,32,105,102,32,40,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,49,41,32,123,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,115,101,108,102,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,115,101,108,102,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,118,97,114,32,114,101,116,32,61,32,116,114,121,67,97,108,108,79,110,101,40,99,98,44,32,115,101,108,102,46,95,118,97,108,117,101,41,59,10,32,32,32,32,105,102,32,40,114,101,116,32,61,61,61,32,73,83,95,69,82,82,79,82,41,32,123,10,32,32,32,32,32,32,114,101,106,101,99,116,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,76,65,83,84,95,69,82,82,79,82,41,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,114,101,116,41,59,10,32,32,32,32,125,10,32,32,125,44,32,48,41,59,10,125,10,102,117,110,99,116,105,111,110,32,114,101,115,111,108,118,101,40,115,101,108,102,44,32,110,101,119,86,97,108,117,101,41,32,123,10,32,32,105,102,32,40,110,101,119,86,97,108,117,101,32,61,61,61,32,115,101,108,102,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,114,101,106,101,99,116,40,115,101,108,102,44,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,65,32,112,114,111,109,105,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,115,111,108,118,101,100,32,119,105,116,104,32,105,116,115,101,108,102,46,39,41,41,59,10,32,32,125,10,32,32,105,102,32,40,110,101,119,86,97,108,117,101,32,38,38,32,40,95,116,121,112,101,111,102,40,110,101,119,86,97,108,117,101,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,124,124,32,116,121,112,101,111,102,32,110,101,119,86,97,108,117,101,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,41,32,123,10,32,32,32,32,118,97,114,32,116,104,101,110,32,61,32,103,101,116,84,104,101,110,40,110,101,119,86,97,108,117,101,41,59,10,32,32,32,32,105,102,32,40,116,104,101,110,32,61,61,61,32,73,83,95,69,82,82,79,82,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,114,101,106,101,99,116,40,115,101,108,102,44,32,76,65,83,84,95,69,82,82,79,82,41,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,116,104,101,110,32,61,61,61,32,115,101,108,102,46,116,104,101,110,32,38,38,32,110,101,119,86,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,80,114,111,109,105,115,101,41,32,123,10,32,32,32,32,32,32,115,101,108,102,46,95,115,116,97,116,101,32,61,32,51,59,10,32,32,32,32,32,32,115,101,108,102,46,95,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,32,32,32,32,102,105,110,97,108,101,40,115,101,108,102,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,116,121,112,101,111,102,32,116,104,101,110,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,100,111,82,101,115,111,108,118,101,40,116,104,101,110,46,98,105,110,100,40,110,101,119,86,97,108,117,101,41,44,32,115,101,108,102,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,125,10,32,32,115,101,108,102,46,95,115,116,97,116,101,32,61,32,49,59,10,32,32,115,101,108,102,46,95,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,102,105,110,97,108,101,40,115,101,108,102,41,59,10,125,10,102,117,110,99,116,105,111,110,32,114,101,106,101,99,116,40,115,101,108,102,44,32,110,101,119,86,97,108,117,101,41,32,123,10,32,32,115,101,108,102,46,95,115,116,97,116,101,32,61,32,50,59,10,32,32,115,101,108,102,46,95,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,105,102,32,40,80,114,111,109,105,115,101,46,95,111,110,82,101,106,101,99,116,41,32,123,10,32,32,32,32,80,114,111,109,105,115,101,46,95,111,110,82,101,106,101,99,116,40,115,101,108,102,44,32,110,101,119,86,97,108,117,101,41,59,10,32,32,125,10,32,32,102,105,110,97,108,101,40,115,101,108,102,41,59,10,125,10,102,117,110,99,116,105,111,110,32,102,105,110,97,108,101,40,115,101,108,102,41,32,123,10,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,49,41,32,123,10,32,32,32,32,104,97,110,100,108,101,40,115,101,108,102,44,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,41,59,10,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,110,117,108,108,59,10,32,32,125,10,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,50,41,32,123,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,59,32,105,32,60,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,10,32,32,32,32,32,32,104,97,110,100,108,101,40,115,101,108,102,44,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,110,117,108,108,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,72,97,110,100,108,101,114,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,44,32,112,114,111,109,105,115,101,41,32,123,10,32,32,116,104,105,115,46,111,110,70,117,108,102,105,108,108,101,100,32,61,32,116,121,112,101,111,102,32,111,110,70,117,108,102,105,108,108,101,100,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,32,63,32,111,110,70,117,108,102,105,108,108,101,100,32,58,32,110,117,108,108,59,10,32,32,116,104,105,115,46,111,110,82,101,106,101,99,116,101,100,32,61,32,116,121,112,101,111,102,32,111,110,82,101,106,101,99,116,101,100,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,32,63,32,111,110,82,101,106,101,99,116,101,100,32,58,32,110,117,108,108,59,10,32,32,116,104,105,115,46,112,114,111,109,105,115,101,32,61,32,112,114,111,109,105,115,101,59,10,125,10,102,117,110,99,116,105,111,110,32,100,111,82,101,115,111,108,118,101,40,102,110,44,32,112,114,111,109,105,115,101,41,32,123,10,32,32,118,97,114,32,100,111,110,101,32,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,114,101,115,32,61,32,116,114,121,67,97,108,108,84,119,111,40,102,110,44,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,32,32,105,102,32,40,100,111,110,101,41,32,114,101,116,117,114,110,59,10,32,32,32,32,100,111,110,101,32,61,32,116,114,117,101,59,10,32,32,32,32,114,101,115,111,108,118,101,40,112,114,111,109,105,115,101,44,32,118,97,108,117,101,41,59,10,32,32,125,44,32,102,117,110,99,116,105,111,110,32,40,114,101,97,115,111,110,41,32,123,10,32,32,32,32,105,102,32,40,100,111,110,101,41,32,114,101,116,117,114,110,59,10,32,32,32,32,100,111,110,101,32,61,32,116,114,117,101,59,10,32,32,32,32,114,101,106,101,99,116,40,112,114,111,109,105,115,101,44,32,114,101,97,115,111,110,41,59,10,32,32,125,41,59,10,32,32,105,102,32,40,33,100,111,110,101,32,38,38,32,114,101,115,32,61,61,61,32,73,83,95,69,82,82,79,82,41,32,123,10,32,32,32,32,100,111,110,101,32,61,32,116,114,117,101,59,10,32,32,32,32,114,101,106,101,99,116,40,112,114,111,109,105,115,101,44,32,76,65,83,84,95,69,82,82,79,82,41,59,10,32,32,125,10,125,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,46,100,111,110,101,32,61,32,102,117,110,99,116,105,111,110,32,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,118,97,114,32,115,101,108,102,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,63,32,116,104,105,115,46,116,104,101,110,46,97,112,112,108,121,40,116,104,105,115,44,32,97,114,103,117,109,101,110,116,115,41,32,58,32,116,104,105,115,59,10,32,32,115,101,108,102,46,116,104,101,110,40,110,117,108,108,44,32,102,117,110,99,116,105,111,110,32,40,101,114,114,41,32,123,10,32,32,32,32,115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,59,10,32,32,32,32,125,44,32,48,41,59,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,91,39,102,105,110,97,108,108,121,39,93,32,61,32,102,117,110,99,116,105,111,110,32,40,102,41,32,123,10,32,32,114,101,116,117,114,110,32,116,104,105,115,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,102,40,41,41,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,118,97,108,117,101,59,10,32,32,32,32,125,41,59,10,32,32,125,44,32,102,117,110,99,116,105,111,110,32,40,101,114,114,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,102,40,41,41,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,59,10,32,32,32,32,125,41,59,10,32,32,125,41,59,10,125,59,10,118,97,114,32,84,82,85,69,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,116,114,117,101,41,59,10,118,97,114,32,70,65,76,83,69,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,102,97,108,115,101,41,59,10,118,97,114,32,78,85,76,76,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,110,117,108,108,41,59,10,118,97,114,32,85,78,68,69,70,73,78,69,68,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,117,110,100,101,102,105,110,101,100,41,59,10,118,97,114,32,90,69,82,79,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,48,41,59,10,118,97,114,32,69,77,80,84,89,83,84,82,73,78,71,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,39,39,41,59,10,102,117,110,99,116,105,111,110,32,118,97,108,117,101,80,114,111,109,105,115,101,40,118,97,108,117,101,41,32,123,10,32,32,118,97,114,32,112,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,80,114,111,109,105,115,101,46,95,110,111,111,112,41,59,10,32,32,112,46,95,115,116,97,116,101,32,61,32,49,59,10,32,32,112,46,95,118,97,108,117,101,32,61,32,118,97,108,117,101,59,10,32,32,114,101,116,117,114,110,32,112,59,10,125,10,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,32,61,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,105,102,32,40,118,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,80,114,111,109,105,115,101,41,32,114,101,116,117,114,110,32,118,97,108,117,101,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,78,85,76,76,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,32,114,101,116,117,114,110,32,85,78,68,69,70,73,78,69,68,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,116,114,117,101,41,32,114,101,116,117,114,110,32,84,82,85,69,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,102,97,108,115,101,41,32,114,101,116,117,114,110,32,70,65,76,83,69,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,48,41,32,114,101,116,117,114,110,32,90,69,82,79,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,39,39,41,32,114,101,116,117,114,110,32,69,77,80,84,89,83,84,82,73,78,71,59,10,32,32,105,102,32,40,95,116,121,112,101,111,102,40,118,97,108,117,101,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,117,101,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,118,97,114,32,116,104,101,110,32,61,32,118,97,108,117,101,46,116,104,101,110,59,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,116,104,101,110,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,116,104,101,110,46,98,105,110,100,40,118,97,108,117,101,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,120,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,80,114,111,109,105,115,101,40,118,97,108,117,101,41,59,10,125,59,10,118,97,114,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,32,61,32,102,117,110,99,116,105,111,110,32,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,105,116,101,114,97,98,108,101,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,65,114,114,97,121,46,102,114,111,109,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,32,61,32,65,114,114,97,121,46,102,114,111,109,59,10,32,32,32,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,105,116,101,114,97,98,108,101,41,59,10,32,32,125,10,32,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,32,61,32,102,117,110,99,116,105,111,110,32,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,120,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,120,41,59,10,32,32,125,59,10,32,32,114,101,116,117,114,110,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,105,116,101,114,97,98,108,101,41,59,10,125,59,10,80,114,111,109,105,115,101,46,97,108,108,32,61,32,102,117,110,99,116,105,111,110,32,40,97,114,114,41,32,123,10,32,32,118,97,114,32,97,114,103,115,32,61,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,59,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,105,102,32,40,97,114,103,115,46,108,101,110,103,116,104,32,61,61,61,32,48,41,32,114,101,116,117,114,110,32,114,101,115,111,108,118,101,40,91,93,41,59,10,32,32,32,32,118,97,114,32,114,101,109,97,105,110,105,110,103,32,61,32,97,114,103,115,46,108,101,110,103,116,104,59,10,32,32,32,32,102,117,110,99,116,105,111,110,32,114,101,115,40,105,44,32,118,97,108,41,32,123,10,32,32,32,32,32,32,105,102,32,40,118,97,108,32,38,38,32,40,95,116,121,112,101,111,102,40,118,97,108,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,32,105,110,115,116,97,110,99,101,111,102,32,80,114,111,109,105,115,101,32,38,38,32,118,97,108,46,116,104,101,110,32,61,61,61,32,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,46,116,104,101,110,41,32,123,10,32,32,32,32,32,32,32,32,32,32,119,104,105,108,101,32,40,118,97,108,46,95,115,116,97,116,101,32,61,61,61,32,51,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,108,32,61,32,118,97,108,46,95,118,97,108,117,101,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,46,95,115,116,97,116,101,32,61,61,61,32,49,41,32,114,101,116,117,114,110,32,114,101,115,40,105,44,32,118,97,108,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,46,95,115,116,97,116,101,32,61,61,61,32,50,41,32,114,101,106,101,99,116,40,118,97,108,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,32,32,118,97,108,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,118,97,108,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,40,105,44,32,118,97,108,41,59,10,32,32,32,32,32,32,32,32,32,32,125,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,116,104,101,110,32,61,32,118,97,108,46,116,104,101,110,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,116,104,101,110,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,112,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,116,104,101,110,46,98,105,110,100,40,118,97,108,41,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,112,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,118,97,108,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,40,105,44,32,118,97,108,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,97,114,103,115,91,105,93,32,61,32,118,97,108,59,10,32,32,32,32,32,32,105,102,32,40,45,45,114,101,109,97,105,110,105,110,103,32,61,61,61,32,48,41,32,123,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,97,114,103,115,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,59,32,105,32,60,32,97,114,103,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,10,32,32,32,32,32,32,114,101,115,40,105,44,32,97,114,103,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,114,101,106,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,114,101,106,101,99,116,40,118,97,108,117,101,41,59,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,114,97,99,101,32,61,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,115,41,32,123,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,118,97,108,117,101,115,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,118,97,108,117,101,41,46,116,104,101,110,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,125,41,59,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,91,39,99,97,116,99,104,39,93,32,61,32,102,117,110,99,116,105,111,110,32,40,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,114,101,116,117,114,110,32,116,104,105,115,46,116,104,101,110,40,110,117,108,108,44,32,111,110,82,101,106,101,99,116,101,100,41,59,10,125,59,10,103,108,111,98,97,108,46,80,114,111,109,105,115,101,32,61,32,80,114,111,109,105,115,101,59,125,41,59,0 }; // NOLINT - const uint8_t k_ConsoleModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,98,106,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,98,106,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,111,98,106,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,98,106,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,98,106,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,98,106,59,32,125,44,32,95,116,121,112,101,111,102,40,111,98,106,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,97,114,114,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,97,114,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,32,123,32,105,102,32,40,33,111,41,32,114,101,116,117,114,110,59,32,105,102,32,40,116,121,112,101,111,102,32,111,32,61,61,61,32,34,115,116,114,105,110,103,34,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,59,32,118,97,114,32,110,32,61,32,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,111,41,46,115,108,105,99,101,40,56,44,32,45,49,41,59,32,105,102,32,40,110,32,61,61,61,32,34,79,98,106,101,99,116,34,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,41,32,110,32,61,32,111,46,99,111,110,115,116,114,117,99,116,111,114,46,110,97,109,101,59,32,105,102,32,40,110,32,61,61,61,32,34,77,97,112,34,32,124,124,32,110,32,61,61,61,32,34,83,101,116,34,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,111,41,59,32,105,102,32,40,110,32,61,61,61,32,34,65,114,103,117,109,101,110,116,115,34,32,124,124,32,47,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,47,46,116,101,115,116,40,110,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,105,116,101,114,41,32,123,32,105,102,32,40,116,121,112,101,111,102,32,83,121,109,98,111,108,32,33,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,38,38,32,105,116,101,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,33,61,32,110,117,108,108,32,124,124,32,105,116,101,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,32,33,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,105,116,101,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,97,114,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,97,114,114,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,97,114,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,97,114,114,44,32,108,101,110,41,32,123,32,105,102,32,40,108,101,110,32,61,61,32,110,117,108,108,32,124,124,32,108,101,110,32,62,32,97,114,114,46,108,101,110,103,116,104,41,32,108,101,110,32,61,32,97,114,114,46,108,101,110,103,116,104,59,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,44,32,97,114,114,50,32,61,32,110,101,119,32,65,114,114,97,121,40,108,101,110,41,59,32,105,32,60,32,108,101,110,59,32,105,43,43,41,32,97,114,114,50,91,105,93,32,61,32,97,114,114,91,105,93,59,32,114,101,116,117,114,110,32,97,114,114,50,59,32,125,10,118,97,114,32,99,111,110,115,111,108,101,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,67,111,110,115,111,108,101,77,111,100,117,108,101,39,41,59,10,118,97,114,32,105,110,100,101,110,116,32,61,32,102,117,110,99,116,105,111,110,32,105,110,100,101,110,116,40,108,101,118,101,108,41,32,123,10,32,32,118,97,114,32,116,97,98,32,61,32,39,39,59,10,32,32,119,104,105,108,101,32,40,116,97,98,46,108,101,110,103,116,104,32,60,32,108,101,118,101,108,32,42,32,50,41,32,123,10,32,32,32,32,116,97,98,32,43,61,32,39,32,32,39,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,116,97,98,59,10,125,59,10,118,97,114,32,105,110,115,112,101,99,116,79,98,106,101,99,116,32,61,32,110,117,108,108,59,10,118,97,114,32,105,110,115,112,101,99,116,32,61,32,110,117,108,108,59,10,102,117,110,99,116,105,111,110,32,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,40,112,97,114,97,109,41,32,123,10,32,32,118,97,114,32,114,101,115,117,108,116,32,61,32,123,125,59,10,32,32,118,97,114,32,112,114,111,112,75,101,121,115,32,61,32,79,98,106,101,99,116,46,107,101,121,115,40,112,97,114,97,109,41,59,10,32,32,112,114,111,112,75,101,121,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,44,32,105,110,100,101,120,41,32,123,10,32,32,32,32,114,101,115,117,108,116,91,112,114,111,112,75,101,121,115,91,105,110,100,101,120,93,93,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,40,112,97,114,97,109,44,32,112,114,111,112,75,101,121,115,91,105,110,100,101,120,93,41,59,10,32,32,125,41,59,10,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,59,10,125,10,105,110,115,112,101,99,116,79,98,106,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,105,110,115,112,101,99,116,79,98,106,101,99,116,40,118,97,108,117,101,41,32,123,10,32,32,118,97,114,32,108,101,118,101,108,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,49,32,38,38,32,97,114,103,117,109,101,110,116,115,91,49,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,49,93,32,58,32,48,59,10,32,32,118,97,114,32,114,101,99,117,114,115,101,84,105,109,101,115,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,50,32,38,38,32,97,114,103,117,109,101,110,116,115,91,50,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,50,93,32,58,32,50,59,10,32,32,118,97,114,32,108,105,110,101,98,114,101,97,107,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,51,32,38,38,32,97,114,103,117,109,101,110,116,115,91,51,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,51,93,32,58,32,39,92,110,39,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,110,117,108,108,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,39,110,117,108,108,39,59,10,32,32,125,10,32,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,118,97,108,117,101,41,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,34,91,32,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,105,116,101,109,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,40,105,116,101,109,44,32,108,101,118,101,108,32,43,32,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,41,59,10,32,32,32,32,125,41,46,106,111,105,110,40,39,44,32,39,41,44,32,34,32,93,34,41,59,10,32,32,125,10,32,32,115,119,105,116,99,104,32,40,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,41,32,123,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,68,97,116,101,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,68,97,116,101,46,112,114,111,116,111,116,121,112,101,46,116,111,73,83,79,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,82,101,103,69,120,112,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,82,101,103,69,120,112,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,69,114,114,111,114,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,115,116,97,99,107,32,124,124,32,69,114,114,111,114,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,83,101,116,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,83,101,116,32,123,32,34,46,99,111,110,99,97,116,40,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,118,97,108,117,101,41,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,105,116,101,109,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,40,105,116,101,109,44,32,108,101,118,101,108,32,43,32,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,108,105,110,101,98,114,101,97,107,41,59,10,32,32,32,32,32,32,32,32,125,41,46,106,111,105,110,40,39,44,32,39,41,44,32,34,32,125,34,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,87,101,97,107,83,101,116,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,87,101,97,107,83,101,116,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,77,97,112,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,101,110,116,114,105,101,115,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,118,97,108,117,101,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,118,97,108,44,32,107,101,121,41,32,123,10,32,32,32,32,32,32,32,32,32,32,101,110,116,114,105,101,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,110,115,112,101,99,116,40,107,101,121,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,42,32,45,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,39,39,41,44,32,34,32,61,62,32,34,41,46,99,111,110,99,97,116,40,105,110,115,112,101,99,116,40,118,97,108,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,42,32,45,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,39,39,41,41,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,77,97,112,32,123,32,34,46,99,111,110,99,97,116,40,101,110,116,114,105,101,115,46,106,111,105,110,40,39,44,32,39,41,44,32,34,32,125,34,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,87,101,97,107,77,97,112,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,87,101,97,107,77,97,112,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,98,114,101,97,107,59,10,32,32,32,32,32,32,125,10,32,32,125,10,32,32,105,102,32,40,118,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,69,114,114,111,114,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,34,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,115,116,97,99,107,32,124,124,32,69,114,114,111,114,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,41,59,10,32,32,125,10,32,32,118,97,114,32,100,101,115,99,115,32,61,32,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,40,118,97,108,117,101,41,59,10,32,32,118,97,114,32,107,101,121,115,32,61,32,79,98,106,101,99,116,46,107,101,121,115,40,100,101,115,99,115,41,59,10,32,32,118,97,114,32,112,97,105,114,115,32,61,32,91,93,59,10,32,32,107,101,121,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,41,32,123,10,32,32,32,32,118,97,114,32,100,101,115,99,32,61,32,100,101,115,99,115,91,107,101,121,93,59,10,32,32,32,32,118,97,114,32,105,116,101,109,80,114,101,102,105,120,32,61,32,34,34,46,99,111,110,99,97,116,40,105,110,100,101,110,116,40,108,101,118,101,108,32,43,32,49,41,41,46,99,111,110,99,97,116,40,107,101,121,44,32,34,32,58,32,34,41,59,10,32,32,32,32,105,102,32,40,100,101,115,99,46,103,101,116,41,32,123,10,32,32,32,32,32,32,105,102,32,40,100,101,115,99,46,115,101,116,41,32,123,10,32,32,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,44,32,34,91,71,101,116,116,101,114,47,83,101,116,116,101,114,93,34,41,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,44,32,34,91,71,101,116,116,101,114,93,34,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,100,101,115,99,46,115,101,116,41,32,123,10,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,44,32,34,91,83,101,116,116,101,114,93,34,41,41,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,100,101,115,99,46,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,41,46,99,111,110,99,97,116,40,105,110,115,112,101,99,116,40,100,101,115,99,46,118,97,108,117,101,44,32,108,101,118,101,108,32,43,32,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,108,105,110,101,98,114,101,97,107,41,41,41,59,10,32,32,32,32,125,10,32,32,125,41,59,10,32,32,114,101,116,117,114,110,32,34,123,34,46,99,111,110,99,97,116,40,108,105,110,101,98,114,101,97,107,41,46,99,111,110,99,97,116,40,112,97,105,114,115,46,106,111,105,110,40,34,44,32,34,46,99,111,110,99,97,116,40,108,105,110,101,98,114,101,97,107,41,41,41,46,99,111,110,99,97,116,40,108,105,110,101,98,114,101,97,107,41,46,99,111,110,99,97,116,40,105,110,100,101,110,116,40,108,101,118,101,108,41,44,32,34,125,34,41,59,10,125,59,10,105,110,115,112,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,105,110,115,112,101,99,116,40,118,97,108,117,101,41,32,123,10,32,32,118,97,114,32,108,101,118,101,108,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,49,32,38,38,32,97,114,103,117,109,101,110,116,115,91,49,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,49,93,32,58,32,48,59,10,32,32,118,97,114,32,114,101,99,117,114,115,101,84,105,109,101,115,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,50,32,38,38,32,97,114,103,117,109,101,110,116,115,91,50,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,50,93,32,58,32,50,59,10,32,32,118,97,114,32,108,105,110,101,98,114,101,97,107,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,51,32,38,38,32,97,114,103,117,109,101,110,116,115,91,51,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,51,93,32,58,32,39,92,110,39,59,10,32,32,115,119,105,116,99,104,32,40,95,116,121,112,101,111,102,40,118,97,108,117,101,41,41,32,123,10,32,32,32,32,99,97,115,101,32,39,115,116,114,105,110,103,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,39,34,46,99,111,110,99,97,116,40,118,97,108,117,101,44,32,34,39,34,41,59,10,32,32,32,32,99,97,115,101,32,39,115,121,109,98,111,108,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,118,97,108,117,101,46,116,111,83,116,114,105,110,103,40,41,59,10,32,32,32,32,99,97,115,101,32,39,102,117,110,99,116,105,111,110,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,91,70,117,110,99,116,105,111,110,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,110,97,109,101,32,63,32,34,58,32,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,110,97,109,101,41,32,58,32,39,39,44,32,34,93,34,41,59,10,32,32,32,32,99,97,115,101,32,39,111,98,106,101,99,116,39,58,10,32,32,32,32,32,32,105,102,32,40,114,101,99,117,114,115,101,84,105,109,101,115,32,60,32,48,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,91,79,98,106,101,99,116,93,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,79,98,106,101,99,116,40,118,97,108,117,101,44,32,108,101,118,101,108,44,32,114,101,99,117,114,115,101,84,105,109,101,115,44,32,108,105,110,101,98,114,101,97,107,41,59,10,32,32,32,32,99,97,115,101,32,39,98,105,103,105,110,116,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,110,34,46,99,111,110,99,97,116,40,118,97,108,117,101,41,59,10,32,32,32,32,99,97,115,101,32,39,117,110,100,101,102,105,110,101,100,39,58,10,32,32,32,32,99,97,115,101,32,39,110,117,109,98,101,114,39,58,10,32,32,32,32,99,97,115,101,32,39,98,111,111,108,101,97,110,39,58,10,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,34,46,99,111,110,99,97,116,40,118,97,108,117,101,41,59,10,32,32,125,10,125,59,10,118,97,114,32,118,109,67,111,110,115,111,108,101,59,10,105,102,32,40,116,121,112,101,111,102,32,99,111,110,115,111,108,101,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,118,109,67,111,110,115,111,108,101,32,61,32,99,111,110,115,111,108,101,59,10,125,10,118,97,114,32,115,117,112,112,111,114,116,65,112,105,76,105,115,116,32,61,32,91,39,108,111,103,39,44,32,39,105,110,102,111,39,44,32,39,119,97,114,110,39,44,32,39,101,114,114,111,114,39,44,32,39,100,101,98,117,103,39,93,59,10,103,108,111,98,97,108,46,67,111,110,115,111,108,101,77,111,100,117,108,101,32,61,32,123,125,59,10,115,117,112,112,111,114,116,65,112,105,76,105,115,116,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,97,112,105,41,32,123,10,32,32,103,108,111,98,97,108,46,67,111,110,115,111,108,101,77,111,100,117,108,101,91,97,112,105,93,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,32,32,125,10,32,32,32,32,118,97,114,32,108,111,103,32,61,32,97,114,103,115,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,97,114,103,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,40,97,114,103,41,59,10,32,32,32,32,125,41,46,106,111,105,110,40,39,32,39,41,59,10,32,32,32,32,99,111,110,115,111,108,101,77,111,100,117,108,101,46,76,111,103,40,108,111,103,44,32,97,112,105,41,59,10,32,32,125,59,10,125,41,59,10,103,108,111,98,97,108,46,99,111,110,115,111,108,101,32,61,32,123,10,32,32,114,101,112,111,114,116,85,110,99,97,117,103,104,116,69,120,99,101,112,116,105,111,110,58,32,102,117,110,99,116,105,111,110,32,114,101,112,111,114,116,85,110,99,97,117,103,104,116,69,120,99,101,112,116,105,111,110,40,101,114,114,111,114,41,32,123,10,32,32,32,32,105,102,32,40,101,114,114,111,114,32,38,38,32,101,114,114,111,114,32,105,110,115,116,97,110,99,101,111,102,32,69,114,114,111,114,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,111,114,59,10,32,32,32,32,125,10,32,32,125,10,125,59,10,105,102,32,40,118,109,67,111,110,115,111,108,101,41,32,123,10,32,32,79,98,106,101,99,116,46,107,101,121,115,40,118,109,67,111,110,115,111,108,101,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,97,112,105,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,99,111,110,115,111,108,101,91,97,112,105,93,32,61,32,118,109,67,111,110,115,111,108,101,91,97,112,105,93,59,10,32,32,125,41,59,10,125,125,41,59,0 }; // NOLINT - const uint8_t k_Network[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,95,101,120,99,108,117,100,101,100,32,61,32,91,34,109,101,116,104,111,100,34,44,32,34,104,101,97,100,101,114,115,34,44,32,34,98,111,100,121,34,93,59,10,102,117,110,99,116,105,111,110,32,111,119,110,75,101,121,115,40,111,98,106,101,99,116,44,32,101,110,117,109,101,114,97,98,108,101,79,110,108,121,41,32,123,32,118,97,114,32,107,101,121,115,32,61,32,79,98,106,101,99,116,46,107,101,121,115,40,111,98,106,101,99,116,41,59,32,105,102,32,40,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,41,32,123,32,118,97,114,32,115,121,109,98,111,108,115,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,40,111,98,106,101,99,116,41,59,32,101,110,117,109,101,114,97,98,108,101,79,110,108,121,32,38,38,32,40,115,121,109,98,111,108,115,32,61,32,115,121,109,98,111,108,115,46,102,105,108,116,101,114,40,102,117,110,99,116,105,111,110,32,40,115,121,109,41,32,123,32,114,101,116,117,114,110,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,40,111,98,106,101,99,116,44,32,115,121,109,41,46,101,110,117,109,101,114,97,98,108,101,59,32,125,41,41,44,32,107,101,121,115,46,112,117,115,104,46,97,112,112,108,121,40,107,101,121,115,44,32,115,121,109,98,111,108,115,41,59,32,125,32,114,101,116,117,114,110,32,107,101,121,115,59,32,125,10,102,117,110,99,116,105,111,110,32,95,111,98,106,101,99,116,83,112,114,101,97,100,40,116,97,114,103,101,116,41,32,123,32,102,111,114,32,40,118,97,114,32,105,32,61,32,49,59,32,105,32,60,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,32,118,97,114,32,115,111,117,114,99,101,32,61,32,110,117,108,108,32,33,61,32,97,114,103,117,109,101,110,116,115,91,105,93,32,63,32,97,114,103,117,109,101,110,116,115,91,105,93,32,58,32,123,125,59,32,105,32,37,32,50,32,63,32,111,119,110,75,101,121,115,40,79,98,106,101,99,116,40,115,111,117,114,99,101,41,44,32,33,48,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,41,32,123,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,116,97,114,103,101,116,44,32,107,101,121,44,32,115,111,117,114,99,101,91,107,101,121,93,41,59,32,125,41,32,58,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,32,63,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,116,97,114,103,101,116,44,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,40,115,111,117,114,99,101,41,41,32,58,32,111,119,110,75,101,121,115,40,79,98,106,101,99,116,40,115,111,117,114,99,101,41,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,41,32,123,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,116,97,114,103,101,116,44,32,107,101,121,44,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,40,115,111,117,114,99,101,44,32,107,101,121,41,41,59,32,125,41,59,32,125,32,114,101,116,117,114,110,32,116,97,114,103,101,116,59,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,111,98,106,44,32,107,101,121,44,32,118,97,108,117,101,41,32,123,32,107,101,121,32,61,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,107,101,121,41,59,32,105,102,32,40,107,101,121,32,105,110,32,111,98,106,41,32,123,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,111,98,106,44,32,107,101,121,44,32,123,32,118,97,108,117,101,58,32,118,97,108,117,101,44,32,101,110,117,109,101,114,97,98,108,101,58,32,116,114,117,101,44,32,99,111,110,102,105,103,117,114,97,98,108,101,58,32,116,114,117,101,44,32,119,114,105,116,97,98,108,101,58,32,116,114,117,101,32,125,41,59,32,125,32,101,108,115,101,32,123,32,111,98,106,91,107,101,121,93,32,61,32,118,97,108,117,101,59,32,125,32,114,101,116,117,114,110,32,111,98,106,59,32,125,10,102,117,110,99,116,105,111,110,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,40,115,111,117,114,99,101,44,32,101,120,99,108,117,100,101,100,41,32,123,32,105,102,32,40,115,111,117,114,99,101,32,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,123,125,59,32,118,97,114,32,116,97,114,103,101,116,32,61,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,76,111,111,115,101,40,115,111,117,114,99,101,44,32,101,120,99,108,117,100,101,100,41,59,32,118,97,114,32,107,101,121,44,32,105,59,32,105,102,32,40,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,41,32,123,32,118,97,114,32,115,111,117,114,99,101,83,121,109,98,111,108,75,101,121,115,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,40,115,111,117,114,99,101,41,59,32,102,111,114,32,40,105,32,61,32,48,59,32,105,32,60,32,115,111,117,114,99,101,83,121,109,98,111,108,75,101,121,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,32,107,101,121,32,61,32,115,111,117,114,99,101,83,121,109,98,111,108,75,101,121,115,91,105,93,59,32,105,102,32,40,101,120,99,108,117,100,101,100,46,105,110,100,101,120,79,102,40,107,101,121,41,32,62,61,32,48,41,32,99,111,110,116,105,110,117,101,59,32,105,102,32,40,33,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,112,114,111,112,101,114,116,121,73,115,69,110,117,109,101,114,97,98,108,101,46,99,97,108,108,40,115,111,117,114,99,101,44,32,107,101,121,41,41,32,99,111,110,116,105,110,117,101,59,32,116,97,114,103,101,116,91,107,101,121,93,32,61,32,115,111,117,114,99,101,91,107,101,121,93,59,32,125,32,125,32,114,101,116,117,114,110,32,116,97,114,103,101,116,59,32,125,10,102,117,110,99,116,105,111,110,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,76,111,111,115,101,40,115,111,117,114,99,101,44,32,101,120,99,108,117,100,101,100,41,32,123,32,105,102,32,40,115,111,117,114,99,101,32,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,123,125,59,32,118,97,114,32,116,97,114,103,101,116,32,61,32,123,125,59,32,118,97,114,32,115,111,117,114,99,101,75,101,121,115,32,61,32,79,98,106,101,99,116,46,107,101,121,115,40,115,111,117,114,99,101,41,59,32,118,97,114,32,107,101,121,44,32,105,59,32,102,111,114,32,40,105,32,61,32,48,59,32,105,32,60,32,115,111,117,114,99,101,75,101,121,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,32,107,101,121,32,61,32,115,111,117,114,99,101,75,101,121,115,91,105,93,59,32,105,102,32,40,101,120,99,108,117,100,101,100,46,105,110,100,101,120,79,102,40,107,101,121,41,32,62,61,32,48,41,32,99,111,110,116,105,110,117,101,59,32,116,97,114,103,101,116,91,107,101,121,93,32,61,32,115,111,117,114,99,101,91,107,101,121,93,59,32,125,32,114,101,116,117,114,110,32,116,97,114,103,101,116,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,98,106,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,98,106,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,111,98,106,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,98,106,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,98,106,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,98,106,59,32,125,44,32,95,116,121,112,101,111,102,40,111,98,106,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,105,110,115,116,97,110,99,101,44,32,67,111,110,115,116,114,117,99,116,111,114,41,32,123,32,105,102,32,40,33,40,105,110,115,116,97,110,99,101,32,105,110,115,116,97,110,99,101,111,102,32,67,111,110,115,116,114,117,99,116,111,114,41,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,34,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,116,97,114,103,101,116,44,32,112,114,111,112,115,41,32,123,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,59,32,105,32,60,32,112,114,111,112,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,32,118,97,114,32,100,101,115,99,114,105,112,116,111,114,32,61,32,112,114,111,112,115,91,105,93,59,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,61,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,124,124,32,102,97,108,115,101,59,32,100,101,115,99,114,105,112,116,111,114,46,99,111,110,102,105,103,117,114,97,98,108,101,32,61,32,116,114,117,101,59,32,105,102,32,40,34,118,97,108,117,101,34,32,105,110,32,100,101,115,99,114,105,112,116,111,114,41,32,100,101,115,99,114,105,112,116,111,114,46,119,114,105,116,97,98,108,101,32,61,32,116,114,117,101,59,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,116,97,114,103,101,116,44,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,100,101,115,99,114,105,112,116,111,114,46,107,101,121,41,44,32,100,101,115,99,114,105,112,116,111,114,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,99,114,101,97,116,101,67,108,97,115,115,40,67,111,110,115,116,114,117,99,116,111,114,44,32,112,114,111,116,111,80,114,111,112,115,44,32,115,116,97,116,105,99,80,114,111,112,115,41,32,123,32,105,102,32,40,112,114,111,116,111,80,114,111,112,115,41,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,67,111,110,115,116,114,117,99,116,111,114,46,112,114,111,116,111,116,121,112,101,44,32,112,114,111,116,111,80,114,111,112,115,41,59,32,105,102,32,40,115,116,97,116,105,99,80,114,111,112,115,41,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,67,111,110,115,116,114,117,99,116,111,114,44,32,115,116,97,116,105,99,80,114,111,112,115,41,59,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,67,111,110,115,116,114,117,99,116,111,114,44,32,34,112,114,111,116,111,116,121,112,101,34,44,32,123,32,119,114,105,116,97,98,108,101,58,32,102,97,108,115,101,32,125,41,59,32,114,101,116,117,114,110,32,67,111,110,115,116,114,117,99,116,111,114,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,97,114,103,41,32,123,32,118,97,114,32,107,101,121,32,61,32,95,116,111,80,114,105,109,105,116,105,118,101,40,97,114,103,44,32,34,115,116,114,105,110,103,34,41,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,40,107,101,121,41,32,61,61,61,32,34,115,121,109,98,111,108,34,32,63,32,107,101,121,32,58,32,83,116,114,105,110,103,40,107,101,121,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,105,109,105,116,105,118,101,40,105,110,112,117,116,44,32,104,105,110,116,41,32,123,32,105,102,32,40,95,116,121,112,101,111,102,40,105,110,112,117,116,41,32,33,61,61,32,34,111,98,106,101,99,116,34,32,124,124,32,105,110,112,117,116,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,105,110,112,117,116,59,32,118,97,114,32,112,114,105,109,32,61,32,105,110,112,117,116,91,83,121,109,98,111,108,46,116,111,80,114,105,109,105,116,105,118,101,93,59,32,105,102,32,40,112,114,105,109,32,33,61,61,32,117,110,100,101,102,105,110,101,100,41,32,123,32,118,97,114,32,114,101,115,32,61,32,112,114,105,109,46,99,97,108,108,40,105,110,112,117,116,44,32,104,105,110,116,32,124,124,32,34,100,101,102,97,117,108,116,34,41,59,32,105,102,32,40,95,116,121,112,101,111,102,40,114,101,115,41,32,33,61,61,32,34,111,98,106,101,99,116,34,41,32,114,101,116,117,114,110,32,114,101,115,59,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,34,41,59,32,125,32,114,101,116,117,114,110,32,40,104,105,110,116,32,61,61,61,32,34,115,116,114,105,110,103,34,32,63,32,83,116,114,105,110,103,32,58,32,78,117,109,98,101,114,41,40,105,110,112,117,116,41,59,32,125,10,103,108,111,98,97,108,46,72,101,97,100,101,114,115,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,117,110,99,116,105,111,110,32,72,101,97,100,101,114,115,40,105,110,105,116,86,97,108,117,101,115,41,32,123,10,32,32,32,32,118,97,114,32,95,116,104,105,115,32,61,32,116,104,105,115,59,10,32,32,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,72,101,97,100,101,114,115,41,59,10,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,32,61,32,123,125,59,10,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,105,110,105,116,86,97,108,117,101,115,41,32,61,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,32,32,79,98,106,101,99,116,46,107,101,121,115,40,105,110,105,116,86,97,108,117,101,115,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,118,97,108,117,101,32,61,32,105,110,105,116,86,97,108,117,101,115,91,107,101,121,93,59,10,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,65,114,114,97,121,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,108,117,101,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,111,110,101,68,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,95,116,104,105,115,46,97,112,112,101,110,100,40,107,101,121,44,32,111,110,101,68,97,116,97,41,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,95,116,104,105,115,46,115,101,116,40,107,101,121,44,32,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,95,99,114,101,97,116,101,67,108,97,115,115,40,72,101,97,100,101,114,115,44,32,91,123,10,32,32,32,32,107,101,121,58,32,34,97,112,112,101,110,100,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,97,112,112,101,110,100,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,117,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,104,97,115,40,110,97,109,101,41,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,117,114,114,32,61,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,59,10,32,32,32,32,32,32,32,32,99,117,114,114,46,112,117,115,104,40,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,61,32,99,117,114,114,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,61,32,91,118,97,108,117,101,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,115,101,116,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,115,101,116,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,117,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,61,32,91,118,97,108,117,101,93,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,103,101,116,65,108,108,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,103,101,116,65,108,108,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,33,116,104,105,115,46,95,104,101,97,100,101,114,115,91,39,67,111,110,116,101,110,116,45,84,121,112,101,39,93,32,38,38,32,33,116,104,105,115,46,95,104,101,97,100,101,114,115,91,39,99,111,110,116,101,110,116,45,116,121,112,101,39,93,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,39,99,111,110,116,101,110,116,45,116,121,112,101,39,93,32,61,32,91,39,116,101,120,116,47,112,108,97,105,110,59,99,104,97,114,115,101,116,61,85,84,70,45,56,39,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,125,44,32,116,104,105,115,46,95,104,101,97,100,101,114,115,41,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,100,101,108,101,116,101,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,95,100,101,108,101,116,101,40,110,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,116,104,105,115,46,95,104,101,97,100,101,114,115,46,110,97,109,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,103,101,116,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,103,101,116,40,110,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,117,110,100,101,102,105,110,101,100,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,104,97,115,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,104,97,115,40,110,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,59,10,32,32,32,32,125,10,32,32,125,93,41,59,10,32,32,114,101,116,117,114,110,32,72,101,97,100,101,114,115,59,10,125,40,41,59,10,103,108,111,98,97,108,46,82,101,115,112,111,110,115,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,117,110,99,116,105,111,110,32,82,101,115,112,111,110,115,101,40,114,101,115,112,111,110,115,101,41,32,123,10,32,32,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,82,101,115,112,111,110,115,101,41,59,10,32,32,32,32,118,97,114,32,114,101,115,112,32,61,32,114,101,115,112,111,110,115,101,32,124,124,32,123,125,59,10,32,32,32,32,116,104,105,115,46,115,116,97,116,117,115,32,61,32,114,101,115,112,46,115,116,97,116,117,115,67,111,100,101,32,61,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,50,48,48,32,58,32,114,101,115,112,46,115,116,97,116,117,115,67,111,100,101,59,10,32,32,32,32,116,104,105,115,46,115,116,97,116,117,115,84,101,120,116,32,61,32,114,101,115,112,46,115,116,97,116,117,115,76,105,110,101,32,124,124,32,39,78,111,116,32,70,111,117,110,100,39,59,10,32,32,32,32,116,104,105,115,46,104,101,97,100,101,114,115,32,61,32,114,101,115,112,46,114,101,115,112,72,101,97,100,101,114,115,32,124,124,32,123,125,59,10,32,32,32,32,116,104,105,115,46,98,111,100,121,32,61,32,114,101,115,112,46,114,101,115,112,66,111,100,121,32,124,124,32,39,39,59,10,32,32,32,32,116,104,105,115,46,111,107,32,61,32,116,104,105,115,46,115,116,97,116,117,115,32,62,61,32,50,48,48,32,38,38,32,116,104,105,115,46,115,116,97,116,117,115,32,60,61,32,50,57,57,59,10,32,32,125,10,32,32,95,99,114,101,97,116,101,67,108,97,115,115,40,82,101,115,112,111,110,115,101,44,32,91,123,10,32,32,32,32,107,101,121,58,32,34,106,115,111,110,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,106,115,111,110,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,116,104,105,115,50,32,61,32,116,104,105,115,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,106,115,111,110,105,102,121,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,106,115,111,110,105,102,121,32,61,32,74,83,79,78,46,112,97,114,115,101,40,95,116,104,105,115,50,46,98,111,100,121,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,106,115,111,110,105,102,121,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,110,101,119,32,69,114,114,111,114,40,39,101,114,114,111,114,32,112,97,114,115,105,110,103,32,111,98,106,101,99,116,39,41,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,116,101,120,116,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,116,101,120,116,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,116,104,105,115,46,98,111,100,121,41,59,10,32,32,32,32,125,10,32,32,125,93,41,59,10,32,32,114,101,116,117,114,110,32,82,101,115,112,111,110,115,101,59,10,125,40,41,59,10,118,97,114,32,109,101,116,104,111,100,115,32,61,32,91,39,68,69,76,69,84,69,39,44,32,39,71,69,84,39,44,32,39,72,69,65,68,39,44,32,39,79,80,84,73,79,78,83,39,44,32,39,80,79,83,84,39,44,32,39,80,85,84,39,93,59,10,102,117,110,99,116,105,111,110,32,110,111,114,109,97,108,105,122,101,77,101,116,104,111,100,40,109,101,116,104,111,100,41,32,123,10,32,32,118,97,114,32,117,112,67,97,115,101,100,32,61,32,109,101,116,104,111,100,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,10,32,32,114,101,116,117,114,110,32,109,101,116,104,111,100,115,46,105,110,100,101,120,79,102,40,117,112,67,97,115,101,100,41,32,62,32,45,49,32,63,32,117,112,67,97,115,101,100,32,58,32,109,101,116,104,111,100,59,10,125,10,103,108,111,98,97,108,46,102,101,116,99,104,32,61,32,102,117,110,99,116,105,111,110,32,40,117,114,108,44,32,111,112,116,105,111,110,115,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,117,114,108,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,69,114,114,111,114,40,39,111,110,108,121,32,83,116,114,105,110,103,32,117,114,108,32,115,117,112,112,111,114,116,101,100,39,41,41,59,10,32,32,125,10,32,32,118,97,114,32,95,114,101,102,32,61,32,111,112,116,105,111,110,115,32,124,124,32,123,125,44,10,32,32,32,32,109,101,116,104,111,100,32,61,32,95,114,101,102,46,109,101,116,104,111,100,44,10,32,32,32,32,104,101,97,100,101,114,115,32,61,32,95,114,101,102,46,104,101,97,100,101,114,115,44,10,32,32,32,32,98,111,100,121,32,61,32,95,114,101,102,46,98,111,100,121,44,10,32,32,32,32,111,116,104,101,114,79,112,116,105,111,110,115,32,61,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,40,95,114,101,102,44,32,95,101,120,99,108,117,100,101,100,41,59,10,32,32,118,97,114,32,114,101,113,72,101,97,100,115,32,61,32,123,125,59,10,32,32,105,102,32,40,104,101,97,100,101,114,115,41,32,123,10,32,32,32,32,105,102,32,40,104,101,97,100,101,114,115,32,105,110,115,116,97,110,99,101,111,102,32,103,108,111,98,97,108,46,72,101,97,100,101,114,115,41,32,123,10,32,32,32,32,32,32,114,101,113,72,101,97,100,115,32,61,32,104,101,97,100,101,114,115,46,103,101,116,65,108,108,40,41,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,104,101,97,100,101,114,115,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,79,98,106,101,99,116,41,32,123,10,32,32,32,32,32,32,118,97,114,32,104,101,97,100,101,114,115,73,110,115,116,97,110,99,101,32,61,32,110,101,119,32,103,108,111,98,97,108,46,72,101,97,100,101,114,115,40,104,101,97,100,101,114,115,41,59,10,32,32,32,32,32,32,114,101,113,72,101,97,100,115,32,61,32,104,101,97,100,101,114,115,73,110,115,116,97,110,99,101,46,103,101,116,65,108,108,40,41,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,69,114,114,111,114,40,39,79,110,108,121,32,72,101,97,100,101,114,115,32,105,110,115,116,97,110,99,101,32,111,114,32,97,32,112,117,114,101,32,111,98,106,101,99,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,102,111,114,32,104,101,97,100,101,114,115,32,111,112,116,105,111,110,39,41,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,118,97,114,32,114,101,113,79,112,116,105,111,110,115,32,61,32,95,111,98,106,101,99,116,83,112,114,101,97,100,40,123,10,32,32,32,32,117,114,108,58,32,117,114,108,44,10,32,32,32,32,109,101,116,104,111,100,58,32,110,111,114,109,97,108,105,122,101,77,101,116,104,111,100,40,109,101,116,104,111,100,32,124,124,32,39,71,69,84,39,41,44,10,32,32,32,32,104,101,97,100,101,114,115,58,32,114,101,113,72,101,97,100,115,32,124,124,32,123,125,44,10,32,32,32,32,98,111,100,121,58,32,98,111,100,121,32,124,124,32,39,39,10,32,32,125,44,32,111,116,104,101,114,79,112,116,105,111,110,115,41,59,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,61,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,110,101,116,119,111,114,107,39,44,32,39,102,101,116,99,104,39,44,32,114,101,113,79,112,116,105,111,110,115,41,59,10,32,32,32,32,114,101,115,117,108,116,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,114,101,115,112,41,32,123,10,32,32,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,114,101,115,112,41,32,61,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,114,101,115,112,111,110,115,101,68,97,116,97,32,61,32,110,101,119,32,103,108,111,98,97,108,46,82,101,115,112,111,110,115,101,40,114,101,115,112,41,59,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,114,101,115,112,111,110,115,101,68,97,116,97,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,114,101,115,112,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,41,46,99,97,116,99,104,40,102,117,110,99,116,105,111,110,32,40,101,41,32,123,10,32,32,32,32,32,32,114,101,106,101,99,116,40,101,41,59,10,32,32,32,32,125,41,59,10,32,32,125,41,59,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_Storage[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,99,111,110,118,101,114,116,69,114,114,111,114,32,61,32,102,117,110,99,116,105,111,110,32,99,111,110,118,101,114,116,69,114,114,111,114,40,101,114,114,111,114,41,32,123,10,32,32,105,102,32,40,33,101,114,114,111,114,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,118,97,114,32,111,117,116,32,61,32,110,101,119,32,69,114,114,111,114,40,101,114,114,111,114,46,109,101,115,115,97,103,101,41,59,10,32,32,111,117,116,46,107,101,121,32,61,32,101,114,114,111,114,46,107,101,121,59,10,32,32,114,101,116,117,114,110,32,111,117,116,59,10,125,59,10,118,97,114,32,99,111,110,118,101,114,116,69,114,114,111,114,115,32,61,32,102,117,110,99,116,105,111,110,32,99,111,110,118,101,114,116,69,114,114,111,114,115,40,101,114,114,115,41,32,123,10,32,32,105,102,32,40,33,101,114,114,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,118,97,114,32,116,97,114,103,101,116,69,114,114,111,114,59,10,32,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,101,114,114,115,41,41,32,123,10,32,32,32,32,116,97,114,103,101,116,69,114,114,111,114,32,61,32,101,114,114,115,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,116,97,114,103,101,116,69,114,114,111,114,32,61,32,91,101,114,114,115,93,59,10,32,32,125,10,32,32,105,102,32,40,116,97,114,103,101,116,69,114,114,111,114,41,32,123,10,32,32,32,32,116,97,114,103,101,116,69,114,114,111,114,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,101,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,111,110,118,101,114,116,69,114,114,111,114,40,101,41,59,10,32,32,32,32,125,41,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,116,97,114,103,101,116,69,114,114,111,114,59,10,125,59,10,72,105,112,112,121,46,97,115,121,110,99,83,116,111,114,97,103,101,32,61,32,123,10,32,32,103,101,116,65,108,108,75,101,121,115,58,32,102,117,110,99,116,105,111,110,32,103,101,116,65,108,108,75,101,121,115,40,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,103,101,116,65,108,108,75,101,121,115,39,41,59,10,32,32,125,44,10,32,32,115,101,116,73,116,101,109,58,32,102,117,110,99,116,105,111,110,32,115,101,116,73,116,101,109,40,107,101,121,44,32,118,97,108,117,101,65,114,103,41,32,123,10,32,32,32,32,118,97,114,32,118,97,108,117,101,32,61,32,118,97,108,117,101,65,114,103,59,10,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,118,97,108,117,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,118,97,108,117,101,32,61,32,118,97,108,117,101,46,116,111,83,116,114,105,110,103,40,41,59,10,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,114,114,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,83,101,116,39,44,32,91,91,107,101,121,44,32,118,97,108,117,101,93,93,41,59,10,32,32,125,44,10,32,32,103,101,116,73,116,101,109,58,32,102,117,110,99,116,105,111,110,32,103,101,116,73,116,101,109,40,107,101,121,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,71,101,116,39,44,32,91,107,101,121,93,41,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,114,41,32,123,10,32,32,32,32,32,32,105,102,32,40,33,114,32,124,124,32,33,114,91,48,93,32,124,124,32,33,114,91,48,93,91,49,93,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,114,91,48,93,91,49,93,59,10,32,32,32,32,125,41,46,99,97,116,99,104,40,102,117,110,99,116,105,111,110,32,40,101,114,114,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,111,110,118,101,114,116,69,114,114,111,114,115,40,101,114,114,41,59,10,32,32,32,32,125,41,59,10,32,32,125,44,10,32,32,114,101,109,111,118,101,73,116,101,109,58,32,102,117,110,99,116,105,111,110,32,114,101,109,111,118,101,73,116,101,109,40,107,101,121,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,82,101,109,111,118,101,39,44,32,91,107,101,121,93,41,59,10,32,32,125,44,10,32,32,109,117,108,116,105,71,101,116,58,32,102,117,110,99,116,105,111,110,32,109,117,108,116,105,71,101,116,40,107,101,121,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,71,101,116,39,44,32,107,101,121,115,41,59,10,32,32,125,44,10,32,32,109,117,108,116,105,83,101,116,58,32,102,117,110,99,116,105,111,110,32,109,117,108,116,105,83,101,116,40,107,101,121,86,97,108,117,101,80,97,105,114,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,83,101,116,39,44,32,107,101,121,86,97,108,117,101,80,97,105,114,115,41,59,10,32,32,125,44,10,32,32,109,117,108,116,105,82,101,109,111,118,101,58,32,102,117,110,99,116,105,111,110,32,109,117,108,116,105,82,101,109,111,118,101,40,107,101,121,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,82,101,109,111,118,101,39,44,32,107,101,121,115,41,59,10,32,32,125,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_Dimensions[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,118,97,114,32,110,97,116,105,118,101,87,105,110,100,111,119,59,10,32,32,118,97,114,32,110,97,116,105,118,101,83,99,114,101,101,110,59,10,32,32,105,102,32,40,103,108,111,98,97,108,46,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,41,32,123,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,119,105,110,100,111,119,59,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,115,99,114,101,101,110,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,119,105,110,100,111,119,80,104,121,115,105,99,97,108,80,105,120,101,108,115,59,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,115,99,114,101,101,110,80,104,121,115,105,99,97,108,80,105,120,101,108,115,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,58,32,110,97,116,105,118,101,87,105,110,100,111,119,44,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,58,32,110,97,116,105,118,101,83,99,114,101,101,110,10,32,32,125,59,10,125,10,102,117,110,99,116,105,111,110,32,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,118,97,114,32,119,105,110,100,111,119,32,61,32,123,125,59,10,32,32,118,97,114,32,115,99,114,101,101,110,32,61,32,123,125,59,10,32,32,118,97,114,32,95,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,32,61,32,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,44,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,32,61,32,95,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,46,110,97,116,105,118,101,87,105,110,100,111,119,44,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,32,61,32,95,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,46,110,97,116,105,118,101,83,99,114,101,101,110,59,10,32,32,105,102,32,40,110,97,116,105,118,101,87,105,110,100,111,119,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,32,63,32,119,105,110,100,111,119,32,61,32,110,97,116,105,118,101,87,105,110,100,111,119,32,58,32,119,105,110,100,111,119,32,61,32,123,10,32,32,32,32,32,32,119,105,100,116,104,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,119,105,100,116,104,44,10,32,32,32,32,32,32,104,101,105,103,104,116,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,104,101,105,103,104,116,44,10,32,32,32,32,32,32,115,99,97,108,101,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,115,99,97,108,101,44,10,32,32,32,32,32,32,102,111,110,116,83,99,97,108,101,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,102,111,110,116,83,99,97,108,101,44,10,32,32,32,32,32,32,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,44,10,32,32,32,32,32,32,110,97,118,105,103,97,116,111,114,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,110,97,118,105,103,97,116,105,111,110,66,97,114,72,101,105,103,104,116,10,32,32,32,32,125,59,10,32,32,125,10,32,32,105,102,32,40,110,97,116,105,118,101,83,99,114,101,101,110,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,32,63,32,115,99,114,101,101,110,32,61,32,110,97,116,105,118,101,83,99,114,101,101,110,32,58,32,115,99,114,101,101,110,32,61,32,123,10,32,32,32,32,32,32,119,105,100,116,104,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,119,105,100,116,104,44,10,32,32,32,32,32,32,104,101,105,103,104,116,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,104,101,105,103,104,116,44,10,32,32,32,32,32,32,115,99,97,108,101,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,115,99,97,108,101,44,10,32,32,32,32,32,32,102,111,110,116,83,99,97,108,101,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,102,111,110,116,83,99,97,108,101,44,10,32,32,32,32,32,32,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,44,10,32,32,32,32,32,32,110,97,118,105,103,97,116,111,114,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,110,97,118,105,103,97,116,105,111,110,66,97,114,72,101,105,103,104,116,10,32,32,32,32,125,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,119,105,110,100,111,119,58,32,119,105,110,100,111,119,44,10,32,32,32,32,115,99,114,101,101,110,58,32,115,99,114,101,101,110,10,32,32,125,59,10,125,10,118,97,114,32,68,105,109,101,110,115,105,111,110,115,32,61,32,123,10,32,32,103,101,116,58,32,102,117,110,99,116,105,111,110,32,103,101,116,40,107,101,121,41,32,123,10,32,32,32,32,118,97,114,32,100,101,118,105,99,101,32,61,32,72,105,112,112,121,46,100,101,118,105,99,101,32,124,124,32,123,125,59,10,32,32,32,32,114,101,116,117,114,110,32,100,101,118,105,99,101,91,107,101,121,93,59,10,32,32,125,44,10,32,32,115,101,116,58,32,102,117,110,99,116,105,111,110,32,115,101,116,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,32,32,105,102,32,40,33,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,118,97,114,32,95,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,32,61,32,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,44,10,32,32,32,32,32,32,119,105,110,100,111,119,32,61,32,95,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,46,119,105,110,100,111,119,44,10,32,32,32,32,32,32,115,99,114,101,101,110,32,61,32,95,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,46,115,99,114,101,101,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,119,105,110,100,111,119,32,61,32,119,105,110,100,111,119,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,115,99,114,101,101,110,32,61,32,115,99,114,101,101,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,105,120,101,108,82,97,116,105,111,32,61,32,72,105,112,112,121,46,100,101,118,105,99,101,46,119,105,110,100,111,119,46,115,99,97,108,101,59,10,32,32,125,44,10,32,32,105,110,105,116,58,32,102,117,110,99,116,105,111,110,32,105,110,105,116,40,41,32,123,10,32,32,32,32,116,104,105,115,46,115,101,116,40,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,68,105,109,101,110,115,105,111,110,115,41,59,10,32,32,125,10,125,59,10,68,105,109,101,110,115,105,111,110,115,46,105,110,105,116,40,41,59,10,95,95,71,76,79,66,65,76,95,95,46,106,115,77,111,100,117,108,101,76,105,115,116,32,61,32,123,10,32,32,68,105,109,101,110,115,105,111,110,115,58,32,68,105,109,101,110,115,105,111,110,115,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_UtilsModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,105,102,32,40,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,61,61,32,39,97,110,100,114,111,105,100,39,41,32,123,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,118,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,112,97,116,116,101,114,110,44,32,114,101,112,101,97,116,41,32,123,10,32,32,32,32,118,97,114,32,95,112,97,116,116,101,114,110,32,61,32,112,97,116,116,101,114,110,59,10,32,32,32,32,118,97,114,32,95,114,101,112,101,97,116,32,61,32,114,101,112,101,97,116,59,10,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,112,97,116,116,101,114,110,32,61,61,61,32,39,110,117,109,98,101,114,39,41,32,123,10,32,32,32,32,32,32,95,112,97,116,116,101,114,110,32,61,32,91,48,44,32,112,97,116,116,101,114,110,93,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,114,101,112,101,97,116,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,32,123,10,32,32,32,32,32,32,95,114,101,112,101,97,116,32,61,32,45,49,59,10,32,32,32,32,125,10,32,32,32,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,40,39,85,116,105,108,115,77,111,100,117,108,101,39,44,32,39,118,105,98,114,97,116,101,39,44,32,116,114,117,101,44,32,95,112,97,116,116,101,114,110,44,32,95,114,101,112,101,97,116,41,59,10,32,32,125,59,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,99,97,110,99,101,108,86,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,40,39,85,116,105,108,115,77,111,100,117,108,101,39,44,32,39,99,97,110,99,101,108,39,44,32,116,114,117,101,41,59,10,32,32,125,59,10,125,32,101,108,115,101,32,105,102,32,40,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,61,61,32,39,105,111,115,39,41,32,123,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,118,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,125,59,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,99,97,110,99,101,108,86,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,125,59,10,125,125,41,59,0 }; // NOLINT - const uint8_t k_global[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,115,108,105,99,101,100,84,111,65,114,114,97,121,40,97,114,114,44,32,105,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,72,111,108,101,115,40,97,114,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,76,105,109,105,116,40,97,114,114,44,32,105,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,44,32,105,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,82,101,115,116,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,82,101,115,116,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,100,101,115,116,114,117,99,116,117,114,101,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,76,105,109,105,116,40,97,114,114,44,32,105,41,32,123,32,118,97,114,32,95,105,32,61,32,110,117,108,108,32,61,61,32,97,114,114,32,63,32,110,117,108,108,32,58,32,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,97,114,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,124,124,32,97,114,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,59,32,105,102,32,40,110,117,108,108,32,33,61,32,95,105,41,32,123,32,118,97,114,32,95,115,44,32,95,101,44,32,95,120,44,32,95,114,44,32,95,97,114,114,32,61,32,91,93,44,32,95,110,32,61,32,33,48,44,32,95,100,32,61,32,33,49,59,32,116,114,121,32,123,32,105,102,32,40,95,120,32,61,32,40,95,105,32,61,32,95,105,46,99,97,108,108,40,97,114,114,41,41,46,110,101,120,116,44,32,48,32,61,61,61,32,105,41,32,123,32,105,102,32,40,79,98,106,101,99,116,40,95,105,41,32,33,61,61,32,95,105,41,32,114,101,116,117,114,110,59,32,95,110,32,61,32,33,49,59,32,125,32,101,108,115,101,32,102,111,114,32,40,59,32,33,40,95,110,32,61,32,40,95,115,32,61,32,95,120,46,99,97,108,108,40,95,105,41,41,46,100,111,110,101,41,32,38,38,32,40,95,97,114,114,46,112,117,115,104,40,95,115,46,118,97,108,117,101,41,44,32,95,97,114,114,46,108,101,110,103,116,104,32,33,61,61,32,105,41,59,32,95,110,32,61,32,33,48,41,59,32,125,32,99,97,116,99,104,32,40,101,114,114,41,32,123,32,95,100,32,61,32,33,48,44,32,95,101,32,61,32,101,114,114,59,32,125,32,102,105,110,97,108,108,121,32,123,32,116,114,121,32,123,32,105,102,32,40,33,95,110,32,38,38,32,110,117,108,108,32,33,61,32,95,105,46,114,101,116,117,114,110,32,38,38,32,40,95,114,32,61,32,95,105,46,114,101,116,117,114,110,40,41,44,32,79,98,106,101,99,116,40,95,114,41,32,33,61,61,32,95,114,41,41,32,114,101,116,117,114,110,59,32,125,32,102,105,110,97,108,108,121,32,123,32,105,102,32,40,95,100,41,32,116,104,114,111,119,32,95,101,59,32,125,32,125,32,114,101,116,117,114,110,32,95,97,114,114,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,72,111,108,101,115,40,97,114,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,97,114,114,41,41,32,114,101,116,117,114,110,32,97,114,114,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,97,114,114,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,97,114,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,32,123,32,105,102,32,40,33,111,41,32,114,101,116,117,114,110,59,32,105,102,32,40,116,121,112,101,111,102,32,111,32,61,61,61,32,34,115,116,114,105,110,103,34,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,59,32,118,97,114,32,110,32,61,32,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,111,41,46,115,108,105,99,101,40,56,44,32,45,49,41,59,32,105,102,32,40,110,32,61,61,61,32,34,79,98,106,101,99,116,34,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,41,32,110,32,61,32,111,46,99,111,110,115,116,114,117,99,116,111,114,46,110,97,109,101,59,32,105,102,32,40,110,32,61,61,61,32,34,77,97,112,34,32,124,124,32,110,32,61,61,61,32,34,83,101,116,34,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,111,41,59,32,105,102,32,40,110,32,61,61,61,32,34,65,114,103,117,109,101,110,116,115,34,32,124,124,32,47,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,47,46,116,101,115,116,40,110,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,105,116,101,114,41,32,123,32,105,102,32,40,116,121,112,101,111,102,32,83,121,109,98,111,108,32,33,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,38,38,32,105,116,101,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,33,61,32,110,117,108,108,32,124,124,32,105,116,101,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,32,33,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,105,116,101,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,97,114,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,97,114,114,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,97,114,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,97,114,114,44,32,108,101,110,41,32,123,32,105,102,32,40,108,101,110,32,61,61,32,110,117,108,108,32,124,124,32,108,101,110,32,62,32,97,114,114,46,108,101,110,103,116,104,41,32,108,101,110,32,61,32,97,114,114,46,108,101,110,103,116,104,59,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,44,32,97,114,114,50,32,61,32,110,101,119,32,65,114,114,97,121,40,108,101,110,41,59,32,105,32,60,32,108,101,110,59,32,105,43,43,41,32,97,114,114,50,91,105,93,32,61,32,97,114,114,91,105,93,59,32,114,101,116,117,114,110,32,97,114,114,50,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,98,106,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,98,106,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,32,114,101,116,117,114,110,32,111,98,106,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,98,106,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,98,106,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,98,106,59,32,125,44,32,95,116,121,112,101,111,102,40,111,98,106,41,59,32,125,10,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,73,100,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,76,105,115,116,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,116,114,117,101,59,10,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,32,61,32,91,91,93,44,32,91,93,44,32,91,93,44,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,93,59,10,95,95,71,76,79,66,65,76,95,95,46,97,114,114,97,121,67,111,110,116,97,105,110,115,32,61,32,102,117,110,99,116,105,111,110,32,40,97,114,114,97,121,44,32,118,97,108,117,101,41,32,123,10,32,32,114,101,116,117,114,110,32,97,114,114,97,121,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,32,33,61,61,32,45,49,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,100,101,102,105,110,101,76,97,122,121,79,98,106,101,99,116,80,114,111,112,101,114,116,121,32,61,32,102,117,110,99,116,105,111,110,32,40,111,98,106,101,99,116,44,32,110,97,109,101,44,32,100,101,115,99,114,105,112,116,111,114,41,32,123,10,32,32,118,97,114,32,103,101,116,32,61,32,100,101,115,99,114,105,112,116,111,114,46,103,101,116,59,10,32,32,118,97,114,32,101,110,117,109,101,114,97,98,108,101,32,61,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,33,61,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,119,114,105,116,97,98,108,101,32,61,32,100,101,115,99,114,105,112,116,111,114,46,119,114,105,116,97,98,108,101,32,33,61,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,118,97,108,117,101,59,10,32,32,118,97,114,32,118,97,108,117,101,83,101,116,32,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,115,101,116,86,97,108,117,101,32,61,32,102,117,110,99,116,105,111,110,32,115,101,116,86,97,108,117,101,40,110,101,119,86,97,108,117,101,41,32,123,10,32,32,32,32,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,32,32,118,97,108,117,101,83,101,116,32,61,32,116,114,117,101,59,10,32,32,32,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,111,98,106,101,99,116,44,32,110,97,109,101,44,32,123,10,32,32,32,32,32,32,118,97,108,117,101,58,32,110,101,119,86,97,108,117,101,44,10,32,32,32,32,32,32,99,111,110,102,105,103,117,114,97,98,108,101,58,32,116,114,117,101,44,10,32,32,32,32,32,32,101,110,117,109,101,114,97,98,108,101,58,32,101,110,117,109,101,114,97,98,108,101,44,10,32,32,32,32,32,32,119,114,105,116,97,98,108,101,58,32,119,114,105,116,97,98,108,101,10,32,32,32,32,125,41,59,10,32,32,125,59,10,32,32,118,97,114,32,103,101,116,86,97,108,117,101,32,61,32,102,117,110,99,116,105,111,110,32,103,101,116,86,97,108,117,101,40,41,32,123,10,32,32,32,32,105,102,32,40,33,118,97,108,117,101,83,101,116,41,32,123,10,32,32,32,32,32,32,115,101,116,86,97,108,117,101,40,103,101,116,40,41,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,118,97,108,117,101,59,10,32,32,125,59,10,32,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,111,98,106,101,99,116,44,32,110,97,109,101,44,32,123,10,32,32,32,32,103,101,116,58,32,103,101,116,86,97,108,117,101,44,10,32,32,32,32,115,101,116,58,32,115,101,116,86,97,108,117,101,44,10,32,32,32,32,99,111,110,102,105,103,117,114,97,98,108,101,58,32,116,114,117,101,44,10,32,32,32,32,101,110,117,109,101,114,97,98,108,101,58,32,101,110,117,109,101,114,97,98,108,101,10,32,32,125,41,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,101,110,113,117,101,117,101,78,97,116,105,118,101,67,97,108,108,32,61,32,102,117,110,99,116,105,111,110,32,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,112,97,114,97,109,115,44,32,111,110,83,117,99,99,101,115,115,44,32,111,110,70,97,105,108,41,32,123,10,32,32,105,102,32,40,111,110,83,117,99,99,101,115,115,32,124,124,32,111,110,70,97,105,108,41,32,123,10,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,112,97,114,97,109,115,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,38,38,32,112,97,114,97,109,115,46,108,101,110,103,116,104,32,62,32,48,32,38,38,32,95,116,121,112,101,111,102,40,112,97,114,97,109,115,91,48,93,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,38,38,32,112,97,114,97,109,115,91,48,93,46,110,111,116,68,101,108,101,116,101,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,115,46,115,104,105,102,116,40,41,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,91,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,93,32,61,32,116,114,117,101,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,111,110,83,117,99,99,101,115,115,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,115,46,112,117,115,104,40,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,41,59,10,32,32,32,32,125,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,93,32,61,32,111,110,83,117,99,99,101,115,115,59,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,32,32,105,102,32,40,111,110,70,97,105,108,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,115,46,112,117,115,104,40,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,41,59,10,32,32,32,32,125,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,93,32,61,32,111,110,70,97,105,108,59,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,125,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,32,43,61,32,49,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,91,48,93,46,112,117,115,104,40,109,111,100,117,108,101,73,68,41,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,91,49,93,46,112,117,115,104,40,109,101,116,104,111,100,73,68,41,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,91,50,93,46,112,117,115,104,40,112,97,114,97,109,115,41,59,10,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,116,105,118,101,70,108,117,115,104,81,117,101,117,101,73,109,109,101,100,105,97,116,101,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,32,32,118,97,114,32,111,114,105,103,105,110,97,108,81,117,101,117,101,32,61,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,41,59,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,32,61,32,91,91,93,44,32,91,93,44,32,91,93,44,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,93,59,10,32,32,32,32,110,97,116,105,118,101,70,108,117,115,104,81,117,101,117,101,73,109,109,101,100,105,97,116,101,40,111,114,105,103,105,110,97,108,81,117,101,117,101,41,59,10,32,32,125,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,32,61,32,102,117,110,99,116,105,111,110,32,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,32,123,10,32,32,105,102,32,40,33,99,111,110,102,105,103,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,118,97,114,32,95,99,111,110,102,105,103,32,61,32,95,115,108,105,99,101,100,84,111,65,114,114,97,121,40,99,111,110,102,105,103,44,32,53,41,44,10,32,32,32,32,109,111,100,117,108,101,78,97,109,101,32,61,32,95,99,111,110,102,105,103,91,48,93,44,10,32,32,32,32,99,111,110,115,116,97,110,116,115,32,61,32,95,99,111,110,102,105,103,91,49,93,44,10,32,32,32,32,109,101,116,104,111,100,115,32,61,32,95,99,111,110,102,105,103,91,50,93,44,10,32,32,32,32,112,114,111,109,105,115,101,77,101,116,104,111,100,115,32,61,32,95,99,111,110,102,105,103,91,51,93,44,10,32,32,32,32,115,121,110,99,77,101,116,104,111,100,115,32,61,32,95,99,111,110,102,105,103,91,52,93,59,10,32,32,105,102,32,40,33,99,111,110,115,116,97,110,116,115,32,38,38,32,33,109,101,116,104,111,100,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,110,97,109,101,58,32,109,111,100,117,108,101,78,97,109,101,10,32,32,32,32,125,59,10,32,32,125,10,32,32,118,97,114,32,109,111,100,117,108,101,32,61,32,123,125,59,10,32,32,105,102,32,40,109,101,116,104,111,100,115,41,32,123,10,32,32,32,32,109,101,116,104,111,100,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,109,101,116,104,111,100,78,97,109,101,44,32,109,101,116,104,111,100,73,68,41,32,123,10,32,32,32,32,32,32,118,97,114,32,105,115,80,114,111,109,105,115,101,32,61,32,112,114,111,109,105,115,101,77,101,116,104,111,100,115,32,38,38,32,95,95,71,76,79,66,65,76,95,95,46,97,114,114,97,121,67,111,110,116,97,105,110,115,40,112,114,111,109,105,115,101,77,101,116,104,111,100,115,44,32,109,101,116,104,111,100,73,68,41,59,10,32,32,32,32,32,32,118,97,114,32,105,115,83,121,110,99,32,61,32,115,121,110,99,77,101,116,104,111,100,115,32,38,38,32,95,95,71,76,79,66,65,76,95,95,46,97,114,114,97,121,67,111,110,116,97,105,110,115,40,115,121,110,99,77,101,116,104,111,100,115,44,32,109,101,116,104,111,100,73,68,41,59,10,32,32,32,32,32,32,118,97,114,32,109,101,116,104,111,100,84,121,112,101,32,61,32,39,97,115,121,110,99,39,59,10,32,32,32,32,32,32,105,102,32,40,105,115,80,114,111,109,105,115,101,41,32,123,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,84,121,112,101,32,61,32,39,112,114,111,109,105,115,101,39,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,105,115,83,121,110,99,41,32,123,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,84,121,112,101,32,61,32,39,115,121,110,99,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,109,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,101,116,104,111,100,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,109,101,116,104,111,100,84,121,112,101,41,59,10,32,32,32,32,125,41,59,10,32,32,125,10,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,109,111,100,117,108,101,44,32,99,111,110,115,116,97,110,116,115,41,59,10,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,110,97,109,101,58,32,109,111,100,117,108,101,78,97,109,101,44,10,32,32,32,32,109,111,100,117,108,101,58,32,109,111,100,117,108,101,10,32,32,125,59,10,125,59,10,103,108,111,98,97,108,46,95,95,102,98,71,101,110,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,59,10,95,95,71,76,79,66,65,76,95,95,46,108,111,97,100,77,111,100,117,108,101,32,61,32,102,117,110,99,116,105,111,110,32,40,110,97,109,101,44,32,109,111,100,117,108,101,73,68,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,116,105,118,101,82,101,113,117,105,114,101,77,111,100,117,108,101,67,111,110,102,105,103,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,32,32,118,97,114,32,99,111,110,102,105,103,32,61,32,110,97,116,105,118,101,82,101,113,117,105,114,101,77,111,100,117,108,101,67,111,110,102,105,103,40,110,97,109,101,41,59,10,32,32,32,32,118,97,114,32,105,110,102,111,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,59,10,32,32,32,32,114,101,116,117,114,110,32,105,110,102,111,32,38,38,32,105,110,102,111,46,109,111,100,117,108,101,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,101,116,104,111,100,32,61,32,102,117,110,99,116,105,111,110,32,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,116,121,112,101,41,32,123,10,32,32,118,97,114,32,102,110,59,10,32,32,105,102,32,40,116,121,112,101,32,61,61,61,32,39,112,114,111,109,105,115,101,39,41,32,123,10,32,32,32,32,102,110,32,61,32,102,117,110,99,116,105,111,110,32,102,110,40,41,32,123,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,101,110,113,117,101,117,101,78,97,116,105,118,101,67,97,108,108,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,97,114,103,115,44,32,102,117,110,99,116,105,111,110,32,40,100,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,97,116,97,41,59,10,32,32,32,32,32,32,32,32,125,44,32,102,117,110,99,116,105,111,110,32,40,101,114,114,111,114,68,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,114,114,111,114,68,97,116,97,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,59,10,32,32,125,32,101,108,115,101,32,105,102,32,40,116,121,112,101,32,61,61,61,32,39,115,121,110,99,39,41,32,123,10,32,32,32,32,102,110,32,61,32,102,117,110,99,116,105,111,110,32,102,110,40,41,32,123,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,50,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,50,41,44,32,95,107,101,121,50,32,61,32,48,59,32,95,107,101,121,50,32,60,32,95,108,101,110,50,59,32,95,107,101,121,50,43,43,41,32,123,10,32,32,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,50,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,50,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,97,116,105,118,101,67,97,108,108,83,121,110,99,72,111,111,107,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,97,114,103,115,41,59,10,32,32,32,32,125,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,102,110,32,61,32,102,117,110,99,116,105,111,110,32,102,110,40,41,32,123,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,51,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,51,41,44,32,95,107,101,121,51,32,61,32,48,59,32,95,107,101,121,51,32,60,32,95,108,101,110,51,59,32,95,107,101,121,51,43,43,41,32,123,10,32,32,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,51,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,51,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,108,97,115,116,65,114,103,32,61,32,97,114,103,115,46,108,101,110,103,116,104,32,62,32,48,32,63,32,97,114,103,115,91,97,114,103,115,46,108,101,110,103,116,104,32,45,32,49,93,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,115,101,99,111,110,100,76,97,115,116,65,114,103,32,61,32,97,114,103,115,46,108,101,110,103,116,104,32,62,32,49,32,63,32,97,114,103,115,91,97,114,103,115,46,108,101,110,103,116,104,32,45,32,50,93,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,104,97,115,83,117,99,99,101,115,115,67,97,108,108,98,97,99,107,32,61,32,116,121,112,101,111,102,32,108,97,115,116,65,114,103,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,59,10,32,32,32,32,32,32,118,97,114,32,104,97,115,69,114,114,111,114,67,97,108,108,98,97,99,107,32,61,32,116,121,112,101,111,102,32,115,101,99,111,110,100,76,97,115,116,65,114,103,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,59,10,32,32,32,32,32,32,118,97,114,32,111,110,83,117,99,99,101,115,115,32,61,32,104,97,115,83,117,99,99,101,115,115,67,97,108,108,98,97,99,107,32,63,32,108,97,115,116,65,114,103,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,111,110,70,97,105,108,32,61,32,104,97,115,69,114,114,111,114,67,97,108,108,98,97,99,107,32,63,32,115,101,99,111,110,100,76,97,115,116,65,114,103,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,99,97,108,108,98,97,99,107,67,111,117,110,116,32,61,32,104,97,115,83,117,99,99,101,115,115,67,97,108,108,98,97,99,107,32,43,32,104,97,115,69,114,114,111,114,67,97,108,108,98,97,99,107,59,10,32,32,32,32,32,32,118,97,114,32,97,114,103,118,32,61,32,97,114,103,115,46,115,108,105,99,101,40,48,44,32,97,114,103,115,46,108,101,110,103,116,104,32,45,32,99,97,108,108,98,97,99,107,67,111,117,110,116,41,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,101,110,113,117,101,117,101,78,97,116,105,118,101,67,97,108,108,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,97,114,103,118,44,32,111,110,70,97,105,108,44,32,111,110,83,117,99,99,101,115,115,41,59,10,32,32,32,32,125,59,10,32,32,125,10,32,32,102,110,46,116,121,112,101,32,61,32,116,121,112,101,59,10,32,32,114,101,116,117,114,110,32,102,110,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,32,61,32,123,10,32,32,85,73,77,97,110,97,103,101,114,58,32,123,10,32,32,32,32,68,105,109,101,110,115,105,111,110,115,58,32,123,10,32,32,32,32,32,32,119,105,110,100,111,119,58,32,123,125,10,32,32,32,32,125,10,32,32,125,10,125,59,10,105,102,32,40,116,121,112,101,111,102,32,110,97,116,105,118,101,77,111,100,117,108,101,80,114,111,120,121,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,32,61,32,110,97,116,105,118,101,77,111,100,117,108,101,80,114,111,120,121,59,10,125,32,101,108,115,101,32,123,10,32,32,118,97,114,32,98,114,105,100,103,101,67,111,110,102,105,103,32,61,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,67,111,110,102,105,103,59,10,32,32,40,98,114,105,100,103,101,67,111,110,102,105,103,32,38,38,32,98,114,105,100,103,101,67,111,110,102,105,103,46,114,101,109,111,116,101,77,111,100,117,108,101,67,111,110,102,105,103,32,124,124,32,91,93,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,32,123,10,32,32,32,32,118,97,114,32,105,110,102,111,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,59,10,32,32,32,32,105,102,32,40,33,105,110,102,111,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,105,110,102,111,46,109,111,100,117,108,101,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,105,110,102,111,46,110,97,109,101,93,32,61,32,105,110,102,111,46,109,111,100,117,108,101,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,100,101,102,105,110,101,76,97,122,121,79,98,106,101,99,116,80,114,111,112,101,114,116,121,40,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,44,32,105,110,102,111,46,110,97,109,101,44,32,123,10,32,32,32,32,32,32,32,32,103,101,116,58,32,102,117,110,99,116,105,111,110,32,103,101,116,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,95,95,71,76,79,66,65,76,95,95,46,108,111,97,100,77,111,100,117,108,101,40,105,110,102,111,46,110,97,109,101,44,32,109,111,100,117,108,101,73,68,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,41,59,10,125,125,41,59,0 }; // NOLINT - const uint8_t k_native2js[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,97,114,114,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,97,114,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,32,123,32,105,102,32,40,33,111,41,32,114,101,116,117,114,110,59,32,105,102,32,40,116,121,112,101,111,102,32,111,32,61,61,61,32,34,115,116,114,105,110,103,34,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,59,32,118,97,114,32,110,32,61,32,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,111,41,46,115,108,105,99,101,40,56,44,32,45,49,41,59,32,105,102,32,40,110,32,61,61,61,32,34,79,98,106,101,99,116,34,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,41,32,110,32,61,32,111,46,99,111,110,115,116,114,117,99,116,111,114,46,110,97,109,101,59,32,105,102,32,40,110,32,61,61,61,32,34,77,97,112,34,32,124,124,32,110,32,61,61,61,32,34,83,101,116,34,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,111,41,59,32,105,102,32,40,110,32,61,61,61,32,34,65,114,103,117,109,101,110,116,115,34,32,124,124,32,47,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,47,46,116,101,115,116,40,110,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,111,44,32,109,105,110,76,101,110,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,105,116,101,114,41,32,123,32,105,102,32,40,116,121,112,101,111,102,32,83,121,109,98,111,108,32,33,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,38,38,32,105,116,101,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,33,61,32,110,117,108,108,32,124,124,32,105,116,101,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,32,33,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,105,116,101,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,97,114,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,97,114,114,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,97,114,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,97,114,114,44,32,108,101,110,41,32,123,32,105,102,32,40,108,101,110,32,61,61,32,110,117,108,108,32,124,124,32,108,101,110,32,62,32,97,114,114,46,108,101,110,103,116,104,41,32,108,101,110,32,61,32,97,114,114,46,108,101,110,103,116,104,59,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,44,32,97,114,114,50,32,61,32,110,101,119,32,65,114,114,97,121,40,108,101,110,41,59,32,105,32,60,32,108,101,110,59,32,105,43,43,41,32,97,114,114,50,91,105,93,32,61,32,97,114,114,91,105,93,59,32,114,101,116,117,114,110,32,97,114,114,50,59,32,125,10,103,108,111,98,97,108,46,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,32,61,32,123,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,102,108,117,115,104,101,100,81,117,101,117,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,118,97,114,32,113,117,101,117,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,32,61,32,91,91,93,44,32,91,93,44,32,91,93,44,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,93,59,10,32,32,114,101,116,117,114,110,32,113,117,101,117,101,91,48,93,46,108,101,110,103,116,104,32,63,32,113,117,101,117,101,32,58,32,110,117,108,108,59,10,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,105,110,118,111,107,101,67,97,108,108,98,97,99,107,65,110,100,82,101,116,117,114,110,70,108,117,115,104,101,100,81,117,101,117,101,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,73,68,44,32,97,114,103,115,41,32,123,10,32,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,95,95,105,110,118,111,107,101,67,97,108,108,98,97,99,107,40,99,98,73,68,44,32,97,114,103,115,41,59,10,32,32,114,101,116,117,114,110,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,102,108,117,115,104,101,100,81,117,101,117,101,40,41,59,10,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,95,95,105,110,118,111,107,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,73,68,44,32,97,114,103,115,41,32,123,10,32,32,118,97,114,32,99,97,108,108,98,97,99,107,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,99,98,73,68,93,59,10,32,32,105,102,32,40,33,99,97,108,108,98,97,99,107,41,32,114,101,116,117,114,110,59,10,32,32,105,102,32,40,33,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,91,99,98,73,68,32,38,32,126,49,93,32,38,38,32,33,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,91,99,98,73,68,32,124,32,49,93,41,32,123,10,32,32,32,32,100,101,108,101,116,101,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,99,98,73,68,32,38,32,126,49,93,59,10,32,32,32,32,100,101,108,101,116,101,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,99,98,73,68,32,124,32,49,93,59,10,32,32,125,10,32,32,105,102,32,40,97,114,103,115,32,38,38,32,97,114,103,115,46,108,101,110,103,116,104,32,62,32,49,32,38,38,32,40,97,114,103,115,91,48,93,32,61,61,61,32,110,117,108,108,32,124,124,32,97,114,103,115,91,48,93,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,41,32,123,10,32,32,32,32,97,114,103,115,46,115,112,108,105,99,101,40,48,44,32,49,41,59,10,32,32,125,10,32,32,99,97,108,108,98,97,99,107,46,97,112,112,108,121,40,118,111,105,100,32,48,44,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,97,114,103,115,41,41,59,10,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,99,97,108,108,70,117,110,99,116,105,111,110,82,101,116,117,114,110,70,108,117,115,104,101,100,81,117,101,117,101,32,61,32,102,117,110,99,116,105,111,110,32,40,109,111,100,117,108,101,44,32,109,101,116,104,111,100,44,32,97,114,103,115,41,32,123,10,32,32,105,102,32,40,109,111,100,117,108,101,32,61,61,61,32,39,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,39,32,124,124,32,109,111,100,117,108,101,32,61,61,61,32,39,68,105,109,101,110,115,105,111,110,115,39,41,32,123,10,32,32,32,32,118,97,114,32,116,97,114,103,101,116,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,106,115,77,111,100,117,108,101,76,105,115,116,91,109,111,100,117,108,101,93,59,10,32,32,32,32,105,102,32,40,33,116,97,114,103,101,116,77,111,100,117,108,101,32,124,124,32,33,116,97,114,103,101,116,77,111,100,117,108,101,91,109,101,116,104,111,100,93,32,124,124,32,116,121,112,101,111,102,32,116,97,114,103,101,116,77,111,100,117,108,101,91,109,101,116,104,111,100,93,32,33,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,116,97,114,103,101,116,77,111,100,117,108,101,91,109,101,116,104,111,100,93,46,99,97,108,108,40,116,97,114,103,101,116,77,111,100,117,108,101,44,32,97,114,103,115,91,49,93,46,112,97,114,97,109,115,41,59,10,32,32,32,32,125,10,32,32,125,32,101,108,115,101,32,105,102,32,40,109,111,100,117,108,101,32,61,61,61,32,39,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,39,41,32,123,10,32,32,32,32,105,102,32,40,109,101,116,104,111,100,32,61,61,61,32,39,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,39,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,116,114,117,101,59,10,32,32,32,32,32,32,118,97,114,32,102,114,97,109,101,73,100,32,61,32,97,114,103,115,91,48,93,59,10,32,32,32,32,32,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,102,114,97,109,101,73,100,93,41,32,123,10,32,32,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,102,114,97,109,101,73,100,93,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,99,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,99,98,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,99,98,40,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,102,114,97,109,101,73,100,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,10,32,32,114,101,116,117,114,110,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,102,108,117,115,104,101,100,81,117,101,117,101,40,41,59,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_Event[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,103,108,111,98,97,108,46,72,105,112,112,121,68,101,97,108,108,111,99,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,105,102,32,40,103,108,111,98,97,108,46,72,105,112,112,121,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,72,105,112,112,121,46,101,109,105,116,40,39,100,101,97,108,108,111,99,39,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,95,95,108,111,97,100,73,110,115,116,97,110,99,101,95,95,32,61,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,10,32,32,118,97,114,32,95,114,101,102,32,61,32,111,98,106,32,124,124,32,123,125,44,10,32,32,32,32,110,97,109,101,32,61,32,95,114,101,102,46,110,97,109,101,44,10,32,32,32,32,105,100,32,61,32,95,114,101,102,46,105,100,44,10,32,32,32,32,95,114,101,102,36,112,97,114,97,109,115,32,61,32,95,114,101,102,46,112,97,114,97,109,115,44,10,32,32,32,32,112,97,114,97,109,115,32,61,32,95,114,101,102,36,112,97,114,97,109,115,32,61,61,61,32,118,111,105,100,32,48,32,63,32,123,125,32,58,32,95,114,101,102,36,112,97,114,97,109,115,59,10,32,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,110,97,109,101,93,41,32,123,10,32,32,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,112,97,114,97,109,115,44,32,123,10,32,32,32,32,32,32,95,95,105,110,115,116,97,110,99,101,78,97,109,101,95,95,58,32,110,97,109,101,44,10,32,32,32,32,32,32,95,95,105,110,115,116,97,110,99,101,73,100,95,95,58,32,105,100,10,32,32,32,32,125,41,59,10,32,32,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,110,97,109,101,93,44,32,123,10,32,32,32,32,32,32,105,100,58,32,105,100,44,10,32,32,32,32,32,32,115,117,112,101,114,80,114,111,112,115,58,32,112,97,114,97,109,115,10,32,32,32,32,125,41,59,10,32,32,32,32,118,97,114,32,69,118,101,110,116,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,106,115,77,111,100,117,108,101,76,105,115,116,46,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,59,10,32,32,32,32,105,102,32,40,69,118,101,110,116,77,111,100,117,108,101,32,38,38,32,116,121,112,101,111,102,32,69,118,101,110,116,77,111,100,117,108,101,46,114,101,99,101,105,118,101,78,97,116,105,118,101,69,118,101,110,116,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,69,118,101,110,116,77,111,100,117,108,101,46,114,101,99,101,105,118,101,78,97,116,105,118,101,69,118,101,110,116,40,91,39,64,104,112,58,108,111,97,100,73,110,115,116,97,110,99,101,39,44,32,112,97,114,97,109,115,93,41,59,10,32,32,32,32,125,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,110,97,109,101,93,46,114,117,110,40,112,97,114,97,109,115,41,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,34,108,111,97,100,32,105,110,115,116,97,110,99,101,32,101,114,114,111,114,58,32,91,34,46,99,111,110,99,97,116,40,110,97,109,101,44,32,34,93,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,32,105,110,32,106,115,34,41,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,95,95,117,110,108,111,97,100,73,110,115,116,97,110,99,101,95,95,32,61,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,10,32,32,118,97,114,32,95,114,101,102,50,32,61,32,111,98,106,32,124,124,32,123,125,44,10,32,32,32,32,105,100,32,61,32,95,114,101,102,50,46,105,100,59,10,32,32,103,108,111,98,97,108,46,72,105,112,112,121,46,101,109,105,116,40,39,100,101,115,116,114,111,121,73,110,115,116,97,110,99,101,39,44,32,105,100,41,59,10,32,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,40,39,82,111,111,116,86,105,101,119,77,97,110,97,103,101,114,39,44,32,39,114,101,109,111,118,101,82,111,111,116,86,105,101,119,39,44,32,105,100,41,59,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_AnimationFrameModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,39,41,59,10,103,108,111,98,97,108,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,41,32,123,10,32,32,105,102,32,40,99,98,41,32,123,10,32,32,32,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,102,97,108,115,101,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,43,61,32,49,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,32,61,32,91,93,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,46,112,117,115,104,40,99,98,41,59,10,32,32,32,32,32,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,41,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,46,112,117,115,104,40,99,98,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,39,39,59,10,32,32,125,10,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,115,39,41,59,10,125,59,10,103,108,111,98,97,108,46,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,67,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,41,59,10,125,59,125,41,59,0 }; // NOLINT - const uint8_t k_Turbo[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,116,117,114,98,111,80,114,111,109,105,115,101,40,102,117,110,99,41,32,123,10,32,32,114,101,116,117,114,110,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,118,97,114,32,95,116,104,105,115,32,61,32,116,104,105,115,59,10,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,118,97,114,32,115,117,99,99,101,115,115,67,97,108,108,98,97,99,107,73,100,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,115,117,99,99,101,115,115,67,97,108,108,98,97,99,107,73,100,93,32,61,32,102,117,110,99,116,105,111,110,32,40,100,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,97,116,97,41,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,32,32,32,32,118,97,114,32,102,97,105,108,67,97,108,108,98,97,99,107,73,100,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,102,97,105,108,67,97,108,108,98,97,99,107,73,100,93,32,61,32,102,117,110,99,116,105,111,110,32,40,101,114,114,111,114,68,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,114,114,111,114,68,97,116,97,41,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,32,32,32,32,102,117,110,99,46,97,112,112,108,121,40,95,116,104,105,115,44,32,91,93,46,99,111,110,99,97,116,40,97,114,103,115,44,32,91,115,117,99,99,101,115,115,67,97,108,108,98,97,99,107,73,100,44,32,102,97,105,108,67,97,108,108,98,97,99,107,73,100,93,41,41,59,10,32,32,32,32,125,41,59,10,32,32,125,59,10,125,10,72,105,112,112,121,46,116,117,114,98,111,80,114,111,109,105,115,101,32,61,32,116,117,114,98,111,80,114,111,109,105,115,101,59,125,41,59,0 }; // NOLINT -} // namespace - -namespace hippy { -inline namespace driver { - -const NativeSourceCode GetNativeSourceCode(const std::string& filename) { - const std::unordered_map global_base_js_source_map{ - {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT - {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT - {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT - {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT - {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT - {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT - {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT - {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT - {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT - {"promise.js", {k_promise, ARRAY_SIZE(k_promise) - 1}}, // NOLINT - {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT - {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT - {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT - {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT - {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT - {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT - {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT - {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT - {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT - {"Turbo.js", {k_Turbo, ARRAY_SIZE(k_Turbo) - 1}}, // NOLINT - }; - const auto it = global_base_js_source_map.find(filename); - return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; -} - -} // namespace driver -} // namespace hippy diff --git a/driver/js/src/vm/jsc/native_source_code_jsc.cc b/driver/js/src/vm/jsc/native_source_code_jsc.cc new file mode 100644 index 00000000000..fe13e534458 --- /dev/null +++ b/driver/js/src/vm/jsc/native_source_code_jsc.cc @@ -0,0 +1,87 @@ +/* + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2017-2024 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "driver/vm/native_source_code.h" +#include "footstone/macros.h" +#include "driver/vm/jsc/native_source_code_jsc.h" + + +namespace { + const uint8_t k_bootstrap[] = { 34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,97,44,32,110,41,32,123,32,105,102,32,40,33,40,97,32,105,110,115,116,97,110,99,101,111,102,32,110,41,41,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,44,32,114,41,32,123,32,102,111,114,32,40,118,97,114,32,116,32,61,32,48,59,32,116,32,60,32,114,46,108,101,110,103,116,104,59,32,116,43,43,41,32,123,32,118,97,114,32,111,32,61,32,114,91,116,93,59,32,111,46,101,110,117,109,101,114,97,98,108,101,32,61,32,111,46,101,110,117,109,101,114,97,98,108,101,32,124,124,32,33,49,44,32,111,46,99,111,110,102,105,103,117,114,97,98,108,101,32,61,32,33,48,44,32,34,118,97,108,117,101,34,32,105,110,32,111,32,38,38,32,40,111,46,119,114,105,116,97,98,108,101,32,61,32,33,48,41,44,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,111,46,107,101,121,41,44,32,111,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,99,114,101,97,116,101,67,108,97,115,115,40,101,44,32,114,44,32,116,41,32,123,32,114,101,116,117,114,110,32,114,32,38,38,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,46,112,114,111,116,111,116,121,112,101,44,32,114,41,44,32,116,32,38,38,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,44,32,116,41,44,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,34,112,114,111,116,111,116,121,112,101,34,44,32,123,32,119,114,105,116,97,98,108,101,58,32,33,49,32,125,41,44,32,101,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,116,41,32,123,32,118,97,114,32,105,32,61,32,95,116,111,80,114,105,109,105,116,105,118,101,40,116,44,32,34,115,116,114,105,110,103,34,41,59,32,114,101,116,117,114,110,32,34,115,121,109,98,111,108,34,32,61,61,32,95,116,121,112,101,111,102,40,105,41,32,63,32,105,32,58,32,105,32,43,32,34,34,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,105,109,105,116,105,118,101,40,116,44,32,114,41,32,123,32,105,102,32,40,34,111,98,106,101,99,116,34,32,33,61,32,95,116,121,112,101,111,102,40,116,41,32,124,124,32,33,116,41,32,114,101,116,117,114,110,32,116,59,32,118,97,114,32,101,32,61,32,116,91,83,121,109,98,111,108,46,116,111,80,114,105,109,105,116,105,118,101,93,59,32,105,102,32,40,118,111,105,100,32,48,32,33,61,61,32,101,41,32,123,32,118,97,114,32,105,32,61,32,101,46,99,97,108,108,40,116,44,32,114,32,124,124,32,34,100,101,102,97,117,108,116,34,41,59,32,105,102,32,40,34,111,98,106,101,99,116,34,32,33,61,32,95,116,121,112,101,111,102,40,105,41,41,32,114,101,116,117,114,110,32,105,59,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,34,41,59,32,125,32,114,101,116,117,114,110,32,40,34,115,116,114,105,110,103,34,32,61,61,61,32,114,32,63,32,83,116,114,105,110,103,32,58,32,78,117,109,98,101,114,41,40,116,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,111,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,59,32,125,44,32,95,116,121,112,101,111,102,40,111,41,59,32,125,10,40,102,117,110,99,116,105,111,110,32,40,103,101,116,73,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,10,32,32,103,108,111,98,97,108,46,72,105,112,112,121,32,61,32,103,108,111,98,97,108,46,72,105,112,112,121,32,124,124,32,123,125,59,10,32,32,118,97,114,32,98,105,110,100,105,110,103,79,98,106,32,61,32,123,125,59,10,32,32,118,97,114,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,32,61,32,102,117,110,99,116,105,111,110,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,109,111,100,117,108,101,41,32,123,10,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,98,105,110,100,105,110,103,79,98,106,91,109,111,100,117,108,101,93,41,32,33,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,32,32,98,105,110,100,105,110,103,79,98,106,91,109,111,100,117,108,101,93,32,61,32,103,101,116,73,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,109,111,100,117,108,101,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,98,105,110,100,105,110,103,79,98,106,91,109,111,100,117,108,101,93,59,10,32,32,125,59,10,32,32,118,97,114,32,67,111,110,116,101,120,116,105,102,121,83,99,114,105,112,116,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,39,41,59,10,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,102,117,110,99,116,105,111,110,32,78,97,116,105,118,101,77,111,100,117,108,101,40,102,105,108,101,110,97,109,101,41,32,123,10,32,32,32,32,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,78,97,116,105,118,101,77,111,100,117,108,101,41,59,10,32,32,32,32,32,32,116,104,105,115,46,102,105,108,101,110,97,109,101,32,61,32,102,105,108,101,110,97,109,101,59,10,32,32,32,32,32,32,116,104,105,115,46,101,120,112,111,114,116,115,32,61,32,123,125,59,10,32,32,32,32,125,10,32,32,32,32,95,99,114,101,97,116,101,67,108,97,115,115,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,91,123,10,32,32,32,32,32,32,107,101,121,58,32,34,99,111,109,112,105,108,101,34,44,10,32,32,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,99,111,109,112,105,108,101,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,102,110,32,61,32,67,111,110,116,101,120,116,105,102,121,83,99,114,105,112,116,46,82,117,110,73,110,84,104,105,115,67,111,110,116,101,120,116,40,116,104,105,115,46,102,105,108,101,110,97,109,101,41,59,10,32,32,32,32,32,32,32,32,102,110,40,116,104,105,115,46,101,120,112,111,114,116,115,44,32,78,97,116,105,118,101,77,111,100,117,108,101,46,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,44,32,123,10,32,32,32,32,32,32,107,101,121,58,32,34,99,97,99,104,101,34,44,10,32,32,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,99,97,99,104,101,40,41,32,123,10,32,32,32,32,32,32,32,32,78,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,91,116,104,105,115,46,102,105,108,101,110,97,109,101,93,32,61,32,116,104,105,115,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,93,44,32,91,123,10,32,32,32,32,32,32,107,101,121,58,32,34,114,101,113,117,105,114,101,34,44,10,32,32,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,114,101,113,117,105,114,101,40,102,105,108,101,80,97,116,104,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,102,105,108,101,80,97,116,104,65,114,114,32,61,32,102,105,108,101,80,97,116,104,46,115,112,108,105,116,40,39,47,39,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,102,105,108,101,110,97,109,101,32,61,32,102,105,108,101,80,97,116,104,65,114,114,91,102,105,108,101,80,97,116,104,65,114,114,46,108,101,110,103,116,104,32,45,32,49,93,59,10,32,32,32,32,32,32,32,32,118,97,114,32,99,97,99,104,101,100,32,61,32,78,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,91,102,105,108,101,110,97,109,101,93,59,10,32,32,32,32,32,32,32,32,105,102,32,40,99,97,99,104,101,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,97,99,104,101,100,46,101,120,112,111,114,116,115,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,118,97,114,32,110,97,116,105,118,101,77,111,100,117,108,101,32,61,32,110,101,119,32,78,97,116,105,118,101,77,111,100,117,108,101,40,102,105,108,101,110,97,109,101,41,59,10,32,32,32,32,32,32,32,32,110,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,40,41,59,10,32,32,32,32,32,32,32,32,110,97,116,105,118,101,77,111,100,117,108,101,46,99,111,109,112,105,108,101,40,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,97,116,105,118,101,77,111,100,117,108,101,46,101,120,112,111,114,116,115,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,93,41,59,10,32,32,32,32,114,101,116,117,114,110,32,78,97,116,105,118,101,77,111,100,117,108,101,59,10,32,32,125,40,41,59,10,32,32,78,97,116,105,118,101,77,111,100,117,108,101,46,99,97,99,104,101,32,61,32,123,125,59,10,32,32,78,97,116,105,118,101,77,111,100,117,108,101,46,114,101,113,117,105,114,101,40,39,104,105,112,112,121,46,106,115,39,41,59,10,125,41,59,0 }; // NOLINT + const uint8_t k_hippy[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,79,116,104,101,114,115,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,68,121,110,97,109,105,99,76,111,97,100,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,80,108,97,116,102,111,114,109,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,98,114,105,100,103,101,47,105,111,115,47,106,115,50,110,97,116,105,118,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,84,105,109,101,114,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,112,114,111,109,105,115,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,67,111,110,115,111,108,101,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,78,101,116,119,111,114,107,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,83,116,111,114,97,103,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,68,105,109,101,110,115,105,111,110,115,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,85,116,105,108,115,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,103,108,111,98,97,108,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,98,114,105,100,103,101,47,105,111,115,47,110,97,116,105,118,101,50,106,115,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,69,118,101,110,116,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,106,115,39,41,59,10,114,101,113,117,105,114,101,40,39,46,46,47,46,46,47,103,108,111,98,97,108,47,105,111,115,47,84,117,114,98,111,46,106,115,39,41,59,10,103,108,111,98,97,108,46,108,111,99,97,108,83,116,111,114,97,103,101,32,61,32,72,105,112,112,121,46,97,115,121,110,99,83,116,111,114,97,103,101,59,10,103,108,111,98,97,108,46,116,117,114,98,111,80,114,111,109,105,115,101,32,61,32,72,105,112,112,121,46,116,117,114,98,111,80,114,111,109,105,115,101,59,125,41,59,0 }; // NOLINT + const uint8_t k_ExceptionHandle[] = { 34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,40,102,117,110,99,116,105,111,110,32,101,120,99,101,112,116,105,111,110,72,97,110,100,108,101,114,40,101,118,101,110,116,78,97,109,101,44,32,101,120,99,101,112,116,105,111,110,41,32,123,10,32,32,105,102,32,40,103,108,111,98,97,108,46,72,105,112,112,121,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,72,105,112,112,121,46,101,109,105,116,40,101,118,101,110,116,78,97,109,101,44,32,101,120,99,101,112,116,105,111,110,41,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,101,118,101,110,116,78,97,109,101,44,32,101,120,99,101,112,116,105,111,110,41,59,10,32,32,125,10,125,41,59,0 }; // NOLINT + const uint8_t k_Others[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,111,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,59,32,125,44,32,95,116,121,112,101,111,102,40,111,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,44,32,114,41,32,123,32,102,111,114,32,40,118,97,114,32,116,32,61,32,48,59,32,116,32,60,32,114,46,108,101,110,103,116,104,59,32,116,43,43,41,32,123,32,118,97,114,32,111,32,61,32,114,91,116,93,59,32,111,46,101,110,117,109,101,114,97,98,108,101,32,61,32,111,46,101,110,117,109,101,114,97,98,108,101,32,124,124,32,33,49,44,32,111,46,99,111,110,102,105,103,117,114,97,98,108,101,32,61,32,33,48,44,32,34,118,97,108,117,101,34,32,105,110,32,111,32,38,38,32,40,111,46,119,114,105,116,97,98,108,101,32,61,32,33,48,41,44,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,111,46,107,101,121,41,44,32,111,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,99,114,101,97,116,101,67,108,97,115,115,40,101,44,32,114,44,32,116,41,32,123,32,114,101,116,117,114,110,32,114,32,38,38,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,46,112,114,111,116,111,116,121,112,101,44,32,114,41,44,32,116,32,38,38,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,44,32,116,41,44,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,34,112,114,111,116,111,116,121,112,101,34,44,32,123,32,119,114,105,116,97,98,108,101,58,32,33,49,32,125,41,44,32,101,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,116,41,32,123,32,118,97,114,32,105,32,61,32,95,116,111,80,114,105,109,105,116,105,118,101,40,116,44,32,34,115,116,114,105,110,103,34,41,59,32,114,101,116,117,114,110,32,34,115,121,109,98,111,108,34,32,61,61,32,95,116,121,112,101,111,102,40,105,41,32,63,32,105,32,58,32,105,32,43,32,34,34,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,105,109,105,116,105,118,101,40,116,44,32,114,41,32,123,32,105,102,32,40,34,111,98,106,101,99,116,34,32,33,61,32,95,116,121,112,101,111,102,40,116,41,32,124,124,32,33,116,41,32,114,101,116,117,114,110,32,116,59,32,118,97,114,32,101,32,61,32,116,91,83,121,109,98,111,108,46,116,111,80,114,105,109,105,116,105,118,101,93,59,32,105,102,32,40,118,111,105,100,32,48,32,33,61,61,32,101,41,32,123,32,118,97,114,32,105,32,61,32,101,46,99,97,108,108,40,116,44,32,114,32,124,124,32,34,100,101,102,97,117,108,116,34,41,59,32,105,102,32,40,34,111,98,106,101,99,116,34,32,33,61,32,95,116,121,112,101,111,102,40,105,41,41,32,114,101,116,117,114,110,32,105,59,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,34,41,59,32,125,32,114,101,116,117,114,110,32,40,34,115,116,114,105,110,103,34,32,61,61,61,32,114,32,63,32,83,116,114,105,110,103,32,58,32,78,117,109,98,101,114,41,40,116,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,97,44,32,110,41,32,123,32,105,102,32,40,33,40,97,32,105,110,115,116,97,110,99,101,111,102,32,110,41,41,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,34,41,59,32,125,10,103,108,111,98,97,108,46,95,95,73,83,72,73,80,80,89,95,95,32,61,32,116,114,117,101,59,10,103,108,111,98,97,108,46,95,95,71,76,79,66,65,76,95,95,32,61,32,123,10,32,32,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,58,32,123,125,10,125,59,10,118,97,114,32,69,114,114,111,114,69,118,101,110,116,32,61,32,95,99,114,101,97,116,101,67,108,97,115,115,40,102,117,110,99,116,105,111,110,32,69,114,114,111,114,69,118,101,110,116,40,109,101,115,115,97,103,101,44,32,102,105,108,101,110,97,109,101,44,32,108,105,110,101,110,111,44,32,99,111,108,110,111,44,32,101,114,114,111,114,41,32,123,10,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,69,114,114,111,114,69,118,101,110,116,41,59,10,32,32,116,104,105,115,46,109,101,115,115,97,103,101,32,61,32,109,101,115,115,97,103,101,59,10,32,32,116,104,105,115,46,102,105,108,101,110,97,109,101,32,61,32,102,105,108,101,110,97,109,101,59,10,32,32,116,104,105,115,46,108,105,110,101,110,111,32,61,32,108,105,110,101,110,111,59,10,32,32,116,104,105,115,46,99,111,108,110,111,32,61,32,99,111,108,110,111,59,10,32,32,116,104,105,115,46,101,114,114,111,114,32,61,32,101,114,114,111,114,59,10,125,41,59,10,102,117,110,99,116,105,111,110,32,104,105,112,112,121,82,101,103,105,115,116,101,114,40,97,112,112,78,97,109,101,44,32,101,110,116,114,121,70,117,110,99,41,32,123,10,32,32,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,97,112,112,78,97,109,101,93,32,61,32,123,10,32,32,32,32,114,117,110,58,32,101,110,116,114,121,70,117,110,99,10,32,32,125,59,10,125,10,102,117,110,99,116,105,111,110,32,111,110,40,101,118,101,110,116,78,97,109,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,101,118,101,110,116,78,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,32,124,124,32,116,121,112,101,111,102,32,108,105,115,116,101,110,101,114,32,33,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,111,110,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,32,97,110,100,32,97,32,102,117,110,99,116,105,111,110,32,97,115,32,108,105,115,116,101,110,101,114,39,41,59,10,32,32,125,10,32,32,118,97,114,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,105,102,32,40,33,40,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,105,110,115,116,97,110,99,101,111,102,32,83,101,116,41,41,32,123,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,32,61,32,110,101,119,32,83,101,116,40,41,59,10,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,125,10,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,97,100,100,40,108,105,115,116,101,110,101,114,41,59,10,32,32,114,101,116,117,114,110,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,59,10,125,10,102,117,110,99,116,105,111,110,32,111,102,102,40,101,118,101,110,116,78,97,109,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,101,118,101,110,116,78,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,111,102,102,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,39,41,59,10,32,32,125,10,32,32,118,97,114,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,105,102,32,40,33,40,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,105,110,115,116,97,110,99,101,111,102,32,83,101,116,41,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,105,102,32,40,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,100,101,108,101,116,101,40,108,105,115,116,101,110,101,114,41,59,10,32,32,32,32,114,101,116,117,114,110,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,59,10,32,32,125,10,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,99,108,101,97,114,40,41,59,10,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,125,10,102,117,110,99,116,105,111,110,32,101,109,105,116,40,101,118,101,110,116,78,97,109,101,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,32,62,32,49,32,63,32,95,108,101,110,32,45,32,49,32,58,32,48,41,44,32,95,107,101,121,32,61,32,49,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,97,114,103,115,91,95,107,101,121,32,45,32,49,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,125,10,32,32,105,102,32,40,116,121,112,101,111,102,32,101,118,101,110,116,78,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,101,109,105,116,40,41,32,111,110,108,121,32,97,99,99,101,112,116,32,97,32,115,116,114,105,110,103,32,97,115,32,101,118,101,110,116,32,110,97,109,101,39,41,59,10,32,32,125,10,32,32,118,97,114,32,105,115,69,114,114,32,61,32,101,118,101,110,116,78,97,109,101,32,61,61,61,32,39,101,114,114,111,114,39,59,10,32,32,118,97,114,32,101,114,114,79,98,106,32,61,32,110,101,119,32,69,114,114,111,114,40,41,59,10,32,32,105,102,32,40,105,115,69,114,114,41,32,123,10,32,32,32,32,118,97,114,32,97,114,114,32,61,32,97,114,103,115,91,48,93,59,10,32,32,32,32,105,102,32,40,33,40,97,114,114,32,105,110,115,116,97,110,99,101,111,102,32,65,114,114,97,121,41,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,109,117,115,116,32,98,101,32,97,114,114,97,121,39,41,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,97,114,114,46,108,101,110,103,116,104,32,33,61,61,32,53,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,72,105,112,112,121,46,101,109,105,116,40,41,32,101,114,114,111,114,32,101,118,101,110,116,44,32,97,114,103,115,48,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,53,39,41,59,10,32,32,32,32,125,10,32,32,32,32,101,114,114,79,98,106,46,109,101,115,115,97,103,101,32,61,32,74,83,79,78,46,115,116,114,105,110,103,105,102,121,40,97,114,114,91,52,93,41,59,10,32,32,32,32,105,102,32,40,72,105,112,112,121,46,111,110,101,114,114,111,114,41,32,123,10,32,32,32,32,32,32,72,105,112,112,121,46,111,110,101,114,114,111,114,40,97,114,114,91,48,93,44,32,97,114,114,91,49,93,44,32,97,114,114,91,50,93,44,32,97,114,114,91,51,93,44,32,101,114,114,79,98,106,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,118,97,114,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,108,111,98,97,108,69,118,101,110,116,72,97,110,100,108,101,91,101,118,101,110,116,78,97,109,101,93,59,10,32,32,105,102,32,40,33,101,118,101,110,116,76,105,115,116,101,110,101,114,115,41,32,123,10,32,32,32,32,105,102,32,40,97,114,103,115,91,48,93,41,32,123,10,32,32,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,97,114,103,115,91,48,93,46,116,111,83,116,114,105,110,103,40,41,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,59,10,32,32,125,10,32,32,116,114,121,32,123,10,32,32,32,32,105,102,32,40,105,115,69,114,114,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,114,114,32,61,32,97,114,103,115,91,48,93,59,10,32,32,32,32,32,32,118,97,114,32,101,118,101,110,116,32,61,32,110,101,119,32,69,114,114,111,114,69,118,101,110,116,40,95,97,114,114,91,48,93,44,32,95,97,114,114,91,49,93,44,32,95,97,114,114,91,50,93,44,32,95,97,114,114,91,51,93,44,32,101,114,114,79,98,106,41,59,10,32,32,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,105,115,116,101,110,101,114,40,101,118,101,110,116,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,105,115,116,101,110,101,114,46,97,112,112,108,121,40,118,111,105,100,32,48,44,32,97,114,103,115,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,32,99,97,116,99,104,32,40,101,114,114,41,32,123,10,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,101,114,114,41,59,10,32,32,125,10,125,10,72,105,112,112,121,46,100,101,118,105,99,101,32,61,32,123,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,32,61,32,123,125,59,10,72,105,112,112,121,46,114,101,103,105,115,116,101,114,32,61,32,123,10,32,32,114,101,103,105,115,116,58,32,104,105,112,112,121,82,101,103,105,115,116,101,114,10,125,59,10,72,105,112,112,121,46,111,110,32,61,32,111,110,59,10,72,105,112,112,121,46,111,102,102,32,61,32,111,102,102,59,10,72,105,112,112,121,46,101,109,105,116,32,61,32,101,109,105,116,59,10,72,105,112,112,121,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,32,61,32,111,110,59,10,72,105,112,112,121,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,32,61,32,111,102,102,59,10,72,105,112,112,121,46,111,110,101,114,114,111,114,32,61,32,117,110,100,101,102,105,110,101,100,59,125,41,59,0 }; // NOLINT + const uint8_t k_DynamicLoad[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,39,41,59,10,103,108,111,98,97,108,46,100,121,110,97,109,105,99,76,111,97,100,32,61,32,102,117,110,99,116,105,111,110,32,40,112,97,116,104,44,32,101,110,99,111,100,101,44,32,99,98,41,32,123,10,32,32,118,97,114,32,114,101,113,117,101,115,116,80,97,116,104,32,61,32,112,97,116,104,32,124,124,32,39,39,59,10,32,32,118,97,114,32,105,115,83,99,104,101,109,97,32,61,32,47,94,40,46,43,58,92,47,92,47,41,124,94,40,92,47,92,47,41,47,46,116,101,115,116,40,112,97,116,104,41,59,10,32,32,105,102,32,40,33,105,115,83,99,104,101,109,97,41,32,123,10,32,32,32,32,114,101,113,117,101,115,116,80,97,116,104,32,61,32,103,108,111,98,97,108,46,95,95,72,73,80,80,89,67,85,82,68,73,82,95,95,32,43,32,112,97,116,104,59,10,32,32,125,10,32,32,67,111,110,116,101,120,116,105,102,121,77,111,100,117,108,101,46,76,111,97,100,85,110,116,114,117,115,116,101,100,67,111,110,116,101,110,116,40,114,101,113,117,101,115,116,80,97,116,104,44,32,101,110,99,111,100,101,44,32,99,98,41,59,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_Platform[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,32,61,32,123,125,59,10,105,102,32,40,116,121,112,101,111,102,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,118,97,114,32,76,111,99,97,108,105,122,97,116,105,111,110,32,61,32,123,10,32,32,32,32,99,111,117,110,116,114,121,58,32,39,39,44,10,32,32,32,32,108,97,110,103,117,97,103,101,58,32,39,39,44,10,32,32,32,32,100,105,114,101,99,116,105,111,110,58,32,48,10,32,32,125,59,10,32,32,105,102,32,40,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,41,32,123,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,68,101,118,105,99,101,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,68,101,118,105,99,101,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,86,101,114,115,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,86,101,114,115,105,111,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,83,68,75,86,101,114,115,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,83,68,75,86,101,114,115,105,111,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,76,111,99,97,108,105,122,97,116,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,76,111,99,97,108,105,122,97,116,105,111,110,32,124,124,32,76,111,99,97,108,105,122,97,116,105,111,110,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,79,83,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,65,80,73,76,101,118,101,108,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,65,80,73,76,101,118,101,108,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,83,68,75,86,101,114,115,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,83,68,75,86,101,114,115,105,111,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,76,111,99,97,108,105,122,97,116,105,111,110,32,61,32,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,80,108,97,116,102,111,114,109,46,76,111,99,97,108,105,122,97,116,105,111,110,32,124,124,32,76,111,99,97,108,105,122,97,116,105,111,110,59,10,32,32,125,10,125,125,41,59,0 }; // NOLINT + const uint8_t k_UIManagerModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,39,41,59,10,118,97,114,32,76,97,121,111,117,116,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,76,97,121,111,117,116,77,111,100,117,108,101,39,41,59,10,72,105,112,112,121,46,100,111,99,117,109,101,110,116,32,61,32,123,10,32,32,99,114,101,97,116,101,78,111,100,101,58,32,102,117,110,99,116,105,111,110,32,99,114,101,97,116,101,78,111,100,101,40,41,32,123,125,44,10,32,32,117,112,100,97,116,101,78,111,100,101,58,32,102,117,110,99,116,105,111,110,32,117,112,100,97,116,101,78,111,100,101,40,41,32,123,125,44,10,32,32,100,101,108,101,116,101,78,111,100,101,58,32,102,117,110,99,116,105,111,110,32,100,101,108,101,116,101,78,111,100,101,40,41,32,123,125,44,10,32,32,102,108,117,115,104,66,97,116,99,104,58,32,102,117,110,99,116,105,111,110,32,102,108,117,115,104,66,97,116,99,104,40,41,32,123,125,44,10,32,32,101,110,100,66,97,116,99,104,58,32,102,117,110,99,116,105,111,110,32,101,110,100,66,97,116,99,104,40,41,32,123,125,44,10,32,32,99,97,108,108,85,73,70,117,110,99,116,105,111,110,58,32,102,117,110,99,116,105,111,110,32,99,97,108,108,85,73,70,117,110,99,116,105,111,110,40,105,100,44,32,110,97,109,101,44,32,112,97,114,97,109,44,32,99,98,41,32,123,10,32,32,32,32,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,46,67,97,108,108,85,73,70,117,110,99,116,105,111,110,40,105,100,44,32,110,97,109,101,44,32,112,97,114,97,109,44,32,99,98,41,59,10,32,32,125,44,10,32,32,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,58,32,102,117,110,99,116,105,111,110,32,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,40,41,32,123,10,32,32,32,32,76,97,121,111,117,116,77,111,100,117,108,101,46,82,101,115,101,116,76,97,121,111,117,116,67,97,99,104,101,40,41,59,10,32,32,125,44,10,32,32,115,101,110,100,82,101,110,100,101,114,69,114,114,111,114,58,32,102,117,110,99,116,105,111,110,32,115,101,110,100,82,101,110,100,101,114,69,114,114,111,114,40,101,114,114,111,114,41,32,123,10,32,32,32,32,105,102,32,40,101,114,114,111,114,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,111,114,59,10,32,32,32,32,125,10,32,32,125,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_js2native[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,110,101,101,100,82,101,106,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,110,101,101,100,82,101,106,101,99,116,40,109,111,100,117,108,101,78,97,109,101,44,32,109,101,116,104,111,100,78,97,109,101,41,32,123,10,32,32,114,101,116,117,114,110,32,33,40,109,111,100,117,108,101,78,97,109,101,32,61,61,61,32,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,32,124,124,32,109,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,117,108,116,105,71,101,116,39,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,99,97,108,108,65,114,103,117,109,101,110,116,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,125,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,60,32,50,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,99,97,108,108,78,97,116,105,118,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,39,41,59,10,32,32,125,10,32,32,118,97,114,32,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,48,93,44,10,32,32,32,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,49,93,59,10,32,32,105,102,32,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,32,61,61,61,32,39,85,73,77,97,110,97,103,101,114,77,111,100,117,108,101,39,32,38,38,32,40,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,101,97,115,117,114,101,39,32,124,124,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,101,97,115,117,114,101,73,110,87,105,110,100,111,119,39,32,124,124,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,61,61,32,39,109,101,97,115,117,114,101,73,110,65,112,112,87,105,110,100,111,119,39,41,41,32,123,10,32,32,32,32,118,97,114,32,110,111,100,101,73,100,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,50,93,59,10,32,32,32,32,118,97,114,32,99,97,108,108,98,97,99,107,70,117,110,99,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,51,93,59,10,32,32,32,32,114,101,116,117,114,110,32,103,108,111,98,97,108,46,72,105,112,112,121,46,100,111,99,117,109,101,110,116,46,99,97,108,108,85,73,70,117,110,99,116,105,111,110,40,110,111,100,101,73,100,44,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,44,32,91,93,44,32,99,97,108,108,98,97,99,107,70,117,110,99,41,59,10,32,32,125,10,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,93,59,10,32,32,118,97,114,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,32,61,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,59,10,32,32,105,102,32,40,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,116,121,112,101,111,102,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,118,97,114,32,112,97,114,97,109,76,105,115,116,32,61,32,91,93,59,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,50,59,32,105,32,60,32,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,99,97,108,108,65,114,103,117,109,101,110,116,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,32,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,112,97,114,97,109,76,105,115,116,46,108,101,110,103,116,104,32,63,32,112,97,114,97,109,76,105,115,116,32,58,32,117,110,100,101,102,105,110,101,100,41,59,10,32,32,32,32,114,101,116,117,114,110,59,10,32,32,125,10,32,32,116,104,114,111,119,32,110,101,119,32,82,101,102,101,114,101,110,99,101,69,114,114,111,114,40,34,99,97,108,108,78,97,116,105,118,101,32,78,97,116,105,118,101,32,34,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,44,32,34,46,34,41,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,44,32,34,40,41,32,110,111,116,32,102,111,117,110,100,34,41,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,50,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,99,97,108,108,65,114,103,117,109,101,110,116,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,50,41,44,32,95,107,101,121,50,32,61,32,48,59,32,95,107,101,121,50,32,60,32,95,108,101,110,50,59,32,95,107,101,121,50,43,43,41,32,123,10,32,32,32,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,95,107,101,121,50,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,50,93,59,10,32,32,125,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,60,32,50,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,50,39,41,41,59,10,32,32,125,10,32,32,118,97,114,32,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,48,93,44,10,32,32,32,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,49,93,59,10,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,93,59,10,32,32,105,102,32,40,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,41,32,123,10,32,32,32,32,118,97,114,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,32,61,32,78,97,116,105,118,101,77,111,100,117,108,101,91,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,93,59,10,32,32,32,32,118,97,114,32,112,97,114,97,109,76,105,115,116,32,61,32,91,93,59,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,50,59,32,105,32,60,32,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,99,97,108,108,65,114,103,117,109,101,110,116,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,116,121,112,101,32,61,61,61,32,39,112,114,111,109,105,115,101,39,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,112,97,114,97,109,76,105,115,116,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,105,102,32,40,110,101,101,100,82,101,106,101,99,116,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,44,32,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,41,41,32,123,10,32,32,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,114,101,106,101,99,116,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,112,97,114,97,109,76,105,115,116,46,112,117,115,104,40,114,101,115,111,108,118,101,41,59,10,32,32,32,32,32,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,78,97,116,105,118,101,77,111,100,117,108,101,44,32,112,97,114,97,109,76,105,115,116,41,59,10,32,32,32,32,125,41,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,82,101,102,101,114,101,110,99,101,69,114,114,111,114,40,34,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,32,78,97,116,105,118,101,32,34,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,111,100,117,108,101,78,97,109,101,44,32,34,46,34,41,46,99,111,110,99,97,116,40,110,97,116,105,118,101,77,101,116,104,111,100,78,97,109,101,44,32,34,40,41,32,110,111,116,32,102,111,117,110,100,34,41,41,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,51,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,99,97,108,108,65,114,103,117,109,101,110,116,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,51,41,44,32,95,107,101,121,51,32,61,32,48,59,32,95,107,101,121,51,32,60,32,95,108,101,110,51,59,32,95,107,101,121,51,43,43,41,32,123,10,32,32,32,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,95,107,101,121,51,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,51,93,59,10,32,32,125,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,60,32,51,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,97,114,103,117,109,101,110,116,115,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,108,97,114,103,101,114,32,116,104,97,110,32,51,39,41,59,10,32,32,125,10,32,32,118,97,114,32,109,111,100,117,108,101,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,48,93,44,10,32,32,32,32,109,101,116,104,111,100,78,97,109,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,49,93,44,10,32,32,32,32,97,117,116,111,68,101,108,101,116,101,32,61,32,99,97,108,108,65,114,103,117,109,101,110,116,115,91,50,93,59,10,32,32,105,102,32,40,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,61,61,61,32,51,41,32,123,10,32,32,32,32,118,97,114,32,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,109,111,100,117,108,101,78,97,109,101,93,59,10,32,32,32,32,105,102,32,40,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,41,32,123,10,32,32,32,32,32,32,105,102,32,40,97,117,116,111,68,101,108,101,116,101,32,61,61,61,32,102,97,108,115,101,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,40,123,10,32,32,32,32,32,32,32,32,32,32,110,111,116,68,101,108,101,116,101,58,32,116,114,117,101,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,40,41,59,10,32,32,32,32,125,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,118,97,114,32,95,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,109,111,100,117,108,101,78,97,109,101,93,59,10,32,32,32,32,105,102,32,40,95,78,97,116,105,118,101,77,111,100,117,108,101,32,38,38,32,95,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,41,32,123,10,32,32,32,32,32,32,118,97,114,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,32,61,32,95,78,97,116,105,118,101,77,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,59,10,32,32,32,32,32,32,118,97,114,32,112,97,114,97,109,32,61,32,91,93,59,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,51,59,32,105,32,60,32,99,97,108,108,65,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,32,32,112,97,114,97,109,46,112,117,115,104,40,99,97,108,108,65,114,103,117,109,101,110,116,115,91,105,93,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,99,117,114,114,101,110,116,67,97,108,108,73,100,32,61,32,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,73,100,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,73,100,32,43,61,32,49,59,10,32,32,32,32,32,32,118,97,114,32,110,97,116,105,118,101,80,97,114,97,109,32,61,32,91,93,59,10,32,32,32,32,32,32,105,102,32,40,97,117,116,111,68,101,108,101,116,101,32,61,61,61,32,102,97,108,115,101,41,32,123,10,32,32,32,32,32,32,32,32,110,97,116,105,118,101,80,97,114,97,109,46,112,117,115,104,40,123,10,32,32,32,32,32,32,32,32,32,32,110,111,116,68,101,108,101,116,101,58,32,116,114,117,101,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,110,97,116,105,118,101,80,97,114,97,109,46,112,117,115,104,40,99,117,114,114,101,110,116,67,97,108,108,73,100,41,59,10,32,32,32,32,32,32,110,97,116,105,118,101,80,97,114,97,109,32,61,32,110,97,116,105,118,101,80,97,114,97,109,46,99,111,110,99,97,116,40,112,97,114,97,109,41,59,10,32,32,32,32,32,32,99,97,108,108,77,111,100,117,108,101,77,101,116,104,111,100,46,97,112,112,108,121,40,95,78,97,116,105,118,101,77,111,100,117,108,101,44,32,110,97,116,105,118,101,80,97,114,97,109,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,117,114,114,101,110,116,67,97,108,108,73,100,59,10,32,32,32,32,125,10,32,32,125,10,32,32,116,104,114,111,119,32,110,101,119,32,82,101,102,101,114,101,110,99,101,69,114,114,111,114,40,34,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,32,78,97,116,105,118,101,32,34,46,99,111,110,99,97,116,40,109,111,100,117,108,101,78,97,109,101,44,32,34,46,34,41,46,99,111,110,99,97,116,40,109,101,116,104,111,100,78,97,109,101,44,32,34,40,41,32,110,111,116,32,102,111,117,110,100,34,41,41,59,10,125,59,10,72,105,112,112,121,46,98,114,105,100,103,101,46,114,101,109,111,118,101,78,97,116,105,118,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_TimerModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,116,105,109,101,114,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,84,105,109,101,114,77,111,100,117,108,101,39,41,59,10,103,108,111,98,97,108,46,115,101,116,84,105,109,101,111,117,116,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,44,32,115,108,101,101,112,84,105,109,101,41,32,123,10,32,32,118,97,114,32,97,114,103,115,32,61,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,97,114,103,117,109,101,110,116,115,44,32,50,41,59,10,32,32,114,101,116,117,114,110,32,116,105,109,101,114,46,83,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,99,98,46,97,112,112,108,121,40,110,117,108,108,44,32,97,114,103,115,41,59,10,32,32,125,44,32,115,108,101,101,112,84,105,109,101,41,59,10,125,59,10,103,108,111,98,97,108,46,99,108,101,97,114,84,105,109,101,111,117,116,32,61,32,102,117,110,99,116,105,111,110,32,40,116,105,109,101,114,73,100,41,32,123,10,32,32,105,102,32,40,78,117,109,98,101,114,46,105,115,73,110,116,101,103,101,114,40,116,105,109,101,114,73,100,41,32,38,38,32,116,105,109,101,114,73,100,32,62,32,48,41,32,123,10,32,32,32,32,116,105,109,101,114,46,67,108,101,97,114,84,105,109,101,111,117,116,40,116,105,109,101,114,73,100,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,115,101,116,73,110,116,101,114,118,97,108,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,44,32,105,110,116,101,114,118,97,108,84,105,109,101,41,32,123,10,32,32,118,97,114,32,97,114,103,115,32,61,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,97,114,103,117,109,101,110,116,115,44,32,50,41,59,10,32,32,114,101,116,117,114,110,32,116,105,109,101,114,46,83,101,116,73,110,116,101,114,118,97,108,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,99,98,46,97,112,112,108,121,40,110,117,108,108,44,32,97,114,103,115,41,59,10,32,32,125,44,32,105,110,116,101,114,118,97,108,84,105,109,101,41,59,10,125,59,10,103,108,111,98,97,108,46,99,108,101,97,114,73,110,116,101,114,118,97,108,32,61,32,102,117,110,99,116,105,111,110,32,40,116,105,109,101,114,73,100,41,32,123,10,32,32,105,102,32,40,78,117,109,98,101,114,46,105,115,73,110,116,101,103,101,114,40,116,105,109,101,114,73,100,41,32,38,38,32,116,105,109,101,114,73,100,32,62,32,48,41,32,123,10,32,32,32,32,116,105,109,101,114,46,67,108,101,97,114,73,110,116,101,114,118,97,108,40,116,105,109,101,114,73,100,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,114,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,44,32,111,112,116,41,32,123,10,32,32,114,101,116,117,114,110,32,116,105,109,101,114,46,82,101,113,117,101,115,116,73,100,108,101,67,97,108,108,98,97,99,107,40,102,117,110,99,116,105,111,110,32,40,112,97,114,97,109,41,32,123,10,32,32,32,32,118,97,114,32,110,111,119,32,61,32,68,97,116,101,46,110,111,119,40,41,59,10,32,32,32,32,118,97,114,32,95,116,105,109,101,82,101,109,97,105,110,105,110,103,32,61,32,112,97,114,97,109,46,116,105,109,101,82,101,109,97,105,110,105,110,103,59,10,32,32,32,32,99,98,40,123,10,32,32,32,32,32,32,100,105,100,84,105,109,101,111,117,116,58,32,112,97,114,97,109,46,100,105,100,84,105,109,101,111,117,116,44,10,32,32,32,32,32,32,116,105,109,101,82,101,109,97,105,110,105,110,103,58,32,102,117,110,99,116,105,111,110,32,116,105,109,101,82,101,109,97,105,110,105,110,103,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,116,105,109,101,32,61,32,95,116,105,109,101,82,101,109,97,105,110,105,110,103,32,45,32,40,68,97,116,101,46,110,111,119,40,41,32,45,32,110,111,119,41,59,10,32,32,32,32,32,32,32,32,116,105,109,101,32,61,32,116,105,109,101,32,60,32,48,32,63,32,48,32,58,32,116,105,109,101,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,105,109,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,41,59,10,32,32,125,44,32,111,112,116,41,59,10,125,59,10,103,108,111,98,97,108,46,99,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,116,105,109,101,114,73,100,41,32,123,10,32,32,105,102,32,40,78,117,109,98,101,114,46,105,115,73,110,116,101,103,101,114,40,116,105,109,101,114,73,100,41,32,38,38,32,116,105,109,101,114,73,100,32,62,32,48,41,32,123,10,32,32,32,32,116,105,109,101,114,46,67,97,110,99,101,108,73,100,108,101,67,97,108,108,98,97,99,107,40,116,105,109,101,114,73,100,41,59,10,32,32,125,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_promise[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,111,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,59,32,125,44,32,95,116,121,112,101,111,102,40,111,41,59,32,125,10,102,117,110,99,116,105,111,110,32,110,111,111,112,40,41,32,123,125,10,118,97,114,32,76,65,83,84,95,69,82,82,79,82,32,61,32,110,117,108,108,59,10,118,97,114,32,73,83,95,69,82,82,79,82,32,61,32,123,125,59,10,102,117,110,99,116,105,111,110,32,103,101,116,84,104,101,110,40,111,98,106,41,32,123,10,32,32,116,114,121,32,123,10,32,32,32,32,114,101,116,117,114,110,32,111,98,106,46,116,104,101,110,59,10,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,76,65,83,84,95,69,82,82,79,82,32,61,32,101,120,59,10,32,32,32,32,114,101,116,117,114,110,32,73,83,95,69,82,82,79,82,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,116,114,121,67,97,108,108,79,110,101,40,102,110,44,32,97,41,32,123,10,32,32,116,114,121,32,123,10,32,32,32,32,114,101,116,117,114,110,32,102,110,40,97,41,59,10,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,76,65,83,84,95,69,82,82,79,82,32,61,32,101,120,59,10,32,32,32,32,114,101,116,117,114,110,32,73,83,95,69,82,82,79,82,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,116,114,121,67,97,108,108,84,119,111,40,102,110,44,32,97,44,32,98,41,32,123,10,32,32,116,114,121,32,123,10,32,32,32,32,102,110,40,97,44,32,98,41,59,10,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,76,65,83,84,95,69,82,82,79,82,32,61,32,101,120,59,10,32,32,32,32,114,101,116,117,114,110,32,73,83,95,69,82,82,79,82,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,80,114,111,109,105,115,101,40,102,110,41,32,123,10,32,32,105,102,32,40,95,116,121,112,101,111,102,40,116,104,105,115,41,32,33,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,80,114,111,109,105,115,101,115,32,109,117,115,116,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,118,105,97,32,110,101,119,39,41,59,10,32,32,125,10,32,32,105,102,32,40,116,121,112,101,111,102,32,102,110,32,33,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,80,114,111,109,105,115,101,32,99,111,110,115,116,114,117,99,116,111,114,92,39,115,32,97,114,103,117,109,101,110,116,32,105,115,32,110,111,116,32,97,32,102,117,110,99,116,105,111,110,39,41,59,10,32,32,125,10,32,32,116,104,105,115,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,32,48,59,10,32,32,116,104,105,115,46,95,115,116,97,116,101,32,61,32,48,59,10,32,32,116,104,105,115,46,95,118,97,108,117,101,32,61,32,110,117,108,108,59,10,32,32,116,104,105,115,46,95,100,101,102,101,114,114,101,100,115,32,61,32,110,117,108,108,59,10,32,32,105,102,32,40,102,110,32,61,61,61,32,110,111,111,112,41,32,114,101,116,117,114,110,59,10,32,32,100,111,82,101,115,111,108,118,101,40,102,110,44,32,116,104,105,115,41,59,10,125,10,80,114,111,109,105,115,101,46,95,111,110,72,97,110,100,108,101,32,61,32,110,117,108,108,59,10,80,114,111,109,105,115,101,46,95,111,110,82,101,106,101,99,116,32,61,32,110,117,108,108,59,10,80,114,111,109,105,115,101,46,95,110,111,111,112,32,61,32,110,111,111,112,59,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,46,116,104,101,110,32,61,32,102,117,110,99,116,105,111,110,32,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,105,102,32,40,116,104,105,115,46,99,111,110,115,116,114,117,99,116,111,114,32,33,61,61,32,80,114,111,109,105,115,101,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,115,97,102,101,84,104,101,110,40,116,104,105,115,44,32,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,59,10,32,32,125,10,32,32,118,97,114,32,114,101,115,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,110,111,111,112,41,59,10,32,32,104,97,110,100,108,101,40,116,104,105,115,44,32,110,101,119,32,72,97,110,100,108,101,114,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,44,32,114,101,115,41,41,59,10,32,32,114,101,116,117,114,110,32,114,101,115,59,10,125,59,10,102,117,110,99,116,105,111,110,32,115,97,102,101,84,104,101,110,40,115,101,108,102,44,32,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,114,101,116,117,114,110,32,110,101,119,32,115,101,108,102,46,99,111,110,115,116,114,117,99,116,111,114,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,118,97,114,32,114,101,115,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,110,111,111,112,41,59,10,32,32,32,32,114,101,115,46,116,104,101,110,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,104,97,110,100,108,101,40,115,101,108,102,44,32,110,101,119,32,72,97,110,100,108,101,114,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,44,32,114,101,115,41,41,59,10,32,32,125,41,59,10,125,10,102,117,110,99,116,105,111,110,32,104,97,110,100,108,101,40,115,101,108,102,44,32,100,101,102,101,114,114,101,100,41,32,123,10,32,32,119,104,105,108,101,32,40,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,51,41,32,123,10,32,32,32,32,115,101,108,102,32,61,32,115,101,108,102,46,95,118,97,108,117,101,59,10,32,32,125,10,32,32,105,102,32,40,80,114,111,109,105,115,101,46,95,111,110,72,97,110,100,108,101,41,32,123,10,32,32,32,32,80,114,111,109,105,115,101,46,95,111,110,72,97,110,100,108,101,40,115,101,108,102,41,59,10,32,32,125,10,32,32,105,102,32,40,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,48,41,32,123,10,32,32,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,48,41,32,123,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,32,49,59,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,100,101,102,101,114,114,101,100,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,49,41,32,123,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,32,50,59,10,32,32,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,91,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,44,32,100,101,102,101,114,114,101,100,93,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,46,112,117,115,104,40,100,101,102,101,114,114,101,100,41,59,10,32,32,32,32,114,101,116,117,114,110,59,10,32,32,125,10,32,32,104,97,110,100,108,101,82,101,115,111,108,118,101,100,40,115,101,108,102,44,32,100,101,102,101,114,114,101,100,41,59,10,125,10,102,117,110,99,116,105,111,110,32,104,97,110,100,108,101,82,101,115,111,108,118,101,100,40,115,101,108,102,44,32,100,101,102,101,114,114,101,100,41,32,123,10,32,32,115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,118,97,114,32,99,98,32,61,32,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,49,32,63,32,100,101,102,101,114,114,101,100,46,111,110,70,117,108,102,105,108,108,101,100,32,58,32,100,101,102,101,114,114,101,100,46,111,110,82,101,106,101,99,116,101,100,59,10,32,32,32,32,105,102,32,40,99,98,32,61,61,61,32,110,117,108,108,41,32,123,10,32,32,32,32,32,32,105,102,32,40,115,101,108,102,46,95,115,116,97,116,101,32,61,61,61,32,49,41,32,123,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,115,101,108,102,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,115,101,108,102,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,118,97,114,32,114,101,116,32,61,32,116,114,121,67,97,108,108,79,110,101,40,99,98,44,32,115,101,108,102,46,95,118,97,108,117,101,41,59,10,32,32,32,32,105,102,32,40,114,101,116,32,61,61,61,32,73,83,95,69,82,82,79,82,41,32,123,10,32,32,32,32,32,32,114,101,106,101,99,116,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,76,65,83,84,95,69,82,82,79,82,41,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,101,102,101,114,114,101,100,46,112,114,111,109,105,115,101,44,32,114,101,116,41,59,10,32,32,32,32,125,10,32,32,125,44,32,48,41,59,10,125,10,102,117,110,99,116,105,111,110,32,114,101,115,111,108,118,101,40,115,101,108,102,44,32,110,101,119,86,97,108,117,101,41,32,123,10,32,32,105,102,32,40,110,101,119,86,97,108,117,101,32,61,61,61,32,115,101,108,102,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,114,101,106,101,99,116,40,115,101,108,102,44,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,65,32,112,114,111,109,105,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,115,111,108,118,101,100,32,119,105,116,104,32,105,116,115,101,108,102,46,39,41,41,59,10,32,32,125,10,32,32,105,102,32,40,110,101,119,86,97,108,117,101,32,38,38,32,40,95,116,121,112,101,111,102,40,110,101,119,86,97,108,117,101,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,124,124,32,116,121,112,101,111,102,32,110,101,119,86,97,108,117,101,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,41,32,123,10,32,32,32,32,118,97,114,32,116,104,101,110,32,61,32,103,101,116,84,104,101,110,40,110,101,119,86,97,108,117,101,41,59,10,32,32,32,32,105,102,32,40,116,104,101,110,32,61,61,61,32,73,83,95,69,82,82,79,82,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,114,101,106,101,99,116,40,115,101,108,102,44,32,76,65,83,84,95,69,82,82,79,82,41,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,116,104,101,110,32,61,61,61,32,115,101,108,102,46,116,104,101,110,32,38,38,32,110,101,119,86,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,80,114,111,109,105,115,101,41,32,123,10,32,32,32,32,32,32,115,101,108,102,46,95,115,116,97,116,101,32,61,32,51,59,10,32,32,32,32,32,32,115,101,108,102,46,95,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,32,32,32,32,102,105,110,97,108,101,40,115,101,108,102,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,116,121,112,101,111,102,32,116,104,101,110,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,100,111,82,101,115,111,108,118,101,40,116,104,101,110,46,98,105,110,100,40,110,101,119,86,97,108,117,101,41,44,32,115,101,108,102,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,125,10,32,32,115,101,108,102,46,95,115,116,97,116,101,32,61,32,49,59,10,32,32,115,101,108,102,46,95,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,102,105,110,97,108,101,40,115,101,108,102,41,59,10,125,10,102,117,110,99,116,105,111,110,32,114,101,106,101,99,116,40,115,101,108,102,44,32,110,101,119,86,97,108,117,101,41,32,123,10,32,32,115,101,108,102,46,95,115,116,97,116,101,32,61,32,50,59,10,32,32,115,101,108,102,46,95,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,105,102,32,40,80,114,111,109,105,115,101,46,95,111,110,82,101,106,101,99,116,41,32,123,10,32,32,32,32,80,114,111,109,105,115,101,46,95,111,110,82,101,106,101,99,116,40,115,101,108,102,44,32,110,101,119,86,97,108,117,101,41,59,10,32,32,125,10,32,32,102,105,110,97,108,101,40,115,101,108,102,41,59,10,125,10,102,117,110,99,116,105,111,110,32,102,105,110,97,108,101,40,115,101,108,102,41,32,123,10,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,49,41,32,123,10,32,32,32,32,104,97,110,100,108,101,40,115,101,108,102,44,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,41,59,10,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,110,117,108,108,59,10,32,32,125,10,32,32,105,102,32,40,115,101,108,102,46,95,100,101,102,101,114,114,101,100,83,116,97,116,101,32,61,61,61,32,50,41,32,123,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,59,32,105,32,60,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,10,32,32,32,32,32,32,104,97,110,100,108,101,40,115,101,108,102,44,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,108,102,46,95,100,101,102,101,114,114,101,100,115,32,61,32,110,117,108,108,59,10,32,32,125,10,125,10,102,117,110,99,116,105,111,110,32,72,97,110,100,108,101,114,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,44,32,112,114,111,109,105,115,101,41,32,123,10,32,32,116,104,105,115,46,111,110,70,117,108,102,105,108,108,101,100,32,61,32,116,121,112,101,111,102,32,111,110,70,117,108,102,105,108,108,101,100,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,32,63,32,111,110,70,117,108,102,105,108,108,101,100,32,58,32,110,117,108,108,59,10,32,32,116,104,105,115,46,111,110,82,101,106,101,99,116,101,100,32,61,32,116,121,112,101,111,102,32,111,110,82,101,106,101,99,116,101,100,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,32,63,32,111,110,82,101,106,101,99,116,101,100,32,58,32,110,117,108,108,59,10,32,32,116,104,105,115,46,112,114,111,109,105,115,101,32,61,32,112,114,111,109,105,115,101,59,10,125,10,102,117,110,99,116,105,111,110,32,100,111,82,101,115,111,108,118,101,40,102,110,44,32,112,114,111,109,105,115,101,41,32,123,10,32,32,118,97,114,32,100,111,110,101,32,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,114,101,115,32,61,32,116,114,121,67,97,108,108,84,119,111,40,102,110,44,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,32,32,105,102,32,40,100,111,110,101,41,32,114,101,116,117,114,110,59,10,32,32,32,32,100,111,110,101,32,61,32,116,114,117,101,59,10,32,32,32,32,114,101,115,111,108,118,101,40,112,114,111,109,105,115,101,44,32,118,97,108,117,101,41,59,10,32,32,125,44,32,102,117,110,99,116,105,111,110,32,40,114,101,97,115,111,110,41,32,123,10,32,32,32,32,105,102,32,40,100,111,110,101,41,32,114,101,116,117,114,110,59,10,32,32,32,32,100,111,110,101,32,61,32,116,114,117,101,59,10,32,32,32,32,114,101,106,101,99,116,40,112,114,111,109,105,115,101,44,32,114,101,97,115,111,110,41,59,10,32,32,125,41,59,10,32,32,105,102,32,40,33,100,111,110,101,32,38,38,32,114,101,115,32,61,61,61,32,73,83,95,69,82,82,79,82,41,32,123,10,32,32,32,32,100,111,110,101,32,61,32,116,114,117,101,59,10,32,32,32,32,114,101,106,101,99,116,40,112,114,111,109,105,115,101,44,32,76,65,83,84,95,69,82,82,79,82,41,59,10,32,32,125,10,125,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,46,100,111,110,101,32,61,32,102,117,110,99,116,105,111,110,32,40,111,110,70,117,108,102,105,108,108,101,100,44,32,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,118,97,114,32,115,101,108,102,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,63,32,116,104,105,115,46,116,104,101,110,46,97,112,112,108,121,40,116,104,105,115,44,32,97,114,103,117,109,101,110,116,115,41,32,58,32,116,104,105,115,59,10,32,32,115,101,108,102,46,116,104,101,110,40,110,117,108,108,44,32,102,117,110,99,116,105,111,110,32,40,101,114,114,41,32,123,10,32,32,32,32,115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,59,10,32,32,32,32,125,44,32,48,41,59,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,91,39,102,105,110,97,108,108,121,39,93,32,61,32,102,117,110,99,116,105,111,110,32,40,102,41,32,123,10,32,32,114,101,116,117,114,110,32,116,104,105,115,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,102,40,41,41,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,118,97,108,117,101,59,10,32,32,32,32,125,41,59,10,32,32,125,44,32,102,117,110,99,116,105,111,110,32,40,101,114,114,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,102,40,41,41,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,59,10,32,32,32,32,125,41,59,10,32,32,125,41,59,10,125,59,10,118,97,114,32,84,82,85,69,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,116,114,117,101,41,59,10,118,97,114,32,70,65,76,83,69,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,102,97,108,115,101,41,59,10,118,97,114,32,78,85,76,76,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,110,117,108,108,41,59,10,118,97,114,32,85,78,68,69,70,73,78,69,68,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,117,110,100,101,102,105,110,101,100,41,59,10,118,97,114,32,90,69,82,79,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,48,41,59,10,118,97,114,32,69,77,80,84,89,83,84,82,73,78,71,32,61,32,118,97,108,117,101,80,114,111,109,105,115,101,40,39,39,41,59,10,102,117,110,99,116,105,111,110,32,118,97,108,117,101,80,114,111,109,105,115,101,40,118,97,108,117,101,41,32,123,10,32,32,118,97,114,32,112,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,80,114,111,109,105,115,101,46,95,110,111,111,112,41,59,10,32,32,112,46,95,115,116,97,116,101,32,61,32,49,59,10,32,32,112,46,95,118,97,108,117,101,32,61,32,118,97,108,117,101,59,10,32,32,114,101,116,117,114,110,32,112,59,10,125,10,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,32,61,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,105,102,32,40,118,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,80,114,111,109,105,115,101,41,32,114,101,116,117,114,110,32,118,97,108,117,101,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,78,85,76,76,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,32,114,101,116,117,114,110,32,85,78,68,69,70,73,78,69,68,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,116,114,117,101,41,32,114,101,116,117,114,110,32,84,82,85,69,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,102,97,108,115,101,41,32,114,101,116,117,114,110,32,70,65,76,83,69,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,48,41,32,114,101,116,117,114,110,32,90,69,82,79,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,39,39,41,32,114,101,116,117,114,110,32,69,77,80,84,89,83,84,82,73,78,71,59,10,32,32,105,102,32,40,95,116,121,112,101,111,102,40,118,97,108,117,101,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,117,101,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,118,97,114,32,116,104,101,110,32,61,32,118,97,108,117,101,46,116,104,101,110,59,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,116,104,101,110,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,116,104,101,110,46,98,105,110,100,40,118,97,108,117,101,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,32,99,97,116,99,104,32,40,101,120,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,120,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,80,114,111,109,105,115,101,40,118,97,108,117,101,41,59,10,125,59,10,118,97,114,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,32,61,32,102,117,110,99,116,105,111,110,32,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,105,116,101,114,97,98,108,101,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,65,114,114,97,121,46,102,114,111,109,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,32,61,32,65,114,114,97,121,46,102,114,111,109,59,10,32,32,32,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,105,116,101,114,97,98,108,101,41,59,10,32,32,125,10,32,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,32,61,32,102,117,110,99,116,105,111,110,32,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,120,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,120,41,59,10,32,32,125,59,10,32,32,114,101,116,117,114,110,32,65,114,114,97,121,46,112,114,111,116,111,116,121,112,101,46,115,108,105,99,101,46,99,97,108,108,40,105,116,101,114,97,98,108,101,41,59,10,125,59,10,80,114,111,109,105,115,101,46,97,108,108,32,61,32,102,117,110,99,116,105,111,110,32,40,97,114,114,41,32,123,10,32,32,118,97,114,32,97,114,103,115,32,61,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,97,114,114,41,59,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,105,102,32,40,97,114,103,115,46,108,101,110,103,116,104,32,61,61,61,32,48,41,32,114,101,116,117,114,110,32,114,101,115,111,108,118,101,40,91,93,41,59,10,32,32,32,32,118,97,114,32,114,101,109,97,105,110,105,110,103,32,61,32,97,114,103,115,46,108,101,110,103,116,104,59,10,32,32,32,32,102,117,110,99,116,105,111,110,32,114,101,115,40,105,44,32,118,97,108,41,32,123,10,32,32,32,32,32,32,105,102,32,40,118,97,108,32,38,38,32,40,95,116,121,112,101,111,102,40,118,97,108,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,32,105,110,115,116,97,110,99,101,111,102,32,80,114,111,109,105,115,101,32,38,38,32,118,97,108,46,116,104,101,110,32,61,61,61,32,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,46,116,104,101,110,41,32,123,10,32,32,32,32,32,32,32,32,32,32,119,104,105,108,101,32,40,118,97,108,46,95,115,116,97,116,101,32,61,61,61,32,51,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,108,32,61,32,118,97,108,46,95,118,97,108,117,101,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,46,95,115,116,97,116,101,32,61,61,61,32,49,41,32,114,101,116,117,114,110,32,114,101,115,40,105,44,32,118,97,108,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,46,95,115,116,97,116,101,32,61,61,61,32,50,41,32,114,101,106,101,99,116,40,118,97,108,46,95,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,32,32,118,97,108,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,118,97,108,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,40,105,44,32,118,97,108,41,59,10,32,32,32,32,32,32,32,32,32,32,125,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,116,104,101,110,32,61,32,118,97,108,46,116,104,101,110,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,116,104,101,110,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,112,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,116,104,101,110,46,98,105,110,100,40,118,97,108,41,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,112,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,118,97,108,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,40,105,44,32,118,97,108,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,97,114,103,115,91,105,93,32,61,32,118,97,108,59,10,32,32,32,32,32,32,105,102,32,40,45,45,114,101,109,97,105,110,105,110,103,32,61,61,61,32,48,41,32,123,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,97,114,103,115,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,102,111,114,32,40,118,97,114,32,105,32,61,32,48,59,32,105,32,60,32,97,114,103,115,46,108,101,110,103,116,104,59,32,105,43,43,41,32,123,10,32,32,32,32,32,32,114,101,115,40,105,44,32,97,114,103,115,91,105,93,41,59,10,32,32,32,32,125,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,114,101,106,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,114,101,106,101,99,116,40,118,97,108,117,101,41,59,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,114,97,99,101,32,61,32,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,115,41,32,123,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,118,97,108,117,101,115,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,118,97,108,117,101,41,46,116,104,101,110,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,59,10,32,32,32,32,125,41,59,10,32,32,125,41,59,10,125,59,10,80,114,111,109,105,115,101,46,112,114,111,116,111,116,121,112,101,91,39,99,97,116,99,104,39,93,32,61,32,102,117,110,99,116,105,111,110,32,40,111,110,82,101,106,101,99,116,101,100,41,32,123,10,32,32,114,101,116,117,114,110,32,116,104,105,115,46,116,104,101,110,40,110,117,108,108,44,32,111,110,82,101,106,101,99,116,101,100,41,59,10,125,59,10,103,108,111,98,97,108,46,80,114,111,109,105,115,101,32,61,32,80,114,111,109,105,115,101,59,125,41,59,0 }; // NOLINT + const uint8_t k_ConsoleModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,111,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,59,32,125,44,32,95,116,121,112,101,111,102,40,111,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,114,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,123,32,105,102,32,40,114,41,32,123,32,105,102,32,40,34,115,116,114,105,110,103,34,32,61,61,32,116,121,112,101,111,102,32,114,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,59,32,118,97,114,32,116,32,61,32,123,125,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,114,41,46,115,108,105,99,101,40,56,44,32,45,49,41,59,32,114,101,116,117,114,110,32,34,79,98,106,101,99,116,34,32,61,61,61,32,116,32,38,38,32,114,46,99,111,110,115,116,114,117,99,116,111,114,32,38,38,32,40,116,32,61,32,114,46,99,111,110,115,116,114,117,99,116,111,114,46,110,97,109,101,41,44,32,34,77,97,112,34,32,61,61,61,32,116,32,124,124,32,34,83,101,116,34,32,61,61,61,32,116,32,63,32,65,114,114,97,121,46,102,114,111,109,40,114,41,32,58,32,34,65,114,103,117,109,101,110,116,115,34,32,61,61,61,32,116,32,124,124,32,47,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,47,46,116,101,115,116,40,116,41,32,63,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,58,32,118,111,105,100,32,48,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,123,32,105,102,32,40,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,110,117,108,108,32,33,61,32,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,124,124,32,110,117,108,108,32,33,61,32,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,114,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,123,32,40,110,117,108,108,32,61,61,32,97,32,124,124,32,97,32,62,32,114,46,108,101,110,103,116,104,41,32,38,38,32,40,97,32,61,32,114,46,108,101,110,103,116,104,41,59,32,102,111,114,32,40,118,97,114,32,101,32,61,32,48,44,32,110,32,61,32,65,114,114,97,121,40,97,41,59,32,101,32,60,32,97,59,32,101,43,43,41,32,110,91,101,93,32,61,32,114,91,101,93,59,32,114,101,116,117,114,110,32,110,59,32,125,10,118,97,114,32,99,111,110,115,111,108,101,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,67,111,110,115,111,108,101,77,111,100,117,108,101,39,41,59,10,118,97,114,32,105,110,100,101,110,116,32,61,32,102,117,110,99,116,105,111,110,32,105,110,100,101,110,116,40,108,101,118,101,108,41,32,123,10,32,32,118,97,114,32,116,97,98,32,61,32,39,39,59,10,32,32,119,104,105,108,101,32,40,116,97,98,46,108,101,110,103,116,104,32,60,32,108,101,118,101,108,32,42,32,50,41,32,123,10,32,32,32,32,116,97,98,32,43,61,32,39,32,32,39,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,116,97,98,59,10,125,59,10,118,97,114,32,105,110,115,112,101,99,116,79,98,106,101,99,116,32,61,32,110,117,108,108,59,10,118,97,114,32,105,110,115,112,101,99,116,32,61,32,110,117,108,108,59,10,102,117,110,99,116,105,111,110,32,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,40,112,97,114,97,109,41,32,123,10,32,32,118,97,114,32,114,101,115,117,108,116,32,61,32,123,125,59,10,32,32,118,97,114,32,112,114,111,112,75,101,121,115,32,61,32,79,98,106,101,99,116,46,107,101,121,115,40,112,97,114,97,109,41,59,10,32,32,112,114,111,112,75,101,121,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,44,32,105,110,100,101,120,41,32,123,10,32,32,32,32,114,101,115,117,108,116,91,112,114,111,112,75,101,121,115,91,105,110,100,101,120,93,93,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,40,112,97,114,97,109,44,32,112,114,111,112,75,101,121,115,91,105,110,100,101,120,93,41,59,10,32,32,125,41,59,10,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,59,10,125,10,105,110,115,112,101,99,116,79,98,106,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,105,110,115,112,101,99,116,79,98,106,101,99,116,40,118,97,108,117,101,41,32,123,10,32,32,118,97,114,32,108,101,118,101,108,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,49,32,38,38,32,97,114,103,117,109,101,110,116,115,91,49,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,49,93,32,58,32,48,59,10,32,32,118,97,114,32,114,101,99,117,114,115,101,84,105,109,101,115,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,50,32,38,38,32,97,114,103,117,109,101,110,116,115,91,50,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,50,93,32,58,32,50,59,10,32,32,118,97,114,32,108,105,110,101,98,114,101,97,107,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,51,32,38,38,32,97,114,103,117,109,101,110,116,115,91,51,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,51,93,32,58,32,39,92,110,39,59,10,32,32,105,102,32,40,118,97,108,117,101,32,61,61,61,32,110,117,108,108,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,39,110,117,108,108,39,59,10,32,32,125,10,32,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,118,97,108,117,101,41,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,34,91,32,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,105,116,101,109,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,40,105,116,101,109,44,32,108,101,118,101,108,32,43,32,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,41,59,10,32,32,32,32,125,41,46,106,111,105,110,40,39,44,32,39,41,44,32,34,32,93,34,41,59,10,32,32,125,10,32,32,115,119,105,116,99,104,32,40,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,41,32,123,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,68,97,116,101,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,68,97,116,101,46,112,114,111,116,111,116,121,112,101,46,116,111,73,83,79,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,82,101,103,69,120,112,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,82,101,103,69,120,112,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,69,114,114,111,114,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,115,116,97,99,107,32,124,124,32,69,114,114,111,114,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,83,101,116,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,83,101,116,32,123,32,34,46,99,111,110,99,97,116,40,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,118,97,108,117,101,41,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,105,116,101,109,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,40,105,116,101,109,44,32,108,101,118,101,108,32,43,32,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,108,105,110,101,98,114,101,97,107,41,59,10,32,32,32,32,32,32,32,32,125,41,46,106,111,105,110,40,39,44,32,39,41,44,32,34,32,125,34,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,87,101,97,107,83,101,116,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,87,101,97,107,83,101,116,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,77,97,112,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,101,110,116,114,105,101,115,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,118,97,108,117,101,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,118,97,108,44,32,107,101,121,41,32,123,10,32,32,32,32,32,32,32,32,32,32,101,110,116,114,105,101,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,110,115,112,101,99,116,40,107,101,121,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,42,32,45,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,39,39,41,44,32,34,32,61,62,32,34,41,46,99,111,110,99,97,116,40,105,110,115,112,101,99,116,40,118,97,108,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,42,32,45,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,39,39,41,41,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,77,97,112,32,123,32,34,46,99,111,110,99,97,116,40,101,110,116,114,105,101,115,46,106,111,105,110,40,39,44,32,39,41,44,32,34,32,125,34,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,99,97,115,101,32,39,91,111,98,106,101,99,116,32,87,101,97,107,77,97,112,93,39,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,87,101,97,107,77,97,112,32,123,32,91,105,116,101,109,115,32,117,110,107,110,111,119,110,93,32,125,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,98,114,101,97,107,59,10,32,32,32,32,32,32,125,10,32,32,125,10,32,32,105,102,32,40,118,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,69,114,114,111,114,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,34,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,115,116,97,99,107,32,124,124,32,69,114,114,111,114,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,118,97,108,117,101,41,41,59,10,32,32,125,10,32,32,118,97,114,32,100,101,115,99,115,32,61,32,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,40,118,97,108,117,101,41,59,10,32,32,118,97,114,32,107,101,121,115,32,61,32,79,98,106,101,99,116,46,107,101,121,115,40,100,101,115,99,115,41,59,10,32,32,118,97,114,32,112,97,105,114,115,32,61,32,91,93,59,10,32,32,107,101,121,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,41,32,123,10,32,32,32,32,118,97,114,32,100,101,115,99,32,61,32,100,101,115,99,115,91,107,101,121,93,59,10,32,32,32,32,118,97,114,32,105,116,101,109,80,114,101,102,105,120,32,61,32,34,34,46,99,111,110,99,97,116,40,105,110,100,101,110,116,40,108,101,118,101,108,32,43,32,49,41,41,46,99,111,110,99,97,116,40,107,101,121,44,32,34,32,58,32,34,41,59,10,32,32,32,32,105,102,32,40,100,101,115,99,46,103,101,116,41,32,123,10,32,32,32,32,32,32,105,102,32,40,100,101,115,99,46,115,101,116,41,32,123,10,32,32,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,44,32,34,91,71,101,116,116,101,114,47,83,101,116,116,101,114,93,34,41,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,44,32,34,91,71,101,116,116,101,114,93,34,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,100,101,115,99,46,115,101,116,41,32,123,10,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,44,32,34,91,83,101,116,116,101,114,93,34,41,41,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,100,101,115,99,46,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,112,97,105,114,115,46,112,117,115,104,40,34,34,46,99,111,110,99,97,116,40,105,116,101,109,80,114,101,102,105,120,41,46,99,111,110,99,97,116,40,105,110,115,112,101,99,116,40,100,101,115,99,46,118,97,108,117,101,44,32,108,101,118,101,108,32,43,32,49,44,32,114,101,99,117,114,115,101,84,105,109,101,115,32,45,32,49,44,32,108,105,110,101,98,114,101,97,107,41,41,41,59,10,32,32,32,32,125,10,32,32,125,41,59,10,32,32,114,101,116,117,114,110,32,34,123,34,46,99,111,110,99,97,116,40,108,105,110,101,98,114,101,97,107,41,46,99,111,110,99,97,116,40,112,97,105,114,115,46,106,111,105,110,40,34,44,32,34,46,99,111,110,99,97,116,40,108,105,110,101,98,114,101,97,107,41,41,41,46,99,111,110,99,97,116,40,108,105,110,101,98,114,101,97,107,41,46,99,111,110,99,97,116,40,105,110,100,101,110,116,40,108,101,118,101,108,41,44,32,34,125,34,41,59,10,125,59,10,105,110,115,112,101,99,116,32,61,32,102,117,110,99,116,105,111,110,32,105,110,115,112,101,99,116,40,118,97,108,117,101,41,32,123,10,32,32,118,97,114,32,108,101,118,101,108,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,49,32,38,38,32,97,114,103,117,109,101,110,116,115,91,49,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,49,93,32,58,32,48,59,10,32,32,118,97,114,32,114,101,99,117,114,115,101,84,105,109,101,115,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,50,32,38,38,32,97,114,103,117,109,101,110,116,115,91,50,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,50,93,32,58,32,50,59,10,32,32,118,97,114,32,108,105,110,101,98,114,101,97,107,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,32,62,32,51,32,38,38,32,97,114,103,117,109,101,110,116,115,91,51,93,32,33,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,97,114,103,117,109,101,110,116,115,91,51,93,32,58,32,39,92,110,39,59,10,32,32,115,119,105,116,99,104,32,40,95,116,121,112,101,111,102,40,118,97,108,117,101,41,41,32,123,10,32,32,32,32,99,97,115,101,32,39,115,116,114,105,110,103,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,39,34,46,99,111,110,99,97,116,40,118,97,108,117,101,44,32,34,39,34,41,59,10,32,32,32,32,99,97,115,101,32,39,115,121,109,98,111,108,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,118,97,108,117,101,46,116,111,83,116,114,105,110,103,40,41,59,10,32,32,32,32,99,97,115,101,32,39,102,117,110,99,116,105,111,110,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,91,70,117,110,99,116,105,111,110,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,110,97,109,101,32,63,32,34,58,32,34,46,99,111,110,99,97,116,40,118,97,108,117,101,46,110,97,109,101,41,32,58,32,39,39,44,32,34,93,34,41,59,10,32,32,32,32,99,97,115,101,32,39,111,98,106,101,99,116,39,58,10,32,32,32,32,32,32,105,102,32,40,114,101,99,117,114,115,101,84,105,109,101,115,32,60,32,48,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,91,79,98,106,101,99,116,93,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,79,98,106,101,99,116,40,118,97,108,117,101,44,32,108,101,118,101,108,44,32,114,101,99,117,114,115,101,84,105,109,101,115,44,32,108,105,110,101,98,114,101,97,107,41,59,10,32,32,32,32,99,97,115,101,32,39,98,105,103,105,110,116,39,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,110,34,46,99,111,110,99,97,116,40,118,97,108,117,101,41,59,10,32,32,32,32,99,97,115,101,32,39,117,110,100,101,102,105,110,101,100,39,58,10,32,32,32,32,99,97,115,101,32,39,110,117,109,98,101,114,39,58,10,32,32,32,32,99,97,115,101,32,39,98,111,111,108,101,97,110,39,58,10,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,114,101,116,117,114,110,32,34,34,46,99,111,110,99,97,116,40,118,97,108,117,101,41,59,10,32,32,125,10,125,59,10,118,97,114,32,118,109,67,111,110,115,111,108,101,59,10,105,102,32,40,116,121,112,101,111,102,32,99,111,110,115,111,108,101,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,118,109,67,111,110,115,111,108,101,32,61,32,99,111,110,115,111,108,101,59,10,125,10,118,97,114,32,115,117,112,112,111,114,116,65,112,105,76,105,115,116,32,61,32,91,39,108,111,103,39,44,32,39,105,110,102,111,39,44,32,39,119,97,114,110,39,44,32,39,101,114,114,111,114,39,44,32,39,100,101,98,117,103,39,93,59,10,103,108,111,98,97,108,46,67,111,110,115,111,108,101,77,111,100,117,108,101,32,61,32,123,125,59,10,115,117,112,112,111,114,116,65,112,105,76,105,115,116,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,97,112,105,41,32,123,10,32,32,103,108,111,98,97,108,46,67,111,110,115,111,108,101,77,111,100,117,108,101,91,97,112,105,93,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,32,32,125,10,32,32,32,32,118,97,114,32,108,111,103,32,61,32,97,114,103,115,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,97,114,103,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,112,101,99,116,40,97,114,103,41,59,10,32,32,32,32,125,41,46,106,111,105,110,40,39,32,39,41,59,10,32,32,32,32,99,111,110,115,111,108,101,77,111,100,117,108,101,46,76,111,103,40,108,111,103,44,32,97,112,105,41,59,10,32,32,125,59,10,125,41,59,10,103,108,111,98,97,108,46,99,111,110,115,111,108,101,32,61,32,123,10,32,32,114,101,112,111,114,116,85,110,99,97,117,103,104,116,69,120,99,101,112,116,105,111,110,58,32,102,117,110,99,116,105,111,110,32,114,101,112,111,114,116,85,110,99,97,117,103,104,116,69,120,99,101,112,116,105,111,110,40,101,114,114,111,114,41,32,123,10,32,32,32,32,105,102,32,40,101,114,114,111,114,32,38,38,32,101,114,114,111,114,32,105,110,115,116,97,110,99,101,111,102,32,69,114,114,111,114,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,111,114,59,10,32,32,32,32,125,10,32,32,125,10,125,59,10,105,102,32,40,118,109,67,111,110,115,111,108,101,41,32,123,10,32,32,79,98,106,101,99,116,46,107,101,121,115,40,118,109,67,111,110,115,111,108,101,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,97,112,105,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,99,111,110,115,111,108,101,91,97,112,105,93,32,61,32,118,109,67,111,110,115,111,108,101,91,97,112,105,93,59,10,32,32,125,41,59,10,125,125,41,59,0 }; // NOLINT + const uint8_t k_Network[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,95,101,120,99,108,117,100,101,100,32,61,32,91,34,109,101,116,104,111,100,34,44,32,34,104,101,97,100,101,114,115,34,44,32,34,98,111,100,121,34,93,59,10,102,117,110,99,116,105,111,110,32,111,119,110,75,101,121,115,40,101,44,32,114,41,32,123,32,118,97,114,32,116,32,61,32,79,98,106,101,99,116,46,107,101,121,115,40,101,41,59,32,105,102,32,40,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,41,32,123,32,118,97,114,32,111,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,40,101,41,59,32,114,32,38,38,32,40,111,32,61,32,111,46,102,105,108,116,101,114,40,102,117,110,99,116,105,111,110,32,40,114,41,32,123,32,114,101,116,117,114,110,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,40,101,44,32,114,41,46,101,110,117,109,101,114,97,98,108,101,59,32,125,41,41,44,32,116,46,112,117,115,104,46,97,112,112,108,121,40,116,44,32,111,41,59,32,125,32,114,101,116,117,114,110,32,116,59,32,125,10,102,117,110,99,116,105,111,110,32,95,111,98,106,101,99,116,83,112,114,101,97,100,40,101,41,32,123,32,102,111,114,32,40,118,97,114,32,114,32,61,32,49,59,32,114,32,60,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,59,32,114,43,43,41,32,123,32,118,97,114,32,116,32,61,32,110,117,108,108,32,33,61,32,97,114,103,117,109,101,110,116,115,91,114,93,32,63,32,97,114,103,117,109,101,110,116,115,91,114,93,32,58,32,123,125,59,32,114,32,37,32,50,32,63,32,111,119,110,75,101,121,115,40,79,98,106,101,99,116,40,116,41,44,32,33,48,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,114,41,32,123,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,114,44,32,116,91,114,93,41,59,32,125,41,32,58,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,32,63,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,44,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,40,116,41,41,32,58,32,111,119,110,75,101,121,115,40,79,98,106,101,99,116,40,116,41,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,114,41,32,123,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,114,44,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,40,116,44,32,114,41,41,59,32,125,41,59,32,125,32,114,101,116,117,114,110,32,101,59,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,114,44,32,116,41,32,123,32,114,101,116,117,114,110,32,40,114,32,61,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,114,41,41,32,105,110,32,101,32,63,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,114,44,32,123,32,118,97,108,117,101,58,32,116,44,32,101,110,117,109,101,114,97,98,108,101,58,32,33,48,44,32,99,111,110,102,105,103,117,114,97,98,108,101,58,32,33,48,44,32,119,114,105,116,97,98,108,101,58,32,33,48,32,125,41,32,58,32,101,91,114,93,32,61,32,116,44,32,101,59,32,125,10,102,117,110,99,116,105,111,110,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,40,101,44,32,116,41,32,123,32,105,102,32,40,110,117,108,108,32,61,61,32,101,41,32,114,101,116,117,114,110,32,123,125,59,32,118,97,114,32,111,44,32,114,44,32,105,32,61,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,76,111,111,115,101,40,101,44,32,116,41,59,32,105,102,32,40,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,41,32,123,32,118,97,114,32,115,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,40,101,41,59,32,102,111,114,32,40,114,32,61,32,48,59,32,114,32,60,32,115,46,108,101,110,103,116,104,59,32,114,43,43,41,32,111,32,61,32,115,91,114,93,44,32,116,46,105,110,99,108,117,100,101,115,40,111,41,32,124,124,32,123,125,46,112,114,111,112,101,114,116,121,73,115,69,110,117,109,101,114,97,98,108,101,46,99,97,108,108,40,101,44,32,111,41,32,38,38,32,40,105,91,111,93,32,61,32,101,91,111,93,41,59,32,125,32,114,101,116,117,114,110,32,105,59,32,125,10,102,117,110,99,116,105,111,110,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,76,111,111,115,101,40,114,44,32,101,41,32,123,32,105,102,32,40,110,117,108,108,32,61,61,32,114,41,32,114,101,116,117,114,110,32,123,125,59,32,118,97,114,32,116,32,61,32,123,125,59,32,102,111,114,32,40,118,97,114,32,110,32,105,110,32,114,41,32,105,102,32,40,123,125,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,46,99,97,108,108,40,114,44,32,110,41,41,32,123,32,105,102,32,40,101,46,105,110,99,108,117,100,101,115,40,110,41,41,32,99,111,110,116,105,110,117,101,59,32,116,91,110,93,32,61,32,114,91,110,93,59,32,125,32,114,101,116,117,114,110,32,116,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,111,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,59,32,125,44,32,95,116,121,112,101,111,102,40,111,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,97,44,32,110,41,32,123,32,105,102,32,40,33,40,97,32,105,110,115,116,97,110,99,101,111,102,32,110,41,41,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,67,97,110,110,111,116,32,99,97,108,108,32,97,32,99,108,97,115,115,32,97,115,32,97,32,102,117,110,99,116,105,111,110,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,44,32,114,41,32,123,32,102,111,114,32,40,118,97,114,32,116,32,61,32,48,59,32,116,32,60,32,114,46,108,101,110,103,116,104,59,32,116,43,43,41,32,123,32,118,97,114,32,111,32,61,32,114,91,116,93,59,32,111,46,101,110,117,109,101,114,97,98,108,101,32,61,32,111,46,101,110,117,109,101,114,97,98,108,101,32,124,124,32,33,49,44,32,111,46,99,111,110,102,105,103,117,114,97,98,108,101,32,61,32,33,48,44,32,34,118,97,108,117,101,34,32,105,110,32,111,32,38,38,32,40,111,46,119,114,105,116,97,98,108,101,32,61,32,33,48,41,44,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,111,46,107,101,121,41,44,32,111,41,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,99,114,101,97,116,101,67,108,97,115,115,40,101,44,32,114,44,32,116,41,32,123,32,114,101,116,117,114,110,32,114,32,38,38,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,46,112,114,111,116,111,116,121,112,101,44,32,114,41,44,32,116,32,38,38,32,95,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,40,101,44,32,116,41,44,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,101,44,32,34,112,114,111,116,111,116,121,112,101,34,44,32,123,32,119,114,105,116,97,98,108,101,58,32,33,49,32,125,41,44,32,101,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,111,112,101,114,116,121,75,101,121,40,116,41,32,123,32,118,97,114,32,105,32,61,32,95,116,111,80,114,105,109,105,116,105,118,101,40,116,44,32,34,115,116,114,105,110,103,34,41,59,32,114,101,116,117,114,110,32,34,115,121,109,98,111,108,34,32,61,61,32,95,116,121,112,101,111,102,40,105,41,32,63,32,105,32,58,32,105,32,43,32,34,34,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,80,114,105,109,105,116,105,118,101,40,116,44,32,114,41,32,123,32,105,102,32,40,34,111,98,106,101,99,116,34,32,33,61,32,95,116,121,112,101,111,102,40,116,41,32,124,124,32,33,116,41,32,114,101,116,117,114,110,32,116,59,32,118,97,114,32,101,32,61,32,116,91,83,121,109,98,111,108,46,116,111,80,114,105,109,105,116,105,118,101,93,59,32,105,102,32,40,118,111,105,100,32,48,32,33,61,61,32,101,41,32,123,32,118,97,114,32,105,32,61,32,101,46,99,97,108,108,40,116,44,32,114,32,124,124,32,34,100,101,102,97,117,108,116,34,41,59,32,105,102,32,40,34,111,98,106,101,99,116,34,32,33,61,32,95,116,121,112,101,111,102,40,105,41,41,32,114,101,116,117,114,110,32,105,59,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,64,64,116,111,80,114,105,109,105,116,105,118,101,32,109,117,115,116,32,114,101,116,117,114,110,32,97,32,112,114,105,109,105,116,105,118,101,32,118,97,108,117,101,46,34,41,59,32,125,32,114,101,116,117,114,110,32,40,34,115,116,114,105,110,103,34,32,61,61,61,32,114,32,63,32,83,116,114,105,110,103,32,58,32,78,117,109,98,101,114,41,40,116,41,59,32,125,10,103,108,111,98,97,108,46,72,101,97,100,101,114,115,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,117,110,99,116,105,111,110,32,72,101,97,100,101,114,115,40,105,110,105,116,86,97,108,117,101,115,41,32,123,10,32,32,32,32,118,97,114,32,95,116,104,105,115,32,61,32,116,104,105,115,59,10,32,32,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,72,101,97,100,101,114,115,41,59,10,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,32,61,32,123,125,59,10,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,105,110,105,116,86,97,108,117,101,115,41,32,61,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,32,32,79,98,106,101,99,116,46,107,101,121,115,40,105,110,105,116,86,97,108,117,101,115,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,107,101,121,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,118,97,108,117,101,32,61,32,105,110,105,116,86,97,108,117,101,115,91,107,101,121,93,59,10,32,32,32,32,32,32,32,32,105,102,32,40,118,97,108,117,101,32,105,110,115,116,97,110,99,101,111,102,32,65,114,114,97,121,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,108,117,101,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,111,110,101,68,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,95,116,104,105,115,46,97,112,112,101,110,100,40,107,101,121,44,32,111,110,101,68,97,116,97,41,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,95,116,104,105,115,46,115,101,116,40,107,101,121,44,32,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,95,99,114,101,97,116,101,67,108,97,115,115,40,72,101,97,100,101,114,115,44,32,91,123,10,32,32,32,32,107,101,121,58,32,34,97,112,112,101,110,100,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,97,112,112,101,110,100,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,117,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,104,97,115,40,110,97,109,101,41,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,117,114,114,32,61,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,59,10,32,32,32,32,32,32,32,32,99,117,114,114,46,112,117,115,104,40,118,97,108,117,101,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,61,32,99,117,114,114,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,61,32,91,118,97,108,117,101,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,115,101,116,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,115,101,116,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,32,124,124,32,116,121,112,101,111,102,32,118,97,108,117,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,61,32,91,118,97,108,117,101,93,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,103,101,116,65,108,108,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,103,101,116,65,108,108,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,33,116,104,105,115,46,95,104,101,97,100,101,114,115,91,39,67,111,110,116,101,110,116,45,84,121,112,101,39,93,32,38,38,32,33,116,104,105,115,46,95,104,101,97,100,101,114,115,91,39,99,111,110,116,101,110,116,45,116,121,112,101,39,93,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,39,99,111,110,116,101,110,116,45,116,121,112,101,39,93,32,61,32,91,39,116,101,120,116,47,112,108,97,105,110,59,99,104,97,114,115,101,116,61,85,84,70,45,56,39,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,125,44,32,116,104,105,115,46,95,104,101,97,100,101,114,115,41,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,100,101,108,101,116,101,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,95,100,101,108,101,116,101,40,110,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,116,104,105,115,46,95,104,101,97,100,101,114,115,46,110,97,109,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,103,101,116,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,103,101,116,40,110,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,117,110,100,101,102,105,110,101,100,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,104,97,115,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,104,97,115,40,110,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,109,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,116,104,105,115,46,95,104,101,97,100,101,114,115,91,110,97,109,101,93,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,59,10,32,32,32,32,125,10,32,32,125,93,41,59,10,32,32,114,101,116,117,114,110,32,72,101,97,100,101,114,115,59,10,125,40,41,59,10,103,108,111,98,97,108,46,82,101,115,112,111,110,115,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,102,117,110,99,116,105,111,110,32,82,101,115,112,111,110,115,101,40,114,101,115,112,111,110,115,101,41,32,123,10,32,32,32,32,95,99,108,97,115,115,67,97,108,108,67,104,101,99,107,40,116,104,105,115,44,32,82,101,115,112,111,110,115,101,41,59,10,32,32,32,32,118,97,114,32,114,101,115,112,32,61,32,114,101,115,112,111,110,115,101,32,124,124,32,123,125,59,10,32,32,32,32,116,104,105,115,46,115,116,97,116,117,115,32,61,32,114,101,115,112,46,115,116,97,116,117,115,67,111,100,101,32,61,61,61,32,117,110,100,101,102,105,110,101,100,32,63,32,50,48,48,32,58,32,114,101,115,112,46,115,116,97,116,117,115,67,111,100,101,59,10,32,32,32,32,116,104,105,115,46,115,116,97,116,117,115,84,101,120,116,32,61,32,114,101,115,112,46,115,116,97,116,117,115,76,105,110,101,32,124,124,32,39,78,111,116,32,70,111,117,110,100,39,59,10,32,32,32,32,116,104,105,115,46,104,101,97,100,101,114,115,32,61,32,114,101,115,112,46,114,101,115,112,72,101,97,100,101,114,115,32,124,124,32,123,125,59,10,32,32,32,32,116,104,105,115,46,98,111,100,121,32,61,32,114,101,115,112,46,114,101,115,112,66,111,100,121,32,124,124,32,39,39,59,10,32,32,32,32,116,104,105,115,46,111,107,32,61,32,116,104,105,115,46,115,116,97,116,117,115,32,62,61,32,50,48,48,32,38,38,32,116,104,105,115,46,115,116,97,116,117,115,32,60,61,32,50,57,57,59,10,32,32,125,10,32,32,95,99,114,101,97,116,101,67,108,97,115,115,40,82,101,115,112,111,110,115,101,44,32,91,123,10,32,32,32,32,107,101,121,58,32,34,106,115,111,110,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,106,115,111,110,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,116,104,105,115,50,32,61,32,116,104,105,115,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,106,115,111,110,105,102,121,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,106,115,111,110,105,102,121,32,61,32,74,83,79,78,46,112,97,114,115,101,40,95,116,104,105,115,50,46,98,111,100,121,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,106,115,111,110,105,102,121,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,110,101,119,32,69,114,114,111,114,40,39,101,114,114,111,114,32,112,97,114,115,105,110,103,32,111,98,106,101,99,116,39,41,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,44,32,123,10,32,32,32,32,107,101,121,58,32,34,116,101,120,116,34,44,10,32,32,32,32,118,97,108,117,101,58,32,102,117,110,99,116,105,111,110,32,116,101,120,116,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,116,104,105,115,46,98,111,100,121,41,59,10,32,32,32,32,125,10,32,32,125,93,41,59,10,32,32,114,101,116,117,114,110,32,82,101,115,112,111,110,115,101,59,10,125,40,41,59,10,118,97,114,32,109,101,116,104,111,100,115,32,61,32,91,39,68,69,76,69,84,69,39,44,32,39,71,69,84,39,44,32,39,72,69,65,68,39,44,32,39,79,80,84,73,79,78,83,39,44,32,39,80,79,83,84,39,44,32,39,80,85,84,39,93,59,10,102,117,110,99,116,105,111,110,32,110,111,114,109,97,108,105,122,101,77,101,116,104,111,100,40,109,101,116,104,111,100,41,32,123,10,32,32,118,97,114,32,117,112,67,97,115,101,100,32,61,32,109,101,116,104,111,100,46,116,111,85,112,112,101,114,67,97,115,101,40,41,59,10,32,32,114,101,116,117,114,110,32,109,101,116,104,111,100,115,46,105,110,100,101,120,79,102,40,117,112,67,97,115,101,100,41,32,62,32,45,49,32,63,32,117,112,67,97,115,101,100,32,58,32,109,101,116,104,111,100,59,10,125,10,103,108,111,98,97,108,46,102,101,116,99,104,32,61,32,102,117,110,99,116,105,111,110,32,40,117,114,108,44,32,111,112,116,105,111,110,115,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,117,114,108,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,69,114,114,111,114,40,39,111,110,108,121,32,83,116,114,105,110,103,32,117,114,108,32,115,117,112,112,111,114,116,101,100,39,41,41,59,10,32,32,125,10,32,32,118,97,114,32,95,114,101,102,32,61,32,111,112,116,105,111,110,115,32,124,124,32,123,125,44,10,32,32,32,32,109,101,116,104,111,100,32,61,32,95,114,101,102,46,109,101,116,104,111,100,44,10,32,32,32,32,104,101,97,100,101,114,115,32,61,32,95,114,101,102,46,104,101,97,100,101,114,115,44,10,32,32,32,32,98,111,100,121,32,61,32,95,114,101,102,46,98,111,100,121,44,10,32,32,32,32,111,116,104,101,114,79,112,116,105,111,110,115,32,61,32,95,111,98,106,101,99,116,87,105,116,104,111,117,116,80,114,111,112,101,114,116,105,101,115,40,95,114,101,102,44,32,95,101,120,99,108,117,100,101,100,41,59,10,32,32,118,97,114,32,114,101,113,72,101,97,100,115,32,61,32,123,125,59,10,32,32,105,102,32,40,104,101,97,100,101,114,115,41,32,123,10,32,32,32,32,105,102,32,40,104,101,97,100,101,114,115,32,105,110,115,116,97,110,99,101,111,102,32,103,108,111,98,97,108,46,72,101,97,100,101,114,115,41,32,123,10,32,32,32,32,32,32,114,101,113,72,101,97,100,115,32,61,32,104,101,97,100,101,114,115,46,103,101,116,65,108,108,40,41,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,104,101,97,100,101,114,115,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,79,98,106,101,99,116,41,32,123,10,32,32,32,32,32,32,118,97,114,32,104,101,97,100,101,114,115,73,110,115,116,97,110,99,101,32,61,32,110,101,119,32,103,108,111,98,97,108,46,72,101,97,100,101,114,115,40,104,101,97,100,101,114,115,41,59,10,32,32,32,32,32,32,114,101,113,72,101,97,100,115,32,61,32,104,101,97,100,101,114,115,73,110,115,116,97,110,99,101,46,103,101,116,65,108,108,40,41,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,110,101,119,32,69,114,114,111,114,40,39,79,110,108,121,32,72,101,97,100,101,114,115,32,105,110,115,116,97,110,99,101,32,111,114,32,97,32,112,117,114,101,32,111,98,106,101,99,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,102,111,114,32,104,101,97,100,101,114,115,32,111,112,116,105,111,110,39,41,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,118,97,114,32,114,101,113,79,112,116,105,111,110,115,32,61,32,95,111,98,106,101,99,116,83,112,114,101,97,100,40,123,10,32,32,32,32,117,114,108,58,32,117,114,108,44,10,32,32,32,32,109,101,116,104,111,100,58,32,110,111,114,109,97,108,105,122,101,77,101,116,104,111,100,40,109,101,116,104,111,100,32,124,124,32,39,71,69,84,39,41,44,10,32,32,32,32,104,101,97,100,101,114,115,58,32,114,101,113,72,101,97,100,115,32,124,124,32,123,125,44,10,32,32,32,32,98,111,100,121,58,32,98,111,100,121,32,124,124,32,39,39,10,32,32,125,44,32,111,116,104,101,114,79,112,116,105,111,110,115,41,59,10,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,61,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,110,101,116,119,111,114,107,39,44,32,39,102,101,116,99,104,39,44,32,114,101,113,79,112,116,105,111,110,115,41,59,10,32,32,32,32,114,101,115,117,108,116,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,114,101,115,112,41,32,123,10,32,32,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,114,101,115,112,41,32,61,61,61,32,39,111,98,106,101,99,116,39,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,114,101,115,112,111,110,115,101,68,97,116,97,32,61,32,110,101,119,32,103,108,111,98,97,108,46,82,101,115,112,111,110,115,101,40,114,101,115,112,41,59,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,114,101,115,112,111,110,115,101,68,97,116,97,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,114,101,115,112,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,41,46,99,97,116,99,104,40,102,117,110,99,116,105,111,110,32,40,101,41,32,123,10,32,32,32,32,32,32,114,101,106,101,99,116,40,101,41,59,10,32,32,32,32,125,41,59,10,32,32,125,41,59,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_Storage[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,99,111,110,118,101,114,116,69,114,114,111,114,32,61,32,102,117,110,99,116,105,111,110,32,99,111,110,118,101,114,116,69,114,114,111,114,40,101,114,114,111,114,41,32,123,10,32,32,105,102,32,40,33,101,114,114,111,114,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,118,97,114,32,111,117,116,32,61,32,110,101,119,32,69,114,114,111,114,40,101,114,114,111,114,46,109,101,115,115,97,103,101,41,59,10,32,32,111,117,116,46,107,101,121,32,61,32,101,114,114,111,114,46,107,101,121,59,10,32,32,114,101,116,117,114,110,32,111,117,116,59,10,125,59,10,118,97,114,32,99,111,110,118,101,114,116,69,114,114,111,114,115,32,61,32,102,117,110,99,116,105,111,110,32,99,111,110,118,101,114,116,69,114,114,111,114,115,40,101,114,114,115,41,32,123,10,32,32,105,102,32,40,33,101,114,114,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,118,97,114,32,116,97,114,103,101,116,69,114,114,111,114,59,10,32,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,101,114,114,115,41,41,32,123,10,32,32,32,32,116,97,114,103,101,116,69,114,114,111,114,32,61,32,101,114,114,115,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,116,97,114,103,101,116,69,114,114,111,114,32,61,32,91,101,114,114,115,93,59,10,32,32,125,10,32,32,105,102,32,40,116,97,114,103,101,116,69,114,114,111,114,41,32,123,10,32,32,32,32,116,97,114,103,101,116,69,114,114,111,114,46,109,97,112,40,102,117,110,99,116,105,111,110,32,40,101,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,111,110,118,101,114,116,69,114,114,111,114,40,101,41,59,10,32,32,32,32,125,41,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,116,97,114,103,101,116,69,114,114,111,114,59,10,125,59,10,72,105,112,112,121,46,97,115,121,110,99,83,116,111,114,97,103,101,32,61,32,123,10,32,32,103,101,116,65,108,108,75,101,121,115,58,32,102,117,110,99,116,105,111,110,32,103,101,116,65,108,108,75,101,121,115,40,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,103,101,116,65,108,108,75,101,121,115,39,41,59,10,32,32,125,44,10,32,32,115,101,116,73,116,101,109,58,32,102,117,110,99,116,105,111,110,32,115,101,116,73,116,101,109,40,107,101,121,44,32,118,97,108,117,101,65,114,103,41,32,123,10,32,32,32,32,118,97,114,32,118,97,108,117,101,32,61,32,118,97,108,117,101,65,114,103,59,10,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,118,97,108,117,101,32,33,61,61,32,39,115,116,114,105,110,103,39,41,32,123,10,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,118,97,108,117,101,32,61,32,118,97,108,117,101,46,116,111,83,116,114,105,110,103,40,41,59,10,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,114,114,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,101,114,114,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,83,101,116,39,44,32,91,91,107,101,121,44,32,118,97,108,117,101,93,93,41,59,10,32,32,125,44,10,32,32,103,101,116,73,116,101,109,58,32,102,117,110,99,116,105,111,110,32,103,101,116,73,116,101,109,40,107,101,121,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,71,101,116,39,44,32,91,107,101,121,93,41,46,116,104,101,110,40,102,117,110,99,116,105,111,110,32,40,114,41,32,123,10,32,32,32,32,32,32,105,102,32,40,33,114,32,124,124,32,33,114,91,48,93,32,124,124,32,33,114,91,48,93,91,49,93,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,114,91,48,93,91,49,93,59,10,32,32,32,32,125,41,46,99,97,116,99,104,40,102,117,110,99,116,105,111,110,32,40,101,114,114,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,111,110,118,101,114,116,69,114,114,111,114,115,40,101,114,114,41,59,10,32,32,32,32,125,41,59,10,32,32,125,44,10,32,32,114,101,109,111,118,101,73,116,101,109,58,32,102,117,110,99,116,105,111,110,32,114,101,109,111,118,101,73,116,101,109,40,107,101,121,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,82,101,109,111,118,101,39,44,32,91,107,101,121,93,41,59,10,32,32,125,44,10,32,32,109,117,108,116,105,71,101,116,58,32,102,117,110,99,116,105,111,110,32,109,117,108,116,105,71,101,116,40,107,101,121,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,71,101,116,39,44,32,107,101,121,115,41,59,10,32,32,125,44,10,32,32,109,117,108,116,105,83,101,116,58,32,102,117,110,99,116,105,111,110,32,109,117,108,116,105,83,101,116,40,107,101,121,86,97,108,117,101,80,97,105,114,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,83,101,116,39,44,32,107,101,121,86,97,108,117,101,80,97,105,114,115,41,59,10,32,32,125,44,10,32,32,109,117,108,116,105,82,101,109,111,118,101,58,32,102,117,110,99,116,105,111,110,32,109,117,108,116,105,82,101,109,111,118,101,40,107,101,121,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,80,114,111,109,105,115,101,40,39,83,116,111,114,97,103,101,77,111,100,117,108,101,39,44,32,39,109,117,108,116,105,82,101,109,111,118,101,39,44,32,107,101,121,115,41,59,10,32,32,125,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_Dimensions[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,118,97,114,32,110,97,116,105,118,101,87,105,110,100,111,119,59,10,32,32,118,97,114,32,110,97,116,105,118,101,83,99,114,101,101,110,59,10,32,32,105,102,32,40,103,108,111,98,97,108,46,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,41,32,123,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,119,105,110,100,111,119,59,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,115,99,114,101,101,110,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,119,105,110,100,111,119,80,104,121,115,105,99,97,108,80,105,120,101,108,115,59,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,32,61,32,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,46,115,99,114,101,101,110,80,104,121,115,105,99,97,108,80,105,120,101,108,115,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,58,32,110,97,116,105,118,101,87,105,110,100,111,119,44,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,58,32,110,97,116,105,118,101,83,99,114,101,101,110,10,32,32,125,59,10,125,10,102,117,110,99,116,105,111,110,32,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,118,97,114,32,119,105,110,100,111,119,32,61,32,123,125,59,10,32,32,118,97,114,32,115,99,114,101,101,110,32,61,32,123,125,59,10,32,32,118,97,114,32,95,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,32,61,32,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,44,10,32,32,32,32,110,97,116,105,118,101,87,105,110,100,111,119,32,61,32,95,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,46,110,97,116,105,118,101,87,105,110,100,111,119,44,10,32,32,32,32,110,97,116,105,118,101,83,99,114,101,101,110,32,61,32,95,116,114,97,110,115,102,101,114,84,111,85,110,105,102,105,101,100,68,105,109,46,110,97,116,105,118,101,83,99,114,101,101,110,59,10,32,32,105,102,32,40,110,97,116,105,118,101,87,105,110,100,111,119,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,32,63,32,119,105,110,100,111,119,32,61,32,110,97,116,105,118,101,87,105,110,100,111,119,32,58,32,119,105,110,100,111,119,32,61,32,123,10,32,32,32,32,32,32,119,105,100,116,104,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,119,105,100,116,104,44,10,32,32,32,32,32,32,104,101,105,103,104,116,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,104,101,105,103,104,116,44,10,32,32,32,32,32,32,115,99,97,108,101,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,115,99,97,108,101,44,10,32,32,32,32,32,32,102,111,110,116,83,99,97,108,101,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,102,111,110,116,83,99,97,108,101,44,10,32,32,32,32,32,32,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,44,10,32,32,32,32,32,32,110,97,118,105,103,97,116,111,114,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,87,105,110,100,111,119,46,110,97,118,105,103,97,116,105,111,110,66,97,114,72,101,105,103,104,116,10,32,32,32,32,125,59,10,32,32,125,10,32,32,105,102,32,40,110,97,116,105,118,101,83,99,114,101,101,110,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,79,83,32,61,61,61,32,39,105,111,115,39,32,63,32,115,99,114,101,101,110,32,61,32,110,97,116,105,118,101,83,99,114,101,101,110,32,58,32,115,99,114,101,101,110,32,61,32,123,10,32,32,32,32,32,32,119,105,100,116,104,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,119,105,100,116,104,44,10,32,32,32,32,32,32,104,101,105,103,104,116,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,104,101,105,103,104,116,44,10,32,32,32,32,32,32,115,99,97,108,101,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,115,99,97,108,101,44,10,32,32,32,32,32,32,102,111,110,116,83,99,97,108,101,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,102,111,110,116,83,99,97,108,101,44,10,32,32,32,32,32,32,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,115,116,97,116,117,115,66,97,114,72,101,105,103,104,116,44,10,32,32,32,32,32,32,110,97,118,105,103,97,116,111,114,66,97,114,72,101,105,103,104,116,58,32,110,97,116,105,118,101,83,99,114,101,101,110,46,110,97,118,105,103,97,116,105,111,110,66,97,114,72,101,105,103,104,116,10,32,32,32,32,125,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,119,105,110,100,111,119,58,32,119,105,110,100,111,119,44,10,32,32,32,32,115,99,114,101,101,110,58,32,115,99,114,101,101,110,10,32,32,125,59,10,125,10,118,97,114,32,68,105,109,101,110,115,105,111,110,115,32,61,32,123,10,32,32,103,101,116,58,32,102,117,110,99,116,105,111,110,32,103,101,116,40,107,101,121,41,32,123,10,32,32,32,32,118,97,114,32,100,101,118,105,99,101,32,61,32,72,105,112,112,121,46,100,101,118,105,99,101,32,124,124,32,123,125,59,10,32,32,32,32,114,101,116,117,114,110,32,100,101,118,105,99,101,91,107,101,121,93,59,10,32,32,125,44,10,32,32,115,101,116,58,32,102,117,110,99,116,105,111,110,32,115,101,116,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,32,32,105,102,32,40,33,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,118,97,114,32,95,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,32,61,32,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,110,115,40,110,97,116,105,118,101,68,105,109,101,110,115,105,111,110,115,41,44,10,32,32,32,32,32,32,119,105,110,100,111,119,32,61,32,95,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,46,119,105,110,100,111,119,44,10,32,32,32,32,32,32,115,99,114,101,101,110,32,61,32,95,103,101,116,80,114,111,99,101,115,115,101,100,68,105,109,101,110,115,105,111,46,115,99,114,101,101,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,119,105,110,100,111,119,32,61,32,119,105,110,100,111,119,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,115,99,114,101,101,110,32,61,32,115,99,114,101,101,110,59,10,32,32,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,112,105,120,101,108,82,97,116,105,111,32,61,32,72,105,112,112,121,46,100,101,118,105,99,101,46,119,105,110,100,111,119,46,115,99,97,108,101,59,10,32,32,125,44,10,32,32,105,110,105,116,58,32,102,117,110,99,116,105,111,110,32,105,110,105,116,40,41,32,123,10,32,32,32,32,116,104,105,115,46,115,101,116,40,95,95,72,73,80,80,89,78,65,84,73,86,69,71,76,79,66,65,76,95,95,46,68,105,109,101,110,115,105,111,110,115,41,59,10,32,32,125,10,125,59,10,68,105,109,101,110,115,105,111,110,115,46,105,110,105,116,40,41,59,10,95,95,71,76,79,66,65,76,95,95,46,106,115,77,111,100,117,108,101,76,105,115,116,32,61,32,123,10,32,32,68,105,109,101,110,115,105,111,110,115,58,32,68,105,109,101,110,115,105,111,110,115,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_UtilsModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,105,102,32,40,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,61,61,32,39,97,110,100,114,111,105,100,39,41,32,123,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,118,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,112,97,116,116,101,114,110,44,32,114,101,112,101,97,116,41,32,123,10,32,32,32,32,118,97,114,32,95,112,97,116,116,101,114,110,32,61,32,112,97,116,116,101,114,110,59,10,32,32,32,32,118,97,114,32,95,114,101,112,101,97,116,32,61,32,114,101,112,101,97,116,59,10,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,112,97,116,116,101,114,110,32,61,61,61,32,39,110,117,109,98,101,114,39,41,32,123,10,32,32,32,32,32,32,95,112,97,116,116,101,114,110,32,61,32,91,48,44,32,112,97,116,116,101,114,110,93,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,114,101,112,101,97,116,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,32,123,10,32,32,32,32,32,32,95,114,101,112,101,97,116,32,61,32,45,49,59,10,32,32,32,32,125,10,32,32,32,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,40,39,85,116,105,108,115,77,111,100,117,108,101,39,44,32,39,118,105,98,114,97,116,101,39,44,32,116,114,117,101,44,32,95,112,97,116,116,101,114,110,44,32,95,114,101,112,101,97,116,41,59,10,32,32,125,59,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,99,97,110,99,101,108,86,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,87,105,116,104,67,97,108,108,98,97,99,107,73,100,40,39,85,116,105,108,115,77,111,100,117,108,101,39,44,32,39,99,97,110,99,101,108,39,44,32,116,114,117,101,41,59,10,32,32,125,59,10,125,32,101,108,115,101,32,105,102,32,40,72,105,112,112,121,46,100,101,118,105,99,101,46,112,108,97,116,102,111,114,109,46,79,83,32,61,61,61,32,39,105,111,115,39,41,32,123,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,118,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,125,59,10,32,32,72,105,112,112,121,46,100,101,118,105,99,101,46,99,97,110,99,101,108,86,105,98,114,97,116,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,125,59,10,125,125,41,59,0 }; // NOLINT + const uint8_t k_global[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,115,108,105,99,101,100,84,111,65,114,114,97,121,40,114,44,32,101,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,72,111,108,101,115,40,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,76,105,109,105,116,40,114,44,32,101,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,44,32,101,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,82,101,115,116,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,82,101,115,116,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,100,101,115,116,114,117,99,116,117,114,101,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,76,105,109,105,116,40,114,44,32,108,41,32,123,32,118,97,114,32,116,32,61,32,110,117,108,108,32,61,61,32,114,32,63,32,110,117,108,108,32,58,32,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,124,124,32,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,59,32,105,102,32,40,110,117,108,108,32,33,61,32,116,41,32,123,32,118,97,114,32,101,44,32,110,44,32,105,44,32,117,44,32,97,32,61,32,91,93,44,32,102,32,61,32,33,48,44,32,111,32,61,32,33,49,59,32,116,114,121,32,123,32,105,102,32,40,105,32,61,32,40,116,32,61,32,116,46,99,97,108,108,40,114,41,41,46,110,101,120,116,44,32,48,32,61,61,61,32,108,41,32,123,32,105,102,32,40,79,98,106,101,99,116,40,116,41,32,33,61,61,32,116,41,32,114,101,116,117,114,110,59,32,102,32,61,32,33,49,59,32,125,32,101,108,115,101,32,102,111,114,32,40,59,32,33,40,102,32,61,32,40,101,32,61,32,105,46,99,97,108,108,40,116,41,41,46,100,111,110,101,41,32,38,38,32,40,97,46,112,117,115,104,40,101,46,118,97,108,117,101,41,44,32,97,46,108,101,110,103,116,104,32,33,61,61,32,108,41,59,32,102,32,61,32,33,48,41,59,32,125,32,99,97,116,99,104,32,40,114,41,32,123,32,111,32,61,32,33,48,44,32,110,32,61,32,114,59,32,125,32,102,105,110,97,108,108,121,32,123,32,116,114,121,32,123,32,105,102,32,40,33,102,32,38,38,32,110,117,108,108,32,33,61,32,116,46,114,101,116,117,114,110,32,38,38,32,40,117,32,61,32,116,46,114,101,116,117,114,110,40,41,44,32,79,98,106,101,99,116,40,117,41,32,33,61,61,32,117,41,41,32,114,101,116,117,114,110,59,32,125,32,102,105,110,97,108,108,121,32,123,32,105,102,32,40,111,41,32,116,104,114,111,119,32,110,59,32,125,32,125,32,114,101,116,117,114,110,32,97,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,72,111,108,101,115,40,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,114,41,41,32,114,101,116,117,114,110,32,114,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,114,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,123,32,105,102,32,40,114,41,32,123,32,105,102,32,40,34,115,116,114,105,110,103,34,32,61,61,32,116,121,112,101,111,102,32,114,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,59,32,118,97,114,32,116,32,61,32,123,125,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,114,41,46,115,108,105,99,101,40,56,44,32,45,49,41,59,32,114,101,116,117,114,110,32,34,79,98,106,101,99,116,34,32,61,61,61,32,116,32,38,38,32,114,46,99,111,110,115,116,114,117,99,116,111,114,32,38,38,32,40,116,32,61,32,114,46,99,111,110,115,116,114,117,99,116,111,114,46,110,97,109,101,41,44,32,34,77,97,112,34,32,61,61,61,32,116,32,124,124,32,34,83,101,116,34,32,61,61,61,32,116,32,63,32,65,114,114,97,121,46,102,114,111,109,40,114,41,32,58,32,34,65,114,103,117,109,101,110,116,115,34,32,61,61,61,32,116,32,124,124,32,47,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,47,46,116,101,115,116,40,116,41,32,63,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,58,32,118,111,105,100,32,48,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,123,32,105,102,32,40,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,110,117,108,108,32,33,61,32,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,124,124,32,110,117,108,108,32,33,61,32,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,114,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,123,32,40,110,117,108,108,32,61,61,32,97,32,124,124,32,97,32,62,32,114,46,108,101,110,103,116,104,41,32,38,38,32,40,97,32,61,32,114,46,108,101,110,103,116,104,41,59,32,102,111,114,32,40,118,97,114,32,101,32,61,32,48,44,32,110,32,61,32,65,114,114,97,121,40,97,41,59,32,101,32,60,32,97,59,32,101,43,43,41,32,110,91,101,93,32,61,32,114,91,101,93,59,32,114,101,116,117,114,110,32,110,59,32,125,10,102,117,110,99,116,105,111,110,32,95,116,121,112,101,111,102,40,111,41,32,123,32,34,64,98,97,98,101,108,47,104,101,108,112,101,114,115,32,45,32,116,121,112,101,111,102,34,59,32,114,101,116,117,114,110,32,95,116,121,112,101,111,102,32,61,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,34,115,121,109,98,111,108,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,32,63,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,116,121,112,101,111,102,32,111,59,32,125,32,58,32,102,117,110,99,116,105,111,110,32,40,111,41,32,123,32,114,101,116,117,114,110,32,111,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,111,46,99,111,110,115,116,114,117,99,116,111,114,32,61,61,61,32,83,121,109,98,111,108,32,38,38,32,111,32,33,61,61,32,83,121,109,98,111,108,46,112,114,111,116,111,116,121,112,101,32,63,32,34,115,121,109,98,111,108,34,32,58,32,116,121,112,101,111,102,32,111,59,32,125,44,32,95,116,121,112,101,111,102,40,111,41,59,32,125,10,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,73,100,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,109,111,100,117,108,101,67,97,108,108,76,105,115,116,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,116,114,117,101,59,10,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,61,32,48,59,10,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,32,61,32,123,125,59,10,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,32,61,32,91,91,93,44,32,91,93,44,32,91,93,44,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,93,59,10,95,95,71,76,79,66,65,76,95,95,46,97,114,114,97,121,67,111,110,116,97,105,110,115,32,61,32,102,117,110,99,116,105,111,110,32,40,97,114,114,97,121,44,32,118,97,108,117,101,41,32,123,10,32,32,114,101,116,117,114,110,32,97,114,114,97,121,46,105,110,100,101,120,79,102,40,118,97,108,117,101,41,32,33,61,61,32,45,49,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,100,101,102,105,110,101,76,97,122,121,79,98,106,101,99,116,80,114,111,112,101,114,116,121,32,61,32,102,117,110,99,116,105,111,110,32,40,111,98,106,101,99,116,44,32,110,97,109,101,44,32,100,101,115,99,114,105,112,116,111,114,41,32,123,10,32,32,118,97,114,32,103,101,116,32,61,32,100,101,115,99,114,105,112,116,111,114,46,103,101,116,59,10,32,32,118,97,114,32,101,110,117,109,101,114,97,98,108,101,32,61,32,100,101,115,99,114,105,112,116,111,114,46,101,110,117,109,101,114,97,98,108,101,32,33,61,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,119,114,105,116,97,98,108,101,32,61,32,100,101,115,99,114,105,112,116,111,114,46,119,114,105,116,97,98,108,101,32,33,61,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,118,97,108,117,101,59,10,32,32,118,97,114,32,118,97,108,117,101,83,101,116,32,61,32,102,97,108,115,101,59,10,32,32,118,97,114,32,115,101,116,86,97,108,117,101,32,61,32,102,117,110,99,116,105,111,110,32,115,101,116,86,97,108,117,101,40,110,101,119,86,97,108,117,101,41,32,123,10,32,32,32,32,118,97,108,117,101,32,61,32,110,101,119,86,97,108,117,101,59,10,32,32,32,32,118,97,108,117,101,83,101,116,32,61,32,116,114,117,101,59,10,32,32,32,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,111,98,106,101,99,116,44,32,110,97,109,101,44,32,123,10,32,32,32,32,32,32,118,97,108,117,101,58,32,110,101,119,86,97,108,117,101,44,10,32,32,32,32,32,32,99,111,110,102,105,103,117,114,97,98,108,101,58,32,116,114,117,101,44,10,32,32,32,32,32,32,101,110,117,109,101,114,97,98,108,101,58,32,101,110,117,109,101,114,97,98,108,101,44,10,32,32,32,32,32,32,119,114,105,116,97,98,108,101,58,32,119,114,105,116,97,98,108,101,10,32,32,32,32,125,41,59,10,32,32,125,59,10,32,32,118,97,114,32,103,101,116,86,97,108,117,101,32,61,32,102,117,110,99,116,105,111,110,32,103,101,116,86,97,108,117,101,40,41,32,123,10,32,32,32,32,105,102,32,40,33,118,97,108,117,101,83,101,116,41,32,123,10,32,32,32,32,32,32,115,101,116,86,97,108,117,101,40,103,101,116,40,41,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,118,97,108,117,101,59,10,32,32,125,59,10,32,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,111,98,106,101,99,116,44,32,110,97,109,101,44,32,123,10,32,32,32,32,103,101,116,58,32,103,101,116,86,97,108,117,101,44,10,32,32,32,32,115,101,116,58,32,115,101,116,86,97,108,117,101,44,10,32,32,32,32,99,111,110,102,105,103,117,114,97,98,108,101,58,32,116,114,117,101,44,10,32,32,32,32,101,110,117,109,101,114,97,98,108,101,58,32,101,110,117,109,101,114,97,98,108,101,10,32,32,125,41,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,101,110,113,117,101,117,101,78,97,116,105,118,101,67,97,108,108,32,61,32,102,117,110,99,116,105,111,110,32,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,112,97,114,97,109,115,44,32,111,110,83,117,99,99,101,115,115,44,32,111,110,70,97,105,108,41,32,123,10,32,32,105,102,32,40,111,110,83,117,99,99,101,115,115,32,124,124,32,111,110,70,97,105,108,41,32,123,10,32,32,32,32,105,102,32,40,95,116,121,112,101,111,102,40,112,97,114,97,109,115,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,38,38,32,112,97,114,97,109,115,46,108,101,110,103,116,104,32,62,32,48,32,38,38,32,95,116,121,112,101,111,102,40,112,97,114,97,109,115,91,48,93,41,32,61,61,61,32,39,111,98,106,101,99,116,39,32,38,38,32,112,97,114,97,109,115,91,48,93,46,110,111,116,68,101,108,101,116,101,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,115,46,115,104,105,102,116,40,41,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,91,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,93,32,61,32,116,114,117,101,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,111,110,83,117,99,99,101,115,115,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,115,46,112,117,115,104,40,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,41,59,10,32,32,32,32,125,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,93,32,61,32,111,110,83,117,99,99,101,115,115,59,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,32,32,105,102,32,40,111,110,70,97,105,108,41,32,123,10,32,32,32,32,32,32,112,97,114,97,109,115,46,112,117,115,104,40,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,41,59,10,32,32,32,32,125,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,93,32,61,32,111,110,70,97,105,108,59,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,125,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,32,43,61,32,49,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,91,48,93,46,112,117,115,104,40,109,111,100,117,108,101,73,68,41,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,91,49,93,46,112,117,115,104,40,109,101,116,104,111,100,73,68,41,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,91,50,93,46,112,117,115,104,40,112,97,114,97,109,115,41,59,10,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,116,105,118,101,70,108,117,115,104,81,117,101,117,101,73,109,109,101,100,105,97,116,101,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,32,32,118,97,114,32,111,114,105,103,105,110,97,108,81,117,101,117,101,32,61,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,41,59,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,32,61,32,91,91,93,44,32,91,93,44,32,91,93,44,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,93,59,10,32,32,32,32,110,97,116,105,118,101,70,108,117,115,104,81,117,101,117,101,73,109,109,101,100,105,97,116,101,40,111,114,105,103,105,110,97,108,81,117,101,117,101,41,59,10,32,32,125,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,32,61,32,102,117,110,99,116,105,111,110,32,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,32,123,10,32,32,105,102,32,40,33,99,111,110,102,105,103,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,125,10,32,32,118,97,114,32,95,99,111,110,102,105,103,32,61,32,95,115,108,105,99,101,100,84,111,65,114,114,97,121,40,99,111,110,102,105,103,44,32,53,41,44,10,32,32,32,32,109,111,100,117,108,101,78,97,109,101,32,61,32,95,99,111,110,102,105,103,91,48,93,44,10,32,32,32,32,99,111,110,115,116,97,110,116,115,32,61,32,95,99,111,110,102,105,103,91,49,93,44,10,32,32,32,32,109,101,116,104,111,100,115,32,61,32,95,99,111,110,102,105,103,91,50,93,44,10,32,32,32,32,112,114,111,109,105,115,101,77,101,116,104,111,100,115,32,61,32,95,99,111,110,102,105,103,91,51,93,44,10,32,32,32,32,115,121,110,99,77,101,116,104,111,100,115,32,61,32,95,99,111,110,102,105,103,91,52,93,59,10,32,32,105,102,32,40,33,99,111,110,115,116,97,110,116,115,32,38,38,32,33,109,101,116,104,111,100,115,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,110,97,109,101,58,32,109,111,100,117,108,101,78,97,109,101,10,32,32,32,32,125,59,10,32,32,125,10,32,32,118,97,114,32,109,111,100,117,108,101,32,61,32,123,125,59,10,32,32,105,102,32,40,109,101,116,104,111,100,115,41,32,123,10,32,32,32,32,109,101,116,104,111,100,115,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,109,101,116,104,111,100,78,97,109,101,44,32,109,101,116,104,111,100,73,68,41,32,123,10,32,32,32,32,32,32,118,97,114,32,105,115,80,114,111,109,105,115,101,32,61,32,112,114,111,109,105,115,101,77,101,116,104,111,100,115,32,38,38,32,95,95,71,76,79,66,65,76,95,95,46,97,114,114,97,121,67,111,110,116,97,105,110,115,40,112,114,111,109,105,115,101,77,101,116,104,111,100,115,44,32,109,101,116,104,111,100,73,68,41,59,10,32,32,32,32,32,32,118,97,114,32,105,115,83,121,110,99,32,61,32,115,121,110,99,77,101,116,104,111,100,115,32,38,38,32,95,95,71,76,79,66,65,76,95,95,46,97,114,114,97,121,67,111,110,116,97,105,110,115,40,115,121,110,99,77,101,116,104,111,100,115,44,32,109,101,116,104,111,100,73,68,41,59,10,32,32,32,32,32,32,118,97,114,32,109,101,116,104,111,100,84,121,112,101,32,61,32,39,97,115,121,110,99,39,59,10,32,32,32,32,32,32,105,102,32,40,105,115,80,114,111,109,105,115,101,41,32,123,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,84,121,112,101,32,61,32,39,112,114,111,109,105,115,101,39,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,105,115,83,121,110,99,41,32,123,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,84,121,112,101,32,61,32,39,115,121,110,99,39,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,109,111,100,117,108,101,91,109,101,116,104,111,100,78,97,109,101,93,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,101,116,104,111,100,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,109,101,116,104,111,100,84,121,112,101,41,59,10,32,32,32,32,125,41,59,10,32,32,125,10,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,109,111,100,117,108,101,44,32,99,111,110,115,116,97,110,116,115,41,59,10,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,110,97,109,101,58,32,109,111,100,117,108,101,78,97,109,101,44,10,32,32,32,32,109,111,100,117,108,101,58,32,109,111,100,117,108,101,10,32,32,125,59,10,125,59,10,103,108,111,98,97,108,46,95,95,102,98,71,101,110,78,97,116,105,118,101,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,59,10,95,95,71,76,79,66,65,76,95,95,46,108,111,97,100,77,111,100,117,108,101,32,61,32,102,117,110,99,116,105,111,110,32,40,110,97,109,101,44,32,109,111,100,117,108,101,73,68,41,32,123,10,32,32,105,102,32,40,116,121,112,101,111,102,32,110,97,116,105,118,101,82,101,113,117,105,114,101,77,111,100,117,108,101,67,111,110,102,105,103,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,32,32,118,97,114,32,99,111,110,102,105,103,32,61,32,110,97,116,105,118,101,82,101,113,117,105,114,101,77,111,100,117,108,101,67,111,110,102,105,103,40,110,97,109,101,41,59,10,32,32,32,32,118,97,114,32,105,110,102,111,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,59,10,32,32,32,32,114,101,116,117,114,110,32,105,110,102,111,32,38,38,32,105,110,102,111,46,109,111,100,117,108,101,59,10,32,32,125,10,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,101,116,104,111,100,32,61,32,102,117,110,99,116,105,111,110,32,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,116,121,112,101,41,32,123,10,32,32,118,97,114,32,102,110,59,10,32,32,105,102,32,40,116,121,112,101,32,61,61,61,32,39,112,114,111,109,105,115,101,39,41,32,123,10,32,32,32,32,102,110,32,61,32,102,117,110,99,116,105,111,110,32,102,110,40,41,32,123,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,101,110,113,117,101,117,101,78,97,116,105,118,101,67,97,108,108,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,97,114,103,115,44,32,102,117,110,99,116,105,111,110,32,40,100,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,97,116,97,41,59,10,32,32,32,32,32,32,32,32,125,44,32,102,117,110,99,116,105,111,110,32,40,101,114,114,111,114,68,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,114,114,111,114,68,97,116,97,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,59,10,32,32,125,32,101,108,115,101,32,105,102,32,40,116,121,112,101,32,61,61,61,32,39,115,121,110,99,39,41,32,123,10,32,32,32,32,102,110,32,61,32,102,117,110,99,116,105,111,110,32,102,110,40,41,32,123,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,50,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,50,41,44,32,95,107,101,121,50,32,61,32,48,59,32,95,107,101,121,50,32,60,32,95,108,101,110,50,59,32,95,107,101,121,50,43,43,41,32,123,10,32,32,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,50,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,50,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,110,97,116,105,118,101,67,97,108,108,83,121,110,99,72,111,111,107,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,97,114,103,115,41,59,10,32,32,32,32,125,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,102,110,32,61,32,102,117,110,99,116,105,111,110,32,102,110,40,41,32,123,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,51,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,51,41,44,32,95,107,101,121,51,32,61,32,48,59,32,95,107,101,121,51,32,60,32,95,108,101,110,51,59,32,95,107,101,121,51,43,43,41,32,123,10,32,32,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,51,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,51,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,108,97,115,116,65,114,103,32,61,32,97,114,103,115,46,108,101,110,103,116,104,32,62,32,48,32,63,32,97,114,103,115,91,97,114,103,115,46,108,101,110,103,116,104,32,45,32,49,93,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,115,101,99,111,110,100,76,97,115,116,65,114,103,32,61,32,97,114,103,115,46,108,101,110,103,116,104,32,62,32,49,32,63,32,97,114,103,115,91,97,114,103,115,46,108,101,110,103,116,104,32,45,32,50,93,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,104,97,115,83,117,99,99,101,115,115,67,97,108,108,98,97,99,107,32,61,32,116,121,112,101,111,102,32,108,97,115,116,65,114,103,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,59,10,32,32,32,32,32,32,118,97,114,32,104,97,115,69,114,114,111,114,67,97,108,108,98,97,99,107,32,61,32,116,121,112,101,111,102,32,115,101,99,111,110,100,76,97,115,116,65,114,103,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,59,10,32,32,32,32,32,32,118,97,114,32,111,110,83,117,99,99,101,115,115,32,61,32,104,97,115,83,117,99,99,101,115,115,67,97,108,108,98,97,99,107,32,63,32,108,97,115,116,65,114,103,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,111,110,70,97,105,108,32,61,32,104,97,115,69,114,114,111,114,67,97,108,108,98,97,99,107,32,63,32,115,101,99,111,110,100,76,97,115,116,65,114,103,32,58,32,110,117,108,108,59,10,32,32,32,32,32,32,118,97,114,32,99,97,108,108,98,97,99,107,67,111,117,110,116,32,61,32,104,97,115,83,117,99,99,101,115,115,67,97,108,108,98,97,99,107,32,43,32,104,97,115,69,114,114,111,114,67,97,108,108,98,97,99,107,59,10,32,32,32,32,32,32,118,97,114,32,97,114,103,118,32,61,32,97,114,103,115,46,115,108,105,99,101,40,48,44,32,97,114,103,115,46,108,101,110,103,116,104,32,45,32,99,97,108,108,98,97,99,107,67,111,117,110,116,41,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,101,110,113,117,101,117,101,78,97,116,105,118,101,67,97,108,108,40,109,111,100,117,108,101,73,68,44,32,109,101,116,104,111,100,73,68,44,32,97,114,103,118,44,32,111,110,70,97,105,108,44,32,111,110,83,117,99,99,101,115,115,41,59,10,32,32,32,32,125,59,10,32,32,125,10,32,32,102,110,46,116,121,112,101,32,61,32,116,121,112,101,59,10,32,32,114,101,116,117,114,110,32,102,110,59,10,125,59,10,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,32,61,32,123,10,32,32,85,73,77,97,110,97,103,101,114,58,32,123,10,32,32,32,32,68,105,109,101,110,115,105,111,110,115,58,32,123,10,32,32,32,32,32,32,119,105,110,100,111,119,58,32,123,125,10,32,32,32,32,125,10,32,32,125,10,125,59,10,105,102,32,40,116,121,112,101,111,102,32,110,97,116,105,118,101,77,111,100,117,108,101,80,114,111,120,121,32,33,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,10,32,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,32,61,32,110,97,116,105,118,101,77,111,100,117,108,101,80,114,111,120,121,59,10,125,32,101,108,115,101,32,123,10,32,32,118,97,114,32,98,114,105,100,103,101,67,111,110,102,105,103,32,61,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,67,111,110,102,105,103,59,10,32,32,40,98,114,105,100,103,101,67,111,110,102,105,103,32,38,38,32,98,114,105,100,103,101,67,111,110,102,105,103,46,114,101,109,111,116,101,77,111,100,117,108,101,67,111,110,102,105,103,32,124,124,32,91,93,41,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,32,123,10,32,32,32,32,118,97,114,32,105,110,102,111,32,61,32,95,95,71,76,79,66,65,76,95,95,46,103,101,110,77,111,100,117,108,101,40,99,111,110,102,105,103,44,32,109,111,100,117,108,101,73,68,41,59,10,32,32,32,32,105,102,32,40,33,105,110,102,111,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,125,10,32,32,32,32,105,102,32,40,105,110,102,111,46,109,111,100,117,108,101,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,91,105,110,102,111,46,110,97,109,101,93,32,61,32,105,110,102,111,46,109,111,100,117,108,101,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,100,101,102,105,110,101,76,97,122,121,79,98,106,101,99,116,80,114,111,112,101,114,116,121,40,95,95,71,76,79,66,65,76,95,95,46,78,97,116,105,118,101,77,111,100,117,108,101,115,44,32,105,110,102,111,46,110,97,109,101,44,32,123,10,32,32,32,32,32,32,32,32,103,101,116,58,32,102,117,110,99,116,105,111,110,32,103,101,116,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,95,95,71,76,79,66,65,76,95,95,46,108,111,97,100,77,111,100,117,108,101,40,105,110,102,111,46,110,97,109,101,44,32,109,111,100,117,108,101,73,68,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,125,41,59,10,125,125,41,59,0 }; // NOLINT + const uint8_t k_native2js[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,114,41,32,123,32,114,101,116,117,114,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,114,41,32,124,124,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,124,124,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,124,124,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,110,111,110,73,116,101,114,97,98,108,101,83,112,114,101,97,100,40,41,32,123,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,34,73,110,118,97,108,105,100,32,97,116,116,101,109,112,116,32,116,111,32,115,112,114,101,97,100,32,110,111,110,45,105,116,101,114,97,98,108,101,32,105,110,115,116,97,110,99,101,46,92,110,73,110,32,111,114,100,101,114,32,116,111,32,98,101,32,105,116,101,114,97,98,108,101,44,32,110,111,110,45,97,114,114,97,121,32,111,98,106,101,99,116,115,32,109,117,115,116,32,104,97,118,101,32,97,32,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,40,41,32,109,101,116,104,111,100,46,34,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,117,110,115,117,112,112,111,114,116,101,100,73,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,123,32,105,102,32,40,114,41,32,123,32,105,102,32,40,34,115,116,114,105,110,103,34,32,61,61,32,116,121,112,101,111,102,32,114,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,59,32,118,97,114,32,116,32,61,32,123,125,46,116,111,83,116,114,105,110,103,46,99,97,108,108,40,114,41,46,115,108,105,99,101,40,56,44,32,45,49,41,59,32,114,101,116,117,114,110,32,34,79,98,106,101,99,116,34,32,61,61,61,32,116,32,38,38,32,114,46,99,111,110,115,116,114,117,99,116,111,114,32,38,38,32,40,116,32,61,32,114,46,99,111,110,115,116,114,117,99,116,111,114,46,110,97,109,101,41,44,32,34,77,97,112,34,32,61,61,61,32,116,32,124,124,32,34,83,101,116,34,32,61,61,61,32,116,32,63,32,65,114,114,97,121,46,102,114,111,109,40,114,41,32,58,32,34,65,114,103,117,109,101,110,116,115,34,32,61,61,61,32,116,32,124,124,32,47,94,40,63,58,85,105,124,73,41,110,116,40,63,58,56,124,49,54,124,51,50,41,40,63,58,67,108,97,109,112,101,100,41,63,65,114,114,97,121,36,47,46,116,101,115,116,40,116,41,32,63,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,58,32,118,111,105,100,32,48,59,32,125,32,125,10,102,117,110,99,116,105,111,110,32,95,105,116,101,114,97,98,108,101,84,111,65,114,114,97,121,40,114,41,32,123,32,105,102,32,40,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,83,121,109,98,111,108,32,38,38,32,110,117,108,108,32,33,61,32,114,91,83,121,109,98,111,108,46,105,116,101,114,97,116,111,114,93,32,124,124,32,110,117,108,108,32,33,61,32,114,91,34,64,64,105,116,101,114,97,116,111,114,34,93,41,32,114,101,116,117,114,110,32,65,114,114,97,121,46,102,114,111,109,40,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,87,105,116,104,111,117,116,72,111,108,101,115,40,114,41,32,123,32,105,102,32,40,65,114,114,97,121,46,105,115,65,114,114,97,121,40,114,41,41,32,114,101,116,117,114,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,41,59,32,125,10,102,117,110,99,116,105,111,110,32,95,97,114,114,97,121,76,105,107,101,84,111,65,114,114,97,121,40,114,44,32,97,41,32,123,32,40,110,117,108,108,32,61,61,32,97,32,124,124,32,97,32,62,32,114,46,108,101,110,103,116,104,41,32,38,38,32,40,97,32,61,32,114,46,108,101,110,103,116,104,41,59,32,102,111,114,32,40,118,97,114,32,101,32,61,32,48,44,32,110,32,61,32,65,114,114,97,121,40,97,41,59,32,101,32,60,32,97,59,32,101,43,43,41,32,110,91,101,93,32,61,32,114,91,101,93,59,32,114,101,116,117,114,110,32,110,59,32,125,10,103,108,111,98,97,108,46,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,32,61,32,123,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,102,108,117,115,104,101,100,81,117,101,117,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,118,97,114,32,113,117,101,117,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,59,10,32,32,95,95,71,76,79,66,65,76,95,95,46,95,113,117,101,117,101,32,61,32,91,91,93,44,32,91,93,44,32,91,93,44,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,73,68,93,59,10,32,32,114,101,116,117,114,110,32,113,117,101,117,101,91,48,93,46,108,101,110,103,116,104,32,63,32,113,117,101,117,101,32,58,32,110,117,108,108,59,10,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,105,110,118,111,107,101,67,97,108,108,98,97,99,107,65,110,100,82,101,116,117,114,110,70,108,117,115,104,101,100,81,117,101,117,101,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,73,68,44,32,97,114,103,115,41,32,123,10,32,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,95,95,105,110,118,111,107,101,67,97,108,108,98,97,99,107,40,99,98,73,68,44,32,97,114,103,115,41,59,10,32,32,114,101,116,117,114,110,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,102,108,117,115,104,101,100,81,117,101,117,101,40,41,59,10,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,95,95,105,110,118,111,107,101,67,97,108,108,98,97,99,107,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,73,68,44,32,97,114,103,115,41,32,123,10,32,32,118,97,114,32,99,97,108,108,98,97,99,107,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,99,98,73,68,93,59,10,32,32,105,102,32,40,33,99,97,108,108,98,97,99,107,41,32,114,101,116,117,114,110,59,10,32,32,105,102,32,40,33,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,91,99,98,73,68,32,38,32,126,49,93,32,38,38,32,33,95,95,71,76,79,66,65,76,95,95,46,95,110,111,116,68,101,108,101,116,101,67,97,108,108,98,97,99,107,73,100,115,91,99,98,73,68,32,124,32,49,93,41,32,123,10,32,32,32,32,100,101,108,101,116,101,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,99,98,73,68,32,38,32,126,49,93,59,10,32,32,32,32,100,101,108,101,116,101,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,99,98,73,68,32,124,32,49,93,59,10,32,32,125,10,32,32,105,102,32,40,97,114,103,115,32,38,38,32,97,114,103,115,46,108,101,110,103,116,104,32,62,32,49,32,38,38,32,40,97,114,103,115,91,48,93,32,61,61,61,32,110,117,108,108,32,124,124,32,97,114,103,115,91,48,93,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,41,32,123,10,32,32,32,32,97,114,103,115,46,115,112,108,105,99,101,40,48,44,32,49,41,59,10,32,32,125,10,32,32,99,97,108,108,98,97,99,107,46,97,112,112,108,121,40,118,111,105,100,32,48,44,32,95,116,111,67,111,110,115,117,109,97,98,108,101,65,114,114,97,121,40,97,114,103,115,41,41,59,10,125,59,10,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,99,97,108,108,70,117,110,99,116,105,111,110,82,101,116,117,114,110,70,108,117,115,104,101,100,81,117,101,117,101,32,61,32,102,117,110,99,116,105,111,110,32,40,109,111,100,117,108,101,44,32,109,101,116,104,111,100,44,32,97,114,103,115,41,32,123,10,32,32,105,102,32,40,109,111,100,117,108,101,32,61,61,61,32,39,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,39,32,124,124,32,109,111,100,117,108,101,32,61,61,61,32,39,68,105,109,101,110,115,105,111,110,115,39,41,32,123,10,32,32,32,32,118,97,114,32,116,97,114,103,101,116,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,106,115,77,111,100,117,108,101,76,105,115,116,91,109,111,100,117,108,101,93,59,10,32,32,32,32,105,102,32,40,33,116,97,114,103,101,116,77,111,100,117,108,101,32,124,124,32,33,116,97,114,103,101,116,77,111,100,117,108,101,91,109,101,116,104,111,100,93,32,124,124,32,116,121,112,101,111,102,32,116,97,114,103,101,116,77,111,100,117,108,101,91,109,101,116,104,111,100,93,32,33,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,116,97,114,103,101,116,77,111,100,117,108,101,91,109,101,116,104,111,100,93,46,99,97,108,108,40,116,97,114,103,101,116,77,111,100,117,108,101,44,32,97,114,103,115,91,49,93,46,112,97,114,97,109,115,41,59,10,32,32,32,32,125,10,32,32,125,32,101,108,115,101,32,105,102,32,40,109,111,100,117,108,101,32,61,61,61,32,39,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,39,41,32,123,10,32,32,32,32,105,102,32,40,109,101,116,104,111,100,32,61,61,61,32,39,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,39,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,116,114,117,101,59,10,32,32,32,32,32,32,118,97,114,32,102,114,97,109,101,73,100,32,61,32,97,114,103,115,91,48,93,59,10,32,32,32,32,32,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,102,114,97,109,101,73,100,93,41,32,123,10,32,32,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,102,114,97,109,101,73,100,93,46,102,111,114,69,97,99,104,40,102,117,110,99,116,105,111,110,32,40,99,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,99,98,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,99,98,40,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,102,114,97,109,101,73,100,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,10,32,32,114,101,116,117,114,110,32,95,95,104,112,66,97,116,99,104,101,100,66,114,105,100,103,101,46,102,108,117,115,104,101,100,81,117,101,117,101,40,41,59,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_Event[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,103,108,111,98,97,108,46,72,105,112,112,121,68,101,97,108,108,111,99,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,105,102,32,40,103,108,111,98,97,108,46,72,105,112,112,121,41,32,123,10,32,32,32,32,103,108,111,98,97,108,46,72,105,112,112,121,46,101,109,105,116,40,39,100,101,97,108,108,111,99,39,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,95,95,108,111,97,100,73,110,115,116,97,110,99,101,95,95,32,61,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,10,32,32,118,97,114,32,95,114,101,102,32,61,32,111,98,106,32,124,124,32,123,125,44,10,32,32,32,32,110,97,109,101,32,61,32,95,114,101,102,46,110,97,109,101,44,10,32,32,32,32,105,100,32,61,32,95,114,101,102,46,105,100,44,10,32,32,32,32,95,114,101,102,36,112,97,114,97,109,115,32,61,32,95,114,101,102,46,112,97,114,97,109,115,44,10,32,32,32,32,112,97,114,97,109,115,32,61,32,95,114,101,102,36,112,97,114,97,109,115,32,61,61,61,32,118,111,105,100,32,48,32,63,32,123,125,32,58,32,95,114,101,102,36,112,97,114,97,109,115,59,10,32,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,110,97,109,101,93,41,32,123,10,32,32,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,112,97,114,97,109,115,44,32,123,10,32,32,32,32,32,32,95,95,105,110,115,116,97,110,99,101,78,97,109,101,95,95,58,32,110,97,109,101,44,10,32,32,32,32,32,32,95,95,105,110,115,116,97,110,99,101,73,100,95,95,58,32,105,100,10,32,32,32,32,125,41,59,10,32,32,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,110,97,109,101,93,44,32,123,10,32,32,32,32,32,32,105,100,58,32,105,100,44,10,32,32,32,32,32,32,115,117,112,101,114,80,114,111,112,115,58,32,112,97,114,97,109,115,10,32,32,32,32,125,41,59,10,32,32,32,32,118,97,114,32,69,118,101,110,116,77,111,100,117,108,101,32,61,32,95,95,71,76,79,66,65,76,95,95,46,106,115,77,111,100,117,108,101,76,105,115,116,46,69,118,101,110,116,68,105,115,112,97,116,99,104,101,114,59,10,32,32,32,32,105,102,32,40,69,118,101,110,116,77,111,100,117,108,101,32,38,38,32,116,121,112,101,111,102,32,69,118,101,110,116,77,111,100,117,108,101,46,114,101,99,101,105,118,101,78,97,116,105,118,101,69,118,101,110,116,32,61,61,61,32,39,102,117,110,99,116,105,111,110,39,41,32,123,10,32,32,32,32,32,32,69,118,101,110,116,77,111,100,117,108,101,46,114,101,99,101,105,118,101,78,97,116,105,118,101,69,118,101,110,116,40,91,39,64,104,112,58,108,111,97,100,73,110,115,116,97,110,99,101,39,44,32,112,97,114,97,109,115,93,41,59,10,32,32,32,32,125,10,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,97,112,112,82,101,103,105,115,116,101,114,91,110,97,109,101,93,46,114,117,110,40,112,97,114,97,109,115,41,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,34,108,111,97,100,32,105,110,115,116,97,110,99,101,32,101,114,114,111,114,58,32,91,34,46,99,111,110,99,97,116,40,110,97,109,101,44,32,34,93,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,32,105,110,32,106,115,34,41,41,59,10,32,32,125,10,125,59,10,103,108,111,98,97,108,46,95,95,117,110,108,111,97,100,73,110,115,116,97,110,99,101,95,95,32,61,32,102,117,110,99,116,105,111,110,32,40,111,98,106,41,32,123,10,32,32,118,97,114,32,95,114,101,102,50,32,61,32,111,98,106,32,124,124,32,123,125,44,10,32,32,32,32,105,100,32,61,32,95,114,101,102,50,46,105,100,59,10,32,32,103,108,111,98,97,108,46,72,105,112,112,121,46,101,109,105,116,40,39,100,101,115,116,114,111,121,73,110,115,116,97,110,99,101,39,44,32,105,100,41,59,10,32,32,72,105,112,112,121,46,98,114,105,100,103,101,46,99,97,108,108,78,97,116,105,118,101,40,39,82,111,111,116,86,105,101,119,77,97,110,97,103,101,114,39,44,32,39,114,101,109,111,118,101,82,111,111,116,86,105,101,119,39,44,32,105,100,41,59,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_AnimationFrameModule[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,118,97,114,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,32,61,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,40,39,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,39,41,59,10,103,108,111,98,97,108,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,102,117,110,99,116,105,111,110,32,40,99,98,41,32,123,10,32,32,105,102,32,40,99,98,41,32,123,10,32,32,32,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,99,97,110,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,102,97,108,115,101,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,43,61,32,49,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,32,61,32,91,93,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,46,112,117,115,104,40,99,98,41,59,10,32,32,32,32,32,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,82,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,41,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,41,32,123,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,81,117,101,117,101,91,95,95,71,76,79,66,65,76,95,95,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,93,46,112,117,115,104,40,99,98,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,39,39,59,10,32,32,125,10,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,39,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,115,39,41,59,10,125,59,10,103,108,111,98,97,108,46,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,111,100,117,108,101,46,67,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,41,59,10,125,59,125,41,59,0 }; // NOLINT + const uint8_t k_Turbo[] = { 40,102,117,110,99,116,105,111,110,40,101,120,112,111,114,116,115,44,32,114,101,113,117,105,114,101,44,32,105,110,116,101,114,110,97,108,66,105,110,100,105,110,103,41,32,123,34,117,115,101,32,115,116,114,105,99,116,34,59,10,10,102,117,110,99,116,105,111,110,32,116,117,114,98,111,80,114,111,109,105,115,101,40,102,117,110,99,41,32,123,10,32,32,114,101,116,117,114,110,32,102,117,110,99,116,105,111,110,32,40,41,32,123,10,32,32,32,32,118,97,114,32,95,116,104,105,115,32,61,32,116,104,105,115,59,10,32,32,32,32,102,111,114,32,40,118,97,114,32,95,108,101,110,32,61,32,97,114,103,117,109,101,110,116,115,46,108,101,110,103,116,104,44,32,97,114,103,115,32,61,32,110,101,119,32,65,114,114,97,121,40,95,108,101,110,41,44,32,95,107,101,121,32,61,32,48,59,32,95,107,101,121,32,60,32,95,108,101,110,59,32,95,107,101,121,43,43,41,32,123,10,32,32,32,32,32,32,97,114,103,115,91,95,107,101,121,93,32,61,32,97,114,103,117,109,101,110,116,115,91,95,107,101,121,93,59,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,102,117,110,99,116,105,111,110,32,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,123,10,32,32,32,32,32,32,118,97,114,32,115,117,99,99,101,115,115,67,97,108,108,98,97,99,107,73,100,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,115,117,99,99,101,115,115,67,97,108,108,98,97,99,107,73,100,93,32,61,32,102,117,110,99,116,105,111,110,32,40,100,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,114,101,115,111,108,118,101,40,100,97,116,97,41,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,32,32,32,32,118,97,114,32,102,97,105,108,67,97,108,108,98,97,99,107,73,100,32,61,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,115,91,102,97,105,108,67,97,108,108,98,97,99,107,73,100,93,32,61,32,102,117,110,99,116,105,111,110,32,40,101,114,114,111,114,68,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,114,114,111,114,68,97,116,97,41,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,95,95,71,76,79,66,65,76,95,95,46,95,99,97,108,108,98,97,99,107,73,68,32,43,61,32,49,59,10,32,32,32,32,32,32,102,117,110,99,46,97,112,112,108,121,40,95,116,104,105,115,44,32,91,93,46,99,111,110,99,97,116,40,97,114,103,115,44,32,91,115,117,99,99,101,115,115,67,97,108,108,98,97,99,107,73,100,44,32,102,97,105,108,67,97,108,108,98,97,99,107,73,100,93,41,41,59,10,32,32,32,32,125,41,59,10,32,32,125,59,10,125,10,72,105,112,112,121,46,116,117,114,98,111,80,114,111,109,105,115,101,32,61,32,116,117,114,98,111,80,114,111,109,105,115,101,59,125,41,59,0 }; // NOLINT +} // namespace + +namespace hippy { +inline namespace driver { + +static const std::unordered_map global_base_js_source_map{ + {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT + {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT + {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT + {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT + {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT + {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT + {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT + {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT + {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT + {"promise.js", {k_promise, ARRAY_SIZE(k_promise) - 1}}, // NOLINT + {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT + {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT + {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT + {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT + {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT + {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT + {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT + {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT + {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT + {"Turbo.js", {k_Turbo, ARRAY_SIZE(k_Turbo) - 1}}, // NOLINT +}; + +static NativeSourceCode GetNativeSourceCodeImp(const std::string& filename) { + const auto it = global_base_js_source_map.find(filename); + return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; +} + +NativeSourceCode NativeSourceCodeProviderJSC::GetNativeSourceCode(const std::string &filename) const { + return GetNativeSourceCodeImp(filename); +} + +} // namespace driver +} // namespace hippy diff --git a/driver/js/src/vm/v8/native_source_code_android.cc b/driver/js/src/vm/v8/native_source_code_android.cc index 6da4344ac4b..bb8e94b5894 100644 --- a/driver/js/src/vm/v8/native_source_code_android.cc +++ b/driver/js/src/vm/v8/native_source_code_android.cc @@ -22,6 +22,7 @@ #include "driver/vm/native_source_code.h" #include "footstone/macros.h" +#include "driver/vm/v8/native_source_code_v8.h" namespace { @@ -52,29 +53,33 @@ inline namespace driver { static const std::unordered_map global_base_js_source_map{ {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT - {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT - {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT - {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT - {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT - {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT - {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT - {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT - {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT - {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT - {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT - {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT - {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT - {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT - {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT - {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT - {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT - {"Turbo.js", {k_Turbo, ARRAY_SIZE(k_Turbo) - 1}}, // NOLINT + {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT + {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT + {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT + {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT + {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT + {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT + {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT + {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT + {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT + {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT + {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT + {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT + {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT + {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT + {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT + {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT + {"Turbo.js", {k_Turbo, ARRAY_SIZE(k_Turbo) - 1}}, // NOLINT }; -const NativeSourceCode GetNativeSourceCode(const std::string& filename) { +static NativeSourceCode GetNativeSourceCodeImp(const std::string& filename) { const auto it = global_base_js_source_map.find(filename); return it != global_base_js_source_map.cend() ? it->second : NativeSourceCode{}; } +NativeSourceCode NativeSourceCodeProviderV8::GetNativeSourceCode(const std::string &filename) const { + return GetNativeSourceCodeImp(filename); +} + } // namespace driver } // namespace hippy diff --git a/driver/js/src/vm/v8/v8_vm.cc b/driver/js/src/vm/v8/v8_vm.cc index e7605b83b5d..f824f82f72c 100644 --- a/driver/js/src/vm/v8/v8_vm.cc +++ b/driver/js/src/vm/v8/v8_vm.cc @@ -91,7 +91,7 @@ V8VM::V8VM(const std::shared_ptr& param) : VM(param) { #ifdef ENABLE_INSPECTOR auto trace = reinterpret_cast(platform->GetTracingController()); devtools::DevtoolsDataSource::OnGlobalTracingControlGenerate(trace); -#endif +#endif } } create_params_.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); @@ -292,7 +292,7 @@ string_view V8VM::GetStackTrace(v8::Isolate* isolate, } -std::shared_ptr CreateVM(const std::shared_ptr& param) { +std::shared_ptr V8VM::CreateVM(const std::shared_ptr& param) { return std::make_shared(std::static_pointer_cast(param)); } diff --git a/driver/js/tools/hermes b/driver/js/tools/hermes new file mode 100755 index 00000000000..6a74fa51254 Binary files /dev/null and b/driver/js/tools/hermes differ diff --git a/framework/android/connector/driver/js/gradle.properties b/framework/android/connector/driver/js/gradle.properties index cddfd826e89..c06278e08e5 100644 --- a/framework/android/connector/driver/js/gradle.properties +++ b/framework/android/connector/driver/js/gradle.properties @@ -19,6 +19,7 @@ # # Indicates the javascript engine to use: # * V8 +# * HERMES # CPP_JS_ENGINE=V8 @@ -36,10 +37,22 @@ CPP_JS_ENGINE=V8 # CPP_V8_COMPONENT=10.6.194 +# +# Hermes Component +# +# The following prebuilt Hermes versions are available: +# * hermes-2023-09-26-RNv0.73.0-ee2922a50fb719bdb378025d95dbd32ad93cd679 (current use) +# +# You can also specify the absolute path to the Hermes component to use, +# e.g. /opt/Hermes-component +# +CPP_HERMES_COMPONENT=hermes-2023-09-26-RNv0.73.0-ee2922a50fb719bdb378025d95dbd32ad93cd679 + + # # Whether to enable devtools inspector features # # When you want to debug your app, set it true, devtools inspector show # elements tab, UI insector etc to improve your app. # -CPP_ENABLE_INSPECTOR=true +CPP_ENABLE_INSPECTOR=false diff --git a/framework/android/connector/driver/js/src/main/cpp/include/connector/java_turbo_module.h b/framework/android/connector/driver/js/src/main/cpp/include/connector/java_turbo_module.h index 4f9c0a68098..d9e6c8cbcf5 100644 --- a/framework/android/connector/driver/js/src/main/cpp/include/connector/java_turbo_module.h +++ b/framework/android/connector/driver/js/src/main/cpp/include/connector/java_turbo_module.h @@ -73,6 +73,8 @@ class JavaTurboModule { std::unordered_map method_map_; std::shared_ptr constructor; + //Hermes 引擎没有提供类似于 V8 ObjectTemplate 的 SetHandler 接口,因此通过 Proxy 进行模拟实现 + std::shared_ptr proxy_handler; std::unique_ptr constructor_wrapper; std::unordered_map, std::unique_ptr> turbo_wrapper_map; std::unordered_map, std::shared_ptr> func_map; diff --git a/framework/android/connector/driver/js/src/main/cpp/src/convert_utils.cc b/framework/android/connector/driver/js/src/main/cpp/src/convert_utils.cc index 4a164ec0a31..e0d4aa5ac3f 100644 --- a/framework/android/connector/driver/js/src/main/cpp/src/convert_utils.cc +++ b/framework/android/connector/driver/js/src/main/cpp/src/convert_utils.cc @@ -517,9 +517,7 @@ std::vector ConvertUtils::GetMethodArgTypesFromSignature( return method_args; } -std::shared_ptr ConvertUtils::ToHostObject(const std::shared_ptr& ctx, - jobject& j_obj, - std::string name, +std::shared_ptr ConvertUtils::ToHostObject(const std::shared_ptr& ctx, jobject& j_obj, std::string name, std::shared_ptr scope) { if (!j_obj) { return ctx->CreateNull(); @@ -527,7 +525,16 @@ std::shared_ptr ConvertUtils::ToHostObject(const std::shared_ptr& JNIEnv* j_env = hippy::JNIEnvironment::GetInstance()->AttachCurrentThread(); std::shared_ptr ret = std::make_shared(j_env, j_obj); auto host_obj = std::make_shared(name, ret, ctx); - auto instance = ctx->NewInstance(host_obj->constructor, 0, nullptr, host_obj.get()); + std::shared_ptr instance = nullptr; +#ifdef JS_V8 + instance = ctx->NewInstance(host_obj->constructor, 0, nullptr, host_obj.get()); +#elif defined(JS_HERMES) + std::shared_ptr argv[] = {host_obj->proxy_handler}; + instance = ctx->NewInstance(host_obj->constructor, 1, argv, host_obj.get()); +#else + FOOTSTONE_LOG(ERROR) << "js engine not support to host object"; + return ctx->CreateNull(); +#endif scope->SetTurboInstance(name, instance); scope->SetTurboHostObject(name, host_obj); return instance; diff --git a/framework/android/connector/driver/js/src/main/cpp/src/java_turbo_module.cc b/framework/android/connector/driver/js/src/main/cpp/src/java_turbo_module.cc index a7b6f14267a..5852cf328bb 100644 --- a/framework/android/connector/driver/js/src/main/cpp/src/java_turbo_module.cc +++ b/framework/android/connector/driver/js/src/main/cpp/src/java_turbo_module.cc @@ -194,7 +194,9 @@ JavaTurboModule::JavaTurboModule(const std::string& name, module->func_map[name] = func_object; info.GetReturnValue()->Set(func_object); }, this); + constructor = ctx->DefineProxy(getter); + proxy_handler = ctx->DefineProxyHandler(getter); constructor_wrapper = std::move(getter); } diff --git a/framework/android/connector/driver/js/src/main/cpp/src/js2java.cc b/framework/android/connector/driver/js/src/main/cpp/src/js2java.cc index 60250feaa5e..e2ad71afb43 100644 --- a/framework/android/connector/driver/js/src/main/cpp/src/js2java.cc +++ b/framework/android/connector/driver/js/src/main/cpp/src/js2java.cc @@ -26,7 +26,6 @@ #include "connector/bridge.h" #include "driver/js_driver_utils.h" -#include "driver/napi/v8/serializer.h" #include "driver/scope.h" #include "footstone/logging.h" #include "footstone/string_view_utils.h" diff --git a/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc b/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc index 68bb816106d..1c78ec3f212 100644 --- a/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc +++ b/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc @@ -57,6 +57,10 @@ #include "driver/vm/v8/v8_vm.h" #endif +#ifdef JS_HERMES +#include "driver/vm/hermes/hermes_vm.h" +#endif + #ifdef ENABLE_INSPECTOR #include "devtools/devtools_data_source.h" #include "devtools/vfs/devtools_handler.h" @@ -137,6 +141,10 @@ using WorkerManager = footstone::WorkerManager; using V8VMInitParam = hippy::V8VMInitParam; #endif +#ifdef JS_HERMES +using HermesVMInitParam = hippy::HermesVMInitParam; +#endif + enum INIT_CB_STATE { DESTROY_ERROR = -2, RUN_SCRIPT_ERROR = -1, @@ -330,7 +338,7 @@ jint CreateJsDriver(JNIEnv* j_env, FOOTSTONE_CHECK(initial_heap_size_in_bytes <= maximum_heap_size_in_bytes); } #else - auto param = std::make_shared(); + auto param = std::make_shared(); #endif #ifdef ENABLE_INSPECTOR if (param->is_debug) { @@ -590,7 +598,9 @@ static jint JNI_OnLoad(__unused JavaVM* j_vm, __unused void* reserved) { static void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); +#ifdef JS_V8 hippy::V8VM::PlatformDestroy(); +#endif hippy::TurboModuleManager::Destroy(j_env); hippy::JavaTurboModule::Destroy(j_env); hippy::ConvertUtils::Destroy(j_env); diff --git a/framework/android/connector/driver/js/src/main/cpp/src/turbo_module_manager.cc b/framework/android/connector/driver/js/src/main/cpp/src/turbo_module_manager.cc index 18ff7e1ff90..d3b14e1c8af 100644 --- a/framework/android/connector/driver/js/src/main/cpp/src/turbo_module_manager.cc +++ b/framework/android/connector/driver/js/src/main/cpp/src/turbo_module_manager.cc @@ -25,20 +25,18 @@ #include #include "connector/java_turbo_module.h" +#include "footstone/logging.h" +#include "footstone/string_view.h" +#include "footstone/string_view_utils.h" #include "jni/data_holder.h" #include "jni/jni_env.h" #include "jni/jni_register.h" #include "jni/jni_utils.h" #include "jni/scoped_java_ref.h" -#include "footstone/logging.h" -#include "footstone/string_view.h" -#include "footstone/string_view_utils.h" -#include "driver/napi/v8/v8_ctx.h" using namespace hippy::napi; using string_view = footstone::string_view; using StringViewUtils = footstone::StringViewUtils; -using V8Ctx = hippy::V8Ctx; constexpr char kTurboKey[] = "getTurboModule"; @@ -46,10 +44,8 @@ namespace hippy { inline namespace framework { inline namespace turbo { -REGISTER_JNI("com/tencent/mtt/hippy/bridge/jsi/TurboModuleManager", // NOLINT(cert-err58-cpp) - "install", - "(J)I", - Install) +REGISTER_JNI("com/tencent/mtt/hippy/bridge/jsi/TurboModuleManager", // NOLINT(cert-err58-cpp) + "install", "(J)I", Install) jclass turbo_module_manager_clazz; jmethodID get_method_id; @@ -57,8 +53,7 @@ jmethodID get_method_id; /** * com.tencent.mtt.hippy.bridge.jsi.TurboModuleManager.get */ -std::shared_ptr QueryTurboModuleImpl(std::shared_ptr& scope, - const std::string& module_name) { +std::shared_ptr QueryTurboModuleImpl(std::shared_ptr& scope, const std::string& module_name) { FOOTSTONE_DLOG(INFO) << "enter QueryTurboModuleImpl " << module_name.c_str(); JNIEnv* j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); jstring name = j_env->NewStringUTF(module_name.c_str()); @@ -90,8 +85,8 @@ void GetTurboModule(CallbackInfo& info, void* data) { info.GetReturnValue()->SetUndefined(); return; } - auto u8_name = StringViewUtils::ToStdString( - StringViewUtils::ConvertEncoding(name, string_view::Encoding::Utf8).utf8_value()); + auto u8_name = + StringViewUtils::ToStdString(StringViewUtils::ConvertEncoding(name, string_view::Encoding::Utf8).utf8_value()); std::shared_ptr result; auto has_instance = scope->HasTurboInstance(u8_name); if (!has_instance) { @@ -107,7 +102,15 @@ void GetTurboModule(CallbackInfo& info, void* data) { auto java_turbo_module = std::make_shared(u8_name, module_impl, ctx); // 4. bind c++ JavaTurboModule to js +#ifdef JS_V8 result = ctx->NewInstance(java_turbo_module->constructor, 0, nullptr, java_turbo_module.get()); +#elif defined(JS_HERMES) + std::shared_ptr argv[] = {java_turbo_module->proxy_handler}; + result = ctx->NewInstance(java_turbo_module->constructor, 1, argv, java_turbo_module.get()); +#else + FOOTSTONE_LOG(ERROR) << "js engine not support jsi"; + return info.GetReturnValue()->SetUndefined(); +#endif // 5. add To Cache scope->SetTurboInstance(u8_name, result); @@ -124,14 +127,13 @@ void GetTurboModule(CallbackInfo& info, void* data) { } void TurboModuleManager::Init(JNIEnv* j_env) { - jclass clazz = - j_env->FindClass("com/tencent/mtt/hippy/bridge/jsi/TurboModuleManager"); + jclass clazz = j_env->FindClass("com/tencent/mtt/hippy/bridge/jsi/TurboModuleManager"); turbo_module_manager_clazz = reinterpret_cast(j_env->NewGlobalRef(clazz)); j_env->DeleteLocalRef(clazz); get_method_id = j_env->GetMethodID(turbo_module_manager_clazz, "get", - "(Ljava/lang/String;)Lcom/tencent/mtt/hippy/modules/" - "nativemodules/HippyNativeModuleBase;"); + "(Ljava/lang/String;)Lcom/tencent/mtt/hippy/modules/" + "nativemodules/HippyNativeModuleBase;"); } void TurboModuleManager::Destroy(JNIEnv* j_env) { @@ -176,6 +178,6 @@ int Install(JNIEnv* j_env, jobject j_obj, jlong j_scope_id) { return 0; } -} -} -} +} // namespace turbo +} // namespace framework +} // namespace hippy diff --git a/framework/android/gradle.properties b/framework/android/gradle.properties index ecf75727ea2..8c5773ac153 100644 --- a/framework/android/gradle.properties +++ b/framework/android/gradle.properties @@ -86,9 +86,9 @@ CPP_HIDDEN_LIBRARY_SYMBOL=true # Equals to setting -D macro in the cmake.arguments property # in the build.gradle file. # -CPP_ANDROID_STL=c++_static +CPP_ANDROID_STL=c++_shared CPP_ANDROID_PLATFORM=android-21 -CPP_ANDROID_CPP_FEATURES=no-rtti no-exceptions +CPP_ANDROID_CPP_FEATURES=rtti exceptions CPP_ANDROID_ARM_NEON=true # diff --git a/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java b/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java index 182f3fb27ae..0b28982faf0 100644 --- a/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java +++ b/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java @@ -29,6 +29,7 @@ import com.openhippy.connector.JsDriver.V8InitParams; import com.openhippy.connector.NativeCallback; import com.openhippy.framework.BuildConfig; +import com.tencent.mtt.hippy.HippyEngine; import com.tencent.mtt.hippy.HippyEngine.ModuleLoadStatus; import com.tencent.mtt.hippy.HippyEngineContext; import com.tencent.mtt.hippy.adapter.thirdparty.HippyThirdPartyAdapter; @@ -53,6 +54,7 @@ import java.lang.ref.WeakReference; import java.util.HashMap; import org.json.JSONObject; +import org.json.JSONException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -159,14 +161,21 @@ public void Call(long result, Message message, String action, String reason) { serializer.writeValue(msg.obj); buffer = safeDirectWriter.chunked(); } else { - mStringBuilder.setLength(0); - byte[] bytes = ArgumentUtils.objectToJsonOpt(msg.obj, mStringBuilder).getBytes( + if (msg.obj instanceof JSValue) { + try { + String str = ((JSValue) msg.obj).dump().toString(); + byte[] bytes = str.getBytes(StandardCharsets.UTF_16LE); + mHippyBridge.callFunction(functionId, mCallFunctionCallback, bytes); + } catch (JSONException e) { + e.printStackTrace(); + } + } else { + mStringBuilder.setLength(0); + byte[] bytes = ArgumentUtils.objectToJsonOpt(msg.obj, mStringBuilder).getBytes( StandardCharsets.UTF_16LE); - buffer = ByteBuffer.allocateDirect(bytes.length); - buffer.put(bytes); + mHippyBridge.callFunction(functionId, mCallFunctionCallback, bytes); + } } - - mHippyBridge.callFunction(functionId, mCallFunctionCallback, buffer); } else { if (mEnableV8Serialization) { if (safeHeapWriter == null) { diff --git a/framework/examples/android-demo/src/main/java/com/openhippy/example/HippyEngineWrapper.kt b/framework/examples/android-demo/src/main/java/com/openhippy/example/HippyEngineWrapper.kt index 193b0e9056c..fffaab25308 100644 --- a/framework/examples/android-demo/src/main/java/com/openhippy/example/HippyEngineWrapper.kt +++ b/framework/examples/android-demo/src/main/java/com/openhippy/example/HippyEngineWrapper.kt @@ -67,6 +67,7 @@ class HippyEngineWrapper//TODO: Coming soon initParams.enableLog = true initParams.logAdapter = DefaultLogAdapter() initParams.groupId = 1 + initParams.enableV8Serialization = false; when(driverMode) { PageConfiguration.DriverMode.JS_REACT -> { initParams.coreJSAssetsPath = "react/vendor.android.js" diff --git a/framework/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj b/framework/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj index ca3cf00f81b..790fb2a8974 100644 --- a/framework/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj +++ b/framework/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj @@ -284,6 +284,7 @@ 81E836ED7DAB70A2CBF5FAFE /* Resources */, 171164B8638E25416B38386C /* CopyFiles */, 188D3F897881826DDEBE243C /* Frameworks */, + 5C535D66C06F215E7B663DBC /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -362,6 +363,23 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 5C535D66C06F215E7B663DBC /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-HippyDemo/Pods-HippyDemo-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-HippyDemo/Pods-HippyDemo-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HippyDemo/Pods-HippyDemo-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -403,6 +421,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "c++17"; CODE_SIGN_IDENTITY = "iPhone Developer"; + ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = HippyDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -525,6 +544,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "c++17"; CODE_SIGN_IDENTITY = "iPhone Developer"; + ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = HippyDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.h b/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.h index 9abca85f258..b678bbcfc60 100644 --- a/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.h +++ b/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.h @@ -30,13 +30,15 @@ NS_ASSUME_NONNULL_BEGIN @interface HippyDemoViewController : DemoBaseViewController -@property(nonatomic, assign, readonly) DriverType driverType; -@property(nonatomic, assign, readonly) RenderType renderType; -@property(nonatomic, strong, readonly, nullable) NSURL *debugURL; -@property(nonatomic, assign, readonly, getter=isDebugMode) BOOL debugMode; +@property (nonatomic, assign, readonly) DriverType driverType; +@property (nonatomic, assign, readonly) RenderType renderType; +@property (nonatomic, assign, readonly) BOOL useHermesEngine; +@property (nonatomic, strong, readonly, nullable) NSURL *debugURL; +@property (nonatomic, assign, readonly, getter=isDebugMode) BOOL debugMode; - (instancetype)initWithDriverType:(DriverType)driverType renderType:(RenderType)renderType + useHermesEngine:(BOOL)usingHermes debugURL:(NSURL *)debugURL isDebugMode:(BOOL)isDebugMode; diff --git a/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.m b/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.m index d45f35c7006..cc541444856 100644 --- a/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.m +++ b/framework/examples/ios-demo/HippyDemo/HippyDemoViewController.m @@ -38,12 +38,14 @@ @implementation HippyDemoViewController - (instancetype)initWithDriverType:(DriverType)driverType renderType:(RenderType)renderType + useHermesEngine:(BOOL)usingHermes debugURL:(NSURL *)debugURL isDebugMode:(BOOL)isDebugMode { self = [super init]; if (self) { _driverType = driverType; _renderType = renderType; + _useHermesEngine = usingHermes; _debugURL = debugURL; _debugMode = isDebugMode; } @@ -93,13 +95,21 @@ - (void)runHippyCache { - (void)registerLogFunction { // Register your custom log function for Hippy, // use HippyDefaultLogFunction as an example, it outputs logs to stderr. - HippySetLogFunction(HippyDefaultLogFunction); + HippySetLogFunction(^(HippyLogLevel level, HippyLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + // output hippy sdk's log to your App log + // this is a demo imp, output to console: + HippyDefaultLogFunction(level, source, fileName, lineNumber, message); + }); } - (void)runHippyDemo { // Necessary configuration: NSString *moduleName = @"Demo"; - NSDictionary *launchOptions = @{ @"DebugMode": @(_debugMode) }; + // Set launch options for hippy bridge + HippyLaunchOptions *launchOptions = [HippyLaunchOptions new]; + launchOptions.debugMode = _debugMode; + launchOptions.useHermesEngine = _useHermesEngine; + // Prepare initial properties for js side NSDictionary *initialProperties = @{ @"isSimulator": @(TARGET_OS_SIMULATOR) }; HippyBridge *bridge = nil; @@ -132,6 +142,7 @@ - (void)runHippyDemo { // Config whether jsc is inspectable, Highly recommended setting, // since inspectable of JSC is disabled by default since iOS 16.4 [bridge setInspectable:YES]; + _hippyBridge = bridge; rootView.frame = self.contentAreaView.bounds; rootView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; diff --git a/framework/examples/ios-demo/HippyDemo/PageManager/PageCreationViewController.m b/framework/examples/ios-demo/HippyDemo/PageManager/PageCreationViewController.m index b1ccf371e1b..601468a7ca0 100644 --- a/framework/examples/ios-demo/HippyDemo/PageManager/PageCreationViewController.m +++ b/framework/examples/ios-demo/HippyDemo/PageManager/PageCreationViewController.m @@ -36,16 +36,39 @@ static NSString *const kDriverTypeVue3 = @"JS Vue3"; static NSString *const kRenderTypeNative = @"Native"; +static NSString *const kJSEngineTypeJSC = @"JSC"; +static NSString *const kJSEngineTypeHermes = @"Hermes"; static NSString *const kCancel = @"取消"; -@interface PageCreationViewController () { - DriverType _currentDriver; - NSString *_renderer; - UITableView *_tableView; - BOOL _debugMode; - UIButton *_creationButton; -} + +typedef NS_ENUM(NSUInteger, PageCreationCellIndex) { + PageCreationCellIndexDriver = 0, + PageCreationCellIndexRenderer, + PageCreationCellIndexJSEngine, + PageCreationCellIndexDebugMode, + PageCreationCellIndexCount, +}; + +@interface PageCreationViewController () + +/// TableView for config +@property (nonatomic, strong) UITableView *tableView; + +/// Creation button +@property (nonatomic, strong) UIButton *creationButton; + +/// Current using dirver +@property (nonatomic, assign) DriverType currentDriver; + +/// Current using renderer +@property (nonatomic, strong) NSString *renderer; + +/// Current using js engine +@property (nonatomic, strong) NSString *jsEngine; + +/// Whether use debug mode +@property (nonatomic, assign) BOOL debugMode; @end @@ -57,6 +80,7 @@ - (void)viewDidLoad { [self setNavigationItemTitle:@"Page Managerment"]; _currentDriver = DriverTypeReact; _renderer = kRenderTypeNative; + _jsEngine = kJSEngineTypeHermes; [self setNavigationAreaBackground:[UIColor whiteColor]]; CGFloat ratio = 229.f / 255.f; [self setContentAreaBackgroundColor:[UIColor colorWithRed:ratio green:ratio blue:ratio alpha:1]]; @@ -84,7 +108,7 @@ - (void)viewDidLoad { } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 3; + return 4; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { @@ -114,15 +138,14 @@ - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSIntege } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - if (2 == [indexPath section]) { + if (PageCreationCellIndexDebugMode == [indexPath section]) { return _debugMode ? 116.f : 58.f; } return 58.f; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - - if (0 == [indexPath section]) { + if (PageCreationCellIndexDriver == [indexPath section]) { PageCreationCell *cell = (PageCreationCell *)[tableView dequeueReusableCellWithIdentifier:kNormalCell forIndexPath:indexPath]; @@ -130,17 +153,23 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.typeLabel.text = @"Driver"; cell.subTypeLabel.text = @[kDriverTypeReact, kDriverTypeVue2, kDriverTypeVue3][_currentDriver]; return cell; - } - else if (1 == [indexPath section]) { + } else if (PageCreationCellIndexRenderer == [indexPath section]) { PageCreationCell *cell = (PageCreationCell *)[tableView dequeueReusableCellWithIdentifier:kNormalCell forIndexPath:indexPath]; - cell.summaryImageView.image = [UIImage imageFromIconName:@"driver_icon"]; + cell.summaryImageView.image = [UIImage imageFromIconName:@"render_icon"]; cell.typeLabel.text = @"Renderer"; cell.subTypeLabel.text = _renderer; return cell; - } - else if (2 == [indexPath section]) { + } else if (PageCreationCellIndexJSEngine == [indexPath section]) { + PageCreationCell *cell = + (PageCreationCell *)[tableView dequeueReusableCellWithIdentifier:kNormalCell + forIndexPath:indexPath]; + cell.summaryImageView.image = [UIImage imageFromIconName:@"driver_icon"]; + cell.typeLabel.text = @"JS Engine"; + cell.subTypeLabel.text = _jsEngine; + return cell; + } else if (PageCreationCellIndexDebugMode == [indexPath section]) { DebugCell *cell = (DebugCell *)[tableView dequeueReusableCellWithIdentifier:kDebugCell forIndexPath:indexPath]; if (!cell.switchAction) { __weak UITableView *weakTableView = tableView; @@ -159,14 +188,11 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N } return cell; } - else { - NSAssert(NO, @"no cell returned"); - return nil; - } + return nil; } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - if (2 == [indexPath section]) { + if (PageCreationCellIndexDebugMode == [indexPath section]) { CGRect frame = [cell convertRect:cell.bounds toView:self.view]; _creationButton.frame = CGRectMake((CGRectGetWidth(self.view.bounds) - CGRectGetWidth(_creationButton.frame)) / 2.f, CGRectGetMaxY(frame) + 10.f, @@ -185,12 +211,15 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)ce - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; switch ([indexPath section]) { - case 0: + case PageCreationCellIndexDriver: [self showDriverSelectMenu]; break; - case 1: + case PageCreationCellIndexRenderer: [self showRenderSelectMenu]; break; + case PageCreationCellIndexJSEngine: + [self showJSEngineSelectMenu]; + break; default: break; } @@ -258,17 +287,45 @@ - (void)showRenderSelectMenu { [self presentViewController:alert animated:YES completion:NULL]; } +- (void)showJSEngineSelectMenu { + __weak typeof(self) weakSelf = self; + UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; + UIAlertAction *jscAction = [UIAlertAction actionWithTitle:kJSEngineTypeJSC style:UIAlertActionStyleDefault + handler:^(UIAlertAction * _Nonnull action) { + __strong typeof(weakSelf) strongSelf = weakSelf; + if (strongSelf) { + strongSelf.jsEngine = kJSEngineTypeJSC; + [strongSelf.tableView reloadSections:[NSIndexSet indexSetWithIndex:PageCreationCellIndexJSEngine] + withRowAnimation:UITableViewRowAnimationAutomatic]; + } + }]; + UIAlertAction *hermesAction = [UIAlertAction actionWithTitle:kJSEngineTypeHermes style:UIAlertActionStyleDefault + handler:^(UIAlertAction * _Nonnull action) { + __strong typeof(weakSelf) strongSelf = weakSelf; + if (strongSelf) { + strongSelf.jsEngine = kJSEngineTypeHermes; + [strongSelf.tableView reloadSections:[NSIndexSet indexSetWithIndex:PageCreationCellIndexJSEngine] + withRowAnimation:UITableViewRowAnimationAutomatic]; + } + }]; + [alert addAction:[UIAlertAction actionWithTitle:kCancel style:UIAlertActionStyleCancel handler:nil]]; + [alert addAction:jscAction]; + [alert addAction:hermesAction]; + [self presentViewController:alert animated:YES completion:NULL]; +} + - (void)createDemoAction { DriverType driverType = _currentDriver; RenderType renderType = RenderTypeNative; NSURL *debugURL = nil; if (_debugMode) { - DebugCell *cell2 = [_tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:2]]; + DebugCell *cell2 = [_tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:PageCreationCellIndexDebugMode]]; NSString *debugString = [cell2 debugURLString]; debugURL = [NSURL URLWithString:debugString]; } HippyDemoViewController *vc = [[HippyDemoViewController alloc] initWithDriverType:driverType renderType:renderType + useHermesEngine:[_jsEngine isEqualToString:kJSEngineTypeHermes] debugURL:debugURL isDebugMode:_debugMode]; NSMutableArray<__kindof UIViewController *> *viewControllers = [[self.navigationController viewControllers] mutableCopy]; diff --git a/framework/examples/ios-demo/podfile b/framework/examples/ios-demo/podfile index 132a71715c7..bd8f5fdd6c9 100644 --- a/framework/examples/ios-demo/podfile +++ b/framework/examples/ios-demo/podfile @@ -1,5 +1,3 @@ -#ENV["layout_engine"]="Taitank" -#ENV["js_engine"] = "v8" install! 'cocoapods', :deterministic_uuids => false use_frameworks! :linkage => :static diff --git a/framework/ios/base/bridge/HippyBridge.h b/framework/ios/base/bridge/HippyBridge.h index d114f42a566..5b4afb17298 100644 --- a/framework/ios/base/bridge/HippyBridge.h +++ b/framework/ios/base/bridge/HippyBridge.h @@ -157,7 +157,25 @@ HIPPY_EXTERN NSString *const HippyReloadNotification; HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); -#pragma mark - +#pragma mark - Bridge Launch Options +/// Launch Options for HippyBridge +@interface HippyLaunchOptions : NSObject + +/// Whether is in debug mode +/// debug mode will open DevMenu and make JS inspectable +@property (nonatomic, assign) BOOL debugMode; + +/// Whether enable turboMode(jsi), default is YES. +@property (nonatomic, assign) BOOL enableTurbo; + +/// Whether use `hermes` as JS engine +/// This property requires the `JS_HERMES` compilation macro enabled to take effect. +/// default is NO. +@property (nonatomic, assign) BOOL useHermesEngine; + +@end + +#pragma mark - HippyBridge /// Async bridge used to communicate with the JavaScript application. @interface HippyBridge : NSObject @@ -166,7 +184,8 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); /// /// @param delegate bridge delegate /// @param block for user-defined module -/// @param launchOptions launch options, will not be sent to frontend +/// @param launchOptions launch options, will not be sent to frontend, see `HippyLaunchOptions` +/// For compatible with historical versions, launchOptions can also pass a NSDictionary object, but not recommended. /// @param executorKey key to engine instance. HippyBridge with same engine key will share same engine intance. /// /// Note: When multiple bridges use the same shared engineKey, @@ -175,7 +194,7 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); /// When executorKey is empty, it is not shared by default. A random key is assigned by default in the SDK. - (instancetype)initWithDelegate:(nullable id)delegate moduleProvider:(nullable HippyBridgeModuleProviderBlock)block - launchOptions:(nullable NSDictionary *)launchOptions + launchOptions:(nullable id)launchOptions executorKey:(nullable NSString *)executorKey; @@ -186,7 +205,8 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); /// @param delegate bridge delegate /// @param bundleURL the /// @param block for user-defined module -/// @param launchOptions launch options, will not be sent to frontend +/// @param launchOptions launch options, will not be sent to frontend, see `HippyLaunchOptions` +/// For compatible with historical versions, launchOptions can also pass a NSDictionary object, but not recommended. /// @param executorKey key to engine instance. HippyBridge with same engine key will share same engine intance. /// /// Note: When multiple bridges use the same shared engineKey, @@ -196,7 +216,7 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); - (instancetype)initWithDelegate:(nullable id)delegate bundleURL:(nullable NSURL *)bundleURL moduleProvider:(nullable HippyBridgeModuleProviderBlock)block - launchOptions:(nullable NSDictionary *)launchOptions + launchOptions:(nullable id)launchOptions executorKey:(nullable NSString *)executorKey NS_DESIGNATED_INITIALIZER; // Not available @@ -206,10 +226,6 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); /// The delegate of bridge @property (nonatomic, weak, readonly) id delegate; -/// SDK launch config -/// TODO: optimizes the launchOptions parameter -@property (nonatomic, copy, readonly) NSDictionary *launchOptions; - /// Module name /// /// @discussion @@ -360,7 +376,7 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); /// Whether is in debug mode /// debug mode will open DevMenu and make JSC inspectable -@property (nonatomic, assign) BOOL debugMode; +@property (nonatomic, assign, readonly) BOOL debugMode; /// Debug URL for devtools @property (nonatomic, strong, nullable, readonly) NSURL *debugURL; @@ -380,6 +396,9 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); #pragma mark - Advanced Usages + +/// Whether is using Hermes as JS Engine +@property (nonatomic, assign, readonly) BOOL usingHermesEngine; /// Interceptor for methods @property (nonatomic, weak) id methodInterceptor; diff --git a/framework/ios/base/bridge/HippyBridge.mm b/framework/ios/base/bridge/HippyBridge.mm index 36bccd6d74f..6c04753f866 100644 --- a/framework/ios/base/bridge/HippyBridge.mm +++ b/framework/ios/base/bridge/HippyBridge.mm @@ -92,10 +92,6 @@ const NSUInteger HippyBridgeBundleTypeVendor = 1; const NSUInteger HippyBridgeBundleTypeBusiness = 2; -// Launch options keys -NSString *const kHippyLaunchOptionsDebugModeKey = @"DebugMode"; -NSString *const kHippyLaunchOptionsEnableTurboKey = @"EnableTurbo"; - // Global device info keys & values static NSString *const kHippyNativeGlobalKeyOS = @"OS"; static NSString *const kHippyNativeGlobalKeyOSVersion = @"OSVersion"; @@ -118,6 +114,11 @@ static NSString *const kHippyRemoteModuleConfigKey = @"remoteModuleConfig"; static NSString *const kHippyBatchedBridgeConfigKey = @"__hpBatchedBridgeConfig"; +// key of launch options, to be deprecated +static NSString *const kLaunchOptionsDebugMode = @"DebugMode"; +static NSString *const kLaunchOptionsEnableTurbo = @"EnableTurbo"; +static NSString *const kLaunchOptionsUseHermes = @"useHermesEngine"; + // Define constants for the URI handlers static NSString *const kFileUriScheme = @"file"; static NSString *const kHpFileUriScheme = @"hpfile"; @@ -137,6 +138,19 @@ typedef NS_ENUM(NSUInteger, HippyBridgeFields) { }; +@implementation HippyLaunchOptions + +- (instancetype)init { + self = [super init]; + if (self) { + _enableTurbo = YES; + } + return self; +} + +@end + + @interface HippyBridge () { // Identifies whether batch updates are in progress. BOOL _wasBatchActive; @@ -198,7 +212,7 @@ @implementation HippyBridge - (instancetype)initWithDelegate:(nullable id)delegate moduleProvider:(nullable HippyBridgeModuleProviderBlock)block - launchOptions:(nullable NSDictionary *)launchOptions + launchOptions:(NSDictionary *)launchOptions executorKey:(nullable NSString *)executorKey { return [self initWithDelegate:delegate bundleURL:nil @@ -210,7 +224,7 @@ - (instancetype)initWithDelegate:(nullable id)delegate - (instancetype)initWithDelegate:(nullable id)delegate bundleURL:(nullable NSURL *)bundleURL moduleProvider:(nullable HippyBridgeModuleProviderBlock)block - launchOptions:(nullable NSDictionary *)launchOptions + launchOptions:(nullable id)launchOptions executorKey:(nullable NSString *)executorKey { if (self = [super init]) { _delegate = delegate; @@ -218,12 +232,13 @@ - (instancetype)initWithDelegate:(nullable id)delegate _pendingLoadingVendorBundleURL = bundleURL; _allBundleURLs = [NSMutableArray array]; _shareOptions = [NSMutableDictionary dictionary]; - _debugMode = [launchOptions[kHippyLaunchOptionsDebugModeKey] boolValue]; - _debugURL = _debugMode ? bundleURL : nil; - _enableTurbo = !!launchOptions[kHippyLaunchOptionsEnableTurboKey] ? [launchOptions[kHippyLaunchOptionsEnableTurboKey] boolValue] : YES; - _engineKey = executorKey.length > 0 ? executorKey : [NSString stringWithFormat:@"%p", self]; + [self parseLaunchOptions:launchOptions]; + if (executorKey.length > 0) { + _engineKey = [NSString stringWithFormat:@"%@_%d", executorKey, _usingHermesEngine]; + } else { + _engineKey = [NSString stringWithFormat:@"%p", self]; + } HippyLogInfo(@"HippyBridge init begin, self:%p", self); - // Set the log delegate for hippy core module registerLogDelegateToHippyCore(); @@ -240,6 +255,21 @@ - (instancetype)initWithDelegate:(nullable id)delegate return self; } +- (void)parseLaunchOptions:(id _Nullable)launchOptions { + if ([launchOptions isKindOfClass:NSDictionary.class]) { + // Compatible with old versions + _debugMode = [launchOptions[kLaunchOptionsDebugMode] boolValue]; + _enableTurbo = !!launchOptions[kLaunchOptionsEnableTurbo] ? [launchOptions[kLaunchOptionsEnableTurbo] boolValue] : YES; + _usingHermesEngine = !!launchOptions[kLaunchOptionsUseHermes] ? [launchOptions[kLaunchOptionsUseHermes] boolValue] : NO; + } else if ([launchOptions isKindOfClass:HippyLaunchOptions.class]) { + HippyLaunchOptions *options = launchOptions; + _debugMode = options.debugMode; + _enableTurbo = options.enableTurbo; + _usingHermesEngine = options.useHermesEngine; + } + +} + - (void)dealloc { HippyLogInfo(@"[Hippy_OC_Log][Life_Circle],%@ dealloc %p", NSStringFromClass([self class]), self); [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -261,7 +291,6 @@ - (void)dealloc { } } - #pragma mark - Setup related /// Set the log delegate for hippy core module @@ -580,9 +609,7 @@ - (void)partialBatchDidFlush { for (HippyModuleData *moduleData in moduleDataByID) { if (moduleData.hasInstance && moduleData.implementsPartialBatchDidFlush) { [self dispatchBlock:^{ - @autoreleasepool { - [moduleData.instance partialBatchDidFlush]; - } + [moduleData.instance partialBatchDidFlush]; } queue:moduleData.methodQueue]; } } @@ -593,9 +620,7 @@ - (void)batchDidComplete { for (HippyModuleData *moduleData in moduleDataByID) { if (moduleData.hasInstance && moduleData.implementsBatchDidComplete) { [self dispatchBlock:^{ - @autoreleasepool { - [moduleData.instance batchDidComplete]; - } + [moduleData.instance batchDidComplete]; } queue:moduleData.methodQueue]; } } @@ -789,9 +814,7 @@ - (void)invalidate { if ([instance respondsToSelector:@selector(invalidate)]) { dispatch_group_enter(group); [self dispatchBlock:^{ - @autoreleasepool { - [(id)instance invalidate]; - } + [(id)instance invalidate]; dispatch_group_leave(group); } queue:moduleData.methodQueue]; } @@ -806,11 +829,9 @@ - (void)invalidate { dispatch_group_notify(group, dispatch_get_main_queue(), ^{ [jsExecutor executeBlockOnJavaScriptQueue:^{ - @autoreleasepool { - [displayLink invalidate]; - [jsExecutor invalidate]; - [moduleSetup invalidate]; - } + [displayLink invalidate]; + [jsExecutor invalidate]; + [moduleSetup invalidate]; }]; }); } @@ -909,6 +930,13 @@ - (void)setInspectable:(BOOL)isInspectable { [self.javaScriptExecutor setInspecable:isInspectable]; } +- (NSURL *)debugURL { + if (_debugMode) { + return self.bundleURLs.firstObject; + } + return nil; +} + - (void)setRedBoxShowEnabled:(BOOL)enabled { #if HIPPY_DEBUG HippyRedBox *redBox = [self redBox]; diff --git a/framework/ios/base/bundleoperations/HippyBundleURLProvider.m b/framework/ios/base/bundleoperations/HippyBundleURLProvider.m index 31e50704f54..e5c72626968 100644 --- a/framework/ios/base/bundleoperations/HippyBundleURLProvider.m +++ b/framework/ios/base/bundleoperations/HippyBundleURLProvider.m @@ -69,9 +69,7 @@ - (instancetype)init { _scheme = HippyBundleURLSchemeHttp; _localhostIP = @"localhost"; _localhostPort = @"38989"; - self.debugPathUrl = @"/index.bundle?platform=ios&dev=true&minify=false"; - // websocket url after url encode - //_wsURL = @"debugUrl=wss%3A%2F%2Fdevtools.hippy.myqcloud.com%3A443%2Fdebugger-proxy"; + _debugPathUrl = @"/index.bundle?platform=ios&dev=true&minify=false"; } return self; } diff --git a/framework/ios/base/executors/HippyJSEnginesMapper.h b/framework/ios/base/executors/HippyJSEnginesMapper.h index 7aeef39698f..4aabb218ff7 100644 --- a/framework/ios/base/executors/HippyJSEnginesMapper.h +++ b/framework/ios/base/executors/HippyJSEnginesMapper.h @@ -41,13 +41,12 @@ class Worker; class EngineResource { public: - EngineResource(); - EngineResource(const std::string name); + EngineResource(const std::string name, const std::string vmType, bool isDebug); ~EngineResource(); std::shared_ptr GetEngine() {return engine_;}; std::shared_ptr GetDomManager() {return dom_manager_;}; private: - void Setup(const std::string name); + void Setup(const std::string name, const std::string vmType, bool isDebug); private: std::shared_ptr engine_; std::shared_ptr dom_worker_; @@ -80,7 +79,9 @@ class EngineResource { * * @return EngineResource instance for key */ -- (std::shared_ptr)createJSEngineResourceForKey:(NSString *)key; +- (std::shared_ptr)createJSEngineResourceForKey:(NSString *)key + engineType:(const std::string&)vmType + isDebug:(BOOL)isDebug; /** * Decrease reference of EngineResource instance for key diff --git a/framework/ios/base/executors/HippyJSEnginesMapper.mm b/framework/ios/base/executors/HippyJSEnginesMapper.mm index 757c3c9a8c5..c004cd2bd62 100644 --- a/framework/ios/base/executors/HippyJSEnginesMapper.mm +++ b/framework/ios/base/executors/HippyJSEnginesMapper.mm @@ -31,11 +31,7 @@ #include "footstone/platform/ios/looper_driver.h" #include "footstone/task_runner.h" -EngineResource::EngineResource() { - Setup("Hippy Dom Thread"); -} - -void EngineResource::Setup(const std::string name) { +void EngineResource::Setup(const std::string name, const std::string vmType, bool isDebug) { auto driver = std::make_unique(); dom_worker_ = std::make_shared(name, false, std::move(driver)); dom_worker_->Start(); @@ -45,18 +41,22 @@ dom_manager_ = std::make_shared(); dom_manager_->SetTaskRunner(task_runner); engine_ = std::make_shared(); - engine_->AsyncInitialize(task_runner, std::make_shared(), nullptr); + auto initParam = std::make_shared(); + if (!vmType.empty()) { + initParam->vm_type = vmType; + } + initParam->is_debug = isDebug; + engine_->AsyncInitialize(task_runner, initParam, nullptr); } -EngineResource::EngineResource(const std::string name) { +EngineResource::EngineResource(const std::string name, const std::string vmType, bool isDebug) { std::ostringstream stream; if (name.length()) { stream << "Hippy Dom " << name << " Thread"; - } - else { + } else { stream << "Hippy Dom Thread"; } - Setup(stream.str()); + Setup(stream.str(), vmType, isDebug); } EngineResource::~EngineResource() { @@ -92,7 +92,7 @@ + (instancetype)defaultInstance { return instance; } -- (std::shared_ptr)createJSEngineResourceForKey:(NSString *)key { +- (std::shared_ptr)createJSEngineResourceForKey:(NSString *)key engineType:(const std::string &)vmType isDebug:(BOOL)isDebug { std::lock_guard lock(_mutex); const auto it = _engineMapper.find([key UTF8String]); bool findIT = (_engineMapper.end() != it); @@ -101,7 +101,7 @@ + (instancetype)defaultInstance { ref.second++; return ref.first; } else { - std::shared_ptr engineSource = std::make_shared([key UTF8String]); + std::shared_ptr engineSource = std::make_shared([key UTF8String], vmType, isDebug); [self setEngine:engineSource forKey:key]; return engineSource; } diff --git a/framework/ios/base/executors/HippyJSExecutor.h b/framework/ios/base/executors/HippyJSExecutor.h index 64cc3ae47c9..f2cb0d86394 100644 --- a/framework/ios/base/executors/HippyJSExecutor.h +++ b/framework/ios/base/executors/HippyJSExecutor.h @@ -39,7 +39,7 @@ typedef void (^HippyContextCreatedBlock)(void); @interface HippyJSExecutor : NSObject /// HippyBridge instance -@property (nonatomic, weak) HippyBridge *bridge; +@property (nonatomic, weak, readonly) HippyBridge *bridge; /// Whether the executor has been invalidated @property (nonatomic, readonly, getter=isValid) BOOL valid; diff --git a/framework/ios/base/executors/HippyJSExecutor.mm b/framework/ios/base/executors/HippyJSExecutor.mm index 01e9b020fbd..bda05080f70 100644 --- a/framework/ios/base/executors/HippyJSExecutor.mm +++ b/framework/ios/base/executors/HippyJSExecutor.mm @@ -52,8 +52,9 @@ #include "driver/napi/js_ctx_value.h" #include "driver/napi/js_try_catch.h" #include "driver/napi/callback_info.h" -#include "driver/vm/jsc/jsc_vm.h" +#include "driver/vm/js_vm.h" #include "driver/scope.h" +#include "driver/js_driver_utils.h" #include "footstone/string_view.h" #include "footstone/string_view_utils.h" #include "footstone/task_runner.h" @@ -64,6 +65,16 @@ #include "devtools/devtools_data_source.h" #endif +#ifdef JS_JSC +#include "driver/napi/jsc/jsc_ctx.h" +#include "driver/napi/jsc/jsc_ctx_value.h" +#endif + +#ifdef JS_HERMES +#include "driver/napi/hermes/hermes_ctx.h" +#include "driver/napi/hermes/hermes_ctx_value.h" +#endif + using string_view = footstone::stringview::string_view; using StringViewUtils = footstone::stringview::StringViewUtils; @@ -76,7 +87,6 @@ constexpr char kGlobalKey[] = "global"; constexpr char kHippyKey[] = "Hippy"; constexpr char kHippyNativeGlobalKey[] = "__HIPPYNATIVEGLOBAL__"; -constexpr char kHippyExceptionEventName[] = "uncaughtException"; constexpr char kHippyRequireModuleConfigFuncKey[] = "nativeRequireModuleConfig"; constexpr char kHippyFlushQueueImmediateFuncKey[] = "nativeFlushQueueImmediate"; constexpr char kHippyGetTurboModule[] = "getTurboModule"; @@ -86,9 +96,8 @@ @interface HippyJSExecutor () { // The hippy scope std::shared_ptr _pScope; -#ifdef JS_JSC + // Whether js engine is inspectable, currently for jsc BOOL _isInspectable; -#endif //JS_JSC } /// Whether JSExecutor has done setup. @@ -104,29 +113,32 @@ @implementation HippyJSExecutor @synthesize pScope = _pScope; - (void)setup { - auto engine = [[HippyJSEnginesMapper defaultInstance] createJSEngineResourceForKey:self.enginekey]; + HippyBridge *bridge = self.bridge; + const std::string engineType = bridge.usingHermesEngine ? hippy::VM::kJSEngineHermes : hippy::VM::kJSEngineJSC; + auto engine = [[HippyJSEnginesMapper defaultInstance] createJSEngineResourceForKey:self.enginekey + engineType:engineType + isDebug:bridge.debugMode]; const char *pName = [self.enginekey UTF8String] ?: ""; auto scope = engine->GetEngine()->CreateScope(pName); __weak __typeof(self)weakSelf = self; - hippy::base::RegisterFunction taskEndCB = [weakSelf](void *) { - @autoreleasepool { - HippyJSExecutor *strongSelf = weakSelf; - if (strongSelf) { - handleJsExcepiton(strongSelf.pScope); + if (!bridge.usingHermesEngine) { + hippy::base::RegisterFunction taskEndCB = [weakSelf](void *) { + @autoreleasepool { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if (strongSelf) { + handleJsExcepiton(strongSelf.pScope); + } } - } - }; - scope->RegisterExtraCallback(hippy::kAsyncTaskEndKey, taskEndCB); + }; + scope->RegisterExtraCallback(hippy::kAsyncTaskEndKey, taskEndCB); + } dispatch_semaphore_t scopeSemaphore = dispatch_semaphore_create(0); footstone::TimePoint startPoint = footstone::TimePoint::SystemNow(); engine->GetEngine()->GetJsTaskRunner()->PostTask([weakSelf, scopeSemaphore, startPoint](){ @autoreleasepool { __strong __typeof(weakSelf)strongSelf = weakSelf; - if (!strongSelf) { - return; - } HippyBridge *bridge = strongSelf.bridge; if (!bridge) { return; @@ -138,6 +150,11 @@ - (void)setup { auto context = scope->GetContext(); auto global_object = context->GetGlobalObject(); +#if defined(ENABLE_INSPECTOR) && defined(JS_HERMES) + // setup debugger agent for hermes + setupDebuggerAgent(bridge, context, weakSelf); +#endif /* defined(ENABLE_INSPECTOR) && defined(JS_HERMES) */ + // add `global` property to global object auto user_global_object_key = context->CreateString(kGlobalKey); context->SetProperty(global_object, user_global_object_key, global_object); @@ -190,16 +207,32 @@ - (void)setup { dispatch_semaphore_signal(scopeSemaphore); #ifdef ENABLE_INSPECTOR - HippyBridge *bridge = self.bridge; - if (bridge && bridge.debugMode) { - NSString *wsURL = [self completeWSURLWithBridge:bridge]; - if (wsURL.length > 0) { - auto workerManager = std::make_shared(1); - auto devtools_data_source = std::make_shared(); - devtools_data_source->CreateDevtoolsService([wsURL UTF8String], workerManager); - self.pScope->SetDevtoolsDataSource(devtools_data_source); + [self executeAsyncBlockOnJavaScriptQueue:^{ + __strong __typeof(weakSelf)strongSelf = weakSelf; + HippyBridge *bridge = strongSelf.bridge; + if (!bridge) { + return; } - } + if (bridge && bridge.debugMode) { + NSString *wsURL = [strongSelf completeWSURLWithBridge:bridge]; + auto scope = strongSelf->_pScope; + if (wsURL.length > 0 && scope) { + auto engine = scope->GetEngine().lock(); + if (!engine) { + return; + } + auto workerManager = std::make_shared(1); + auto devtools_data_source = std::make_shared(); + devtools_data_source->CreateDevtoolsService([wsURL UTF8String], workerManager); + if (bridge.usingHermesEngine) { + // InitDevTools will bind devtools_data_source to scope + hippy::JsDriverUtils::InitDevTools(scope, engine->GetVM(), devtools_data_source); + } else { + scope->SetDevtoolsDataSource(devtools_data_source); + } + } + } + }]; #endif } @@ -207,14 +240,12 @@ - (instancetype)initWithEngineKey:(NSString *)engineKey bridge:(HippyBridge *)br NSParameterAssert(engineKey.length > 0); if (self = [super init]) { _valid = YES; - self.enginekey = engineKey; - self.bridge = bridge; - - self.ready = NO; - self.pendingCalls = [NSMutableArray array]; + _ready = NO; + _enginekey = engineKey; + _bridge = bridge; + _pendingCalls = [NSMutableArray array]; HippyLogInfo(@"[Hippy_OC_Log][Life_Circle],HippyJSCExecutor Init %p, engineKey:%@", self, engineKey); } - return self; } @@ -227,22 +258,26 @@ - (void)invalidate { if (!self.isValid) { return; } + _valid = NO; + HippyLogInfo(@"[Hippy_OC_Log][Life_Circle],HippyJSCExecutor invalide %p", self); + + HippyBridge *bridge = self.bridge; #ifdef ENABLE_INSPECTOR auto devtools_data_source = self.pScope->GetDevtoolsDataSource(); if (devtools_data_source) { - bool reload = self.bridge.invalidateReason == HippyInvalidateReasonReload ? true : false; + bool reload = bridge.invalidateReason == HippyInvalidateReasonReload ? true : false; devtools_data_source->Destroy(reload); } -#endif - HippyLogInfo(@"[Hippy_OC_Log][Life_Circle],HippyJSCExecutor invalide %p", self); - _valid = NO; +#endif /* ENABLE_INSPECTOR */ + #ifdef JS_JSC - if (self.pScope) { + if (self.pScope && bridge && !bridge.usingHermesEngine) { auto jsc_context = std::static_pointer_cast(self.pScope->GetContext()); static CFStringRef delName = CFSTR("HippyJSContext(delete)"); jsc_context->SetName(delName); } -#endif //JS_JSC +#endif /* JS_JSC */ + self.pScope->WillExit(); _pScope = nullptr; NSString *enginekey = self.enginekey; @@ -262,6 +297,36 @@ - (void)invalidate { #pragma mark - Subprocedures of Setup +#if defined(ENABLE_INSPECTOR) && defined(JS_HERMES) +static void setupDebuggerAgent(HippyBridge *bridge, const std::shared_ptr &context, HippyJSExecutor *const __weak weakSelf) { + if (bridge.debugMode && bridge.usingHermesEngine) { + // Create cdp agent for hermes + auto hermesCtx = std::static_pointer_cast(context); + hermesCtx->SetupDebugAgent([weakSelf](facebook::hermes::debugger::RuntimeTask fn) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + auto scope = strongSelf.pScope; + if (scope && scope->GetTaskRunner() && scope->GetContext()) { + auto hermes_ctx = std::static_pointer_cast(scope->GetContext()); + scope->GetTaskRunner()->PostTask(^{ + fn(*hermes_ctx->GetRuntime()); + }); + } + }, [weakSelf](const std::string &message) { + // Process CDP response or event and send message back to the Chrome debugger + // HippyLogTrace(@"To Debugger: %s\n", message.c_str()); + __strong __typeof(weakSelf)strongSelf = weakSelf; + auto scope = strongSelf.pScope; + if (scope) { + auto devtoolsDataSource = scope->GetDevtoolsDataSource(); + if (devtoolsDataSource) { + devtoolsDataSource->GetNotificationCenter()->vm_response_notification->ResponseToFrontend(message); + }; + } + }); + } +} +#endif /* defined(ENABLE_INSPECTOR) && defined(JS_HERMES) */ + - (void)injectDeviceInfoAsHippyNativeGlobal:(HippyBridge *)bridge context:(const std::shared_ptr &)context globalObject:(const std::shared_ptr &)globalObject { @@ -369,26 +434,25 @@ - (void)setSandboxDirectory:(NSString *)directory { if (directory) { __weak HippyJSExecutor *weakSelf = self; [self executeBlockOnJavaScriptQueue:^{ - @autoreleasepool { - HippyJSExecutor *strongSelf = weakSelf; - if (!strongSelf) { - return; - } - HippyAssert(strongSelf.pScope, @"scope must not be null"); - HippyAssert(strongSelf.pScope->GetContext(), @"context must not be null"); - auto context = strongSelf.pScope->GetContext(); - auto global_object = context->GetGlobalObject(); - auto key = context->CreateString("__HIPPYCURDIR__"); - auto value = context->CreateString(NSStringToU8StringView(directory)); - context->SetProperty(global_object, key, value); + HippyJSExecutor *strongSelf = weakSelf; + if (!strongSelf) { + return; } + HippyAssert(strongSelf.pScope, @"scope must not be null"); + HippyAssert(strongSelf.pScope->GetContext(), @"context must not be null"); + auto context = strongSelf.pScope->GetContext(); + auto global_object = context->GetGlobalObject(); + auto key = context->CreateString("__HIPPYCURDIR__"); + auto value = context->CreateString(NSStringToU8StringView(directory)); + context->SetProperty(global_object, key, value); }]; } } - (SharedCtxValuePtr)JSTurboObjectWithName:(NSString *)name { // create HostObject by name - HippyOCTurboModule *turboModule = [self->_bridge turboModuleWithName:name]; + HippyBridge *bridge = self.bridge; + HippyOCTurboModule *turboModule = [bridge turboModuleWithName:name]; auto scope = self.pScope; auto context = scope->GetContext(); if (!turboModule) { @@ -415,7 +479,9 @@ - (SharedCtxValuePtr)JSTurboObjectWithName:(NSString *)name { for (size_t i = 0; i < info.Length(); ++i) { argv.push_back(info[i]); } - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto turbo_wrapper = reinterpret_cast(data); @@ -425,7 +491,9 @@ - (SharedCtxValuePtr)JSTurboObjectWithName:(NSString *)name { info.GetReturnValue()->Set(result); }, turbo_wrapper.get()); [turbo saveTurboWrapper:name turbo:std::move(turbo_wrapper)]; - auto scope_wrapper = reinterpret_cast(std::any_cast(info.GetSlot())); + std::any slot_any = info.GetSlot(); + auto any_pointer = std::any_cast(&slot_any); + auto scope_wrapper = reinterpret_cast(static_cast(*any_pointer)); auto scope = scope_wrapper->scope.lock(); FOOTSTONE_CHECK(scope); auto func = scope->GetContext()->CreateFunction(func_wrapper); @@ -434,56 +502,87 @@ - (SharedCtxValuePtr)JSTurboObjectWithName:(NSString *)name { CFRelease(data); }, (void *)retainedTurboModule); - auto obj = scope->GetContext()->DefineProxy(wrapper); - scope->SaveFunctionWrapper(std::move(wrapper)); - scope->SetTurboInstance(turbo_name, obj); - return obj; +#ifdef JS_HERMES + // Save function wrapper + if (bridge.usingHermesEngine) { + auto proxy = scope->GetContext()->DefineProxy(nullptr); + auto handler = scope->GetContext()->DefineProxyHandler(wrapper); + auto proxy_ctx = std::static_pointer_cast(proxy); + auto handler_ctx = std::static_pointer_cast(handler); + auto& runtime = std::static_pointer_cast(scope->GetContext())->GetRuntime(); + auto constructor = proxy_ctx->GetValue(runtime).asObject(*runtime).asFunction(*runtime); + auto instance = constructor.callAsConstructor(*runtime, { handler_ctx->GetValue(runtime) }); + auto obj = std::make_shared(*runtime, instance); + scope->SaveFunctionWrapper(std::move(wrapper)); + scope->SetTurboInstance(turbo_name, obj); + return obj; + } else { + auto obj = scope->GetContext()->DefineProxy(wrapper); + scope->SaveFunctionWrapper(std::move(wrapper)); + scope->SetTurboInstance(turbo_name, obj); + return obj; + } +#else + auto obj = scope->GetContext()->DefineProxy(wrapper); + scope->SaveFunctionWrapper(std::move(wrapper)); + scope->SetTurboInstance(turbo_name, obj); + return obj; +#endif /* JS_HERMES */ } - (void)setContextName:(NSString *)contextName { #ifdef JS_JSC +#ifdef JS_HERMES + // TODO: setContextName not support Hermes now + if (self.bridge.usingHermesEngine) { + return; + } +#endif /* JS_HERMES */ if (!contextName) { return; } __weak __typeof(self)weakSelf = self; [self executeBlockOnJavaScriptQueue:^{ - @autoreleasepool { - __strong __typeof(weakSelf)strongSelf = weakSelf; - if (!strongSelf.pScope) { - return; - } - SharedCtxPtr context = strongSelf.pScope->GetContext(); - if (!context) { - return; - } - auto tryCatch = hippy::napi::CreateTryCatchScope(true, context); - auto jsc_context = std::static_pointer_cast(context); - NSString *finalName = [NSString stringWithFormat:@"HippyContext: %@", contextName]; - jsc_context->SetName((__bridge CFStringRef)finalName); - if (tryCatch->HasCaught()) { - HippyLogWarn(@"set context throw exception"); - } + __strong __typeof(weakSelf)strongSelf = weakSelf; + if (!strongSelf.pScope) { + return; + } + SharedCtxPtr context = strongSelf.pScope->GetContext(); + if (!context) { + return; + } + auto tryCatch = hippy::TryCatch::CreateTryCatchScope(true, context); + auto jsc_context = std::static_pointer_cast(context); + NSString *finalName = [NSString stringWithFormat:@"HippyContext: %@", contextName]; + jsc_context->SetName((__bridge CFStringRef)finalName); + if (tryCatch->HasCaught()) { + HippyLogWarn(@"set context throw exception"); } }]; #endif //JS_JSC } - (void)setInspecable:(BOOL)inspectable { +#ifdef JS_HERMES + // judge js engine type + if (self.bridge.usingHermesEngine) { + return; + } +#endif /* JS_HERMES */ + #ifdef JS_JSC _isInspectable = inspectable; #if defined(__IPHONE_16_4) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_4 if (@available(iOS 16.4, *)) { WeakCtxPtr weak_ctx = self.pScope->GetContext(); [self executeBlockOnJavaScriptQueue:^{ - @autoreleasepool { - SharedCtxPtr context = weak_ctx.lock(); - if (!context) { - return; - } - auto jsc_context = std::static_pointer_cast(context); - JSGlobalContextRef contextRef = jsc_context->context_; - JSGlobalContextSetInspectable(contextRef, inspectable); + SharedCtxPtr context = weak_ctx.lock(); + if (!context) { + return; } + auto jsc_context = std::static_pointer_cast(context); + JSGlobalContextRef contextRef = jsc_context->context_; + JSGlobalContextSetInspectable(contextRef, inspectable); }]; } #endif //defined(__IPHONE_16_4) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_4 @@ -547,65 +646,63 @@ - (void)_executeJSCall:(NSString *)method HippyAssert(onComplete != nil, @"onComplete block should not be nil"); __weak HippyJSExecutor *weakSelf = self; [self executeBlockOnJavaScriptQueue:^{ - @autoreleasepool { - HippyJSExecutor *strongSelf = weakSelf; - if (!strongSelf || !strongSelf.isValid || nullptr == strongSelf.pScope) { - return; - } - @try { - HippyBridge *bridge = [strongSelf bridge]; - NSString *moduleName = [bridge moduleName]; - NSError *executeError = nil; - id objcValue = nil; - auto context = strongSelf.pScope->GetContext(); - auto global_object = context->GetGlobalObject(); - auto bridge_key = context->CreateString("__hpBatchedBridge"); - auto batchedbridge_value = context->GetProperty(global_object, bridge_key); - SharedCtxValuePtr resultValue = nullptr; - string_view exception; - if (batchedbridge_value) { - string_view methodName = NSStringToU8StringView(method); - SharedCtxValuePtr method_value = context->GetProperty(batchedbridge_value, methodName); - if (method_value) { - if (context->IsFunction(method_value)) { - std::vector function_params(arguments.count); - for (NSUInteger i = 0; i < arguments.count; i++) { - id obj = arguments[i]; - function_params[i] = [obj convertToCtxValue:context]; - } - auto tryCatch = hippy::CreateTryCatchScope(true, context); - resultValue = context->CallFunction(method_value, context->GetGlobalObject(), arguments.count, function_params.data()); - if (tryCatch->HasCaught()) { - exception = tryCatch->GetExceptionMessage(); - } - } else { - executeError - = HippyErrorWithMessageAndModuleName([NSString stringWithFormat:@"%@ is not a function", method], moduleName); + HippyJSExecutor *strongSelf = weakSelf; + if (!strongSelf || !strongSelf.isValid || nullptr == strongSelf.pScope) { + return; + } + @try { + HippyBridge *bridge = [strongSelf bridge]; + NSString *moduleName = [bridge moduleName]; + NSError *executeError = nil; + id objcValue = nil; + auto context = strongSelf.pScope->GetContext(); + auto global_object = context->GetGlobalObject(); + auto bridge_key = context->CreateString("__hpBatchedBridge"); + auto batchedbridge_value = context->GetProperty(global_object, bridge_key); + SharedCtxValuePtr resultValue = nullptr; + string_view exception; + if (batchedbridge_value) { + string_view methodName = NSStringToU8StringView(method); + SharedCtxValuePtr method_value = context->GetProperty(batchedbridge_value, methodName); + if (method_value) { + if (context->IsFunction(method_value)) { + std::vector function_params(arguments.count); + for (NSUInteger i = 0; i < arguments.count; i++) { + id obj = arguments[i]; + function_params[i] = [obj convertToCtxValue:context]; + } + auto tryCatch = hippy::TryCatch::CreateTryCatchScope(true, context); + resultValue = context->CallFunction(method_value, context->GetGlobalObject(), arguments.count, function_params.data()); + if (tryCatch->HasCaught()) { + exception = tryCatch->GetExceptionMessage(); } } else { - executeError = HippyErrorWithMessageAndModuleName( - [NSString stringWithFormat:@"property/function %@ not found in __hpBatchedBridge", method], moduleName); + NSString *errMsg = [NSString stringWithFormat:@"%@ is not a function", method]; + executeError = HippyErrorWithMessageAndModuleName(errMsg, moduleName); } } else { - executeError = HippyErrorWithMessageAndModuleName(@"__hpBatchedBridge not found", moduleName); + NSString *errMsg = [NSString stringWithFormat:@"property/function %@ not found in __hpBatchedBridge", method]; + executeError = HippyErrorWithMessageAndModuleName(errMsg, moduleName); } - if (!StringViewUtils::IsEmpty(exception) || executeError) { - if (!StringViewUtils::IsEmpty(exception)) { - NSString *string = StringViewToNSString(exception); - executeError = HippyErrorWithMessageAndModuleName(string, moduleName); - } - } else if (resultValue) { - objcValue = ObjectFromCtxValue(context, resultValue); + } else { + executeError = HippyErrorWithMessageAndModuleName(@"__hpBatchedBridge not found", moduleName); + } + if (!StringViewUtils::IsEmpty(exception) || executeError) { + if (!StringViewUtils::IsEmpty(exception)) { + NSString *string = StringViewToNSString(exception); + executeError = HippyErrorWithMessageAndModuleName(string, moduleName); } - onComplete(objcValue, executeError); - } @catch (NSException *exception) { - NSString *moduleName = strongSelf.bridge.moduleName?:@"unknown"; - NSMutableDictionary *userInfo = [exception.userInfo mutableCopy]?:[NSMutableDictionary dictionary]; - [userInfo setObject:moduleName forKey:HippyFatalModuleName]; - [userInfo setObject:arguments?:[NSArray array] forKey:@"arguments"]; - NSException *reportException = [NSException exceptionWithName:exception.name reason:exception.reason userInfo:userInfo]; - HippyHandleException(reportException); + } else if (resultValue) { + objcValue = ObjectFromCtxValue(context, resultValue); } + onComplete(objcValue, executeError); + } @catch (NSException *exception) { + NSString *moduleName = strongSelf.bridge.moduleName?:@"unknown"; + NSMutableDictionary *userInfo = [exception.userInfo mutableCopy]?:[NSMutableDictionary dictionary]; + [userInfo setObject:moduleName forKey:HippyFatalModuleName]; + [userInfo setObject:arguments?:[NSArray array] forKey:@"arguments"]; + NSException *reportException = [NSException exceptionWithName:exception.name reason:exception.reason userInfo:userInfo]; + HippyHandleException(reportException); } }]; } @@ -615,21 +712,22 @@ - (void)executeApplicationScript:(NSData *)script sourceURL:(NSURL *)sourceURL o HippyAssertParam(sourceURL); __weak HippyJSExecutor* weakSelf = self; [self executeBlockOnJavaScriptQueue:^{ - @autoreleasepool { - HippyJSExecutor *strongSelf = weakSelf; - if (!strongSelf || !strongSelf.isValid) { - onComplete(nil, HippyErrorWithMessageAndModuleName(@"jsexecutor is not invalid", strongSelf.bridge.moduleName)); - return; - } - NSError *error = nil; - auto entry = strongSelf.pScope->GetPerformance()->PerformanceNavigation(hippy::kPerfNavigationHippyInit); - string_view url = [[sourceURL absoluteString] UTF8String]?:""; - entry->BundleInfoOfUrl(url).execute_source_start_ = footstone::TimePoint::SystemNow(); - id result = executeApplicationScript(script, sourceURL, strongSelf.pScope->GetContext(), &error); - entry->BundleInfoOfUrl(url).execute_source_end_ = footstone::TimePoint::SystemNow(); - if (onComplete) { - onComplete(result, error); - } + HippyJSExecutor *strongSelf = weakSelf; + if (!strongSelf || !strongSelf.isValid) { + onComplete(nil, HippyErrorWithMessageAndModuleName(@"jsexecutor is not invalid", strongSelf.bridge.moduleName)); + return; + } + NSError *error = nil; + auto entry = strongSelf.pScope->GetPerformance()->PerformanceNavigation(hippy::kPerfNavigationHippyInit); + string_view url = [[sourceURL absoluteString] UTF8String]?:""; + entry->BundleInfoOfUrl(url).execute_source_start_ = footstone::TimePoint::SystemNow(); + id result = executeApplicationScript(script, + sourceURL, + strongSelf.pScope->GetContext(), + &error); + entry->BundleInfoOfUrl(url).execute_source_end_ = footstone::TimePoint::SystemNow(); + if (onComplete) { + onComplete(result, error); } }]; } @@ -643,18 +741,23 @@ - (void)executeApplicationScript:(NSData *)script sourceURL:(NSURL *)sourceURL o return lock; } -static id executeApplicationScript(NSData *script, NSURL *sourceURL, SharedCtxPtr context, NSError **error) { +static NSError *executeApplicationScript(NSData *script, + NSURL *sourceURL, + SharedCtxPtr context, + __strong NSError **error) { const char *scriptBytes = reinterpret_cast([script bytes]); string_view view = string_view::new_from_utf8(scriptBytes, [script length]); string_view fileName = NSStringToU16StringView([sourceURL absoluteString]); string_view errorMsg; NSLock *lock = jslock(); BOOL lockSuccess = [lock lockBeforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]; - auto tryCatch = hippy::napi::CreateTryCatchScope(true, context); + + auto tryCatch = hippy::TryCatch::CreateTryCatchScope(true, context); SharedCtxValuePtr result = context->RunScript(view, fileName); if (tryCatch->HasCaught()) { errorMsg = std::move(tryCatch->GetExceptionMessage()); } + if (lockSuccess) { [lock unlock]; } @@ -677,11 +780,18 @@ - (void)executeBlockOnJavaScriptQueue:(dispatch_block_t)block { } auto engine = engineRsc->GetEngine(); if (engine) { + dispatch_block_t autoreleaseBlock = ^(void){ + if (block) { + @autoreleasepool { + block(); + } + } + }; auto runner = engine->GetJsTaskRunner(); if (footstone::Worker::IsTaskRunning() && runner == footstone::runner::TaskRunner::GetCurrentTaskRunner()) { - block(); + autoreleaseBlock(); } else if (runner) { - runner->PostTask(block); + runner->PostTask(autoreleaseBlock); } } } @@ -701,7 +811,14 @@ - (void)executeAsyncBlockOnJavaScriptQueue:(dispatch_block_t)block { if (engine) { auto runner = engine->GetJsTaskRunner(); if (runner) { - runner->PostTask(block); + dispatch_block_t autoreleaseBlock = ^(void){ + if (block) { + @autoreleasepool { + block(); + } + } + }; + runner->PostTask(autoreleaseBlock); } } } @@ -718,7 +835,7 @@ - (void)injectObjectSync:(NSObject *)value asGlobalObjectNamed:(NSString *)objec return; } auto context = self.pScope->GetContext(); - auto tryCatch = hippy::napi::CreateTryCatchScope(true, context); + auto tryCatch = hippy::TryCatch::CreateTryCatchScope(true, context); auto globalObject = context->GetGlobalObject(); auto nameKey = context->CreateString(objectName.UTF8String); auto ctxValue = [value convertToCtxValue:context]; @@ -727,7 +844,7 @@ - (void)injectObjectSync:(NSObject *)value asGlobalObjectNamed:(NSString *)objec } else { HippyLogError(@"Convert Error while inject:%@ for:%@", value, objectName); } - if (tryCatch->HasCaught()) { + if (tryCatch && tryCatch->HasCaught()) { NSString *errorMsg = StringViewToNSString(tryCatch->GetExceptionMessage()); NSError *error = HippyErrorWithMessage(errorMsg); if (onComplete) { @@ -743,19 +860,17 @@ - (void)injectObjectSync:(NSObject *)value asGlobalObjectNamed:(NSString *)objec - (void)injectObjectAsync:(NSObject *)value asGlobalObjectNamed:(NSString *)objectName callback:(HippyJavaScriptCallback)onComplete { __weak __typeof(self)weakSelf = self; [self executeBlockOnJavaScriptQueue:^{ - @autoreleasepool { - __strong __typeof(weakSelf)strongSelf = weakSelf; - if (!strongSelf || !strongSelf.isValid) { - return; - } - [strongSelf injectObjectSync:value asGlobalObjectNamed:objectName callback:onComplete]; + __strong __typeof(weakSelf)strongSelf = weakSelf; + if (!strongSelf || !strongSelf.isValid) { + return; } + [strongSelf injectObjectSync:value asGlobalObjectNamed:objectName callback:onComplete]; }]; } - (NSString *)completeWSURLWithBridge:(HippyBridge *)bridge { - if (![bridge.delegate respondsToSelector:@selector(shouldStartInspector:)] || - ![bridge.delegate shouldStartInspector:bridge]) { + if ([bridge.delegate respondsToSelector:@selector(shouldStartInspector:)] && + [bridge.delegate shouldStartInspector:bridge] == NO) { return @""; } HippyDevInfo *devInfo = [[HippyDevInfo alloc] init]; @@ -774,7 +889,7 @@ - (NSString *)completeWSURLWithBridge:(HippyBridge *)bridge { devInfo.versionId = bundleURLProvider.versionId; devInfo.wsURL = bundleURLProvider.wsURL; } - return [devInfo assembleFullWSURLWithClientId:[self getClientID] contextName:bridge.contextName]; + return [devInfo assembleFullWSURLWithClientId:[self getClientID] contextName:bridge.contextName isHermesEngine:bridge.usingHermesEngine]; } @@ -784,11 +899,13 @@ static void handleJsExcepiton(std::shared_ptr scope) { if (!scope) { return; } +#ifdef JS_JSC std::shared_ptr context = std::static_pointer_cast(scope->GetContext()); std::shared_ptr exception = std::static_pointer_cast(context->GetException()); if (exception) { // if native does not handled, rethrow to js if (!context->IsExceptionHandled()) { + constexpr char kHippyExceptionEventName[] = "uncaughtException"; hippy::vm::VM::HandleException(context, kHippyExceptionEventName, exception); } string_view exceptionStrView = context->GetExceptionMessage(exception); @@ -799,6 +916,7 @@ static void handleJsExcepiton(std::shared_ptr scope) { context->SetException(nullptr); context->SetExceptionHandled(true); } +#endif /* JS_JSC */ } diff --git a/framework/ios/debug/devtools/HippyDevInfo.h b/framework/ios/debug/devtools/HippyDevInfo.h index 3d7216c7778..43f8f8f42b1 100644 --- a/framework/ios/debug/devtools/HippyDevInfo.h +++ b/framework/ios/debug/devtools/HippyDevInfo.h @@ -34,6 +34,13 @@ - (void)parseWsURLWithURLQuery:(NSString *)query; --(NSString *)assembleFullWSURLWithClientId:(NSString *)clientId contextName:(NSString *) contextName; +/// Assemble full websocket url for devtools +/// - Parameters: +/// - clientId: unique id of client +/// - contextName: context name +/// - usingHermes: whether using hermes as js engine +- (NSString *)assembleFullWSURLWithClientId:(NSString *)clientId + contextName:(NSString *)contextName + isHermesEngine:(BOOL)usingHermes; @end diff --git a/framework/ios/debug/devtools/HippyDevInfo.m b/framework/ios/debug/devtools/HippyDevInfo.m index dc07711cb31..5e1feeb881f 100644 --- a/framework/ios/debug/devtools/HippyDevInfo.m +++ b/framework/ios/debug/devtools/HippyDevInfo.m @@ -28,6 +28,9 @@ NSString *const HippyDevWebSocketSchemeWss = @"wss"; NSString *const HippyDevWebSocketInfoDebugURL = @"debugUrl="; +static NSString *const kHippyClientRoleForJSC = @"ios_client"; +static NSString *const kHippyClientRoleForHermes = @"android_client"; // temporarily uses android as its identity + @implementation HippyDevInfo - (void)setScheme:(NSString *)scheme { @@ -63,7 +66,9 @@ - (void)parseWsURLWithURLQuery:(NSString *)query { _wsURL = [debugWsURL substringFromIndex:range.location + range.length]; } -- (NSString *)assembleFullWSURLWithClientId:(NSString *)clientId contextName:(NSString *)contextName { +- (NSString *)assembleFullWSURLWithClientId:(NSString *)clientId + contextName:(NSString *)contextName + isHermesEngine:(BOOL)usingHermes { if (self.port.length <= 0) { self.port = [self.scheme isEqualToString:HippyDevWebSocketSchemeWs] ? @"80" : @"443"; } @@ -80,7 +85,8 @@ - (NSString *)assembleFullWSURLWithClientId:(NSString *)clientId contextName:(NS } else { addressPrefix = [NSString stringWithFormat:@"%@?", addressPrefix]; } - NSString *devAddress = [NSString stringWithFormat:@"%@clientId=%@&platform=1&role=ios_client&deviceName=%@", addressPrefix, clientId, encodedDeviceName]; + NSString *devAddress = [NSString stringWithFormat:@"%@clientId=%@&platform=1&role=%@&deviceName=%@", + addressPrefix, clientId, (usingHermes ? kHippyClientRoleForHermes : kHippyClientRoleForJSC), encodedDeviceName]; if (self.versionId.length > 0) { devAddress = [NSString stringWithFormat:@"%@&hash=%@", devAddress, self.versionId]; } diff --git a/framework/ios/module/turbo/HippyOCTurboModule+Inner.h b/framework/ios/module/turbo/HippyOCTurboModule+Inner.h index 197cfc32b19..a22a2dcd87a 100644 --- a/framework/ios/module/turbo/HippyOCTurboModule+Inner.h +++ b/framework/ios/module/turbo/HippyOCTurboModule+Inner.h @@ -25,9 +25,10 @@ #ifdef __cplusplus #import "HippyOCTurboModule.h" +#import #include -#include "driver/napi/jsc/jsc_ctx.h" -#include "driver/napi/jsc/jsc_ctx_value.h" +#include "driver/napi/js_ctx.h" +#include "driver/napi/js_ctx_value.h" namespace hippy { inline namespace driver { diff --git a/framework/ios/module/turbo/HippyOCTurboModule.mm b/framework/ios/module/turbo/HippyOCTurboModule.mm index fbe610798d0..847c2ccf4d1 100644 --- a/framework/ios/module/turbo/HippyOCTurboModule.mm +++ b/framework/ios/module/turbo/HippyOCTurboModule.mm @@ -34,8 +34,8 @@ #include #include "footstone/string_view_utils.h" -#include "driver/napi/jsc/jsc_ctx.h" -#include "driver/napi/jsc/jsc_ctx_value.h" +#include "driver/napi/js_ctx.h" +#include "driver/napi/js_ctx_value.h" using namespace hippy; using namespace napi; @@ -84,7 +84,7 @@ - (void)saveTurboWrapper:(std::shared_ptr)name turbo:(std::unique_ptr< // get argument NSMutableArray *argumentArray = @[].mutableCopy; - for (NSInteger i = 0; i < count; ++i) { + for (NSUInteger i = 0; i < count; ++i) { std::shared_ptr ctxValue = *(args + i); [argumentArray addObject:convertCtxValueToObjcObject(ctx, ctxValue, weakSelf)?: [NSNull null]]; } diff --git a/framework/voltron/core/src/bridge/native_source_code_flutter.cc b/framework/voltron/core/src/bridge/native_source_code_flutter.cc index 0eb97c5ca5f..1feee685609 100644 --- a/framework/voltron/core/src/bridge/native_source_code_flutter.cc +++ b/framework/voltron/core/src/bridge/native_source_code_flutter.cc @@ -51,22 +51,22 @@ inline namespace driver { static const std::unordered_map global_base_js_source_map{ {"bootstrap.js", {k_bootstrap, ARRAY_SIZE(k_bootstrap) - 1}}, // NOLINT {"hippy.js", {k_hippy, ARRAY_SIZE(k_hippy) - 1}}, // NOLINT - {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT - {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT - {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT - {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT - {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT - {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT - {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT - {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT - {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT - {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT - {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT - {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT - {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT - {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT - {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT - {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT + {"ExceptionHandle.js", {k_ExceptionHandle, ARRAY_SIZE(k_ExceptionHandle) - 1}}, // NOLINT + {"Others.js", {k_Others, ARRAY_SIZE(k_Others) - 1}}, // NOLINT + {"DynamicLoad.js", {k_DynamicLoad, ARRAY_SIZE(k_DynamicLoad) - 1}}, // NOLINT + {"Platform.js", {k_Platform, ARRAY_SIZE(k_Platform) - 1}}, // NOLINT + {"UIManagerModule.js", {k_UIManagerModule, ARRAY_SIZE(k_UIManagerModule) - 1}}, // NOLINT + {"js2native.js", {k_js2native, ARRAY_SIZE(k_js2native) - 1}}, // NOLINT + {"TimerModule.js", {k_TimerModule, ARRAY_SIZE(k_TimerModule) - 1}}, // NOLINT + {"ConsoleModule.js", {k_ConsoleModule, ARRAY_SIZE(k_ConsoleModule) - 1}}, // NOLINT + {"Network.js", {k_Network, ARRAY_SIZE(k_Network) - 1}}, // NOLINT + {"Storage.js", {k_Storage, ARRAY_SIZE(k_Storage) - 1}}, // NOLINT + {"Dimensions.js", {k_Dimensions, ARRAY_SIZE(k_Dimensions) - 1}}, // NOLINT + {"UtilsModule.js", {k_UtilsModule, ARRAY_SIZE(k_UtilsModule) - 1}}, // NOLINT + {"global.js", {k_global, ARRAY_SIZE(k_global) - 1}}, // NOLINT + {"native2js.js", {k_native2js, ARRAY_SIZE(k_native2js) - 1}}, // NOLINT + {"Event.js", {k_Event, ARRAY_SIZE(k_Event) - 1}}, // NOLINT + {"AnimationFrameModule.js", {k_AnimationFrameModule, ARRAY_SIZE(k_AnimationFrameModule) - 1}}, // NOLINT }; const NativeSourceCode GetNativeSourceCode(const std::string& filename) { diff --git a/hippy.podspec b/hippy.podspec index 7d762dfca41..f302bc99030 100644 --- a/hippy.podspec +++ b/hippy.podspec @@ -1,6 +1,6 @@ layout_engine = "Taitank" -js_engine = "jsc" +js_engine = "hermes" Pod::Spec.new do |s| if ENV["layout_engine"] @@ -12,7 +12,7 @@ Pod::Spec.new do |s| puts "layout engine is #{layout_engine}, js engine is #{js_engine}" s.name = 'hippy' - s.version = '3.0.0' + s.version = '3.3.0-hermes' s.summary = 'Hippy Cross Platform Framework' s.description = <<-DESC Hippy is designed for developers to easily build cross-platform @@ -26,7 +26,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '11.0' s.prepare_command = <<-CMD - ./xcodeinitscript.sh "#{layout_engine}" "#{js_engine}" + ./xcodeinitscript.sh "#{layout_engine}" "#{js_engine}" CMD s.subspec 'Base' do |base| @@ -79,8 +79,8 @@ Pod::Spec.new do |s| framework.frameworks = 'CoreServices' framework.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } framework.dependency 'hippy/Base' framework.dependency 'hippy/JSDriver' @@ -102,8 +102,8 @@ Pod::Spec.new do |s| footstone.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', 'GCC_PREPROCESSOR_DEFINITIONS[config=Release]' => '${inherited} NDEBUG=1', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, 'HEADER_SEARCH_PATHS' => header_search_paths, } end @@ -114,8 +114,8 @@ Pod::Spec.new do |s| footstoneutils.project_header_files = ['modules/ios/footstoneutils/*.h'] footstoneutils.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } footstoneutils.dependency 'hippy/Footstone' footstoneutils.dependency 'hippy/Base' @@ -131,8 +131,8 @@ Pod::Spec.new do |s| vfs.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', 'HEADER_SEARCH_PATHS' => header_search_paths, - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } vfs.dependency 'hippy/Footstone' end @@ -147,39 +147,25 @@ Pod::Spec.new do |s| driver.exclude_files = [ 'driver/js/include/driver/napi/v8', 'driver/js/src/napi/v8', - 'driver/js/include/driver/runtime', - 'driver/js/src/runtime', - 'driver/js/include/driver/vm/v8', + 'driver/js/include/driver/vm/v8', 'driver/js/src/vm/v8', - 'driver/js/include/driver/napi/jsh', + 'driver/js/include/driver/napi/hermes', + 'driver/js/src/napi/hermes', + 'driver/js/include/driver/vm/hermes', + 'driver/js/src/vm/hermes', + 'driver/js/include/driver/napi/jsh', 'driver/js/src/napi/jsh', 'driver/js/include/driver/vm/jsh', 'driver/js/src/vm/jsh' ] - elsif js_engine == "v8" - driver.exclude_files = [ - 'driver/js/include/driver/napi/jsc', - 'driver/js/src/napi/jsc', - 'driver/js/include/driver/vm/jsc', - 'driver/js/src/vm/jsc', - 'driver/js/include/driver/napi/jsh', - 'driver/js/src/napi/jsh', - 'driver/js/include/driver/vm/jsh', - 'driver/js/src/vm/jsh' - ] - else + elsif js_engine == "hermes" driver.exclude_files = [ 'driver/js/include/driver/napi/v8', 'driver/js/src/napi/v8', - 'driver/js/include/driver/runtime', - 'driver/js/src/runtime', - 'driver/js/include/vm/v8', - 'driver/js/src/vm/v8', - 'driver/js/include/driver/napi/jsc', - 'driver/js/src/napi/jsc', - 'driver/js/include/vm/jsc', - 'driver/js/src/vm/jsc', - 'driver/js/include/driver/napi/jsh', + 'driver/js/include/driver/vm/v8', + 'driver/js/src/vm/v8', + 'driver/js/src/vm/hermes/native_source_code_hermes_android.cc', + 'driver/js/include/driver/napi/jsh', 'driver/js/src/napi/jsh', 'driver/js/include/driver/vm/jsh', 'driver/js/src/vm/jsh' @@ -189,8 +175,8 @@ Pod::Spec.new do |s| definition_engine = '' if js_engine == "jsc" definition_engine = 'JS_JSC=1' - elsif js_engine == "v8" - definition_engine = 'JS_V8=1' + elsif js_engine == "hermes" + definition_engine = 'JS_HERMES=1 JS_JSC=1' else end @@ -199,8 +185,8 @@ Pod::Spec.new do |s| 'HEADER_SEARCH_PATHS' => header_search_paths, 'GCC_PREPROCESSOR_DEFINITIONS' => definition_engine, 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } driver.dependency 'hippy/Footstone' driver.dependency 'hippy/Dom' @@ -230,8 +216,8 @@ Pod::Spec.new do |s| dom.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', 'HEADER_SEARCH_PATHS' => dom_pod_target_header_path, - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } dom.dependency 'hippy/Footstone' if layout_engine == "Taitank" @@ -248,8 +234,8 @@ Pod::Spec.new do |s| domutils.private_header_files = ['modules/ios/domutils/*.h'] domutils.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } domutils.dependency 'hippy/Dom' domutils.dependency 'hippy/FootstoneUtils' @@ -263,8 +249,8 @@ Pod::Spec.new do |s| taitank.private_header_files = ['dom/dom_project/_deps/taitank-src/src/*.h'] taitank.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } taitank.libraries = 'c++' puts 'hippy subspec \'Taitank\' read end' @@ -276,8 +262,8 @@ Pod::Spec.new do |s| yoga.private_header_files = ['dom/include/dom/yoga_layout_node.h', 'dom/dom_project/_deps/yoga-src/yoga/**/*.h'] yoga.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } yoga.libraries = 'c++' puts 'hippy subspec \'yoga\' read end' @@ -313,12 +299,7 @@ Pod::Spec.new do |s| puts 'hippy subspec \'devtools\' read begin' devtools.libraries = 'c++' devtools_exclude_files = Array.new; - if js_engine == "jsc" - devtools_exclude_files += ['devtools/devtools-integration/native/include/devtools/v8', 'devtools/devtools-integration/native/src/v8'] - elsif js_engine == "v8" - else - devtools_exclude_files += ['devtools/devtools-integration/native/include/devtools/v8', 'devtools/devtools-integration/native/src/v8'] - end + devtools_exclude_files += ['devtools/devtools-integration/native/include/devtools/v8', 'devtools/devtools-integration/native/src/v8'] devtools.exclude_files = devtools_exclude_files devtools.project_header_files = [ #devtools_integration/native @@ -346,8 +327,8 @@ Pod::Spec.new do |s| 'HEADER_SEARCH_PATHS' => pod_search_path, 'GCC_PREPROCESSOR_DEFINITIONS' => 'ENABLE_INSPECTOR=1 ASIO_NO_TYPEID ASIO_NO_EXCEPTIONS ASIO_DISABLE_ALIGNOF _WEBSOCKETPP_NO_EXCEPTIONS_ JSON_NOEXCEPTION BASE64_STATIC_DEFINE', 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } devtools.user_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ENABLE_INSPECTOR=1' @@ -361,20 +342,19 @@ Pod::Spec.new do |s| puts 'hippy subspec \'devtools\' read end' end - if js_engine == "v8" - s.subspec 'v8' do |v8| - puts 'hippy subspec \'v8\' read begin' - v8.source_files = ['v8forios/v8/include'] - v8.private_header_files = ['v8forios/v8/include'] - v8.pod_target_xcconfig = { + if js_engine == "hermes" + s.subspec 'hermes' do |hermes| + puts 'hippy subspec \'hermes\' read begin' + hermes.private_header_files = "hermesforios/destroot/include/**/*.h" + hermes.header_mappings_dir = "hermesforios/destroot/include" + hermes.pod_target_xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', - 'HEADER_SEARCH_PATHS' => '$(PODS_TARGET_SRCROOT)/v8forios/v8/include $(PODS_TARGET_SRCROOT)/v8forios/v8/include/v8', - 'GCC_ENABLE_CPP_EXCEPTIONS' => false, - 'GCC_ENABLE_CPP_RTTI' => false, + 'HEADER_SEARCH_PATHS' => '$(PODS_TARGET_SRCROOT)/hermesforios/destroot/include', + 'GCC_ENABLE_CPP_EXCEPTIONS' => true, + 'GCC_ENABLE_CPP_RTTI' => true, } - v8.libraries = 'c++' - v8.vendored_library = 'v8forios/v8/libv8.a' - puts 'hippy subspec \'v8\' read end' + hermes.ios.vendored_frameworks = "hermesforios/destroot/Library/Frameworks/universal/hermes.xcframework" + puts 'hippy subspec \'hermes\' read end' end end diff --git a/modules/footstone/src/platform/ios/logging.cc b/modules/footstone/src/platform/ios/logging.cc index 95422fdf1a0..0bee3909c80 100644 --- a/modules/footstone/src/platform/ios/logging.cc +++ b/modules/footstone/src/platform/ios/logging.cc @@ -84,6 +84,12 @@ LogMessage::~LogMessage() { } else { default_delegate_(stream_, severity_); } + +#ifdef DEBUG + if (severity_ >= TDF_LOG_FATAL) { + abort(); + } +#endif /* DEBUG */ } diff --git a/modules/footstone/src/platform/ios/looper_driver.cc b/modules/footstone/src/platform/ios/looper_driver.cc index 640582b6463..92a97c52e1d 100644 --- a/modules/footstone/src/platform/ios/looper_driver.cc +++ b/modules/footstone/src/platform/ios/looper_driver.cc @@ -50,7 +50,6 @@ LooperDriver::LooperDriver(): loop_() { LooperDriver::~LooperDriver() { CFRunLoopTimerInvalidate(delayed_wake_timer_); - CFRunLoopRemoveTimer(loop_, delayed_wake_timer_, kCFRunLoopDefaultMode); CFRelease(delayed_wake_timer_); CFRelease(loop_); } @@ -89,6 +88,7 @@ void LooperDriver::Start() { void LooperDriver::Terminate() { is_terminated_ = true; CFRunLoopStop(loop_); + CFRunLoopRemoveTimer(loop_, delayed_wake_timer_, kCFRunLoopDefaultMode); } void LooperDriver::OnTimerFire(CFRunLoopTimerRef timer) { diff --git a/modules/footstone/src/worker_manager.cc b/modules/footstone/src/worker_manager.cc index 3632002e54c..39c110837ea 100644 --- a/modules/footstone/src/worker_manager.cc +++ b/modules/footstone/src/worker_manager.cc @@ -44,7 +44,7 @@ void WorkerManager::Terminate() { void WorkerManager::CreateWorkers(uint32_t size) { std::shared_ptr worker; for (uint32_t i = 0; i < size; ++i) { - worker = std::make_shared(); + worker = std::make_shared("Hippy URI Worker"); worker->Start(); workers_.push_back(worker); } diff --git a/modules/ios/base/HippyAssert.m b/modules/ios/base/HippyAssert.m index 39b9139bcf5..f996cf509d4 100644 --- a/modules/ios/base/HippyAssert.m +++ b/modules/ios/base/HippyAssert.m @@ -86,19 +86,6 @@ void HippyFatal(NSError *error) { HippyFatalHandler fatalHandler = HippyGetFatalHandler(); if (fatalHandler) { fatalHandler(error); - } else { -#if HIPPY_DEBUG - @try { - NSString *name = [NSString stringWithFormat:@"%@: %@", HippyFatalExceptionName, error.localizedDescription]; - NSString *message = HippyFormatError(error.localizedDescription, error.userInfo[HippyJSStackTraceKey], 75); - if (failReason) { - name = [NSString stringWithFormat:@"%@: %@[Reason]: %@", HippyFatalExceptionName, error.localizedDescription, failReason]; - } - [NSException raise:name format:@"%@", message]; - } @catch (NSException *e) { - // no op - } -#endif //#ifdef DEBUG } } diff --git a/modules/vfs/android/src/main/cpp/src/handler/asset_handler.cc b/modules/vfs/android/src/main/cpp/src/handler/asset_handler.cc index 2373576efa1..0b56b9cf1ec 100644 --- a/modules/vfs/android/src/main/cpp/src/handler/asset_handler.cc +++ b/modules/vfs/android/src/main/cpp/src/handler/asset_handler.cc @@ -71,9 +71,7 @@ bool ReadAsset(const string_view& path, bytes.back() = '\0'; } AAsset_close(asset); - FOOTSTONE_DLOG(INFO) << "path = " << path << ", len = " << bytes.length() - << ", file_data = " - << reinterpret_cast(bytes.c_str()); + FOOTSTONE_DLOG(INFO) << "path = " << path << ", len = " << bytes.length(); return true; } FOOTSTONE_DLOG(INFO) << "ReadFile fail, file_path = " << file_path; diff --git a/tests/ios/HippyCtxValueConvertTest.mm b/tests/ios/HippyCtxValueConvertTest.mm index f902c748b0d..7e72957762f 100644 --- a/tests/ios/HippyCtxValueConvertTest.mm +++ b/tests/ios/HippyCtxValueConvertTest.mm @@ -41,7 +41,7 @@ @interface HippyCtxValueConvertTest : XCTestCase @implementation HippyCtxValueConvertTest - (void)setUp { - _vm = hippy::CreateVM(std::make_shared()); + _vm = hippy::VM::CreateVM(std::make_shared()); _context = _vm->CreateContext(); } diff --git a/tests/ios/HippyOC2CtxValueTest.mm b/tests/ios/HippyOC2CtxValueTest.mm index 1a1315cc757..6b47e1261fe 100644 --- a/tests/ios/HippyOC2CtxValueTest.mm +++ b/tests/ios/HippyOC2CtxValueTest.mm @@ -41,7 +41,18 @@ - (void)tearDown { } - (void)testOCObject2CtxValue { - auto engine = [[HippyJSEnginesMapper defaultInstance] createJSEngineResourceForKey:@"testKey"]; +#ifdef JS_JSC + [self runOCObject2CtxValueTestInEngine:hippy::VM::kJSEngineJSC]; +#endif /* JS_JSC */ +#ifdef JS_HERMES + [self runOCObject2CtxValueTestInEngine:hippy::VM::kJSEngineHermes]; +#endif /* JS_HERMES */ +} + +- (void)runOCObject2CtxValueTestInEngine:(const std::string &)engineType { + auto engine = [[HippyJSEnginesMapper defaultInstance] createJSEngineResourceForKey:@"testKey" + engineType:engineType + isDebug:YES]; auto scope = engine->GetEngine()->CreateScope("testKey"); XCTestExpectation *expectation = [self expectationWithDescription:@"ToCtxValue"]; diff --git a/xcodeinitscript.sh b/xcodeinitscript.sh index 570f772b6a3..c1ea188388d 100755 --- a/xcodeinitscript.sh +++ b/xcodeinitscript.sh @@ -42,33 +42,20 @@ fi cmake ./CMakeLists.txt -B ./dom_project -G Xcode -DMODULE_TOOLS=YES -DCMAKE_TOOLCHAIN_FILE=${ios_tool_chain_path} -DPLATFORM=OS64COMBINED -DDEPLOYMENT_TARGET=11.0 -DLAYOUT_ENGINE=${layout_engine} echo -e "\033[33m dom cmake build end\033[0m" -if [[ "v8" == ${2} ]]; then - echo "use v8 js engine" +if [[ "hermes" == ${2} ]]; then + echo "use hermes js engine" cd ${root_dir} - rm -rf v8forios - mkdir v8forios - mkdir v8forios/arm64 - mkdir v8forios/x64 + rm -rf hermesforios + mkdir hermesforios - #download and unzip arm64 bundle - curl https://infra-packages.openhippy.com/hippy/global_packages/v8/9.8-lkgr/ios-arm64.tgz --output v8forios/arm64/arm64.tgz - tar zxvf v8forios/arm64/arm64.tgz -C ./v8forios/arm64 - rm -f v8forios/arm64/arm64.tgz - - #download and unzip x64 bundle - curl https://infra-packages.openhippy.com/hippy/global_packages/v8/9.8-lkgr/ios-x64.tgz --output v8forios/x64/x64.tgz - tar zxvf v8forios/x64/x64.tgz -C ./v8forios/x64 - rm -f v8forios/x64/x64.tgz - - #move header to v8forios folder - mkdir v8forios/v8 - mv v8forios/arm64/include v8forios/v8/include - - #merge libraries - lipo -create v8forios/arm64/lib/libv8_monolith.a v8forios/x64/lib/libv8_monolith.a -output v8forios/v8/libv8.a + #download hermes + curl https://infra-packages.openhippy.com/hippy/global_packages/hermes/hermes-2024-09-09-RNv0.76.0-db6d12e202e15f7a446d8848d6ca8f7abb3cfb32/ios.tgz --output hermesforios/ios.tgz + tar zxvf hermesforios/ios.tgz -C ./hermesforios/ + rm -f hermesforios/ios.tgz + cd ${root_dir} elif [[ "custom" == ${2} ]]; then echo "use custom js engine" else echo "use default jsc js engine" -fi \ No newline at end of file +fi