diff --git a/packages/cli/package.json b/packages/cli/package.json index c6333a572..10d4f77ff 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -77,6 +77,7 @@ "@octokit/request-error": "catalog:", "@octokit/rest": "catalog:", "@socketaddon/iocraft": "file:../package-builder/build/dev/out/socketaddon-iocraft", + "@socketaddon/opentui": "file:../package-builder/build/dev/out/socketaddon-opentui", "@socketregistry/hyrious__bun.lockb": "catalog:", "@socketregistry/indent-string": "catalog:", "@socketregistry/is-interactive": "catalog:", diff --git a/packages/cli/scripts/download-assets.mjs b/packages/cli/scripts/download-assets.mjs index d9fa65f99..aea139f35 100644 --- a/packages/cli/scripts/download-assets.mjs +++ b/packages/cli/scripts/download-assets.mjs @@ -59,6 +59,18 @@ const ASSETS = { name: 'iocraft', type: 'multi-platform', }, + opentui: { + description: 'opentui native bindings (.node files)', + download: { + asset: 'opentui-*.node', + cwd: rootPath, + downloadDir: '../../packages/build-infra/build/downloaded/opentui', + quiet: false, + tool: 'opentui', + }, + name: 'opentui', + type: 'multi-platform', + }, models: { description: 'AI models (MiniLM-L6-v2, CodeT5)', download: { diff --git a/packages/cli/src/utils/terminal/iocraft.mts b/packages/cli/src/utils/terminal/iocraft.mts index 510172a16..b54d249c4 100644 --- a/packages/cli/src/utils/terminal/iocraft.mts +++ b/packages/cli/src/utils/terminal/iocraft.mts @@ -22,13 +22,20 @@ function getIocraft(): typeof iocraft { try { // Use createRequire to load native .node module from ESM. const require = createRequire(import.meta.url) - const loaded = require('@socketaddon/iocraft') + // Try opentui first (yoga-layout + opentui.node renderer), + // fall back to iocraft if not available. + let loaded + try { + loaded = require('@socketaddon/opentui') + } catch { + loaded = require('@socketaddon/iocraft') + } // Handle ESM default export when loaded via require(). iocraftInstance = loaded.default || loaded } catch (e) { throw new Error( - `Failed to load iocraft native module: ${e}\n` + - `Make sure @socketaddon/iocraft is installed and your platform is supported.`, + `Failed to load terminal UI module: ${e}\n` + + `Make sure @socketaddon/opentui or @socketaddon/iocraft is installed and your platform is supported.`, ) } } diff --git a/packages/cli/test/unit/commands/analytics/__snapshots__/AnalyticsRenderer.test.mts.snap b/packages/cli/test/unit/commands/analytics/__snapshots__/AnalyticsRenderer.test.mts.snap index c071da946..165df31df 100644 --- a/packages/cli/test/unit/commands/analytics/__snapshots__/AnalyticsRenderer.test.mts.snap +++ b/packages/cli/test/unit/commands/analytics/__snapshots__/AnalyticsRenderer.test.mts.snap @@ -3,39 +3,38 @@ exports[`AnalyticsRenderer > data rendering > should render analytics with fixture data 1`] = ` "Socket Analytics -┌─────────────────────────┐ -│ │ -│ Top 5 Alert Types: │ -│ │ -│ envVars: 2533 │ -│ unmaintained: 532 │ -│ filesystemAccess: 514 │ -│ networkAccess: 434 │ -│ dynamicRequire: 274 │ -│ │ -└─────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────┐ +│ │ +│ Top 5 Alert Types: │ +│ │ +│ envVars: 2533 │ +│ unmaintained: 532 │ +│ filesystemAccess: 514 │ +│ networkAccess: 434 │ +│ dynamicRequire: 274 │ +│ │ +└──────────────────────────────────────────────────────────────────────────────┘ -┌─────────────────────────┐ -│ │ -│ Critical Alerts │ -│ │ -│ Apr 19: 0 │ -│ Apr 21: 0 │ -│ Apr 20: 0 │ -│ Apr 22: 0 │ -│ │ -└─────────────────────────┘ - -┌─────────────────────────┐ -│ │ -│ High Alerts │ -│ │ -│ Apr 19: 13 │ -│ Apr 21: 13 │ -│ Apr 20: 13 │ -│ Apr 22: 10 │ -│ │ -└─────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────┐ +│ │ +│ Critical Alerts │ +│ │ +│ Apr 19: 0 │ +│ Apr 21: 0 │ +│ Apr 20: 0 │ +│ Apr 22: 0 │ +│ │ +└──────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────┐ +│ │ +│ High Alerts │ +│ │ +│ Apr 19: 13 │ +│ Apr 21: 13 │ +│ Apr 20: 13 │ +│ Apr 22: 10 │ +│ │ +└──────────────────────────────────────────────────────────────────────────────┘ " `; diff --git a/packages/cli/test/unit/commands/audit-log/__snapshots__/AuditLogRenderer.test.mts.snap b/packages/cli/test/unit/commands/audit-log/__snapshots__/AuditLogRenderer.test.mts.snap index b9f12e5a2..68ab12e50 100644 --- a/packages/cli/test/unit/commands/audit-log/__snapshots__/AuditLogRenderer.test.mts.snap +++ b/packages/cli/test/unit/commands/audit-log/__snapshots__/AuditLogRenderer.test.mts.snap @@ -3,14 +3,13 @@ exports[`AuditLogRenderer > data rendering > should render audit log table with multiple entries 1`] = ` "Socket Audit Logs for test-org -┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ │ -│ Event ID Created At Event Type User Email │ -│ │ -│ evt_12345678901234 Apr 19, 2024 10:30 AM repository.created user@example.com │ -│ evt_23456789012345 Apr 19, 2024 11:00 AM settings.updated admin@example.com │ -│ │ -└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ - +┌──────────────────────────────────────────────────────────────────────────────┐ +│ │ +│ Event ID Created At Event Type │ +│ │ +│ evt_12345678901234 Apr 19, 2024 10:30 AM repository.created │ +│ evt_23456789012345 Apr 19, 2024 11:00 AM settings.updated │ +│ │ +└──────────────────────────────────────────────────────────────────────────────┘ " `; diff --git a/packages/cli/test/unit/commands/threat-feed/__snapshots__/ThreatFeedRenderer.test.mts.snap b/packages/cli/test/unit/commands/threat-feed/__snapshots__/ThreatFeedRenderer.test.mts.snap index 878be89e0..e07199164 100644 --- a/packages/cli/test/unit/commands/threat-feed/__snapshots__/ThreatFeedRenderer.test.mts.snap +++ b/packages/cli/test/unit/commands/threat-feed/__snapshots__/ThreatFeedRenderer.test.mts.snap @@ -3,14 +3,13 @@ exports[`ThreatFeedRenderer > data rendering > should render threat feed table with multiple threats 1`] = ` "Socket Threat Feed -┌─────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ │ -│ Ecosystem Name Version Type Detected │ -│ │ -│ npm malicious-pkg 1.0.0 malware test-date │ -│ npm suspicious-lib 2.1.0 obfuscation test-date │ -│ │ -└─────────────────────────────────────────────────────────────────────────────────────────────────────┘ - +┌──────────────────────────────────────────────────────────────────────────────┐ +│ │ +│ Ecosystem Name Version Type │ +│ │ +│ npm malicious-pkg 1.0.0 malware │ +│ npm suspicious-lib 2.1.0 obfuscation │ +│ │ +└──────────────────────────────────────────────────────────────────────────────┘ " `; diff --git a/packages/package-builder/templates/socketaddon-opentui-main/index.d.ts b/packages/package-builder/templates/socketaddon-opentui-main/index.d.ts new file mode 100644 index 000000000..896b106b0 --- /dev/null +++ b/packages/package-builder/templates/socketaddon-opentui-main/index.d.ts @@ -0,0 +1,21 @@ +/** + * OpenTUI render engine — iocraft-compatible API. + */ + +export interface ComponentNode { + type: 'Text' | 'View' | 'MixedText' | 'Fragment' + children?: ComponentNode[] + content?: string + [key: string]: unknown +} + +export interface OpenTuiEngine { + renderToString(element: ComponentNode): string + renderToStringWithWidth(element: ComponentNode, maxWidth: number): string + printComponent(element: ComponentNode): void + eprintComponent(element: ComponentNode): void + getTerminalSize(): [number, number] +} + +declare const engine: OpenTuiEngine +export default engine diff --git a/packages/package-builder/templates/socketaddon-opentui-main/index.mjs b/packages/package-builder/templates/socketaddon-opentui-main/index.mjs new file mode 100644 index 000000000..66da6b58a --- /dev/null +++ b/packages/package-builder/templates/socketaddon-opentui-main/index.mjs @@ -0,0 +1,129 @@ +/** + * @socketaddon/opentui - Node.js bindings for OpenTUI terminal UI library + * + * Platform detection, native addon loading, and high-level render engine. + * Automatically loads the correct .node binary for the current platform + * and provides iocraft-compatible renderToString/printComponent/eprintComponent API. + */ + +import { createRequire } from 'node:module' +import { platform, arch } from 'node:os' + +const require = createRequire(import.meta.url) + +/** + * Detect the current platform and architecture. + * @returns {string} Platform identifier (e.g., 'darwin-arm64', 'linux-x64-musl') + */ +function getPlatformIdentifier() { + const platformName = platform() + const archName = arch() + + const platformMap = { + __proto__: null, + darwin: 'darwin', + linux: 'linux', + win32: 'win', + } + + const archMap = { + __proto__: null, + arm64: 'arm64', + x64: 'x64', + } + + const mappedPlatform = platformMap[platformName] + const mappedArch = archMap[archName] + + if (!mappedPlatform || !mappedArch) { + throw new Error( + `Unsupported platform: ${platformName} ${archName}\n` + + `opentui native bindings are only available for:\n` + + ` - macOS (darwin): arm64, x64\n` + + ` - Linux (linux): arm64, x64 (glibc and musl)\n` + + ` - Windows (win32): arm64, x64`, + ) + } + + // Detect musl on Linux. + let libcSuffix = '' + if (platformName === 'linux') { + try { + const { spawnSync } = require('node:child_process') + const lddResult = spawnSync('ldd', ['--version'], { + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + }) + const output = lddResult.stdout || '' + if (output.includes('musl')) { + libcSuffix = '-musl' + } + } catch { + // If ldd fails, assume glibc. + } + } + + return `${mappedPlatform}-${mappedArch}${libcSuffix}` +} + +/** + * Load the native addon for the current platform. + * @returns {object} The loaded opentui native module + */ +function loadNativeAddon() { + const platformId = getPlatformIdentifier() + const packageName = `@socketaddon/opentui-${platformId}` + + try { + // Try to load from optionalDependencies first. + return require(packageName) + } catch (e) { + // Fallback for development: resolve based on actual package location. + try { + const { dirname, join } = require('node:path') + const { fileURLToPath } = require('node:url') + const { realpathSync, existsSync } = require('node:fs') + + const __dirname = dirname(fileURLToPath(import.meta.url)) + const realDir = realpathSync(__dirname) + + let buildOutDir + + if (realDir.includes('/build/') && realDir.includes('/out/socketaddon-opentui')) { + buildOutDir = realDir.split('/socketaddon-opentui')[0] + } else if (realDir.includes('@socketaddon+opentui@file+packages+package-builder+build+dev+out+socketaddon-opentui')) { + const match = realDir.match(/^(.+?)\/node_modules\/\.pnpm\/@socketaddon/) + if (match) { + const projectRoot = match[1] + buildOutDir = join(projectRoot, 'packages/package-builder/build/dev/out') + } + } + + if (buildOutDir) { + const siblingPath = join(buildOutDir, `socketaddon-opentui-${platformId}`, 'opentui.node') + if (existsSync(siblingPath)) { + return require(siblingPath) + } + } + + throw new Error('Not in development build structure') + } catch { + if (e.code === 'MODULE_NOT_FOUND') { + throw new Error( + `Failed to load opentui native addon for ${platformId}.\n` + + `The package ${packageName} is not installed.\n` + + `This usually means your platform is not supported or the optionalDependencies were not installed correctly.\n\n` + + `Try reinstalling with: npm install --force @socketaddon/opentui`, + ) + } + throw e + } + } +} + +// Load native addon and create render engine. +const native = loadNativeAddon() +const { createRenderEngine } = require('./render-engine.mjs') +const engine = createRenderEngine(native) + +export default engine diff --git a/packages/package-builder/templates/socketaddon-opentui-main/package.json b/packages/package-builder/templates/socketaddon-opentui-main/package.json new file mode 100644 index 000000000..3292ea9e6 --- /dev/null +++ b/packages/package-builder/templates/socketaddon-opentui-main/package.json @@ -0,0 +1,54 @@ +{ + "name": "@socketaddon/opentui", + "version": "1.0.0-pre.0", + "description": "Node.js bindings for OpenTUI - a Zig-based terminal UI library with flexbox layout", + "license": "MIT", + "type": "module", + "main": "./index.mjs", + "types": "./index.d.ts", + "exports": { + ".": { + "types": "./index.d.ts", + "default": "./index.mjs" + }, + "./react": { + "default": "./react.mjs" + } + }, + "files": [ + "LICENSE", + "README.md", + "index.d.ts", + "index.mjs", + "react.mjs", + "render-engine.mjs", + "yoga-sync.cjs" + ], + "optionalDependencies": { + "@socketaddon/opentui-darwin-arm64": "1.0.0-pre.0", + "@socketaddon/opentui-darwin-x64": "1.0.0-pre.0", + "@socketaddon/opentui-linux-arm64": "1.0.0-pre.0", + "@socketaddon/opentui-linux-arm64-musl": "1.0.0-pre.0", + "@socketaddon/opentui-linux-x64": "1.0.0-pre.0", + "@socketaddon/opentui-linux-x64-musl": "1.0.0-pre.0", + "@socketaddon/opentui-win-arm64": "1.0.0-pre.0", + "@socketaddon/opentui-win-x64": "1.0.0-pre.0" + }, + "engines": { + "node": ">=18" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SocketDev/socket-cli.git" + }, + "author": { + "name": "Socket Inc", + "email": "eng@socket.dev", + "url": "https://socket.dev" + }, + "homepage": "https://github.com/SocketDev/socket-cli", + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/package-builder/templates/socketaddon-opentui-main/react.mjs b/packages/package-builder/templates/socketaddon-opentui-main/react.mjs new file mode 100644 index 000000000..e17f441e3 --- /dev/null +++ b/packages/package-builder/templates/socketaddon-opentui-main/react.mjs @@ -0,0 +1,351 @@ +/** + * @fileoverview React reconciler for OpenTUI terminal UI. + * + * Provides a React renderer that maps JSX components to the OpenTUI + * render engine's Element tree format. Uses react-reconciler to bridge + * React's component model to our yoga-layout + opentui.node pipeline. + * + * Usage: + * import { render, Box, Text } from '@socketaddon/opentui/react' + * + * render( + * + * Hello from React! + * + * ) + */ + +import { createRequire } from 'node:module' +import process from 'node:process' + +const require = createRequire(import.meta.url) + +const Reconciler = require('react-reconciler') + +// --------------------------------------------------------------------------- +// Element tree node (same shape as render-engine.mjs expects) +// --------------------------------------------------------------------------- + +function createElementNode(type, props) { + const node = { type, children: [] } + + if (type === 'Text') { + // Text content comes from children prop. + if (typeof props.children === 'string') { + node.content = props.children + } else if (Array.isArray(props.children)) { + node.content = props.children.join('') + } + // Style props. + if (props.color) node.color = props.color + if (props.bold) node.bold = true + if (props.dimColor) node.dim_color = true + if (props.italic) node.italic = true + if (props.underline) node.underline = true + if (props.strikethrough) node.strikethrough = true + if (props.weight) node.weight = props.weight + if (props.align) node.align = props.align + if (props.wrap) node.wrap = props.wrap + } else if (type === 'View') { + // Layout props → snake_case for render engine. + if (props.flexDirection) node.flex_direction = props.flexDirection + if (props.justifyContent) node.justify_content = props.justifyContent + if (props.alignItems) node.align_items = props.alignItems + if (props.alignContent) node.align_content = props.alignContent + if (props.flexGrow !== undefined) node.flex_grow = props.flexGrow + if (props.flexShrink !== undefined) node.flex_shrink = props.flexShrink + if (props.flexBasis !== undefined) node.flex_basis = props.flexBasis + if (props.flexWrap) node.flex_wrap = props.flexWrap + if (props.gap !== undefined) node.gap = props.gap + if (props.rowGap !== undefined) node.row_gap = props.rowGap + if (props.columnGap !== undefined) node.column_gap = props.columnGap + if (props.width !== undefined) node.width = props.width + if (props.height !== undefined) node.height = props.height + if (props.minWidth !== undefined) node.min_width = props.minWidth + if (props.minHeight !== undefined) node.min_height = props.minHeight + if (props.maxWidth !== undefined) node.max_width = props.maxWidth + if (props.maxHeight !== undefined) node.max_height = props.maxHeight + if (props.padding !== undefined) node.padding = props.padding + if (props.paddingX !== undefined) node.padding_x = props.paddingX + if (props.paddingY !== undefined) node.padding_y = props.paddingY + if (props.paddingTop !== undefined) node.padding_top = props.paddingTop + if (props.paddingRight !== undefined) node.padding_right = props.paddingRight + if (props.paddingBottom !== undefined) node.padding_bottom = props.paddingBottom + if (props.paddingLeft !== undefined) node.padding_left = props.paddingLeft + if (props.margin !== undefined) node.margin = props.margin + if (props.marginX !== undefined) node.margin_x = props.marginX + if (props.marginY !== undefined) node.margin_y = props.marginY + if (props.marginTop !== undefined) node.margin_top = props.marginTop + if (props.marginRight !== undefined) node.margin_right = props.marginRight + if (props.marginBottom !== undefined) node.margin_bottom = props.marginBottom + if (props.marginLeft !== undefined) node.margin_left = props.marginLeft + if (props.borderStyle) node.border_style = props.borderStyle + if (props.borderColor) node.border_color = props.borderColor + if (props.borderEdges) node.border_edges = props.borderEdges + if (props.backgroundColor) node.background_color = props.backgroundColor + if (props.display) node.display = props.display + if (props.position) node.position = props.position + if (props.top !== undefined) node.top = props.top + if (props.right !== undefined) node.right = props.right + if (props.bottom !== undefined) node.bottom = props.bottom + if (props.left !== undefined) node.left = props.left + if (props.inset !== undefined) node.inset = props.inset + if (props.overflow) { + node.overflow_x = props.overflow + node.overflow_y = props.overflow + } + if (props.overflowX) node.overflow_x = props.overflowX + if (props.overflowY) node.overflow_y = props.overflowY + } else if (type === 'MixedText') { + if (props.contents) { + node.mixed_text_contents = props.contents.map(s => ({ + text: s.text, + color: s.color, + weight: s.weight, + decoration: s.decoration, + italic: s.italic, + })) + } + if (props.align) node.align = props.align + if (props.wrap) node.wrap = props.wrap + } + + return node +} + +// --------------------------------------------------------------------------- +// React reconciler host config +// --------------------------------------------------------------------------- + +// Map JSX element types to internal types. +const TYPE_MAP = { + __proto__: null, + box: 'View', + text: 'Text', + 'mixed-text': 'MixedText', + br: 'Text', // line break → newline text node +} + +const hostConfig = { + // Core + createInstance(type, props) { + const internalType = TYPE_MAP[type] || type + const node = createElementNode(internalType, props) + // Handle
as newline. + if (type === 'br') { + node.content = '\n' + } + return node + }, + + createTextInstance(text) { + return { type: 'Text', content: text, children: [] } + }, + + appendChildToContainer(container, child) { + container.children.push(child) + }, + + appendChild(parent, child) { + parent.children.push(child) + }, + + appendInitialChild(parent, child) { + parent.children.push(child) + }, + + removeChild(parent, child) { + const idx = parent.children.indexOf(child) + if (idx !== -1) parent.children.splice(idx, 1) + }, + + removeChildFromContainer(container, child) { + const idx = container.children.indexOf(child) + if (idx !== -1) container.children.splice(idx, 1) + }, + + insertBefore(parent, child, before) { + const idx = parent.children.indexOf(before) + if (idx !== -1) { + parent.children.splice(idx, 0, child) + } else { + parent.children.push(child) + } + }, + + insertInContainerBefore(container, child, before) { + const idx = container.children.indexOf(before) + if (idx !== -1) { + container.children.splice(idx, 0, child) + } else { + container.children.push(child) + } + }, + + // Updates + prepareUpdate(_instance, _type, _oldProps, _newProps) { + return true // Always update for now. + }, + + commitUpdate(instance, _payload, type, _oldProps, newProps) { + // Rebuild the node with new props. + const internalType = TYPE_MAP[type] || type + const updated = createElementNode(internalType, newProps) + Object.assign(instance, updated) + instance.children = instance.children || [] + }, + + commitTextUpdate(node, _oldText, newText) { + node.content = newText + }, + + // Tree operations + getRootHostContext() { + return {} + }, + + getChildHostContext(parentContext) { + return parentContext + }, + + getPublicInstance(instance) { + return instance + }, + + finalizeInitialChildren() { + return false + }, + + prepareForCommit() { + return null + }, + + resetAfterCommit() {}, + + shouldSetTextContent(_type, props) { + return typeof props.children === 'string' + }, + + clearContainer(container) { + container.children = [] + }, + + // Required but no-op for static rendering. + supportsMutation: true, + supportsPersistence: false, + supportsHydration: false, + isPrimaryRenderer: true, + scheduleTimeout: setTimeout, + cancelTimeout: clearTimeout, + noTimeout: -1, + getCurrentEventPriority() { + return 16 // DefaultEventPriority + }, + getInstanceFromNode() { + return null + }, + beforeActiveInstanceBlur() {}, + afterActiveInstanceBlur() {}, + prepareScopeUpdate() {}, + getInstanceFromScope() { + return null + }, + detachDeletedInstance() {}, + preparePortalMount() {}, + setCurrentUpdatePriority() {}, + getCurrentUpdatePriority() { + return 16 + }, + resolveUpdatePriority() { + return 16 + }, + resetFormInstance() {}, + requestPostPaintCallback() {}, + maySuspendCommit() { + return false + }, + preloadInstance() { + return true + }, + completeSuspendedInstance() {}, + resolveEventType() { + return null + }, + resolveEventTimeStamp() { + return 0 + }, + shouldAttemptEagerTransition() { + return false + }, + trackSchedulerEvent() {}, + resolveUpdatePriority() { + return 16 + }, + setCurrentUpdatePriority() {}, + getCurrentUpdatePriority() { + return 16 + }, + NotPendingTransition: null, +} + +const reconciler = Reconciler(hostConfig) + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +/** + * Render a React element tree to an Element node tree suitable for + * the OpenTUI render engine. + * + * @param {import('react').ReactElement} element - React element to render + * @returns {object} Element tree (View with children) + */ +export function renderToElementTree(element) { + const container = { type: 'View', children: [] } + const root = reconciler.createContainer( + container, + 0, // LegacyRoot — synchronous rendering + null, + false, + null, + '', + () => {}, + null, + ) + // Synchronous render: updateContainerSync + flushSyncWork ensures + // the tree is fully built before we return. + reconciler.updateContainerSync(element, root, null, () => {}) + reconciler.flushSyncWork() + // If single child, return it directly. + if (container.children.length === 1) { + return container.children[0] + } + return container +} + +/** + * Render a React element to stdout using the OpenTUI render engine. + * + * @param {import('react').ReactElement} element - React element + * @param {object} engine - OpenTUI render engine instance + */ +export function render(element, engine) { + const tree = renderToElementTree(element) + engine.printComponent(tree) +} + +/** + * Render a React element to a plain text string. + * + * @param {import('react').ReactElement} element - React element + * @param {object} engine - OpenTUI render engine instance + * @returns {string} Plain text output + */ +export function renderToString(element, engine) { + const tree = renderToElementTree(element) + return engine.renderToString(tree) +} + +// Re-export React.createElement for JSX usage without React import. +export { createElement } from 'react' diff --git a/packages/package-builder/templates/socketaddon-opentui-main/render-engine.mjs b/packages/package-builder/templates/socketaddon-opentui-main/render-engine.mjs new file mode 100644 index 000000000..b7ac477b9 --- /dev/null +++ b/packages/package-builder/templates/socketaddon-opentui-main/render-engine.mjs @@ -0,0 +1,749 @@ +/** + * @fileoverview OpenTUI render engine with yoga-layout flexbox. + * + * Accepts the same Element tree that iocraft.mts produces and renders it + * using yoga-layout for flexbox computation and opentui.node for buffer + * drawing + ANSI output. + * + * Public API (iocraft-compatible): + * renderToString(element) → string (ANSI) + * renderToStringWithWidth(element, maxWidth) → string + * printComponent(element) → void (stdout) + * eprintComponent(element) → void (stderr) + * getTerminalSize() → [columns, rows] + */ + +import { createRequire } from 'node:module' +import process from 'node:process' + +const require = createRequire(import.meta.url) + +// --------------------------------------------------------------------------- +// Constants +// --------------------------------------------------------------------------- + +// Strip terminal control sequences from getLastOutputForTest output, +// keeping only printable text and ANSI SGR (color/style) codes. +// This makes renderToString output compatible with iocraft's cleaner format. +// eslint-disable-next-line no-control-regex +const CURSOR_CONTROL_RE = /\x1b\[\?[0-9;]*[a-zA-Z]|\x1b\[[0-9;]*[HJKfABCDEFGSTn]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b\[[0-9]+ q/g + +function stripCursorControls(s) { + return s.replace(CURSOR_CONTROL_RE, '') +} + +const TEXT_ATTR_BOLD = 1 +const TEXT_ATTR_DIM = 2 +const TEXT_ATTR_ITALIC = 4 +const TEXT_ATTR_UNDERLINE = 8 +const TEXT_ATTR_STRIKETHROUGH = 128 + +const BLACK = new Float32Array([0, 0, 0, 1]) +const WHITE = new Float32Array([1, 1, 1, 1]) +const TRANSPARENT = new Float32Array([0, 0, 0, 0]) + +// Standard ANSI color names → RGBA floats. +const NAMED_COLORS = { + __proto__: null, + black: [0, 0, 0, 1], + blue: [0, 0, 0.8, 1], + blueBright: [0.33, 0.33, 1, 1], + cyan: [0, 0.8, 0.8, 1], + cyanBright: [0.33, 1, 1, 1], + gray: [0.5, 0.5, 0.5, 1], + green: [0, 0.8, 0, 1], + greenBright: [0.33, 1, 0.33, 1], + grey: [0.5, 0.5, 0.5, 1], + magenta: [0.8, 0, 0.8, 1], + magentaBright: [1, 0.33, 1, 1], + red: [0.8, 0, 0, 1], + redBright: [1, 0.33, 0.33, 1], + white: [1, 1, 1, 1], + yellow: [0.8, 0.8, 0, 1], + yellowBright: [1, 1, 0.33, 1], +} + +// Unicode box-drawing character sets for border styles. +const BORDER_CHARS = { + __proto__: null, + bold: '\u250F\u2501\u2513\u2503\u2517\u2501\u251B\u2503', // ┏━┓┃┗━┛┃ (tl,t,tr,r,bl,b,br,l) + classic: '+-+|+-+|', + double: '\u2554\u2550\u2557\u2551\u255A\u2550\u255D\u2551', // ╔═╗║╚═╝║ + 'double-left-right': '\u2553\u2500\u2556\u2551\u2559\u2500\u255C\u2551', // ╓─╖║╙─╜║ + 'double-top-bottom': '\u2552\u2550\u2555\u2502\u2558\u2550\u255B\u2502', // ╒═╕│╘═╛│ + rounded: '\u256D\u2500\u256E\u2502\u2570\u2500\u256F\u2502', // ╭─╮│╰─╯│ + single: '\u250C\u2500\u2510\u2502\u2514\u2500\u2518\u2502', // ┌─┐│└─┘│ +} + +// ANSI 256-color palette → RGB (first 16 standard colors). +const ANSI_STANDARD = [ + [0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], + [0, 0, 128], [128, 0, 128], [0, 128, 128], [192, 192, 192], + [128, 128, 128], [255, 0, 0], [0, 255, 0], [255, 255, 0], + [0, 0, 255], [255, 0, 255], [0, 255, 255], [255, 255, 255], +] + +// --------------------------------------------------------------------------- +// Color parsing +// --------------------------------------------------------------------------- + +const colorCache = new Map() + +function parseColor(color) { + if (!color) return null + const cached = colorCache.get(color) + if (cached) return cached + + let result + const named = NAMED_COLORS[color] + if (named) { + result = new Float32Array(named) + } else if (color.startsWith('#')) { + result = hexToRgba(color) + } else if (color.startsWith('ansi:')) { + result = ansi256ToRgba(parseInt(color.slice(5), 10)) + } else if (/^\d+$/.test(color)) { + result = ansi256ToRgba(parseInt(color, 10)) + } else { + result = null + } + + if (result) colorCache.set(color, result) + return result +} + +function hexToRgba(hex) { + const h = hex.replace('#', '') + const r = parseInt(h.substring(0, 2), 16) / 255 + const g = parseInt(h.substring(2, 4), 16) / 255 + const b = parseInt(h.substring(4, 6), 16) / 255 + return new Float32Array([r, g, b, 1]) +} + +function ansi256ToRgba(n) { + if (n < 0 || n > 255) return new Float32Array(WHITE) + if (n < 16) { + const c = ANSI_STANDARD[n] + return new Float32Array([c[0] / 255, c[1] / 255, c[2] / 255, 1]) + } + if (n < 232) { + // 6x6x6 color cube. + const idx = n - 16 + const r = Math.floor(idx / 36) + const g = Math.floor((idx % 36) / 6) + const b = idx % 6 + return new Float32Array([ + r ? (r * 40 + 55) / 255 : 0, + g ? (g * 40 + 55) / 255 : 0, + b ? (b * 40 + 55) / 255 : 0, + 1, + ]) + } + // Grayscale ramp. + const v = (8 + (n - 232) * 10) / 255 + return new Float32Array([v, v, v, 1]) +} + +// --------------------------------------------------------------------------- +// Text attributes +// --------------------------------------------------------------------------- + +function buildAttributes(element) { + let attrs = 0 + if (element.bold || element.weight === 'bold') attrs |= TEXT_ATTR_BOLD + if (element.dim_color || element.weight === 'light') attrs |= TEXT_ATTR_DIM + if (element.italic) attrs |= TEXT_ATTR_ITALIC + if (element.underline) attrs |= TEXT_ATTR_UNDERLINE + if (element.strikethrough) attrs |= TEXT_ATTR_STRIKETHROUGH + return attrs +} + +function buildSectionAttributes(section) { + let attrs = 0 + if (section.weight === 'bold') attrs |= TEXT_ATTR_BOLD + if (section.weight === 'light') attrs |= TEXT_ATTR_DIM + if (section.italic) attrs |= TEXT_ATTR_ITALIC + if (section.decoration === 'underline') attrs |= TEXT_ATTR_UNDERLINE + if (section.decoration === 'strikethrough') attrs |= TEXT_ATTR_STRIKETHROUGH + return attrs +} + +// --------------------------------------------------------------------------- +// Text measurement +// --------------------------------------------------------------------------- + +function measureText(text) { + if (!text) return { width: 0, height: 0 } + const lines = text.split('\n') + let maxWidth = 0 + for (let i = 0, len = lines.length; i < len; i += 1) { + const w = lines[i].length + if (w > maxWidth) maxWidth = w + } + return { width: maxWidth, height: lines.length } +} + +function getMixedTextWidth(contents) { + if (!contents) return 0 + let width = 0 + for (let i = 0, len = contents.length; i < len; i += 1) { + width += (contents[i].text || '').length + } + return width +} + +// --------------------------------------------------------------------------- +// Yoga tree builder +// --------------------------------------------------------------------------- + +function buildYogaTree(element, yoga, parentBg) { + if (!element) return null + + // Fragment: transparent wrapper — return children directly. + if (element.type === 'Fragment') { + return { + children: (element.children || []).map(c => buildYogaTree(c, yoga, parentBg)).filter(Boolean), + element, + isFragment: true, + } + } + + const node = yoga.Node.create() + const bg = parseColor(element.background_color) || parentBg || TRANSPARENT + + if (element.type === 'Text' || element.type === 'MixedText') { + // Leaf node — measure text to determine dimensions. + const textContent = element.type === 'Text' + ? (element.content || '') + : '' + const mixedWidth = element.type === 'MixedText' + ? getMixedTextWidth(element.mixed_text_contents) + : 0 + + node.setMeasureFunc((width, widthMode, _height, _heightMode) => { + if (element.type === 'MixedText') { + return { width: mixedWidth, height: 1 } + } + const measured = measureText(textContent) + if (widthMode === yoga.MEASURE_MODE_AT_MOST && measured.width > width) { + // Wrap text to fit. + const wrappedHeight = Math.ceil(measured.width / Math.max(1, Math.floor(width))) + return { width: Math.min(measured.width, Math.floor(width)), height: wrappedHeight } + } + return measured + }) + + return { bg, children: [], element, node } + } + + // View node — apply all flex properties. + if (element.display === 'none') node.setDisplay(yoga.DISPLAY_NONE) + if (element.position === 'absolute') node.setPositionType(yoga.POSITION_TYPE_ABSOLUTE) + + // Flex direction (default: column). + if (element.flex_direction === 'row') { + node.setFlexDirection(yoga.FLEX_DIRECTION_ROW) + } else { + node.setFlexDirection(yoga.FLEX_DIRECTION_COLUMN) + } + + // Justify content. + const justifyMap = { + __proto__: null, + center: yoga.JUSTIFY_CENTER, + 'flex-end': yoga.JUSTIFY_FLEX_END, + 'flex-start': yoga.JUSTIFY_FLEX_START, + 'space-around': yoga.JUSTIFY_SPACE_AROUND, + 'space-between': yoga.JUSTIFY_SPACE_BETWEEN, + } + if (element.justify_content && justifyMap[element.justify_content] !== undefined) { + node.setJustifyContent(justifyMap[element.justify_content]) + } + + // Align items. + const alignMap = { + __proto__: null, + center: yoga.ALIGN_CENTER, + 'flex-end': yoga.ALIGN_FLEX_END, + 'flex-start': yoga.ALIGN_FLEX_START, + stretch: yoga.ALIGN_STRETCH, + } + if (element.align_items && alignMap[element.align_items] !== undefined) { + node.setAlignItems(alignMap[element.align_items]) + } + + // Align content. + const alignContentMap = { + __proto__: null, + center: yoga.ALIGN_CENTER, + 'flex-end': yoga.ALIGN_FLEX_END, + 'flex-start': yoga.ALIGN_FLEX_START, + 'space-around': yoga.ALIGN_SPACE_AROUND, + 'space-between': yoga.ALIGN_SPACE_BETWEEN, + stretch: yoga.ALIGN_STRETCH, + } + if (element.align_content && alignContentMap[element.align_content] !== undefined) { + node.setAlignContent(alignContentMap[element.align_content]) + } + + // Flex properties. + if (element.flex_grow !== undefined) node.setFlexGrow(element.flex_grow) + if (element.flex_shrink !== undefined) node.setFlexShrink(element.flex_shrink) + if (element.flex_basis !== undefined) { + if (element.flex_basis === 'auto') { + node.setFlexBasisAuto() + } else if (typeof element.flex_basis === 'string' && element.flex_basis.endsWith('%')) { + node.setFlexBasisPercent(parseFloat(element.flex_basis)) + } else { + node.setFlexBasis(element.flex_basis) + } + } + if (element.flex_wrap === 'wrap') node.setFlexWrap(yoga.WRAP_WRAP) + + // Dimensions. + if (element.width !== undefined) node.setWidth(element.width) + if (element.height !== undefined) node.setHeight(element.height) + if (element.min_width !== undefined) node.setMinWidth(element.min_width) + if (element.min_height !== undefined) node.setMinHeight(element.min_height) + if (element.max_width !== undefined) node.setMaxWidth(element.max_width) + if (element.max_height !== undefined) node.setMaxHeight(element.max_height) + + // Gap. + if (element.gap !== undefined) node.setGap(yoga.GUTTER_ALL, element.gap) + if (element.row_gap !== undefined) node.setGap(yoga.GUTTER_ROW, element.row_gap) + if (element.column_gap !== undefined) node.setGap(yoga.GUTTER_COLUMN, element.column_gap) + + // Padding. + if (element.padding !== undefined) node.setPadding(yoga.EDGE_ALL, element.padding) + if (element.padding_x !== undefined) node.setPadding(yoga.EDGE_HORIZONTAL, element.padding_x) + if (element.padding_y !== undefined) node.setPadding(yoga.EDGE_VERTICAL, element.padding_y) + if (element.padding_top !== undefined) node.setPadding(yoga.EDGE_TOP, element.padding_top) + if (element.padding_right !== undefined) node.setPadding(yoga.EDGE_RIGHT, element.padding_right) + if (element.padding_bottom !== undefined) node.setPadding(yoga.EDGE_BOTTOM, element.padding_bottom) + if (element.padding_left !== undefined) node.setPadding(yoga.EDGE_LEFT, element.padding_left) + + // Margin. + if (element.margin !== undefined) node.setMargin(yoga.EDGE_ALL, element.margin) + if (element.margin_x !== undefined) node.setMargin(yoga.EDGE_HORIZONTAL, element.margin_x) + if (element.margin_y !== undefined) node.setMargin(yoga.EDGE_VERTICAL, element.margin_y) + if (element.margin_top !== undefined) node.setMargin(yoga.EDGE_TOP, element.margin_top) + if (element.margin_right !== undefined) node.setMargin(yoga.EDGE_RIGHT, element.margin_right) + if (element.margin_bottom !== undefined) node.setMargin(yoga.EDGE_BOTTOM, element.margin_bottom) + if (element.margin_left !== undefined) node.setMargin(yoga.EDGE_LEFT, element.margin_left) + + // Border (tell yoga about border width so it affects layout). + const hasBorder = element.border_style && element.border_style !== 'none' + if (hasBorder) { + const edges = element.border_edges || { top: true, right: true, bottom: true, left: true } + if (edges.top !== false) node.setBorder(yoga.EDGE_TOP, 1) + if (edges.right !== false) node.setBorder(yoga.EDGE_RIGHT, 1) + if (edges.bottom !== false) node.setBorder(yoga.EDGE_BOTTOM, 1) + if (edges.left !== false) node.setBorder(yoga.EDGE_LEFT, 1) + } + + // Absolute positioning insets. + if (element.inset !== undefined) node.setPosition(yoga.EDGE_ALL, element.inset) + if (element.top !== undefined) node.setPosition(yoga.EDGE_TOP, element.top) + if (element.right !== undefined) node.setPosition(yoga.EDGE_RIGHT, element.right) + if (element.bottom !== undefined) node.setPosition(yoga.EDGE_BOTTOM, element.bottom) + if (element.left !== undefined) node.setPosition(yoga.EDGE_LEFT, element.left) + + // Overflow. + if (element.overflow === 'hidden' || element.overflow_x === 'hidden' || element.overflow_y === 'hidden') { + node.setOverflow(yoga.OVERFLOW_HIDDEN) + } + + // Build children (flatten fragments). + const children = [] + const childElements = element.children || [] + for (let i = 0, len = childElements.length; i < len; i += 1) { + const childTree = buildYogaTree(childElements[i], yoga, bg) + if (!childTree) continue + if (childTree.isFragment) { + // Flatten fragment children into this node. + for (let j = 0, flen = childTree.children.length; j < flen; j += 1) { + const fc = childTree.children[j] + node.insertChild(fc.node, children.length) + children.push(fc) + } + } else { + node.insertChild(childTree.node, children.length) + children.push(childTree) + } + } + + return { bg, children, element, node } +} + +// --------------------------------------------------------------------------- +// Buffer drawing +// --------------------------------------------------------------------------- + +function drawTree(tree, native, bufPtr, offsetX, offsetY, parentFg, parentBg) { + if (!tree || !tree.node) return + + const { element, node, children, bg } = tree + const x = Math.round(offsetX + node.getComputedLeft()) + const y = Math.round(offsetY + node.getComputedTop()) + const w = Math.round(node.getComputedWidth()) + const h = Math.round(node.getComputedHeight()) + + const elemBg = parseColor(element.background_color) || parentBg + const elemFg = parseColor(element.color) || parentFg + + if (element.type === 'View') { + // Fill background. + if (element.background_color) { + const bgColor = parseColor(element.background_color) || TRANSPARENT + for (let row = 0; row < h; row += 1) { + for (let col = 0; col < w; col += 1) { + native.bufferSetCell(bufPtr, x + col, y + row, 32, // space + bgColor[0], bgColor[1], bgColor[2], bgColor[3], + bgColor[0], bgColor[1], bgColor[2], bgColor[3], 0) + } + } + } + + // Draw border. + const hasBorder = element.border_style && element.border_style !== 'none' + if (hasBorder) { + drawBorder(native, bufPtr, x, y, w, h, element, elemBg) + } + + // Compute inner offset (padding + border). + const borderTop = hasBorder && (element.border_edges?.top !== false) ? 1 : 0 + const borderLeft = hasBorder && (element.border_edges?.left !== false) ? 1 : 0 + + const padTop = node.getComputedPadding(0) // EDGE_TOP = 0 in yoga + const padLeft = node.getComputedPadding(3) // EDGE_LEFT = 3 + + // Draw children. + for (let i = 0, len = children.length; i < len; i += 1) { + drawTree(children[i], native, bufPtr, x, y, elemFg || WHITE, elemBg || TRANSPARENT) + } + } else if (element.type === 'Text') { + const fg = elemFg || WHITE + const bg2 = elemBg || TRANSPARENT + const attrs = buildAttributes(element) + const content = element.content || '' + const lines = content.split('\n') + + for (let lineIdx = 0, llen = lines.length; lineIdx < llen; lineIdx += 1) { + const line = lines[lineIdx] + if (line.length > 0) { + native.bufferDrawText(bufPtr, line, x, y + lineIdx, + fg[0], fg[1], fg[2], fg[3], + bg2[0], bg2[1], bg2[2], bg2[3], attrs) + } + } + } else if (element.type === 'MixedText') { + // Draw all sections as a single contiguous span by concatenating + // text and drawing it as one bufferDrawText call, then overwriting + // per-character colors/attributes with bufferSetCell for sections + // that differ from the first section's style. + const contents = element.mixed_text_contents || [] + if (contents.length === 0) return + const defaultBg = elemBg || TRANSPARENT + + // First pass: draw the full concatenated text with the first section's style. + let fullText = '' + for (let i = 0, len = contents.length; i < len; i += 1) { + fullText += contents[i].text || '' + } + if (fullText.length === 0) return + + const firstFg = parseColor(contents[0].color) || elemFg || WHITE + const firstAttrs = buildSectionAttributes(contents[0]) + native.bufferDrawText(bufPtr, fullText, x, y, + firstFg[0], firstFg[1], firstFg[2], firstFg[3], + defaultBg[0], defaultBg[1], defaultBg[2], defaultBg[3], firstAttrs) + + // Second pass: overwrite cells for sections with different styles. + let curX = x + (contents[0].text || '').length + for (let i = 1, len = contents.length; i < len; i += 1) { + const section = contents[i] + const text = section.text || '' + if (text.length === 0) continue + const fg = parseColor(section.color) || elemFg || WHITE + const attrs = buildSectionAttributes(section) + // Only overwrite if style differs from first section. + for (let j = 0, tlen = text.length; j < tlen; j += 1) { + native.bufferSetCell(bufPtr, curX + j, y, text.codePointAt(j), + fg[0], fg[1], fg[2], fg[3], + defaultBg[0], defaultBg[1], defaultBg[2], defaultBg[3], attrs) + } + curX += text.length + } + } +} + +function drawBorder(native, bufPtr, x, y, w, h, element, bg) { + const style = element.border_style + let chars + if (element.custom_border_chars) { + const c = element.custom_border_chars + chars = c.top_left + c.top + c.top_right + c.right + c.bottom_right + c.bottom + c.bottom_left + c.left + } else { + chars = BORDER_CHARS[style] || BORDER_CHARS.single + } + + const edges = element.border_edges || { bottom: true, left: true, right: true, top: true } + const borderColor = parseColor(element.border_color) || WHITE + const bgColor = bg || TRANSPARENT + + // Draw corners and edges manually using setCell. + // chars order: tl, t, tr, r, bl, b, br, l + const tl = chars.codePointAt(0) + const t = chars.codePointAt(1) + const tr = chars.codePointAt(2) + const r = chars.codePointAt(3) + const bl = chars.codePointAt(4) + const b = chars.codePointAt(5) + const br = chars.codePointAt(6) + const l = chars.codePointAt(7) + + const fc = borderColor + const bc = bgColor + + // Top edge. + if (edges.top !== false) { + if (edges.left !== false) { + native.bufferSetCell(bufPtr, x, y, tl, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + for (let col = 1; col < w - 1; col += 1) { + native.bufferSetCell(bufPtr, x + col, y, t, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + if (edges.right !== false && w > 1) { + native.bufferSetCell(bufPtr, x + w - 1, y, tr, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + } + + // Bottom edge. + if (edges.bottom !== false && h > 1) { + if (edges.left !== false) { + native.bufferSetCell(bufPtr, x, y + h - 1, bl, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + for (let col = 1; col < w - 1; col += 1) { + native.bufferSetCell(bufPtr, x + col, y + h - 1, b, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + if (edges.right !== false && w > 1) { + native.bufferSetCell(bufPtr, x + w - 1, y + h - 1, br, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + } + + // Left edge. + if (edges.left !== false) { + for (let row = 1; row < h - 1; row += 1) { + native.bufferSetCell(bufPtr, x, y + row, l, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + } + + // Right edge. + if (edges.right !== false && w > 1) { + for (let row = 1; row < h - 1; row += 1) { + native.bufferSetCell(bufPtr, x + w - 1, y + row, r, fc[0], fc[1], fc[2], fc[3], bc[0], bc[1], bc[2], bc[3], 0) + } + } +} + +// --------------------------------------------------------------------------- +// Buffer-to-ANSI serializer +// --------------------------------------------------------------------------- + +/** + * Read the buffer's raw cell data and produce a plain-text string. + * This matches iocraft's renderToString behavior which returns + * unformatted text without ANSI escape codes. + */ +function serializeBufferPlain(native, bufPtr, width, height) { + const chars = new Uint32Array(native.bufferGetCharArrayBuffer(bufPtr)) + const lines = [] + + for (let row = 0; row < height; row += 1) { + let line = '' + // Track last non-space column for trimming trailing spaces. + let lastNonSpace = -1 + for (let col = 0; col < width; col += 1) { + const idx = row * width + col + if (chars[idx] !== 32) lastNonSpace = col + } + + for (let col = 0; col <= lastNonSpace; col += 1) { + const idx = row * width + col + line += String.fromCodePoint(chars[idx]) + } + + lines.push(line) + } + + // Trim trailing empty lines. + while (lines.length > 0 && lines[lines.length - 1] === '') { + lines.pop() + } + + return lines.join('\n') + '\n' +} + +/** + * Read the buffer's raw cell data and produce an ANSI-colored string. + * Used by printComponent/eprintComponent for terminal output with colors. + */ +function serializeBufferAnsi(native, bufPtr, width, height) { + const chars = new Uint32Array(native.bufferGetCharArrayBuffer(bufPtr)) + const fgData = new Float32Array(native.bufferGetFgArrayBuffer(bufPtr)) + const bgData = new Float32Array(native.bufferGetBgArrayBuffer(bufPtr)) + const attrData = new Uint32Array(native.bufferGetAttributesArrayBuffer(bufPtr)) + + const lines = [] + let prevFg = '' + let prevBg = '' + let prevAttr = 0 + + for (let row = 0; row < height; row += 1) { + let line = '' + let lastNonSpace = -1 + for (let col = 0; col < width; col += 1) { + const idx = row * width + col + if (chars[idx] !== 32) lastNonSpace = col + } + + for (let col = 0; col <= lastNonSpace; col += 1) { + const idx = row * width + col + const ch = chars[idx] + const fgIdx = idx * 4 + const fgR = Math.round(fgData[fgIdx] * 255) + const fgG = Math.round(fgData[fgIdx + 1] * 255) + const fgB = Math.round(fgData[fgIdx + 2] * 255) + const bgR = Math.round(bgData[fgIdx] * 255) + const bgG = Math.round(bgData[fgIdx + 1] * 255) + const bgB = Math.round(bgData[fgIdx + 2] * 255) + const attr = attrData[idx] & 0xFF + + const fgKey = `${fgR};${fgG};${fgB}` + const bgKey = `${bgR};${bgG};${bgB}` + + const parts = [] + if (attr !== prevAttr) { + const removed = prevAttr & ~attr + if (removed) { + parts.push('\x1b[0m') + prevFg = '' + prevBg = '' + } + if (attr & TEXT_ATTR_BOLD && !(prevAttr & TEXT_ATTR_BOLD)) parts.push('\x1b[1m') + if (attr & TEXT_ATTR_DIM && !(prevAttr & TEXT_ATTR_DIM)) parts.push('\x1b[2m') + if (attr & TEXT_ATTR_ITALIC && !(prevAttr & TEXT_ATTR_ITALIC)) parts.push('\x1b[3m') + if (attr & TEXT_ATTR_UNDERLINE && !(prevAttr & TEXT_ATTR_UNDERLINE)) parts.push('\x1b[4m') + if (attr & TEXT_ATTR_STRIKETHROUGH && !(prevAttr & TEXT_ATTR_STRIKETHROUGH)) parts.push('\x1b[9m') + prevAttr = attr + } + if (fgKey !== prevFg) { + parts.push(`\x1b[38;2;${fgR};${fgG};${fgB}m`) + prevFg = fgKey + } + if (bgKey !== prevBg && !(bgR === 0 && bgG === 0 && bgB === 0)) { + parts.push(`\x1b[48;2;${bgR};${bgG};${bgB}m`) + prevBg = bgKey + } + + line += parts.join('') + String.fromCodePoint(ch) + } + + lines.push(line) + prevFg = '' + prevBg = '' + prevAttr = 0 + } + + while (lines.length > 0 && lines[lines.length - 1] === '') { + lines.pop() + } + + return lines.join('\n') + '\x1b[0m\n' +} + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +export function createRenderEngine(native) { + // Load yoga-layout synchronously (embedded WASM). + const yoga = require('./yoga-sync.cjs') + + function renderToStringWithWidth(element, maxWidth) { + if (!element) return '' + + const termWidth = maxWidth || process.stdout.columns || 80 + + // Wrap root fragments in an implicit View so yoga has a root node. + let rootElement = element + if (element.type === 'Fragment') { + rootElement = { type: 'View', children: element.children || [] } + } + + // Build yoga tree from element tree. + const tree = buildYogaTree(rootElement, yoga, TRANSPARENT) + if (!tree || !tree.node) return '' + + // Compute layout. + tree.node.calculateLayout(termWidth, undefined, yoga.DIRECTION_LTR) + + const totalWidth = Math.round(tree.node.getComputedWidth()) + const totalHeight = Math.round(tree.node.getComputedHeight()) + + if (totalWidth <= 0 || totalHeight <= 0) { + tree.node.freeRecursive() + return '' + } + + // Create opentui buffer for drawing. + const bufPtr = native.createOptimizedBuffer(totalWidth, totalHeight, false, 0, 'render') + + // Clear buffer. + native.bufferClear(bufPtr, 0, 0, 0, 1) + + // Draw the element tree into the buffer. + drawTree(tree, native, bufPtr, 0, 0, WHITE, TRANSPARENT) + + // Serialize buffer cells. + const plainOutput = serializeBufferPlain(native, bufPtr, totalWidth, totalHeight) + const ansiOutput = serializeBufferAnsi(native, bufPtr, totalWidth, totalHeight) + + // Cleanup. + native.destroyOptimizedBuffer(bufPtr) + tree.node.freeRecursive() + + return { ansi: ansiOutput, plain: plainOutput } + } + + function renderToString(element) { + const result = renderToStringWithWidth(element, undefined) + return typeof result === 'string' ? result : result.plain + } + + function printComponent(element) { + const result = renderToStringWithWidth(element, undefined) + if (!result) return + const output = typeof result === 'string' ? result : result.ansi + if (output) process.stdout.write(output) + } + + function eprintComponent(element) { + const result = renderToStringWithWidth(element, undefined) + if (!result) return + const output = typeof result === 'string' ? result : result.ansi + if (output) process.stderr.write(output) + } + + function getTerminalSize() { + return [process.stdout.columns || 80, process.stdout.rows || 24] + } + + return { + eprintComponent, + getTerminalSize, + printComponent, + renderToString, + renderToStringWithWidth, + } +} diff --git a/packages/package-builder/templates/socketaddon-opentui-main/yoga-sync.cjs b/packages/package-builder/templates/socketaddon-opentui-main/yoga-sync.cjs new file mode 100644 index 000000000..a8269e77e --- /dev/null +++ b/packages/package-builder/templates/socketaddon-opentui-main/yoga-sync.cjs @@ -0,0 +1,4709 @@ +'use strict'; + +/** + * Synchronous yoga-layout with embedded WASM binary. + * + * This file is AUTO-GENERATED by yoga-layout-builder. + * Built with official yoga-layout API via wrapAssembly wrapper. + * + * Source: yoga.mjs (147297 bytes) + * WASM: 152919 bytes (203892 bytes base64) + */ + +// Polyfill for import.meta.url in CommonJS (converted from ESM). +// Uses pathToFileURL for proper cross-platform file:// URL conversion. +const __importMetaUrl = require('node:url').pathToFileURL(__filename).href; + +// Base64-encoded WASM binary (embedded at build time). +const base64Wasm = 'AGFzbQEAAAAB5ARHYAF/AX9gAX8AYAJ/fwBgAn9/AX9gA39/fwBgA39/fwF/YAABf2AAAGAEf39/fwBgAn99AGACf3wAYAN/f3wAYAF/AX1gBn9/f39/fwBgBX9/f39/AGADf399AGAEf39/fwF/YAF/AXxgAn9/AX1gAn9/AXxgBH9/f30BfWAGf399f31/AGADf31/AGAFf39/f38Bf2ADf35/AX5gBX9/f399AGADf399AX1gBX9/f319AX1gCn9/f39/f39/f38AYAR/f31/AGADf39/AX1gBH98fH8AYAR/fX1/AGADf319AX1gBn98f39/fwF/YAJ+fwF/YAR/fn5/AGAGf39/f39/AX9gDX9/f39/f39/f39/f38AYAl/f39/f39/f38AYAV/f39/fwF8YAV/f399fQBgBn9/f399fQF9YAV/f39/fQF9YA5/f319f39/fX1/f39/fwF/YAp/f39/fX19fX9/AGAHf39/f319fQF9YAt/f39/fX1/f39/fwBgDH9/f39/f39/fX19fQF/YAV/f39+fgBgBH9+f38Bf2AGf399f31/AX9gBH9/f3wAYAN/f38BfGAFf398fH8AYA1/fX99f31/fX19fX1/AX9gCn9/f319f39/f38AYAh/f39/f399fQBgC39/f39/f399fX19AX9gDX99fX9/f319f39/f38Bf2ANf319f39/fX1/f39/fwBgBn9/f319fQF9YAl/f399fX19f38AYAR8fH9/AX1gA398fABgBH9/fX0AYAJ8fwF8YAd/f39/f39/AX9gA35/fwF/YAF8AX5gAn5+AXwCxws5A2VudhZfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzACYDZW52H19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfZnVuY3Rpb24AHANlbnYlX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19jbGFzc19mdW5jdGlvbgAnA2VudiJfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yAA0DZW52HV9lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0AA0DZW52I19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0X2ZpZWxkABwDZW52HV9lbWJpbmRfZmluYWxpemVfdmFsdWVfb2JqZWN0AAEDZW52JV9lbWJpbmRfY3JlYXRlX2luaGVyaXRpbmdfY29uc3RydWN0b3IABQNlbnYNX2VtdmFsX2RlY3JlZgABA2VudhVfZW12YWxfY3JlYXRlX2ludm9rZXIABQNlbnYNX2VtdmFsX2ludm9rZQAoA2VudhZfZW12YWxfcnVuX2Rlc3RydWN0b3JzAAEDZW52C19fY3hhX3Rocm93AAQDZW52CGludm9rZV9pAAADZW52G19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2hfMgAGA2VudhFfX3Jlc3VtZUV4Y2VwdGlvbgABA2VudgppbnZva2VfaWlpAAUDZW52CGludm9rZV92AAEDZW52CWludm9rZV9paQADA2VudgxpbnZva2VfdmlpaWkADgNlbnYJaW52b2tlX3ZpAAIDZW52CWludm9rZV9maQASA2VudgppbnZva2VfdmlpAAQDZW52DGludm9rZV92aWlmZgApA2VudgppbnZva2VfdmlmAA8DZW52DWludm9rZV9maWlpZmYAKgNlbnYMaW52b2tlX2ZpaWlmACsDZW52C2ludm9rZV9maWlmABQDZW52FWludm9rZV9paWZmaWlpZmZpaWlpaQAsA2VudhFpbnZva2VfdmlpaWZmZmZpaQAtA2VudgtpbnZva2VfdmlmaQAdA2VudgxpbnZva2VfaWlpaWkAFwNlbnYLaW52b2tlX3ZpaWkACANlbnYOaW52b2tlX2ZpaWlmZmYALgNlbnYKaW52b2tlX2ZpaQAeA2VudhJpbnZva2VfdmlpaWZmaWlpaWkALwNlbnYTaW52b2tlX2lpaWlpaWlpZmZmZgAwA2VudhFfX2N4YV9iZWdpbl9jYXRjaAAAA2VudhtfX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoXzMAAANlbnYNX19jeGFfcmV0aHJvdwAHA2Vudg9fX2N4YV9lbmRfY2F0Y2gABwNlbnYNaW52b2tlX3ZpaWlpaQANA2VudhVfZW1iaW5kX3JlZ2lzdGVyX3ZvaWQAAgNlbnYVX2VtYmluZF9yZWdpc3Rlcl9ib29sAAgDZW52GF9lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcgAOA2VudhdfZW1iaW5kX3JlZ2lzdGVyX2JpZ2ludAAxA2VudhZfZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0AAQDZW52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NgIIIAEgACgCBDYCDCAAQQA2AgQgAUHEKjYCACABC7YCAQZ/IwBBIGsiAyIHIz9LIAcjQElyBEAgBxA4CyAHJAACQCABKAIAIgRB+P///wdPDQACQAJAIARBCksNACADIAQ6ABcgA0EMaiEFDAELIARBB3IiBkEBahDFBCEFIAMgBkGBgICAeGo2AhQgAyAFNgIMIAMgBDYCECAFIQULIAUhBQJAIARFDQAgBEUNACAFIAFBBGogBPwKAAALIAUgBGpBADoAACADIAI2AgggAxCBBDYCBCADQRhqIANBDGogA0EEaiAAEQQAIAMoAhwhBCADQQA2AhwCQCADKAIIIgFBCUkNACABEAggA0EANgIICwJAIAMsABdBf0oNACADKAIMIAMoAhRB/////wdxEMkECyADQSBqIggjP0sgCCNASXIEQCAIEDgLIAgkACAEDwsQjwEACykAIAAgASgCACABIAEsAAtBAEgbQYAoIAIoAgQQBzYCBCAAEIEENgIACw0AIAAoAgBBfGooAgALFwACQCAARQ0AIAAgACgCACgCBBEBAAsLQgEBfyABIAAoAgQiAkEBdWohASAAKAIAIQACQAJAIAJBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASAAEQEACw0AIAAoAgBBfGooAgALBAAgAAsEACAACxcAAkAgAEUNACAAIAAoAgAoAgQRAQALCwkAIABBAToABAsMACABIAAoAgARAQALcwEDfyMAQRBrIgIiAyM/SyADI0BJcgRAIAMQOAsgAyQAIAIgATYCDCACEIEENgIIIAJBCGogABEAACEBAkAgAigCDCIAQQlJDQAgABAIIAJBADYCDAsgAkEQaiIEIz9LIAQjQElyBEAgBBA4CyAEJAAgAQs9AQF/QRAQxQQiAUEAOgAEIAFB4C42AgAgASAAKAIANgIIIAEgACgCBDYCDCAAQQA2AgQgAUHMLjYCACABCykAIAAgASgCACABIAEsAAtBAEgbQdQsIAIoAgQQBzYCBCAAEIEENgIACwUAQewuCxQAAkAgAEUNACAAEIECQQQQyQQLCwcAIAARBgALBwAgABEGAAsJACABIAARAQALRgEBfyABIAAoAgQiBEEBdWohASAAKAIAIQACQAJAIARBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASACIAMgABEEAAtEAQF/IAEgACgCBCIDQQF1aiEBIAAoAgAhAAJAAkAgA0EBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAIgABEJAAtEAQF/IAEgACgCBCIDQQF1aiEBIAAoAgAhAAJAAkAgA0EBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAIgABECAAtEAQF/IAEgACgCBCIDQQF1aiEBIAAoAgAhAAJAAkAgA0EBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAIgABECAAtEAQF/IAEgACgCBCIDQQF1aiEBIAAoAgAhAAJAAkAgA0EBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAIgABEDAAtCAQF/IAEgACgCBCICQQF1aiEBIAAoAgAhAAJAAkAgAkEBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAARAAALQgEBfyABIAAoAgQiAkEBdWohASAAKAIAIQACQAJAIAJBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASAAEQAACzUBAX9BMBDFBCIAQgA3AyggAEIANwMgIABCADcDGCAAQgA3AxAgAEIANwMIIABCADcDACAACxEAAkAgAEUNACAAQTAQyQQLCw0AIAEgACgCAGorAwALDwAgASAAKAIAaiACOQMACxkBAX9BEBDFBCIAQgA3AwggAEIANwMAIAALEQACQCAARQ0AIABBEBDJBAsLDQAgASAAKAIAaisDAAsPACABIAAoAgBqIAI5AwALGQEBf0EQEMUEIgBCADcDCCAAQQA2AgAgAAsRAAJAIABFDQAgAEEQEMkECwsNACABIAAoAgBqKwMACw8AIAEgACgCAGogAjkDAAsNACABIAAoAgBqKAIACw8AIAEgACgCAGogAjYCAAsFAEGkMQsUAAJAIABFDQAgABCaAUEMEMkECwsHACAAEQYACwcAIAARBgALCQAgASAAEQAACwkAIAEgABEBAAtCAQF/IAEgACgCBCICQQF1aiEBIAAoAgAhAAJAAkAgAkEBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAARAQALRAEBfyABIAAoAgQiA0EBdWohASAAKAIAIQACQAJAIANBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASACIAARAgALRAEBfyABIAAoAgQiA0EBdWohASAAKAIAIQACQAJAIANBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASACIAARAgALRgEBfyABIAAoAgQiBEEBdWohASAAKAIAIQACQAJAIARBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASACIAMgABELAAtEAQF/IAEgACgCBCIDQQF1aiEBIAAoAgAhAAJAAkAgA0EBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAIgABEKAAtCAQF/IAEgACgCBCICQQF1aiEBIAAoAgAhAAJAAkAgAkEBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAARAAALmQEBBH8jAEEQayIDIgUjP0sgBSNASXIEQCAFEDgLIAUkACABIAAoAgQiBEEBdWohASAAKAIAIQACQAJAIARBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgAyABIAIgABEEAEEQEMUEIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiIGIz9LIAYjQElyBEAgBhA4CyAGJAAgAAuXAQEEfyMAQRBrIgIiBCM/SyAEI0BJcgRAIAQQOAsgBCQAIAEgACgCBCIDQQF1aiEBIAAoAgAhAAJAAkAgA0EBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyACIAEgABECAEEQEMUEIgAgAikDCDcDCCAAIAIpAwA3AwAgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAAgAAtCAQF/IAEgACgCBCICQQF1aiEBIAAoAgAhAAJAAkAgAkEBcUUNACABKAIAIABqKAIAIQAMAQsgACEACyABIAAREQALRAEBfyABIAAoAgQiA0EBdWohASAAKAIAIQACQAJAIANBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASACIAAREwALRAEBfyABIAAoAgQiA0EBdWohASAAKAIAIQACQAJAIANBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASACIAAREgALRgEBfyABIAAoAgQiBEEBdWohASAAKAIAIQACQAJAIARBAXFFDQAgASgCACAAaigCACEADAELIAAhAAsgASACIAMgABEEAAtEAQF/IAEgACgCBCIDQQF1aiEBIAAoAgAhAAJAAkAgA0EBcUUNACABKAIAIABq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AiEACyABQgA3AgQgASAAIgA2AgAgACABEKkCIAELYQEBfwJAIABFDQAgACgCABCbAiAAKAIIIQEgAEEANgIIAkAgAUUNACABIAEoAgAoAgQRAQALIAAoAgQhASAAQQA2AgQCQCABRQ0AIAEgASgCACgCBBEBAAsgAEEMEMkECwtUAQF/IAAoAgAQmwIgACgCCCEBIABBADYCCAJAIAFFDQAgASABKAIAKAIEEQEACyAAKAIEIQEgAEEANgIEAkAgAUUNACABIAEoAgAoAgQRAQALIAALUgEBfyAAKAIEIQEgAEEANgIEAkAgAUUNACABIAEoAgAoAgQRAQALIAAoAgghASAAQQA2AggCQCABRQ0AIAEgASgCACgCBBEBAAsgACgCABCdAgsPACAAKAIAIAEoAgAQvQILDAAgACgCACABEPUCCwwAIAAoAgAgARDLAgsPACAAKAIAIAEgArYQ3wILDwAgACgCACABIAK2EOECCwwAIAAoAgAgARDiAgsMACAAKAIAIAEQxQILDAAgACgCACABEMcCCwwAIAAoAgAgARDJAgsMACAAKAIAIAEQwQILDAAgACgCACABEL8CCwwAIAAoAgAgARDNAgsMACAAKAIAIAEQwwILDwAgACgCACABIAK2EOQCCw8AIAAoAgAgASACthDmAgsMACAAKAIAIAEQ5wILDAAgACgCACABEM8CCwwAIAAoAgAgARDRAgsNACAAKAIAIAG2ENMCCw0AIAAoAgAgAbYQ2gILDQAgACgCACABthDcAgsKACAAKAIAEN0CCw0AIAAoAgAgAbYQ1gILDQAgACgCACABthDYAgsNACAAKAIAIAG2EPcCCw0AIAAoAgAgAbYQ+QILCgAgACgCABD6AgsNACAAKAIAIAG2EPwCCw0AIAAoAgAgAbYQ/QILCgAgACgCABD+AgsNACAAKAIAIAG2EIADCw0AIAAoAgAgAbYQggMLDQAgACgCACABthCEAwsNACAAKAIAIAG2EIUDCw0AIAAoAgAgAbYQhwMLDQAgACgCACABthCJAwsNACAAKAIAIAG2EIsDCw0AIAAoAgAgAbYQjAMLDQAgACgCACABthDzAgsPACAAKAIAIAEgArYQ7QILDwAgACgCACABIAK2EOkCCw8AIAAoAgAgASACthDrAgsMACAAKAIAIAEQrAILDwAgACgCACABIAK2EO8CCw8AIAAoAgAgASACthDxAgsKACAAKAIAEPYCCwoAIAAoAgAQzAILZgIDfwF9IwBBEGsiAyIEIz9LIAQjQElyBEAgBBA4CyAEJAAgA0EIaiABKAIAIAIQ4wIgAyoCCCEGIAAgAygCDDYCACAAIAa7OQMIIANBEGoiBSM/SyAFI0BJcgRAIAUQOAsgBSQACwoAIAAoAgAQxgILCgAgACgCABDIAgsKACAAKAIAEMoCCwoAIAAoAgAQwgILCgAgACgCABDAAgsKACAAKAIAEM4CCwoAIAAoAgAQxAILZgIDfwF9IwBBEGsiAyIEIz9LIAQjQElyBEAgBBA4CyAEJAAgA0EIaiABKAIAIAIQ6AIgAyoCCCEGIAAgAygCDDYCACAAIAa7OQMIIANBEGoiBSM/SyAFI0BJcgRAIAUQOAsgBSQACwoAIAAoAgAQ0AILCgAgACgCABDSAgtkAgN/AX0jAEEQayICIgMjP0sgAyNASXIEQCADEDgLIAMkACACQQhqIAEoAgAQ3gIgAioCCCEFIAAgAigCDDYCACAAIAW7OQMIIAJBEGoiBCM/SyAEI0BJcgRAIAQQOAsgBCQACwsAIAAoAgAQ1wK7CwsAIAAoAgAQ2QK7C2QCA38BfSMAQRBrIgIiAyM/SyADI0BJcgRAIAMQOAsgAyQAIAJBCGogASgCABD7AiACKgIIIQUgACACKAIMNgIAIAAgBbs5AwggAkEQaiIEIz9LIAQjQElyBEAgBBA4CyAEJAALZAIDfwF9IwBBEGsiAiIDIz9LIAMjQElyBEAgAxA4CyADJAAgAkEIaiABKAIAEP8CIAIqAgghBSAAIAIoAgw2AgAgACAFuzkDCCACQRBqIgQjP0sgBCNASXIEQCAEEDgLIAQkAAtkAgN/AX0jAEEQayICIgMjP0sgAyNASXIEQCADEDgLIAMkACACQQhqIAEoAgAQgwMgAioCCCEFIAAgAigCDDYCACAAIAW7OQMIIAJBEGoiBCM/SyAEI0BJcgRAIAQQOAsgBCQAC2QCA38BfSMAQRBrIgIiAyM/SyADI0BJcgRAIAMQOAsgAyQAIAJBCGogASgCABCGAyACKgIIIQUgACACKAIMNgIAIAAgBbs5AwggAkEQaiIEIz9LIAQjQElyBEAgBBA4CyAEJAALZAIDfwF9IwBBEGsiAiIDIz9LIAMjQElyBEAgAxA4CyADJAAgAkEIaiABKAIAEIoDIAIqAgghBSAAIAIoAgw2AgAgACAFuzkDCCACQRBqIgQjP0sgBCNASXIEQCAEEDgLIAQkAAtkAgN/AX0jAEEQayICIgMjP0sgAyNASXIEQCADEDgLIAMkACACQQhqIAEoAgAQjQMgAioCCCEFIAAgAigCDDYCACAAIAW7OQMIIAJBEGoiBCM/SyAEI0BJcgRAIAQQOAsgBCQACwsAIAAoAgAQ9AK7Cw0AIAAoAgAgARDuArsLZgIDfwF9IwBBEGsiAyIEIz9LIAQjQElyBEAgBBA4CyAEJAAgA0EIaiABKAIAIAIQ7AIgAyoCCCEGIAAgAygCDDYCACAAIAa7OQMIIANBEGoiBSM/SyAFI0BJcgRAIAUQOAsgBSQACwwAIAAoAgAgARDyAgsKACAAKAIAEK0CCxEAIAAoAgAgASgCACACEKQCCw8AIAAoAgAgASgCABCcAgsKACAAKAIAEKcCCxkAAkAgACgCABCoAiIADQBBAA8LIAAQqgILGwACQCAAKAIAIAEQpgIiAA0AQQAPCyAAEKoCCzIBAX8gACgCBCECIAAgATYCBAJAIAJFDQAgAiACKAIAKAIEEQEACyAAKAIAQcoBEKsCC3EBA38jAEEQayIGIgcjP0sgByNASXIEQCAHEDgLIAckACAGIAEQqgIoAgQiASACIAMgBCAFIAEoAgAoAggRFQAgACAGKwMAtjgCACAAIAYrAwi2OAIEIAZBEGoiCCM/SyAII0BJcgRAIAgQOAsgCCQACzEBAX8gACgCBCEBIABBADYCBAJAIAFFDQAgASABKAIAKAIEEQEACyAAKAIAQQAQqwILMgEBfyAAKAIIIQIgACABNgIIAkAgAkUNACACIAIoAgAoAgQRAQALIAAoAgBBywEQowILFwAgABCqAigCCCIAIAAoAgAoAggRAQALMQEBfyAAKAIIIQEgAEEANgIIAkAgAUUNACABIAEoAgAoAgQRAQALIAAoAgBBABCjAgsKACAAKAIAEKICCwoAIAAoAgAQoQILDAAgACgCAEEAEKACCwoAIAAoAgAQnwILEgAgACgCACABtiACtiADEJ4CCwsAIAAoAgAQtAK7CwsAIAAoAgAQtgK7CwsAIAAoAgAQtQK7CwsAIAAoAgAQtwK7CwsAIAAoAgAQuAK7CwsAIAAoAgAQuQK7C1YAIAAgASgCABC0Ars5AwAgACABKAIAELYCuzkDCCAAIAEoAgAQtQK7OQMQIAAgASgCABC3Ars5AxggACABKAIAELgCuzkDICAAIAEoAgAQuQK7OQMoCw0AIAAoAgAgARC6ArsLDQAgACgCACABELsCuwsNACAAKAIAIAEQvAK7CwwAIAAoAgAgARCuAgsTAQF/QQQQxQQiABCJAjYCACAACxkAAkAgAEUNACAAKAIAEIoCIABBBBDJBAsLDAAgACgCABCKAiAACw4AIAAoAgAgASACEJECCwwAIAAoAgAgARCOAgsMACAAKAIAIAEQjwILDAAgACgCACABEIwCCwwAIAAoAgAgARCSAgsKACAAKAIAEJACCwoAIAAoAgAQjQILfQEEfyMEIQBBIBDFBCEBIABBADYCACMFEA0hAiAAKAIAIQMgAEEANgIAAkAgA0EBRg0AIAFBADYCHCABQoCAgICAgIDAPzcCFCABQgA3AgwgAUEAOgAIIAEgAjYCBCABQQA2AgAgAQ8LEA4hABC6BBogAUEgEMkEIAAQDwALEQACQCAARQ0AIABBIBDJBAsLBQAQzAMLCQAgACABEMMDCwcAIAAQwgMLHAAgACABQwAAAABgIwZBsBNqENADIAAgARDIAwsJACAAIAEQxgMLBwAgABDAAwsPACAAIAFB/wFxIAIQxAMLDQAgACABQf8BcRDFAwu4AQEIfyMAQRBrIgAiBiM/SyAGI0BJcgRAIAYQOAsgBiQAIwQhARCLAiECQYgEEMUEIQMgAUEANgIAIwcgAyACEBAhBCABKAIAIQUgAUEANgIAAkAgBUEBRw0AEA4hABC6BBogA0GIBBDJBCAAEA8ACyACQQBHIwZBnRlqEM4DIAAgAjYCCCAAIABBCGo2AgwgBEEAIABBDGoQ1gMgAEEQaiIHIz9LIAcjQElyBEAgBxA4CyAHJAAgBAu0AQEHfyMAQRBrIgEiBiM/SyAGI0BJcgRAIAYQOAsgBiQAIwQhAkGIBBDFBCEDIAJBADYCACMHIAMgABAQIQQgAigCACEFIAJBADYCAAJAIAVBAUYNACAAQQBHIwZBnRlqEM4DIAEgADYCCCABIAFBCGo2AgwgBEEAIAFBDGoQ1gMgAUEQaiIHIz9LIAcjQElyBEAgBxA4CyAHJAAgBA8LEA4hARC6BBogA0GIBBDJBCABEA8AC7IBAQZ/IwBBEGsiASIFIz9LIAUjQElyBEAgBRA4CyAFJAAjBCECQYgEEMUEIQMgAkEANgIAIwggAyAAEBAhACACKAIAIQQgAkEANgIAAkAgBEEBRg0AIAEgACgC9AM2AgggASABQQhqNgIMIABBACABQQxqENYDIABBADYC5AMgAUEQaiIGIz9LIAYjQElyBEAgBhA4CyAGJAAgAA8LEA4hARC6BBogA0GIBBDJBCABEA8AC84DAQZ/IAAgASgCEDYCECAAIAEpAgg3AgggACABKQIANwIAIABBFGoiAiABQRRqQegA/AoAACAAQgA3AoABIABBADsBfCAAQgA3AogBIABCADcCkAEjBCIDQQA2AgAjCUHOAWogAEH8AGogAUH8AGoQEBogAygCACEEIANBADYCAAJAIARBAUcNABAOIQEQugQaIABBlAFqEJgCGiABEA8ACyAAQZgBaiABQZgBakHQAvwKAAAgAEEANgLwAyAAQgA3AugDAkACQCABKALsAyIDIAEoAugDIgVGDQACQCADIAVrIgNBf0oNACMEIgFBADYCACMJQc8BahARIAEoAgAhAyABQQA2AgAgA0EBRg0CAAsjBCIGQQA2AgAjCiADEBIhBCAGKAIAIQcgBkEANgIAIAdBAUYNASAAIAQ2AuwDIAAgBDYC6AMgACAEIANqIgY2AvADAkAgA0UNACAEIAUgA/wKAAALIAAgBjYC7AMLIAAgASgChAQ2AoQEIAAgASkC/AM3AvwDIAAgASkC9AM3AvQDIAAPCxAOIQMQugQaAkAgACgC6AMiAUUNACAAIAE2AuwDIAEgACgC8AMgAWsQyQQLIAIQmgIaIAMQDwALwAMBBn8gACABLwEAOwEAIAAgASkCBDcCBCAAIAEpAgw3AgwgACABKAIUNgIUAkACQCABKAIYIgENAEEAIQIMAQtBGBDFBCICQQA2AgggAkIANwIAAkACQAJAIAEoAgQiAyABKAIAIgRGDQACQCADIARrIgNBf0oNACMEIgBBADYCACMJQdEBahARIAAoAgAhASAAQQA2AgAgAUEBRg0CAAsjBCIFQQA2AgAjCiADEBIhBiAFKAIAIQcgBUEANgIAIAdBAUYNASACIAY2AgAgAiAGIANqIgU2AggCQCADRQ0AIAYgBCAD/AoAAAsgAiAFNgIECyMEIgNBADYCACMJQdIBaiACQQxqIAFBDGoQEBogAygCACEBIANBADYCACABQQFHDQIQDiEBELoEGgwBCxAOIQEQugQaCwJAIAIoAgAiAEUNACACIAA2AgQgACACKAIIIABrEMkECyACQRgQyQQgARAPAAsgACgCGCEBIAAgAjYCGAJAIAFFDQACQCABKAIMIgJFDQAgAiABKAIUQQJ0EMkECwJAIAEoAgAiAkUNACABIAI2AgQgAiABKAIIIAJrEMkECyABQRgQyQQLIAALXgECfyAAKAIAIQEgAEEANgIAAkAgAUUNAAJAIAEoAgwiAkUNACACIAEoAhRBAnQQyQQLAkAgASgCACICRQ0AIAEgAjYCBCACIAEoAgggAmsQyQQLIAFBGBDJBAsgAAsMACMGQcIQahCQAQALYAECfyAAKAKAASEBIABBADYCgAECQCABRQ0AAkAgASgCDCICRQ0AIAIgASgCFEECdBDJBAsCQCABKAIAIgJFDQAgASACNgIEIAIgASgCCCACaxDJBAsgAUEYEMkECyAAC8IDAQl/IwBBEGsiASIIIz9LIAgjQElyBEAgCBA4CyAIJAACQCAAKALkAyICRQ0AIAIgABDkAxogAEEANgLkAwsCQCAAKALsAyICIAAoAugDIgNGDQAgAiADa0ECdSIEQQNxIQVBACECAkAgBEEESQ0AIARBfHEhBkEAIQJBACEHA0AgAyACQQJ0aiIEKAIAQQA2AuQDIAQoAgRBADYC5AMgBCgCCEEANgLkAyAEKAIMQQA2AuQDIAJBBGohAiAHQQRqIgcgBkcNAAsgBUUNAQtBACEEA0AgAyACQQJ0aigCAEEANgLkAyACQQFqIQIgBEEBaiIEIAVHDQALCyAAEPUDIAEgACgC9AM2AgggASABQQhqNgIMIABBASABQQxqENYDAkAgACgC6AMiAkUNACAAIAI2AuwDIAIgACgC8AMgAmsQyQQLIAAoApQBIQIgAEEANgKUAQJAIAJFDQACQCACKAIMIgRFDQAgBCACKAIUQQJ0EMkECwJAIAIoAgAiBEUNACACIAQ2AgQgBCACKAIIIARrEMkECyACQRgQyQQLIABBiAQQyQQgAUEQaiIJIz9LIAkjQElyBEAgCRA4CyAJJAAL6AQBAX8CQCAAKALsAyAAKALoA0YNACABKALkAyECIAAgARDkA0UNAAJAIAAgAkcNACABQgA3AqABIAFCgICAgICAgOD/ADcCmAEgAUIANwKoASABQoCAgP6HgIDg/wA3ApQDIAFCgICA/oeAgOD/ADcCjAMgAUEANgKIAyABQoCAgPyLgIDAv383AoADIAFCgYCAgBA3AvgCIAFCgICA/IuAgMC/fzcC8AIgAUKAgID8i4CAwL9/NwLoAiABQoGAgIAQNwLgAiABQoCAgPyLgIDAv383AtgCIAFCgICA/IuAgMC/fzcC0AIgAUKBgICAEDcCyAIgAUKAgID8i4CAwL9/NwLAAiABQoCAgPyLgIDAv383ArgCIAFCgYCAgBA3ArACIAFCgICA/IuAgMC/fzcCqAIgAUKAgID8i4CAwL9/NwKgAiABQoGAgIAQNwKYAiABQoCAgPyLgIDAv383ApACIAFCgICA/IuAgMC/fzcCiAIgAUKBgICAEDcCgAIgAUKAgID8i4CAwL9/NwL4ASABQoCAgPyLgIDAv383AvABIAFCgYCAgBA3AugBIAFCgICA/IuAgMC/fzcC4AEgAUKAgID8i4CAwL9/NwLYASABQoGAgIAQNwLQASABQoCAgPyLgIDAv383AsgBIAFCgICA/IuAgMC/fzcCwAEgAUKBgICAEDcCuAEgAUKAgID8i4CAwL9/NwKwASABQgA3AtQDIAFCADcCzAMgAUIANwLEAyABQgA3ArwDIAFCADcCtAMgAUIANwKsAyABQgA3AqQDIAFCADcCnAMgAUEANgLkAwsgABDiAwsLBwAgABD7AwsRACAAIAEgAiADQf8BcRC5AwsKACAALQAAQQFxCxMAIAAgAC0AAEH+AXEgAXI6AAALDQAgAC0AAEEEcUECdgsgAQF/IwYhASAAIAAoAghBAEcgAUGACGoQzwMgABDiAwsJACAAIAE2AhALQQEBfyMGIQMgACABKALkA0UgA0HfJGoQzwMgACAAKAIIRSADQeQlahDPAyAAIAEgAhDeAyABIAA2AuQDIAAQ4gMLDAAjBkHCEGoQsgIACzEBAX9BACECAkAgASAAKALsAyAAKALoAyIAa0ECdU8NACAAIAFBAnRqKAIAIQILIAILEgAgACgC7AMgACgC6ANrQQJ1CwgAIAAoAuQDCwkAIAAgATYCBAsHACAAKAIECwkAIAAgARDdAwsxAQF/AkAgASAALQAAIgJBAnFBAXZGDQAgACACQf0BcUECQQAgARtyOgAAIAAQ4gMLCw0AIAAtAABBAnFBAXYLGAAgACAALQAAQfcBcUEIQQAgARtyOgAACwwAIwZBwhBqEJABAAvKAgEGfyAAQQA2AgggAEIANwIAAkACQCABKAIEIgJFDQAgAkF/TA0BIAJBf2pBBXZBAWoiA0ECdBDFBCECIAAgAzYCCCAAQQA2AgQgACACNgIAIAEoAgAhBCAAIAEoAgQiATYCBCABQR9xIQUgAUEDdkH8////AXEhAwJAAkAgAUEgSw0AIAJBADYCAAwBCyACIAFBf2pBA3ZB/P///wFxakEANgIACyADIAVyRQ0AIAQgA2ohBkEAIQFBACEDA0BBASABdCEHAkACQCAEKAIAIAN2QQFxRQ0AIAIoAgAgB3IhBwwBCyACKAIAIAdBf3NxIQcLIAIgBzYCAEEAIAFBAWogAUEfRiIHGyEBIAJBBEEAIAcbaiECIARBBEEAIANBH0YiBxtqIQRBACADQQFqIAcbIgMgBUcNACAEIAZHDQALCyAADwsQsQIACwwAIwZBwhBqEJABAAtbAQN/IwQhAUEIEOEEIQIgAUEANgIAIwlB0wFqIAIgABAQIQMgASgCACEAIAFBADYCAAJAIABBAUYNACMLIQEgAyMMIAEQDAALEA4hARC6BBogAhDiBCABEA8ACxsBAX8jDSECIAAgARDOBCIBIAJBCGo2AgAgAQsIACAAKgKcAwsIACAAKgKgAwsIACAAKgKkAwsIACAAKgKoAwsIACAAKgKMAwsIACAAKgKQAwuEAQAgACABQf8BcSIBQQZJIwZBghBqEM8DAkACQAJAIAFBfGoOAgABAgsCQCAALQCIA0EDcUECRw0AIABBtANqKgIADwsgAEGsA2oqAgAPCwJAIAAtAIgDQQNxQQJHDQAgAEGsA2oqAgAPCyAAQbQDaioCAA8LIAAgAUECdGpBrANqKgIAC4QBACAAIAFB/wFxIgFBBkkjBkGCEGoQzwMCQAJAAkAgAUF8ag4CAAECCwJAIAAtAIgDQQNxQQJHDQAgAEHEA2oqAgAPCyAAQbwDaioCAA8LAkAgAC0AiANBA3FBAkcNACAAQbwDaioCAA8LIABBxANqKgIADwsgACABQQJ0akG8A2oqAgALhAEAIAAgAUH/AXEiAUEGSSMGQYIQahDPAwJAAkACQCABQXxqDgIAAQILAkAgAC0AiANBA3FBAkcNACAAQdQDaioCAA8LIABBzANqKgIADwsCQCAALQCIA0EDcUECRw0AIABBzANqKgIADwsgAEHUA2oqAgAPCyAAIAFBAnRqQcwDaioCAAs6AQJ/AkAgAEEUaiICIAFBFGoiAxC+Ag0AIAIgA0HoAPwKAAAgAEH8AGogAUH8AGoQlwIaIAAQ4gMLC7wCAQN/QQAhAgJAIAEoAgAgACgCAHNB//7//wBxDQAgAEEEaiAAQegAaiIDIAFBBGogAUHoAGoiBBCOA0UNACAAQQZqIAMgAUEGaiAEEI4DRQ0AIABBCGogAyABQQhqIAQQjgNFDQAgAEEKaiADIAFBCmogBBCPA0UNACAAQQxqIAMgAUEMaiAEEJADRQ0AIABBHmogAyABQR5qIAQQkANFDQAgAEEwaiADIAFBMGogBBCQA0UNACAAQcIAaiADIAFBwgBqIAQQkANFDQAgAEHUAGogAyABQdQAaiAEEJEDRQ0AIABB2gBqIAMgAUHaAGogBBCSA0UNACAAQd4AaiADIAFB3gBqIAQQkgNFDQAgAEHiAGogAyABQeIAaiAEEJIDRQ0AIABB5gBqIAMgAUHmAGogBBCOAyECCyACCy8BAX8CQCAAKAIUIgJBA3EgAUH/AXFGDQAgACACQXxxIAFBA3FyNgIUIAAQ4gMLCwoAIAAoAhRBA3ELNQEBfwJAIAAoAhQiAkECdkEDcSABQf8BcUYNACAAIAJBc3EgAUECdEEMcXI2AhQgABDiAwsLDQAgACgCFEECdkEDcQs3AQF/AkAgACgCFCICQQR2QQdxIAFB/wFxRg0AIAAgAkGPf3EgAUEEdEHwAHFyNgIUIAAQ4gMLCw0AIAAoAhRBBHZBB3ELNwEBfwJAIAAoAhQiAkEIdkEPcSABQf8BcUYNACAAIAJB/2FxIAFBCHRBgB5xcjYCFCAAEOIDCwsNACAAKAIUQQh2QQ9xCzkBAX8CQCAAKAIUIgJBDHZBD3EgAUH/AXFGDQAgACACQf+ffHEgAUEMdEGA4ANxcjYCFCAAEOIDCwsNACAAKAIUQQx2QQ9xCzkBAX8CQCAAKAIUIgJBEHZBD3EgAUH/AXFGDQAgACACQf//Q3EgAUEQdEGAgDxxcjYCFCAAEOIDCwsKACAALwEWQQ9xCzsBAX8CQCAAKAIUIgJBFHZBA3EgAUH/AXFGDQAgACACQf//v35xIAFBFHRBgIDAAXFyNgIUIAAQ4gMLCw0AIAAoAhRBFHZBA3ELOwEBfwJAIAAoAhQiAkEWdkEDcSABQf8BcUYNACAAIAJB////eXEgAUEWdEGAgIAGcXI2AhQgABDiAwsLDQAgACgCFEEWdkEDcQs7AQF/AkAgACgCFCICQRh2QQNxIAFB/wFxRg0AIAAgAkH///9ncSABQRh0QYCAgBhxcjYCFCAAEOIDCwsKACAALQAXQQNxCz0BAX8CQCAAKAIUIgJBGnZBA3EgAUH/AXFGDQAgACACQf///59/cSABQRp0QYCAgOAAcXI2AhQgABDiAwsLDQAgACgCFEEadkEDcQvwAQIDfwF9AkACQAJAAkAgAC8BGCICQQdxRQ0AIAJBBHYhAwJAAkAgAkEIcUUNAAJAIAJBP0sNACAAIANBAnRqQYABaioCACEFDAILIANBfGoiBCAAKAKUASIDKAIEIAMoAgAiA2tBAnVPDQUgAyAEQQJ0aioCACEFDAELQQAgA0H/D3EiA2sgAyACwUEASBuyIQULIAUgAVsNAiABIAFbDQEgBSAFWw0BDAILIAEgAVwNAQsgAEEYaiEDAkACQCABIAFbDQAgAyACQfj/A3E7AAAMAQsgAEH8AGogAyABQQMQ1AILIAAQ4gMLDwsQ1QIAC+gBAQJ/IAEgAS8AAEF4cSADciIEOwAAAkACQCAEQQhxRQ0AIARB//8DcSIDQQR2IQUCQCADQT9LDQAgACAFQQJ0aiACOAIEIAEgBDsAAA8LIAVBfGoiBSAAKAIYIgMoAgQgAygCACIDa0ECdU8NASADIAVBAnRqIAI4AgAgASAEOwAADwsCQCACIAL8ACIEslwNACAEQf8PakH+H0sNACABQQAgBGtBgBByIAQgAkMAAAAAXRtBBHQgA0EHcXI7AAAPCyAAIAK8EJQDIQQgASABLwAAQQdxIARBBHRyQQhyOwAADwsQ1QIACwwAIwZBwhBqELICAAvwAQIDfwF9AkACQAJAAkAgAC8BGiICQQdxRQ0AIAJBBHYhAwJAAkAgAkEIcUUNAAJAIAJBP0sNACAAIANBAnRqQYABaioCACEFDAILIANBfGoiBCAAKAKUASIDKAIEIAMoAgAiA2tBAnVPDQUgAyAEQQJ0aioCACEFDAELQQAgA0H/D3EiA2sgAyACwUEASBuyIQULIAUgAVsNAiABIAFbDQEgBSAFWw0BDAILIAEgAVwNAQsgAEEaaiEDAkACQCABIAFbDQAgAyACQfj/A3E7AAAMAQsgAEH8AGogAyABQQMQ1AILIAAQ4gMLDwsQ1QIAC+kBAgJ9BH9DAAAAACEBAkACQCAALwEaIgNBB3FFDQAgA0EEdiEEAkAgA0EIcUUNAAJAAkAgA0E/Sw0AIAAgBEECdGpBgAFqIQUMAQsgBEF8aiIGIAAoApQBIgUoAgQgBSgCACIFa0ECdU8NAyAFIAZBAnRqIQULIAUqAgAiAiACXA0BAkAgA0E/Sw0AIAAgBEECdGpBgAFqKgIADwsgBEF8aiIEIAAoApQBIgMoAgQgAygCACIDa0ECdU8NAiADIARBAnRqKgIADwtBACAEQf8PcSIAayAAIAPBQQBIG7IhAQsgAQ8LENUCAAvwAQIDfwF9AkACQAJAAkAgAC8BHCICQQdxRQ0AIAJBBHYhAwJAAkAgAkEIcUUNAAJAIAJBP0sNACAAIANBAnRqQYABaioCACEFDAILIANBfGoiBCAAKAKUASIDKAIEIAMoAgAiA2tBAnVPDQUgAyAEQQJ0aioCACEFDAELQQAgA0H/D3EiA2sgAyACwUEASBuyIQULIAUgAVsNAiABIAFbDQEgBSAFWw0BDAILIAEgAVwNAQsgAEEcaiEDAkACQCABIAFbDQAgAyACQfj/A3E7AAAMAQsgAEH8AGogAyABQQMQ1AILIAAQ4gMLDwsQ1QIAC/YBAgR/AX0CQAJAAkACQCAALwEcIgFBB3FFDQAgAUEEdiECIAFBCHFFDQICQAJAIAFBP0sNACAAIAJBAnRqQYABaiEDDAELIAJBfGoiBCAAKAKUASIDKAIEIAMoAgAiA2tBAnVPDQQgAyAEQQJ0aiEDCyADKgIAIgUgBVsNAQtDAACAP0MAAAAAIAAoAvQDEMIDGw8LAkAgAUE/Sw0AIAAgAkECdGpBgAFqKgIADwsgAkF8aiICIAAoApQBIgEoAgQgASgCACIBa0ECdU8NASABIAJBAnRqKgIADwtBACACQf8PcSIAayAAIAHBQQBIG7IPCxDVAgALdAEEfyMAQRBrIgIiBCM/SyAEI0BJcgRAIAQQOAsgBCQAIAIgAbxB/////wdxQYCAgPwHSCIDOgAMIAIgAUMAAMB/IAMbOAIIIAIgAikCCDcDACAAIAIQ2wIgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALrQMDBH8CfQF+QQAhAgJAAkACQAJAAkACQAJAAkACQAJAIAAvAR4iA0EHcSIEDgUCAAAAAQALIANBBHYhAgJAAkAgA0EIcUUNAAJAIANBP0sNACAAIAJBAnRqQYABaioCACEGDAILIAJBfGoiBSAAKAKUASICKAIEIAIoAgAiAmtBAnVPDQogAiAFQQJ0aioCACEGDAELQQAgAkH/D3EiAmsgAiADwUEASBuyIQYLIARBAUcNAiAGQwAAwH8gBrxB/////wdxQYCAgPwHSCICGyEHDAMLQQMhAgsgASoCACEGDAILQQJBACAGvEH/////B3FBgICA/AdIIgQbIQIgBkMAAMB/IAQbIQcLQQEhBCAHIAEqAgAiBlsNASAHIAdbDQILIAYgBlwhBAsgBEUNACACIAEtAARB/wFxRg0BCyAAQR5qIQICQAJAAkACQCABKQIAIghCIIinQf8BcSIBDgQAAgIBAgsgAiADQfj/A3E7AAAMAgsgAiADQfj/A3FBBHI7AAAMAQsgAEH8AGogAiAIp75BAUECIAFBAUYbENQCCyAAEOIDCw8LENUCAAt5AQR/IwBBEGsiAiIEIz9LIAQjQElyBEAgBBA4CyAEJAAgAkECQQAgAbxB/////wdxQYCAgPwHSCIDGzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgACACENsCIAJBEGoiBSM/SyAFI0BJcgRAIAUQOAsgBSQAC18BA38jAEEQayIBIgIjP0sgAiNASXIEQCACEDgLIAIkACABQQM6AAwgAUGAgID+BzYCCCABIAEpAgg3AwAgACABENsCIAFBEGoiAyM/SyADI0BJcgRAIAMQOAsgAyQAC40CAgF9A39DAADAfyECAkACQAJAAkAgAS8BHiIDQQdxIgQOBQIBAQEAAQtBAyEEDAELIANBBHYhBQJAAkAgA0EIcUUNAAJAIANBP0sNACABIAVBAnRqQYABaioCACECDAILIAVBfGoiAyABKAKUASIBKAIEIAEoAgAiAWtBAnVPDQMgASADQQJ0aioCACECDAELQQAgBUH/D3EiAWsgASADwUEASBuyIQILAkAgBEEBRw0AIAJDAADAfyACvEH/////B3FBgICA/AdIIgQbIQIMAQtBAkEAIAK8Qf////8HcUGAgID8B0giARshBCACQwAAwH8gARshAgsgACAENgIEIAAgAjgCAA8LENUCAAt6AQR/IwBBEGsiAyIFIz9LIAUjQElyBEAgBRA4CyAFJAAgAyACvEH/////B3FBgICA/AdIIgQ6AAwgAyACQwAAwH8gBBs4AgggAyADKQIINwMAIAAgAUH/AXEgAxDgAiADQRBqIgYjP0sgBiNASXIEQCAGEDgLIAYkAAu1AwMEfwJ9AX5BACEDAkACQAJAAkACQAJAAkACQAJAAkAgACABQQF0aiIELwAyIgFBB3EiBQ4FAgAAAAEACyABQQR2IQMCQAJAIAFBCHFFDQACQCABQT9LDQAgACADQQJ0akGAAWoqAgAhBwwCCyADQXxqIgYgACgClAEiAygCBCADKAIAIgNrQQJ1Tw0KIAMgBkECdGoqAgAhBwwBC0EAIANB/w9xIgNrIAMgAcFBAEgbsiEHCyAFQQFHDQIgB0MAAMB/IAe8Qf////8HcUGAgID8B0giAxshCAwDC0EDIQMLIAIqAgAhBwwCC0ECQQAgB7xB/////wdxQYCAgPwHSCIFGyEDIAdDAADAfyAFGyEIC0EBIQUgCCACKgIAIgdbDQEgCCAIWw0CCyAHIAdcIQULIAVFDQAgAyACLQAEQf8BcUYNAQsgBEEyaiEDAkACQAJAAkAgAikCACIJQiCIp0H/AXEiAg4EAAICAQILIAMgAUH4/wNxOwAADAILIAMgAUH4/wNxQQRyOwAADAELIABB/ABqIAMgCae+QQFBAiACQQFGGxDUAgsgABDiAwsPCxDVAgALfwEEfyMAQRBrIgMiBSM/SyAFI0BJcgRAIAUQOAsgBSQAIANBAkEAIAK8Qf////8HcUGAgID8B0giBBs6AAwgAyACQwAAwH8gBBs4AgggAyADKQIINwMAIAAgAUH/AXEgAxDgAiADQRBqIgYjP0sgBiNASXIEQCAGEDgLIAYkAAtlAQN/IwBBEGsiAiIDIz9LIAMjQElyBEAgAxA4CyADJAAgAkEDOgAMIAJBgICA/gc2AgggAiACKQIINwMAIAAgAUH/AXEgAhDgAiACQRBqIgQjP0sgBCNASXIEQCAEEDgLIAQkAAuXAgIBfQJ/QwAAwH8hAwJAAkACQAJAIAEgAkH/AXFBAXRqLwAyIgRBB3EiAg4FAgEBAQABC0EDIQIMAQsgBEEEdiEFAkACQCAEQQhxRQ0AAkAgBEE/Sw0AIAEgBUECdGpBgAFqKgIAIQMMAgsgBUF8aiIEIAEoApQBIgEoAgQgASgCACIBa0ECdU8NAyABIARBAnRqKgIAIQMMAQtBACAFQf8PcSIBayABIATBQQBIG7IhAwsCQCACQQFHDQAgA0MAAMB/IAO8Qf////8HcUGAgID8B0giAhshAwwBC0ECQQAgA7xB/////wdxQYCAgPwHSCIBGyECIANDAADAfyABGyEDCyAAIAI2AgQgACADOAIADwsQ1QIAC3oBBH8jAEEQayIDIgUjP0sgBSNASXIEQCAFEDgLIAUkACADIAK8Qf////8HcUGAgID8B0giBDoADCADIAJDAADAfyAEGzgCCCADIAMpAgg3AwAgACABQf8BcSADEOUCIANBEGoiBiM/SyAGI0BJcgRAIAYQOAsgBiQAC7UDAwR/An0BfkEAIQMCQAJAAkACQAJAAkACQAJAAkACQCAAIAFBAXRqIgQvACAiAUEHcSIFDgUCAAAAAQALIAFBBHYhAwJAAkAgAUEIcUUNAAJAIAFBP0sNACAAIANBAnRqQYABaioCACEHDAILIANBfGoiBiAAKAKUASIDKAIEIAMoAgAiA2tBAnVPDQogAyAGQQJ0aioCACEHDAELQQAgA0H/D3EiA2sgAyABwUEASBuyIQcLIAVBAUcNAiAHQwAAwH8gB7xB/////wdxQYCAgPwHSCIDGyEIDAMLQQMhAwsgAioCACEHDAILQQJBACAHvEH/////B3FBgICA/AdIIgUbIQMgB0MAAMB/IAUbIQgLQQEhBSAIIAIqAgAiB1sNASAIIAhbDQILIAcgB1whBQsgBUUNACADIAItAARB/wFxRg0BCyAEQSBqIQMCQAJAAkACQCACKQIAIglCIIinQf8BcSICDgQAAgIBAgsgAyABQfj/A3E7AAAMAgsgAyABQfj/A3FBBHI7AAAMAQsgAEH8AGogAyAJp75BAUECIAJBAUYbENQCCyAAEOIDCw8LENUCAAt/AQR/IwBBEGsiAyIFIz9LIAUjQElyBEAgBRA4CyAFJAAgA0ECQQAgArxB/////wdxQYCAgPwHSCIEGzoADCADIAJDAADAfyAEGzgCCCADIAMpAgg3AwAgACABQf8BcSADEOUCIANBEGoiBiM/SyAGI0BJcgRAIAYQOAsgBiQAC2UBA38jAEEQayICIgMjP0sgAyNASXIEQCADEDgLIAMkACACQQM6AAwgAkGAgID+BzYCCCACIAIpAgg3AwAgACABQf8BcSACEOUCIAJBEGoiBCM/SyAEI0BJcgRAIAQQOAsgBCQAC5cCAgF9An9DAADAfyEDAkACQAJAAkAgASACQf8BcUEBdGovACAiBEEHcSICDgUCAQEBAAELQQMhAgwBCyAEQQR2IQUCQAJAIARBCHFFDQACQCAEQT9LDQAgASAFQQJ0akGAAWoqAgAhAwwCCyAFQXxqIgQgASgClAEiASgCBCABKAIAIgFrQQJ1Tw0DIAEgBEECdGoqAgAhAwwBC0EAIAVB/w9xIgFrIAEgBMFBAEgbsiEDCwJAIAJBAUcNACADQwAAwH8gA7xB/////wdxQYCAgPwHSCICGyEDDAELQQJBACADvEH/////B3FBgICA/AdIIgEbIQIgA0MAAMB/IAEbIQMLIAAgAjYCBCAAIAM4AgAPCxDVAgALegEEfyMAQRBrIgMiBSM/SyAFI0BJcgRAIAUQOAsgBSQAIAMgArxB/////wdxQYCAgPwHSCIEOgAMIAMgAkMAAMB/IAQbOAIIIAMgAykCCDcDACAAIAFB/wFxIAMQ6gIgA0EQaiIGIz9LIAYjQElyBEAgBhA4CyAGJAALtgMDBH8CfQF+QQAhAwJAAkACQAJAAkACQAJAAkACQAJAIAAgAUEBdGoiBC8ARCIBQQdxIgUOBQIAAAABAAsgAUEEdiEDAkACQCABQQhxRQ0AAkAgAUE/Sw0AIAAgA0ECdGpBgAFqKgIAIQcMAgsgA0F8aiIGIAAoApQBIgMoAgQgAygCACIDa0ECdU8NCiADIAZBAnRqKgIAIQcMAQtBACADQf8PcSIDayADIAHBQQBIG7IhBwsgBUEBRw0CIAdDAADAfyAHvEH/////B3FBgICA/AdIIgMbIQgMAwtBAyEDCyACKgIAIQcMAgtBAkEAIAe8Qf////8HcUGAgID8B0giBRshAyAHQwAAwH8gBRshCAtBASEFIAggAioCACIHWw0BIAggCFsNAgsgByAHXCEFCyAFRQ0AIAMgAi0ABEH/AXFGDQELIARBxABqIQMCQAJAAkACQCACKQIAIglCIIinQf8BcSICDgQAAgIBAgsgAyABQfj/A3E7AAAMAgsgAyABQfj/A3FBBHI7AAAMAQsgAEH8AGogAyAJp75BAUECIAJBAUYbENQCCyAAEOIDCw8LENUCAAt/AQR/IwBBEGsiAyIFIz9LIAUjQElyBEAgBRA4CyAFJAAgA0ECQQAgArxB/////wdxQYCAgPwHSCIEGzoADCADIAJDAADAfyAEGzgCCCADIAMpAgg3AwAgACABQf8BcSADEOoCIANBEGoiBiM/SyAGI0BJcgRAIAYQOAsgBiQAC5cCAgF9An9DAADAfyEDAkACQAJAAkAgASACQf8BcUEBdGovAEQiBEEHcSICDgUCAQEBAAELQQMhAgwBCyAEQQR2IQUCQAJAIARBCHFFDQACQCAEQT9LDQAgASAFQQJ0akGAAWoqAgAhAwwCCyAFQXxqIgQgASgClAEiASgCBCABKAIAIgFrQQJ1Tw0DIAEgBEECdGoqAgAhAwwBC0EAIAVB/w9xIgFrIAEgBMFBAEgbsiEDCwJAIAJBAUcNACADQwAAwH8gA7xB/////wdxQYCAgPwHSCICGyEDDAELQQJBACADvEH/////B3FBgICA/AdIIgEbIQIgA0MAAMB/IAEbIQMLIAAgAjYCBCAAIAM4AgAPCxDVAgALmgMCBn8CfSACQwAAwH8gArwiA0H/////B3FBgICA/AdIIgQbIQlBACEFAkACQAJAAkACQAJAAkAgACABQf8BcUEBdGoiBi8AViIHQQdxIgEOBQIBAQEAAQtBAyEFDAELIAdBBHYhBQJAAkAgB0EIcUUNAAJAIAdBP0sNACAAIAVBAnRqQYABaioCACEKDAILIAVBfGoiCCAAKAKUASIFKAIEIAUoAgAiBWtBAnVPDQYgBSAIQQJ0aioCACEKDAELQQAgBUH/D3EiBWsgBSAHwUEASBuyIQoLAkACQCABQQFHDQAgCkMAAMB/IAq8Qf////8HcUGAgID8B0giBRshCgwBC0ECQQAgCrxB/////wdxQYCAgPwHSCIBGyEFIApDAADAfyABGyEKC0EBIQEgCiAJWw0BIAogClsNAgsgCSAJXCEBCyABRQ0AIAUgBEYNAQsgBkHWAGohBQJAAkAgA0H/////B3FBgICA/AdIDQAgBSAHQfj/A3E7AAAMAQsgAEH8AGogBSACQQEQ1AILIAAQ4gMLDwsQ1QIAC8gBAgJ9AX9DAADAfyECAkACQAJAIAAgAUH/AXFBAXRqLwBWIgFBB3EOBQEAAAABAAsgAUEEdiEEAkACQCABQQhxRQ0AAkAgAUE/Sw0AIAAgBEECdGpBgAFqKgIAIQMMAgsgBEF8aiIBIAAoApQBIgAoAgQgACgCACIAa0ECdU8NAyAAIAFBAnRqKgIAIQMMAQtBACAEQf8PcSIAayAAIAHBQQBIG7IhAwsgA7xB/////wdxQf////sHSg0AIAMhAgsgAg8LENUCAAt6AQR/IwBBEGsiAyIFIz9LIAUjQElyBEAgBRA4CyAFJAAgAyACvEH/////B3FBgICA/AdIIgQ6AAwgAyACQwAAwH8gBBs4AgggAyADKQIINwMAIAAgAUH/AXEgAxDwAiADQRBqIgYjP0sgBiNASXIEQCAGEDgLIAYkAAu2AwMEfwJ9AX5BACEDAkACQAJAAkACQAJAAkACQAJAAkAgACABQQF0aiIELwBoIgFBB3EiBQ4FAgAAAAEACyABQQR2IQMCQAJAIAFBCHFFDQACQCABQT9LDQAgACADQQJ0akGAAWoqAgAhBwwCCyADQXxqIgYgACgClAEiAygCBCADKAIAIgNrQQJ1Tw0KIAMgBkECdGoqAgAhBwwBC0EAIANB/w9xIgNrIAMgAcFBAEgbsiEHCyAFQQFHDQIgB0MAAMB/IAe8Qf////8HcUGAgID8B0giAxshCAwDC0EDIQMLIAIqAgAhBwwCC0ECQQAgB7xB/////wdxQYCAgPwHSCIFGyEDIAdDAADAfyAFGyEIC0EBIQUgCCACKgIAIgdbDQEgCCAIWw0CCyAHIAdcIQULIAVFDQAgAyACLQAEQf8BcUYNAQsgBEHoAGohAwJAAkACQAJAIAIpAgAiCUIgiKdB/wFxIgIOBAACAgECCyADIAFB+P8DcTsAAAwCCyADIAFB+P8DcUEEcjsAAAwBCyAAQfwAaiADIAmnvkEBQQIgAkEBRhsQ1AILIAAQ4gMLDwsQ1QIAC38BBH8jAEEQayIDIgUjP0sgBSNASXIEQCAFEDgLIAUkACADQQJBACACvEH/////B3FBgICA/AdIIgQbOgAMIAMgAkMAAMB/IAQbOAIIIAMgAykCCDcDACAAIAFB/wFxIAMQ8AIgA0EQaiIGIz9LIAYjQElyBEAgBhA4CyAGJAALyAECAn0Bf0MAAMB/IQICQAJAAkAgACABQf8BcUEBdGovAGgiAUEHcQ4FAQAAAAEACyABQQR2IQQCQAJAIAFBCHFFDQACQCABQT9LDQAgACAEQQJ0akGAAWoqAgAhAwwCCyAEQXxqIgEgACgClAEiACgCBCAAKAIAIgBrQQJ1Tw0DIAAgAUECdGoqAgAhAwwBC0EAIARB/w9xIgBrIAAgAcFBAEgbsiEDCyADvEH/////B3FB////+wdKDQAgAyECCyACDwsQ1QIAC48CAgN/AX0CQAJAAkACQCAALwF6IgJBB3FFDQAgAkEEdiEDAkACQCACQQhxRQ0AAkAgAkE/Sw0AIAAgA0ECdGpBgAFqKgIAIQUMAgsgA0F8aiIEIAAoApQBIgMoAgQgAygCACIDa0ECdU8NBSADIARBAnRqKgIAIQUMAQtBACADQf8PcSIDayADIALBQQBIG7IhBQsgBSABWw0CIAEgAVsNASAFIAVbDQEMAgsgASABXA0BCyAAQfoAaiEEAkACQCABvEH/////B3EiA0EARyADQYCAgPwHR3EgA0GBgID8B0hxDQAgBCACQfj/A3E7AAAMAQsgAEH8AGogBCABQQMQ1AILIAAQ4gMLDwsQ1QIAC6UBAgJ9An9DAADAfyEBAkACQAJAIAAvAXoiA0EHcUUNACADQQR2IQQgA0EIcUUNAgJAAkAgA0E/Sw0AIAAgBEECdGpBgAFqIQMMAQsgBEF8aiIEIAAoApQBIgMoAgQgAygCACIDa0ECdU8NAiADIARBAnRqIQMLIAMqAgAiAiACXA0AIAIhAQsgAQ8LENUCAAtBACAEQf8PcSIAayAAIAPBQQBIG7ILPQEBfwJAIAAoAhQiAkEcdkEBcSABQf8BcUYNACAAIAJB/////35xIAFBHHRBgICAgAFxcjYCFCAAEOIDCwsNACAAKAIUQRx2QQFxC3YBBH8jAEEQayICIgQjP0sgBCNASXIEQCAEEDgLIAQkACACIAG8Qf////8HcUGAgID8B0giAzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgAEEAIAIQ+AIgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALtgMDBH8CfQF+QQAhAwJAAkACQAJAAkACQAJAAkACQAJAIAAgAUEBdGoiBC8AbiIBQQdxIgUOBQIAAAABAAsgAUEEdiEDAkACQCABQQhxRQ0AAkAgAUE/Sw0AIAAgA0ECdGpBgAFqKgIAIQcMAgsgA0F8aiIGIAAoApQBIgMoAgQgAygCACIDa0ECdU8NCiADIAZBAnRqKgIAIQcMAQtBACADQf8PcSIDayADIAHBQQBIG7IhBwsgBUEBRw0CIAdDAADAfyAHvEH/////B3FBgICA/AdIIgMbIQgMAwtBAyEDCyACKgIAIQcMAgtBAkEAIAe8Qf////8HcUGAgID8B0giBRshAyAHQwAAwH8gBRshCAtBASEFIAggAioCACIHWw0BIAggCFsNAgsgByAHXCEFCyAFRQ0AIAMgAi0ABEH/AXFGDQELIARB7gBqIQMCQAJAAkACQCACKQIAIglCIIinQf8BcSICDgQAAgIBAgsgAyABQfj/A3E7AAAMAgsgAyABQfj/A3FBBHI7AAAMAQsgAEH8AGogAyAJp75BAUECIAJBAUYbENQCCyAAEOIDCw8LENUCAAt7AQR/IwBBEGsiAiIEIz9LIAQjQElyBEAgBBA4CyAEJAAgAkECQQAgAbxB/////wdxQYCAgPwHSCIDGzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgAEEAIAIQ+AIgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALYQEDfyMAQRBrIgEiAiM/SyACI0BJcgRAIAIQOAsgAiQAIAFBAzoADCABQYCAgP4HNgIIIAEgASkCCDcDACAAQQAgARD4AiABQRBqIgMjP0sgAyNASXIEQCADEDgLIAMkAAuNAgIBfQN/QwAAwH8hAgJAAkACQAJAIAEvAG4iA0EHcSIEDgUCAQEBAAELQQMhBAwBCyADQQR2IQUCQAJAIANBCHFFDQACQCADQT9LDQAgASAFQQJ0akGAAWoqAgAhAgwCCyAFQXxqIgMgASgClAEiASgCBCABKAIAIgFrQQJ1Tw0DIAEgA0ECdGoqAgAhAgwBC0EAIAVB/w9xIgFrIAEgA8FBAEgbsiECCwJAIARBAUcNACACQwAAwH8gArxB/////wdxQYCAgPwHSCIEGyECDAELQQJBACACvEH/////B3FBgICA/AdIIgEbIQQgAkMAAMB/IAEbIQILIAAgBDYCBCAAIAI4AgAPCxDVAgALdgEEfyMAQRBrIgIiBCM/SyAEI0BJcgRAIAQQOAsgBCQAIAIgAbxB/////wdxQYCAgPwHSCIDOgAMIAIgAUMAAMB/IAMbOAIIIAIgAikCCDcDACAAQQEgAhD4AiACQRBqIgUjP0sgBSNASXIEQCAFEDgLIAUkAAt7AQR/IwBBEGsiAiIEIz9LIAQjQElyBEAgBBA4CyAEJAAgAkECQQAgAbxB/////wdxQYCAgPwHSCIDGzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgAEEBIAIQ+AIgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALYQEDfyMAQRBrIgEiAiM/SyACI0BJcgRAIAIQOAsgAiQAIAFBAzoADCABQYCAgP4HNgIIIAEgASkCCDcDACAAQQEgARD4AiABQRBqIgMjP0sgAyNASXIEQCADEDgLIAMkAAuNAgIBfQN/QwAAwH8hAgJAAkACQAJAIAEvAHAiA0EHcSIEDgUCAQEBAAELQQMhBAwBCyADQQR2IQUCQAJAIANBCHFFDQACQCADQT9LDQAgASAFQQJ0akGAAWoqAgAhAgwCCyAFQXxqIgMgASgClAEiASgCBCABKAIAIgFrQQJ1Tw0DIAEgA0ECdGoqAgAhAgwBC0EAIAVB/w9xIgFrIAEgA8FBAEgbsiECCwJAIARBAUcNACACQwAAwH8gArxB/////wdxQYCAgPwHSCIEGyECDAELQQJBACACvEH/////B3FBgICA/AdIIgEbIQQgAkMAAMB/IAEbIQILIAAgBDYCBCAAIAI4AgAPCxDVAgALdgEEfyMAQRBrIgIiBCM/SyAEI0BJcgRAIAQQOAsgBCQAIAIgAbxB/////wdxQYCAgPwHSCIDOgAMIAIgAUMAAMB/IAMbOAIIIAIgAikCCDcDACAAQQAgAhCBAyACQRBqIgUjP0sgBSNASXIEQCAFEDgLIAUkAAu2AwMEfwJ9AX5BACEDAkACQAJAAkACQAJAAkACQAJAAkAgACABQQF0aiIELwByIgFBB3EiBQ4FAgAAAAEACyABQQR2IQMCQAJAIAFBCHFFDQACQCABQT9LDQAgACADQQJ0akGAAWoqAgAhBwwCCyADQXxqIgYgACgClAEiAygCBCADKAIAIgNrQQJ1Tw0KIAMgBkECdGoqAgAhBwwBC0EAIANB/w9xIgNrIAMgAcFBAEgbsiEHCyAFQQFHDQIgB0MAAMB/IAe8Qf////8HcUGAgID8B0giAxshCAwDC0EDIQMLIAIqAgAhBwwCC0ECQQAgB7xB/////wdxQYCAgPwHSCIFGyEDIAdDAADAfyAFGyEIC0EBIQUgCCACKgIAIgdbDQEgCCAIWw0CCyAHIAdcIQULIAVFDQAgAyACLQAEQf8BcUYNAQsgBEHyAGohAwJAAkACQAJAIAIpAgAiCUIgiKdB/wFxIgIOBAACAgECCyADIAFB+P8DcTsAAAwCCyADIAFB+P8DcUEEcjsAAAwBCyAAQfwAaiADIAmnvkEBQQIgAkEBRhsQ1AILIAAQ4gMLDwsQ1QIAC3sBBH8jAEEQayICIgQjP0sgBCNASXIEQCAEEDgLIAQkACACQQJBACABvEH/////B3FBgICA/AdIIgMbOgAMIAIgAUMAAMB/IAMbOAIIIAIgAikCCDcDACAAQQAgAhCBAyACQRBqIgUjP0sgBSNASXIEQCAFEDgLIAUkAAuNAgIBfQN/QwAAwH8hAgJAAkACQAJAIAEvAHIiA0EHcSIEDgUCAQEBAAELQQMhBAwBCyADQQR2IQUCQAJAIANBCHFFDQACQCADQT9LDQAgASAFQQJ0akGAAWoqAgAhAgwCCyAFQXxqIgMgASgClAEiASgCBCABKAIAIgFrQQJ1Tw0DIAEgA0ECdGoqAgAhAgwBC0EAIAVB/w9xIgFrIAEgA8FBAEgbsiECCwJAIARBAUcNACACQwAAwH8gArxB/////wdxQYCAgPwHSCIEGyECDAELQQJBACACvEH/////B3FBgICA/AdIIgEbIQQgAkMAAMB/IAEbIQILIAAgBDYCBCAAIAI4AgAPCxDVAgALdgEEfyMAQRBrIgIiBCM/SyAEI0BJcgRAIAQQOAsgBCQAIAIgAbxB/////wdxQYCAgPwHSCIDOgAMIAIgAUMAAMB/IAMbOAIIIAIgAikCCDcDACAAQQEgAhCBAyACQRBqIgUjP0sgBSNASXIEQCAFEDgLIAUkAAt7AQR/IwBBEGsiAiIEIz9LIAQjQElyBEAgBBA4CyAEJAAgAkECQQAgAbxB/////wdxQYCAgPwHSCIDGzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgAEEBIAIQgQMgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALjQICAX0Df0MAAMB/IQICQAJAAkACQCABLwB0IgNBB3EiBA4FAgEBAQABC0EDIQQMAQsgA0EEdiEFAkACQCADQQhxRQ0AAkAgA0E/Sw0AIAEgBUECdGpBgAFqKgIAIQIMAgsgBUF8aiIDIAEoApQBIgEoAgQgASgCACIBa0ECdU8NAyABIANBAnRqKgIAIQIMAQtBACAFQf8PcSIBayABIAPBQQBIG7IhAgsCQCAEQQFHDQAgAkMAAMB/IAK8Qf////8HcUGAgID8B0giBBshAgwBC0ECQQAgArxB/////wdxQYCAgPwHSCIBGyEEIAJDAADAfyABGyECCyAAIAQ2AgQgACACOAIADwsQ1QIAC3YBBH8jAEEQayICIgQjP0sgBCNASXIEQCAEEDgLIAQkACACIAG8Qf////8HcUGAgID8B0giAzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgAEEAIAIQiAMgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALtgMDBH8CfQF+QQAhAwJAAkACQAJAAkACQAJAAkACQAJAIAAgAUEBdGoiBC8AdiIBQQdxIgUOBQIAAAABAAsgAUEEdiEDAkACQCABQQhxRQ0AAkAgAUE/Sw0AIAAgA0ECdGpBgAFqKgIAIQcMAgsgA0F8aiIGIAAoApQBIgMoAgQgAygCACIDa0ECdU8NCiADIAZBAnRqKgIAIQcMAQtBACADQf8PcSIDayADIAHBQQBIG7IhBwsgBUEBRw0CIAdDAADAfyAHvEH/////B3FBgICA/AdIIgMbIQgMAwtBAyEDCyACKgIAIQcMAgtBAkEAIAe8Qf////8HcUGAgID8B0giBRshAyAHQwAAwH8gBRshCAtBASEFIAggAioCACIHWw0BIAggCFsNAgsgByAHXCEFCyAFRQ0AIAMgAi0ABEH/AXFGDQELIARB9gBqIQMCQAJAAkACQCACKQIAIglCIIinQf8BcSICDgQAAgIBAgsgAyABQfj/A3E7AAAMAgsgAyABQfj/A3FBBHI7AAAMAQsgAEH8AGogAyAJp75BAUECIAJBAUYbENQCCyAAEOIDCw8LENUCAAt7AQR/IwBBEGsiAiIEIz9LIAQjQElyBEAgBBA4CyAEJAAgAkECQQAgAbxB/////wdxQYCAgPwHSCIDGzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgAEEAIAIQiAMgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALjQICAX0Df0MAAMB/IQICQAJAAkACQCABLwB2IgNBB3EiBA4FAgEBAQABC0EDIQQMAQsgA0EEdiEFAkACQCADQQhxRQ0AAkAgA0E/Sw0AIAEgBUECdGpBgAFqKgIAIQIMAgsgBUF8aiIDIAEoApQBIgEoAgQgASgCACIBa0ECdU8NAyABIANBAnRqKgIAIQIMAQtBACAFQf8PcSIBayABIAPBQQBIG7IhAgsCQCAEQQFHDQAgAkMAAMB/IAK8Qf////8HcUGAgID8B0giBBshAgwBC0ECQQAgArxB/////wdxQYCAgPwHSCIBGyEEIAJDAADAfyABGyECCyAAIAQ2AgQgACACOAIADwsQ1QIAC3YBBH8jAEEQayICIgQjP0sgBCNASXIEQCAEEDgLIAQkACACIAG8Qf////8HcUGAgID8B0giAzoADCACIAFDAADAfyADGzgCCCACIAIpAgg3AwAgAEEBIAIQiAMgAkEQaiIFIz9LIAUjQElyBEAgBRA4CyAFJAALewEEfyMAQRBrIgIiBCM/SyAEI0BJcgRAIAQQOAsgBCQAIAJBAkEAIAG8Qf////8HcUGAgID8B0giAxs6AAwgAiABQwAAwH8gAxs4AgggAiACKQIINwMAIABBASACEIgDIAJBEGoiBSM/SyAFI0BJcgRAIAUQOAsgBSQAC40CAgF9A39DAADAfyECAkACQAJAAkAgAS8AeCIDQQdxIgQOBQIBAQEAAQtBAyEEDAELIANBBHYhBQJAAkAgA0EIcUUNAAJAIANBP0sNACABIAVBAnRqQYABaioCACECDAILIAVBfGoiAyABKAKUASIBKAIEIAEoAgAiAWtBAnVPDQMgASADQQJ0aioCACECDAELQQAgBUH/D3EiAWsgASADwUEASBuyIQILAkAgBEEBRw0AIAJDAADAfyACvEH/////B3FBgICA/AdIIgQbIQIMAQtBAkEAIAK8Qf////8HcUGAgID8B0giARshBCACQwAAwH8gARshAgsgACAENgIEIAAgAjgCAA8LENUCAAvVAgICfQF/AkACQAJAAkAgAC8AACIAQQdxDQBDAADAfyEEIAIvAAAiAEEHcQ0BQQEPCyAAQQR2IQYCQAJAIABBCHFFDQACQCAAQT9LDQAgASAGQQJ0akEEaioCACEEDAILIAZBfGoiBiABKAIYIgAoAgQgACgCACIAa0ECdU8NAyAAIAZBAnRqKgIAIQQMAQtBACAGQf8PcSIBayABIADBQQBIG7IhBAsgAi8AACIAQQdxDQBDAADAfyEFDAILIABBBHYhAgJAAkAgAEEIcUUNAAJAIABBP0sNACADIAJBAnRqQQRqKgIAIQUMAgsgAkF8aiICIAMoAhgiACgCBCAAKAIAIgBrQQJ1Tw0CIAAgAkECdGoqAgAhBQwBC0EAIAJB/w9xIgJrIAIgAMFBAEgbsiEFCyAEIAVcDQFBAQ8LENUCAAsCQCAEIARcDQBBAA8LIAUgBVwL1wQCAn8CfUEDIQRDAADAfyEGAkACQAJAAkACQCAALwAAIgBBB3EiBQ4FAAEBAQIBCwJAIAIvAAAiAEEHcUUNAEEAIQRDAADAfyEGDAMLQQEPCyAAQQR2IQQCQAJAIABBCHFFDQACQCAAQT9LDQAgASAEQQJ0akEEaioCACEGDAILIARBfGoiBCABKAIYIgAoAgQgACgCACIAa0ECdU8NBCAAIARBAnRqKgIAIQYMAQtBACAEQf8PcSIEayAEIADBQQBIG7IhBgsCQCAFQQFHDQAgBkMAAMB/IAa8Qf////8HcUGAgID8B0giBBshBgwBC0ECQQAgBrxB/////wdxQYCAgPwHSCIAGyEEIAZDAADAfyAAGyEGCyACLwAAIQALQwAAwH8hB0EAIQICQAJAAkAgAEEHcSIFDgUCAQEBAAELQQMhAgwBCyAAQfD/A3FBBHYhAgJAAkAgAEEIcUUNAAJAIABB//8DcUE/Sw0AIAMgAkECdGpBBGoqAgAhBwwCCyACQXxqIgIgAygCGCIAKAIEIAAoAgAiAGtBAnVPDQMgACACQQJ0aioCACEHDAELQQAgAkH/D3EiAmsgAiAAwUEASBuyIQcLAkAgBUEBRw0AIAdDAADAfyAHvEH/////B3FBgICA/AdIIgIbIQcMAQtBAkEAIAe8Qf////8HcUGAgID8B0giABshAiAHQwAAwH8gABshBwsCQAJAIAYgB1wNAEEBIQAMAQsCQCAGIAZcDQBBACEADAELIAcgB1whAAsgACAEQf8BcSACQf8BcUZxDwsQ1QIAC8EBAQF/AkACQCAAIAEgAiADEI8DRQ0AIABBAmogASACQQJqIAMQjwNFDQAgAEEEaiABIAJBBGogAxCPA0UNACAAQQZqIAEgAkEGaiADEI8DRQ0AIABBCGogASACQQhqIAMQjwNFDQAgAEEKaiABIAJBCmogAxCPA0UNACAAQQxqIAEgAkEMaiADEI8DRQ0AIABBDmogASACQQ5qIAMQjwNFDQBBASEEIABBEGogASACQRBqIAMQjwMNAQtBACEECyAEC0kBAX8CQAJAIAAgASACIAMQjwNFDQAgAEECaiABIAJBAmogAxCPA0UNAEEBIQQgAEEEaiABIAJBBGogAxCPAw0BC0EAIQQLIAQLNQEBfwJAAkAgACABIAIgAxCPA0UNAEEBIQQgAEECaiABIAJBAmogAxCPAw0BC0EAIQQLIAQLGwECfyMOIQAjDyEBQQQQ4QQQlAUgASAAEAwAC8oCAQd/IwBBEGsiAiIHIz9LIAcjQElyBEAgBxA4CyAHJAAgAiABNgIMIAAgAC8BACIDQQFqOwEAAkACQAJAIANBA0sNACAAIANBAnRqIAE2AgQMAQsCQCAAKAIYIgENAEEYEMUEIgFCADcCECABQgA3AgggAUIANwIAIAAgATYCGAsgASACQQxqEJUDAkAgACgCGCIBKAIQIgAgASgCFCIEQQV0Rw0AQf////8HIQUgAEH/////B08NAiABQQxqIQYCQCAAQf7///8DSw0AIARBBnQiBCAAQeD///8DcUEgaiIAIAQgAEsbIQULIAYgBRCWAyABKAIQIQALIAEgAEEBajYCECABKAIMIABBA3ZB/P///wFxaiIBIAEoAgBBfiAAd3E2AgALIAJBEGoiCCM/SyAII0BJcgRAIAgQOAsgCCQAIAMPCxCxAgAL8gEBB38CQCAAKAIEIgIgACgCCCIDTw0AIAIgASgCADYCACAAIAJBBGo2AgQPCwJAAkAgAiAAKAIAIgRrIgJBAnUiBUEBaiIGQYCAgIAETw0AIAMgBGsiB0EBdSIDIAYgAyAGSxtB/////wMgB0H8////B0kbIgNBgICAgARPDQEgA0ECdCIGEMUEIgggAmoiAyABKAIANgIAIAMgBUECdGshAQJAIAJFDQAgASAEIAL8CgAACyAAIAggBmo2AgggACADQQRqIgI2AgQgACABNgIAAkAgBEUNACAEIAcQyQQLIAAgAjYCBA8LEK8CAAsQkwMAC90CAQx/AkACQCABIAAoAggiAkEFdE0NACABQX9MDQEgAUF/akEFdkEBaiIDQQJ0EMUEIQQgACgCBCIBQR9xIQUgAUEDdkH8////AXEhBgJAAkAgAUEgSw0AIARBADYCAAwBCyAEIAFBf2pBA3ZB/P///wFxakEANgIACyAAKAIAIQcCQCAGIAVyRQ0AIAcgBmohCEEAIQYgBCEJIAchCiAHIQFBACELA0BBASAGdCEMAkACQCABKAIAIAt2QQFxRQ0AIAkoAgAgDHIhDAwBCyAJKAIAIAxBf3NxIQwLIAkgDDYCACABQQRqIg0gCiALQR9GIgwbIgogDSABIAwbIAZBH0YiDRshAUEAIAZBAWogDRshBiAJQQRBACANG2ohCUEAIAtBAWogDBsiCyAFRw0AIAEgCEcNAAsLIAAgAzYCCCAAIAQ2AgAgB0UNACAHIAJBAnQQyQQLDwsQsQIAC4gGAwN/BX0BfEEAIQ0CQCAJQwAAAABdDQAgCEMAAAAAXQ0AIAUhECABIREgAyESIAchEwJAIAwQwQMiFEMAAAAAWw0AIAG7IBS7IhVBAEEAEL4DIREgA7sgFUEAQQAQvgMhEiAFuyAVQQBBABC+AyEQIAe7IBVBAEEAEL4DIRMLQQAhDkEAIQwCQCAEIABHDQACQCAQIBBcIBEgEVwiDXINACAQIBGTi0MXt9E4XSEMDAELQQAhDCAQIBBbDQAgDSEMCwJAIAYgAkcNAAJAIBMgE1wgEiASXCINcg0AIBMgEpOLQxe30ThdIQ4MAQsgEyATWw0AIA0hDgtBASEPQQEhDQJAIAwNACABIAqTIQECQAJAAkAgAA0AAkAgASABXCIAIAggCFxyDQBBASENIAEgCJOLQxe30ThdRQ0CDAQLIAggCFsNAUEBIQ0gAEUNAQwDCyAAQQJHDQFBASENIARBAUcNASABIAhgDQICQCABIAFcIAggCFwiAHINAEEBIQ0gASAIk4tDF7fROF1FDQEMAwtBACENIAEgAVsNAkEBIQ0gAA0CC0EAIQ0MAQtBACENIAggCFwNACAFIAFeRQ0AIARBAkcNACAAQQJHDQBBASENIAggAV8NAEEAIQ0gASABXA0AIAEgCJOLQxe30ThdIQ0LAkAgDg0AIAMgC5MhCAJAAkACQCACDQACQCAIIAhcIgIgCSAJXHINACAIIAmTi0MXt9E4XUUNAgwECyAJIAlbDQEgAkUNAQwDCyACQQJHDQEgBkEBRw0BAkAgCCAJYEUNAEEBIQ8MAwsCQCAIIAhcIAkgCVwiAnINAEEBIQ8gCCAJk4tDF7fROF1FDQEMAwtBACEPIAggCFsNAkEBIQ8gAg0CC0EAIQ8MAQsCQCAJIAlbDQBBACEPDAELAkAgByAIXg0AQQAhDwwBCwJAIAZBAkYNAEEAIQ8MAQsCQCACQQJGDQBBACEPDAELIAkgCF8NAEEAIQ8gCCAIXA0AIAggCZOLQxe30ThdIQ8LIA0gD3EhDQsgDQuoBwIKfwF9IwBBEGsiASIJIz9LIAkjQElyBEAgCRA4CyAJJAACQAJAAkACQAJAIAAoAgxFDQAgASABQQ9qNgIAIABBByABENYDIAAgACoClAMgACoCmAMQ2gMhCyABIAFBD2o2AgAgAEEIIAEQ1gMgACALIAtbIwZB/x5qEM8DDAELAkACQAJAAkACQAJAIAAoAuwDIAAoAugDIgJGDQAgAUIANwIEIAEgADYCAAJAIAIoAgAoAhRBgICA4ABxQYCAgMAARg0AQQAhAiAAIQMMAwsjBCICQQA2AgAjCUHVAWogARAUIAIoAgAhAyACQQA2AgACQCADQQFGDQAgASgCBCECIAEoAgAhAwwCCxAOIQQQugQaIAEoAggiAkUNCQNAIAIoAgAhAyACQQwQyQQgAyECIAMNAAwKCwALQQAhAiABQQA2AgggAUIANwMAQQAhAwsgAw0AQQAhBSACRQ0BC0EAIQUDQAJAIAIgAygC7AMgAygC6AMiBmtBAnUiB0kNACMEIgJBADYCACMJQdYBahARIAIoAgAhAyACQQA2AgAgA0EBRg0GAAsgBiACQQJ0aigCACIEKALcAw0BAkAgBCgCFCIIQYCAwAFxQYCAgAFGDQACQCAIQRB2QQ9xIggNACAAKAIUQQx2QQ9xIQgLAkAgCEEFRw0AIAAtABRBCHFFDQAgBCEFDAMLAkAgBC0AAEECcUUNACAEIQUMAwsgBSAEIAUbIQULAkACQCACQQFqIgIgB0kNAANAAkAgASgCCCICDQAgAUIANwMAQQAhAkEAIQMMAwsgASACKAIENgIAIAEgAigCCDYCBCABIAIoAgA2AgggAkEMEMkEIAEoAgRBAWoiAiABKAIAIgMoAuwDIAMoAugDIgZrQQJ1Tw0ACwsgASACNgIEIAYgAkECdGooAgAoAhRBgICA4ABxQYCAgMAARw0AIwQiAkEANgIAIwlB1QFqIAEQFCACKAIAIQMgAkEANgIAIANBAUYNAyABKAIEIQIgASgCACEDCyADDQAgAg0ACwsCQCABKAIIIgJFDQADQCACKAIAIQMgAkEMEMkEIAMhAiADDQALCyAFDQEgACoCmAMhCwwCCxAOIQQQugQaDAMLIAUQmAMgBSoCoAOSIQsLIAFBEGoiCiM/SyAKI0BJcgRAIAoQOAsgCiQAIAsPCxAOIQQQugQaCyABKAIIIgJFDQADQCACKAIAIQMgAkEMEMkEIAMhAiADDQALCyAEEA8AC4IGAQd/IwBBEGsiASIGIz9LIAYjQElyBEAgBhA4CyAGJAACQAJAIAAoAhQiAkEIcQ0AQQAhAwwBCwJAIAJBgOADcUGAoAFHDQBBASEDDAELAkACQAJAAkACQAJAAkACQCAAKALsAyAAKALoAyICRg0AIAFCADcCBCABIAA2AgACQCACKAIAKAIUQYCAgOAAcUGAgIDAAEYNAEEAIQIMAwsjBCICQQA2AgAjCUHVAWogARAUIAIoAgAhACACQQA2AgACQCAAQQFGDQAgASgCBCECIAEoAgAhAAwCCxAOIQQQugQaIAEoAggiAkUNBwNAIAIoAgAhACACQQwQyQQgACECIAANAAwICwALQQAhAiABQQA2AgggAUIANwMAQQAhAAsgAA0AQQAhAyACRQ0BCwNAAkAgAiAAKALsAyAAKALoAyIEa0ECdSIFSQ0AIwQiAkEANgIAIwlB1gFqEBEgAigCACEAIAJBADYCACAAQQFGDQQACyAEIAJBAnRqKAIAKAIUIgNBgIDAAXFBgICAAUcgA0GAgDxxQYCAFEZxIgMNAQJAAkAgAkEBaiICIAVJDQADQAJAIAEoAggiAg0AIAFCADcDAEEAIQJBACEADAMLIAEgAigCBDYCACABIAIoAgg2AgQgASACKAIANgIIIAJBDBDJBCABKAIEQQFqIgIgASgCACIAKALsAyAAKALoAyIEa0ECdU8NAAsLIAEgAjYCBCAEIAJBAnRqKAIAKAIUQYCAgOAAcUGAgIDAAEcNACMEIgJBADYCACMJQdUBaiABEBQgAigCACEAIAJBADYCACAAQQFGDQMgASgCBCECIAEoAgAhAAsgAA0AIAINAAsLIAEoAggiAkUNBANAIAIoAgAhACACQQwQyQQgACECIAANAAwFCwALEA4hBBC6BBoMAQsQDiEEELoEGgsgASgCCCICRQ0AA0AgAigCACEAIAJBDBDJBCAAIQIgAA0ACwsgBBAPAAsgAUEQaiIHIz9LIAcjQElyBEAgBxA4CyAHJAAgAwuARwIKfwd9IwBBEGsiCiISIz9LIBIjQElyBEAgEhA4CyASJABBAyELIAEoAhRB/AFxQQJ2IgxBA3EhDQJAAkACQCAGQQJHDQBBACEMAkACQCANQX5qDgIEAQALQQMhDAwCC0ECIQsMAgsgDEF/c0ECcSEMCyANIQsLQwAAwH8hFEMAAMB/IRUCQAJAAkACQAJAAkACQAJAAkACQAJAIAIvACgiDUEHcSIODgUBAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEWDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAPQQJ0aioCACEWDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRYLIA5BAUYNAUMAAMB/IRUgFrxB/////wdxQf////sHTA0DDAQLQwAAwH8hFQJAAkAgAi8AICINQQdxIg4OBQEAAAAFAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRYMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NByANIA9BAnRqKgIAIRYMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhFgsgDkEBRg0BQwAAwH8hFSAWvEH/////B3FB////+wdMDQMMBAtDAADAfyEVAkACQCACLwAsIg1BB3EiDg4FAQAAAAUACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0HIA0gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEWCyAOQQFGDQFDAADAfyEVIBa8Qf////8HcUH////7B0oNBAwDC0MAAMB/IRUCQCACLwAwIg1BB3EiDg4FBAAAAAQACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0GIA0gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEWCyAOQQFHDQELIBZDAADAfyAWi0MAAIB/XRshFQwCC0MAAMB/IRUgFrxB/////wdxQf////sHSg0BCyADIBaUQwrXIzyUIRULAkACQAJAAkACQAJAIAIvACoiDUEHcSIODgUBAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEWDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAPQQJ0aioCACEWDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRYLIA5BAUYNASAWvEH/////B3FB////+wdMDQMMBAsCQAJAIAIvACQiDUEHcSIODgUBAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEWDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAPQQJ0aioCACEWDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRYLIA5BAUYNASAWvEH/////B3FB////+wdMDQMMBAsCQAJAIAIvACwiDUEHcSIODgUBAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEWDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAPQQJ0aioCACEWDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRYLIA5BAUYNASAWvEH/////B3FB////+wdKDQQMAwsCQCACLwAwIg1BB3EiDg4FBAAAAAQACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0GIA0gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEWCyAOQQFHDQELIBZDAADAfyAWi0MAAIB/XRshFAwCCyAWvEH/////B3FB////+wdKDQELIAMgFpRDCtcjPJQhFAtDAADAfyEXQwAAwH8hFgJAAkACQAJAAkACQCACLwAiIg1BB3EiDg4FAQAAAAUACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhGAwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0HIA0gD0ECdGoqAgAhGAwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEYCyAOQQFGDQFDAADAfyEWIBi8Qf////8HcUH////7B0wNAwwEC0MAAMB/IRYCQAJAIAIvAC4iDUEHcSIODgUBAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEYDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAPQQJ0aioCACEYDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRgLIA5BAUYNAUMAAMB/IRYgGLxB/////wdxQf////sHSg0EDAMLQwAAwH8hFgJAIAIvADAiDUEHcSIODgUEAAAABAALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEYDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQYgDSAPQQJ0aioCACEYDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRgLIA5BAUcNAQsgGEMAAMB/IBiLQwAAgH9dGyEWDAILQwAAwH8hFiAYvEH/////B3FB////+wdKDQELIAMgGJRDCtcjPJQhFgsCQAJAAkACQAJAAkAgAi8AJiINQQdxIg4OBQEAAAAFAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRgMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NByANIA9BAnRqKgIAIRgMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhGAsgDkEBRg0BIBi8Qf////8HcUH////7B0wNAwwECwJAAkAgAi8ALiINQQdxIg4OBQEAAAAFAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRgMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NByANIA9BAnRqKgIAIRgMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhGAsgDkEBRg0BIBi8Qf////8HcUH////7B0oNBAwDCwJAIAIvADAiDUEHcSIODgUEAAAABAALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEYDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQYgDSAPQQJ0aioCACEYDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRgLIA5BAUcNAQsgGEMAAMB/IBiLQwAAgH9dGyEXDAILIBi8Qf////8HcUH////7B0oNAQsgAyAYlEMK1yM8lCEXCyACQRRqIQ0gFUMAAAAAIBUgFVsbIBRDAAAAACAUIBRbG5IhGCAXQwAAAAAgFyAXWxshFCAWQwAAAAAgFiAWWxshFyACKgL4AyIVIRYCQAJAAkACQCACLQD8AyIOQX9qDgIBAAILIAMgFZRDCtcjPJQhFgsgFkMAAAAAYEUNACAVIAMgFZRDCtcjPJQgDkEBRhshFQJAIA0tAANBEHFFDQAgFSANQQIgBiADEK0DIA1BAiAGIAMQsAOSIhZDAAAAACAWIBZbG5IhFQsgGCAVkiEVDAELIApBCGogDSACQTJqIg4gBhCxA0MAAMB/IRUgCi0ADEUNACAKQQhqIA0gDiAGELIDIAotAAxFDQAgCkEIaiANIA4gBhCxAyAKLQAMQQNGDQAgCkEIaiANIA4gBhCyAyAKLQAMQQNGDQAgACoClAMhGSAKQQhqIABBFGoiDyAAQdYAaiIQIAYQsQNDAADAfyEVQwAAwH8hFgJAAkACQCAKLQAMQX9qDgIAAQILIAoqAgghFgwBCyAKKgIIQwAAAACUQwrXIzyUIRYLIApBCGogDyAQIAYQsgNDAAAAACAWIBZDAAAAAF0bQwAAAAAgFiAWWxshFgJAAkACQCAKLQAMQX9qDgIAAQILIAoqAgghFQwBCyAKKgIIQwAAAACUQwrXIzyUIRULIApBCGogDSAOIAYQsQMgFkMAAAAAIBUgFUMAAAAAXRtDAAAAACAVIBVbG5IhGkMAAMB/IRVDAADAfyEWAkACQAJAIAotAAxBf2oOAgABAgsgCioCCCEWDAELIAMgCioCCJRDCtcjPJQhFgsgGSAakyEZIApBCGogDSAOIAYQsgMgFkMAAAAAIBYgFlsbIRYCQAJAAkAgCi0ADEF/ag4CAAECCyAKKgIIIRUMAQsgAyAKKgIIlEMK1yM8lCEVCyANIAZBACADIAMQpwMhGiAZIBYgFUMAAAAAIBUgFVsbkpMhFgJAAkAgDSAGQQAgAyADEKgDIhVDAAAAAGBFDQAgFiAVXg0BCwJAIBpDAAAAAGANACAWIRUMAQsgGiAWIBYgGl0bIRULIA1BAiAGIAMQqQMgDUECIAYgAxCqA5IiFiAVIBUgFl0bIBYgFSAVIBVcGyAVIBVbIBYgFltxGyEVCyAXIBSSIRcgAioCgAQiFiEUAkACQAJAAkACQAJAAkAgAi0AhAQiDkF/ag4CAQACCyAEIBaUQwrXIzyUIRQLIBRDAAAAAGBFDQAgFiAEIBaUQwrXIzyUIA5BAUYbIRYCQCANLQADQRBxRQ0AIBYgDUEAIAYgAxCtAyANQQAgBiADELADkiIUQwAAAAAgFCAUWxuSIRYLIBcgFpIhFgwBCwJAAkACQAJAIAIvADQiDkEHcSIPRQ0AIA9BBEYNAiAOQQR2IQ8CQAJAIA5BCHFFDQACQCAOQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDigCBCAOKAIAIg5rQQJ1Tw0KIA4gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDsFBAEgbsiEWCyAKIBZDAADAfyAWvEH/////B3EiDkGAgID8B0gbOAIIIA5B////+wdKIQ4MAQsCQCACLwBAIg5BB3EiD0UNACAPQQRGDQIgDkEEdiEPAkACQCAOQQhxRQ0AAkAgDkE/Sw0AIAIgD0ECdGpBgAFqKgIAIRYMAgsgD0F8aiIPIAIoApQBIg4oAgQgDigCACIOa0ECdU8NCiAOIA9BAnRqKgIAIRYMAQtBACAPQf8PcSIPayAPIA7BQQBIG7IhFgsgCiAWQwAAwH8gFrxB/////wdxIg5BgICA/AdIGzgCCCAOQf////sHSiEODAELIApBCGogAkH8AGogAi8AQhC6AyAKLQAMRSEOCyAODQELAkACQCACLwA4Ig5BB3EiD0UNAAJAIA9BBEcNACAKQQM6AAwgCkGAgID+BzYCCAwCCyAOQQR2IRACQAJAIA5BCHFFDQACQCAOQT9LDQAgAiAQQQJ0akGAAWoqAgAhFgwCCyAQQXxqIhAgAigClAEiDigCBCAOKAIAIg5rQQJ1Tw0JIA4gEEECdGoqAgAhFgwBC0EAIBBB/w9xIhBrIBAgDsFBAEgbsiEWCwJAIA9BAUcNACAKIBa8Qf////8HcUGAgID8B0giDjoADCAKIBZDAADAfyAOGzgCCAwCCyAKQQJBACAWvEH/////B3FBgICA/AdIIg4bOgAMIAogFkMAAMB/IA4bOAIIDAELIAJB/ABqIQ4CQCACLwBAIg9BB3FFDQAgCkEIaiAOIA8QugMMAQsgCkEIaiAOIAIvAEIQugMLIAotAAxFDQACQAJAIAIvADQiDkEHcUUNACAKQQhqIAJB/ABqIA4QugMMAQsgAkH8AGohDgJAIAIvAEAiD0EHcUUNACAKQQhqIA4gDxC6AwwBCyAKQQhqIA4gAi8AQhC6AwsgCi0ADEEDRg0AAkACQCACLwA4Ig5BB3FFDQAgCkEIaiACQfwAaiAOELoDDAELIAJB/ABqIQ4CQCACLwBAIg9BB3FFDQAgCkEIaiAOIA8QugMMAQsgCkEIaiAOIAIvAEIQugMLIAotAAxBA0YNACAAKgKYAyEZAkACQCAALwFYIg5BB3FFDQAgCkEIaiAAQfwAaiAOELoDDAELIABB/ABqIQ4CQCAALwBkIg9BB3FFDQAgCkEIaiAOIA8QugMMAQsgCkEIaiAOIAAvAGYQugMLQwAAwH8hFgJAAkACQCAKLQAMQX9qDgIAAQILIAoqAgghFgwBCyAKKgIIQwAAAACUQwrXIzyUIRYLAkACQCAALwBcIg5BB3FFDQAgCkEIaiAAQfwAaiAOELoDDAELIABB/ABqIQ4CQCAALwBkIg9BB3FFDQAgCkEIaiAOIA8QugMMAQsgCkEIaiAOIAAvAGYQugMLIBZDAAAAAF0hDkMAAMB/IRQCQAJAAkAgCi0ADEF/ag4CAAECCyAKKgIIIRQMAQsgCioCCEMAAAAAlEMK1yM8lCEUC0MAAAAAIBYgDhshGiAWIBZbIQ5DAAAAACAUIBRDAAAAAF0bIRYgFCAUWyEPAkACQCACLwA0IhBBB3FFDQAgCkEIaiACQfwAaiAQELoDDAELIAJB/ABqIRACQCACLwBAIhFBB3FFDQAgCkEIaiAQIBEQugMMAQsgCkEIaiAQIAIvAEIQugMLIBpDAAAAACAOGyEUIBZDAAAAACAPGyEaQwAAwH8hFgJAAkACQCAKLQAMQX9qDgIAAQILIAoqAgghFgwBCyAEIAoqAgiUQwrXIzyUIRYLIBQgGpIhFCAWIBZbIQ4CQAJAIAIvADgiD0EHcUUNACAKQQhqIAJB/ABqIA8QugMMAQsgAkH8AGohDwJAIAIvAEAiEEEHcUUNACAKQQhqIA8gEBC6AwwBCyAKQQhqIA8gAi8AQhC6AwsgGSAUkyEUIBZDAAAAACAOGyEZQwAAwH8hFgJAAkACQCAKLQAMQX9qDgIAAQILIAoqAgghFgwBCyAEIAoqAgiUQwrXIzyUIRYLIA0gBkEBIAQgAxCnAyEaIBQgGSAWQwAAAAAgFiAWWxuSkyEUAkACQCANIAZBASAEIAMQqAMiFkMAAAAAYEUNACAUIBZeDQELAkAgGkMAAAAAYA0AIBQhFgwBCyAaIBQgFCAaXRshFgsgDUEAIAYgAxCpAyANQQAgBiADEKoDkiIUIBYgFiAUXRsgFCAWIBYgFlwbIBYgFlsgFCAUW3EbIRYMAQtBACEOQwAAwH8hFkEBIQ8gFSAVXA0DDAELIBUgFVwiDiAWIBZcIg9GDQELIAIvAXoiDUEHcUUNAAJAAkACQAJAAkAgDUEIcUUNACANQQR2IRACQAJAIA1BP0sNACACIBBBAnRqQYABaiEQDAELIBBBfGoiESACKAKUASIQKAIEIBAoAgAiEGtBAnVPDQggECARQQJ0aiEQCyAQKgIAIhQgFFwNBSAORQ0BIA1BBHYhDgJAIA1BP0sNACACIA5BAnRqQYABaioCACEVDAULIA5BfGoiDiACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAOQQJ0aioCACEVDAQLIA4NAiAPRQ0EQQAgDUEEdkH/D3EiDmsgDiANwUEASBuyIRYMAQsgD0UNAyANQQR2IQ4CQCANQT9LDQAgAiAOQQJ0akGAAWoqAgAhFgwBCyAOQXxqIg4gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0FIA0gDkECdGoqAgAhFgsgFyAVIBiTIBaVkiEWDAILQQAgDUEEdkH/D3EiDmsgDiANwUEASBuyIRULIBYgF5MgFZQgGJIhFQsCQCAVIBVbDQBBASEPDAELIBYgFlsNBUEAIQ8LIAIgAyAVIAVBAUcgC0ECSXEgA0MAAAAAXnEgD3EiDRsgFiAGQQIgDyANGyAWIBZcIAMgBEEAQQYgByAIIAkQoQMaIAIqApQDIRhDAADAfyEUQwAAwH8hFQJAAkACQAJAAkACQCACLwEoIg1BB3EiDg4FAQAAAAUACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0HIA0gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEWCyAOQQFGDQFDAADAfyEVIBa8Qf////8HcUH////7B0wNAwwEC0MAAMB/IRUCQAJAIAIvACAiDUEHcSIODgUBAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEWDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAPQQJ0aioCACEWDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRYLIA5BAUYNAUMAAMB/IRUgFrxB/////wdxQf////sHTA0DDAQLQwAAwH8hFQJAAkAgAi8ALCINQQdxIg4OBQEAAAAFAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRYMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NByANIA9BAnRqKgIAIRYMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhFgsgDkEBRg0BQwAAwH8hFSAWvEH/////B3FB////+wdKDQQMAwtDAADAfyEVAkAgAi8AMCINQQdxIg4OBQQAAAAEAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRYMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NBiANIA9BAnRqKgIAIRYMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhFgsgDkEBRw0BCyAWQwAAwH8gFotDAACAf10bIRUMAgtDAADAfyEVIBa8Qf////8HcUH////7B0oNAQsgAyAWlEMK1yM8lCEVCwJAAkACQAJAAkACQCACLwAqIg1BB3EiDg4FAQAAAAUACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0HIA0gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEWCyAOQQFGDQEgFrxB/////wdxQf////sHTA0DDAQLAkACQCACLwAkIg1BB3EiDg4FAQAAAAUACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0HIA0gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEWCyAOQQFGDQEgFrxB/////wdxQf////sHTA0DDAQLAkACQCACLwAsIg1BB3EiDg4FAQAAAAUACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhFgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0HIA0gD0ECdGoqAgAhFgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEWCyAOQQFGDQEgFrxB/////wdxQf////sHSg0EDAMLAkAgAi8AMCINQQdxIg4OBQQAAAAEAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRYMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NBiANIA9BAnRqKgIAIRYMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhFgsgDkEBRw0BCyAWQwAAwH8gFotDAACAf10bIRQMAgsgFrxB/////wdxQf////sHSg0BCyADIBaUQwrXIzyUIRQLIAIqApgDIRlDAADAfyEXQwAAwH8hFgJAAkACQAJAAkACQCACLwEiIg1BB3EiDg4FAQAAAAUACyANQQR2IQ8CQAJAIA1BCHFFDQACQCANQT9LDQAgAiAPQQJ0akGAAWoqAgAhGgwCCyAPQXxqIg8gAigClAEiDSgCBCANKAIAIg1rQQJ1Tw0HIA0gD0ECdGoqAgAhGgwBC0EAIA9B/w9xIg9rIA8gDcFBAEgbsiEaCyAOQQFGDQFDAADAfyEWIBq8Qf////8HcUH////7B0wNAwwEC0MAAMB/IRYCQAJAIAIvAC4iDUEHcSIODgUBAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEaDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQcgDSAPQQJ0aioCACEaDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRoLIA5BAUYNAUMAAMB/IRYgGrxB/////wdxQf////sHSg0EDAMLQwAAwH8hFgJAIAIvADAiDUEHcSIODgUEAAAABAALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEaDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQYgDSAPQQJ0aioCACEaDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRoLIA5BAUcNAQsgGkMAAMB/IBqLQwAAgH9dGyEWDAILQwAAwH8hFiAavEH/////B3FB////+wdKDQELIAMgGpRDCtcjPJQhFgsCQAJAAkAgAi8AJiINQQdxIg4OBQEAAAAGAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRoMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NBCANIA9BAnRqKgIAIRoMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhGgsgDkEBRg0BIBq8Qf////8HcUH////7B0wNBAwFCwJAAkAgAi8ALiINQQdxIg4OBQEAAAAGAAsgDUEEdiEPAkACQCANQQhxRQ0AAkAgDUE/Sw0AIAIgD0ECdGpBgAFqKgIAIRoMAgsgD0F8aiIPIAIoApQBIg0oAgQgDSgCACINa0ECdU8NBCANIA9BAnRqKgIAIRoMAQtBACAPQf8PcSIPayAPIA3BQQBIG7IhGgsgDkEBRg0BIBq8Qf////8HcUH////7B0oNBQwECwJAIAIvADAiDUEHcSIODgUFAAAABQALIA1BBHYhDwJAAkAgDUEIcUUNAAJAIA1BP0sNACACIA9BAnRqQYABaioCACEaDAILIA9BfGoiDyACKAKUASINKAIEIA0oAgAiDWtBAnVPDQMgDSAPQQJ0aioCACEaDAELQQAgD0H/D3EiD2sgDyANwUEASBuyIRoLIA5BAUcNAgsgGkMAAMB/IBqLQwAAgH9dGyEXDAMLENUCAAsgGrxB/////wdxQf////sHSg0BCyADIBqUQwrXIzyUIRcLIBggFUMAAAAAIBUgFVsbIBRDAAAAACAUIBRbG5KSIRUgGSAWQwAAAAAgFiAWWxsgF0MAAAAAIBcgF1sbkpIhFgsgAiAVIBYgBkEAQQAgAyAEQQFBASAHIAggCRChAxogACABIAIgBiALQQEgAyAEEJsDIAAgASACIAYgDEEAIAMgBBCbAyAKQRBqIhMjP0sgEyNASXIEQCATEDgLIBMkAAucCgIHfwJ9IwBBEGsiCCINIz9LIA0jQElyBEAgDRA4CyANJAAgCEEIaiACQRRqIglBAkEAIANBAkYiChtBASAEQf4BcUECRiILGyIMIAMQtgMgBiAHIAsbIQ8CQAJAIAgtAAxFDQAgCEEIaiAJIAwgAxC2AyAILQAMQQNGDQAgCEEIaiAJIAwgAxC2A0MAAMB/IQZDAADAfyEHAkACQAJAIAgtAAxBf2oOAgABAgsgCCoCCCEHDAELIA8gCCoCCJRDCtcjPJQhBwsgCEEIaiAAQRRqIAwgAxClAyAHQwAAAAAgByAHWxshBwJAAkACQCAILQAMQX9qDgIAAQILIAgqAgghBgwBCyAIKgIIQwAAAACUQwrXIzyUIQYLIAhBCGogCSAMIAMQpAMgB0MAAAAAIAYgBkMAAAAAXRtDAAAAACAGIAZbG5IhB0MAAMB/IQYCQAJAAkAgCC0ADEF/ag4CAAECCyAIKgIIIQYMAQsgDyAIKgIIlEMK1yM8lCEGCyAHIAZDAAAAACAGIAZbG5IhBkEBIQMgBCEJAkACQAJAAkACQAJAIAQOBAMEAgABC0ECIQMMAgsjBkGDFWoQzQMAC0EAIQMLIAwgA0YNASAEQQJJIQkLIAAgCUECdGoqApQDIAIgBEECSUECdGoqApQDkyAGkyEGCyACIAYjBkHoNWogBEECdGooAgAQ6gMMAQsgCEEIaiAJQQBBAiAKG0EDIAsbIgsgAxC2AwJAAkACQCAILQAMRQ0AIAhBCGogCSALIAMQtgMgCC0ADEEDRg0AIARBBE8NASAAQZQDaiIKIwZBuDVqIARBAnRqKAIAQQJ0aioCACEGIAIgBEECSSIBQQJ0aiIFKgKUAyEHIAhBCGogAEEUaiALIAMQpQMgBiAHkyEQQwAAwH8hB0MAAMB/IQYCQAJAAkAgCC0ADEF/ag4CAAECCyAIKgIIIQYMAQsgCCoCCEMAAAAAlEMK1yM8lCEGCyAIQQhqIAkgCyADEKQDIBBDAAAAACAGIAZDAAAAAF0bQwAAAAAgBiAGWxuTIQYCQAJAAkAgCC0ADEF/ag4CAAECCyAIKgIIIQcMAQsgDyAIKgIIlEMK1yM8lCEHCyAIQQhqIAkgCyADELYDIAYgB0MAAAAAIAcgB1sbkyEHQwAAwH8hBgJAAkACQCAILQAMQX9qDgIAAQILIAgqAgghBgwBCyAPIAgqAgiUQwrXIzyUIQYLIAcgBkMAAAAAIAYgBlsbkyEGQQEhCSAEIQMCQAJAAkACQAJAIAQOBAIDAAECC0EAIQkMAQtBAiEJCyABIQMgDCAJRg0BCyAKIANBAnRqKgIAIAVBlANqKgIAkyAGkyEGCyACIAYjBkHoNWogBEECdGooAgAQ6gMMAwsCQAJAAkACQCAFRQ0AIAEtABRBBHZBB3EiCUEFSw0GQQEgCXQiCUEycQ0BIAlBCXFFDQMgASACIAMgBCAGEJwDDAYLIAEoAhQiDEGAgIAGcSELAkAgCSgCAEEQdkEPcSIJIAxBDHZBD3EgCRsiCUEFRw0AIAxBCHFFDQILAkAgC0GAgIAERw0AIAlBfmoOAgEFAwsgCUEISw0FQQEgCXRB8wNxDQQgCUECRw0CCyABIAIgAyAEIAYQnQMMBAsgC0GAgIAERw0CCyABIAIgAyAEIAYQngMMAgsjBkGDFWoQzQMACyABIAIgAyAEIAYQnAMLIAhBEGoiDiM/SyAOI0BJcgRAIA4QOAsgDiQAC5MCAgR/AX0jAEEQayIFIgcjP0sgByNASXIEQCAHEDgLIAckAAJAIANBBE8NACAFQQhqIAFBFGojBkHoNWogA0ECdCIGaigCACACEKQDQwAAwH8hCQJAAkACQCAFLQAMQX9qDgIAAQILIAUqAgghCQwBCyAEIAUqAgiUQwrXIzyUIQkLIAlDAAAAACAJIAlbGyAAIwZB6DVqIAZqKAIAQQJ0aioCvAOSIQkCQCABKAL0A0ECEMcDDQAgCSAAIwZB6DVqIANBAnRqKAIAQQJ0aioCzAOSIQkLIAEgCSMGQeg1aiADQQJ0aigCABDqAyAFQRBqIggjP0sgCCNASXIEQCAIEDgLIAgkAA8LIwZBgxVqEM0DAAunBAIGfwJ9IwBBEGsiBSIJIz9LIAkjQElyBEAgCRA4CyAJJAACQCADQQRPDQAgACMGQbg1aiADQQJ0aigCAEECdGoqApQDIQsgAEG8A2oiBiEHIAMhCAJAAkACQAJAIAMOBAABAwIACyAAQcADaiEHQQMhCAwCCyAAQcgDaiEHQQEhCAwBCyAAQcQDaiEHQQAhCAsgCyAHKgIAkyAAIAhBAnRqKgK8A5MhCwJAIAEoAvQDQQIQxwMNACALIAAjBiIHQcg1aiADQQJ0IghqKAIAaioCAJMgACAHQdg1aiAIaigCAEECdGoqAswDkyELCyALIAEgA0ECSUECdGoqApQDIAFBFGoiCCADIAQQowOSk0MAAAA/lCELQQAhBwJAAkACQAJAIAMOBAABAwIACyAAQcADaiEGQQEhBwwCCyAAQcgDaiEGQQMhBwwBCyAAQcQDaiEGQQIhBwsgBioCACEMIAVBCGogCCAHIAIQpAMgCyAMkiEMQwAAwH8hCwJAAkACQCAFLQAMQX9qDgIAAQILIAUqAgghCwwBCyAEIAUqAgiUQwrXIzyUIQsLIAwgC0MAAAAAIAsgC1sbkiELAkAgASgC9ANBAhDHAw0AIAsgACMGQeg1aiADQQJ0aigCAEECdGoqAswDkiELCyABIAsjBkHoNWogA0ECdGooAgAQ6gMgBUEQaiIKIz9LIAojQElyBEAgChA4CyAKJAAPCyMGQYMVahDNAwALsQICBX8CfSMAQRBrIgUiCCM/SyAII0BJcgRAIAgQOAsgCCQAAkAgA0EETw0AIAAjBiIGQag1aiADQQJ0IgdqKAIAaioCACEKIAVBCGogAUEUaiAGQdg1aiAHaigCACACEKQDQwAAwH8hCwJAAkACQCAFLQAMQX9qDgIAAQILIAUqAgghCwwBCyAEIAUqAgiUQwrXIzyUIQsLIAogC0MAAAAAIAsgC1sbkiELAkAgASgC9ANBAhDHAw0AIAsgACMGQdg1aiADQQJ0aigCAEECdGoqAswDkiELCyABIAAgA0ECSUECdCICaioClAMgASACaioClAOTIAuTIwZB6DVqIANBAnRqKAIAEOoDIAVBEGoiCSM/SyAJI0BJcgRAIAkQOAsgCSQADwsjBkGDFWoQzQMAC6ESAgx/BH0jAEEQayILIhUjP0sgFSNASXIEQCAVEDgLIBUkAAJAAkACQAJAAkAgASgC7AMgASgC6AMiDEYNACALQgA3AgQgCyABNgIAAkAgDCgCACgCFEGAgIDgAHFBgICAwABGDQBBACENIAEhDAwDCyMEIgxBADYCACMJQdUBaiALEBQgDCgCACENIAxBADYCAAJAIA1BAUYNACALKAIEIQ0gCygCACEMDAILEA4hDhC6BBogCygCCCIMRQ0EA0AgDCgCACENIAxBDBDJBCANIQwgDQ0ADAULAAtBACENIAtBADYCCCALQgA3AwBBACEMCyAMDQBBACEPIA1FDQELIABBFGohECAFQQFqIRFBACEPAkACQAJAAkADQAJAAkACQAJAAkAgDSAMKALsAyAMKALoAyIMa0ECdUkNACMEIgxBADYCACMJQdYBahARIAwoAgAhDSAMQQA2AgAgDUEBRg0BAAsgDCANQQJ0aigCACIMKAIUIg1BgICA4ABxQYCAgCBGDQMgDUEUdkEDcQ4DAgMBAwsQDiEOELoEGgwHCyABKAL0AyEOIwQiDUEANgIAIxAgDkEEEBAhEiANKAIAIQ4gDUEANgIAAkACQAJAAkACQCAOQQFGDQAgCSEXIAohGAJAIBINACAAKgKUAyEXIwQiDUEANgIAIxEgEEECECIhGSANKAIAIQ4gDUEANgIAIA5BAUYNAiAAKgKYAyEYIwQiDUEANgIAIxEgEEEAECIhGiANKAIAIQ4gDUEANgIAIA5BAUYNAyAYIBqTIRggFyAZkyEXCyMEIg1BADYCACMJQdkBaiAAIAEgDCAXIBggAiADIAQgBSAGECMgDSgCACEOIA1BADYCACAOQQFGDQJBASESAkAgD0EBcQ0AIAwtAAAhEgtBAiEOIAEoAhQiE0ECdkEDcSEPAkACQAJAAkACQCADQQJHDQBBACEUQQMhDkEAIQ0gD0F+ag4CAQkACyAOQQAgD0ECSSIUGyENIBNBBHFFDQcgE0EIcUUNASAPIQ4LIAAhDwJAIAwtADJBB3ENACAAIQ8gDC0ANkEHcQ0AIAAhDyAMLQBCQQdxDQAgACEPIAwtAD5BB3ENACAAIQ8gDC0AOkEHcQ0AIAAgASAMLwA8QQdxGyEPCyAPQZQDaiETIAwgFEECdGpBlANqIQ8gDkEDRg0BIAxBnANqIQ5BAiEUDAILIAAhDgJAIAwtADRBB3ENACAAIQ4gDC0AOEEHcQ0AIAAhDiAMLQBCQQdxDQAgASEOIAwvAEBBB3FFDQAgACEOCyAOQZgDaiETIAxBqANqIQ4gDCAPQQJJQQJ0akGUA2ohD0EBIRQMAQsgDEGkA2ohDkEAIRQLIA4qAgAhFyAPKgIAIRggEyoCACEZIwQiDkEANgIAIxIgDCAZIBiTIBeTIBQQHiAOKAIAIQ8gDkEANgIAIA9BAUcNAxAOIQ4QugQaDAsLEA4hDhC6BBoMCgsQDiEOELoEGgwJCxAOIQ4QugQaDAgLIA1BAXFFDQACQAJAAkACQAJAAkACQCANQQJJDQAgDC0AMkEHcQ0BIAwtADZBB3ENASAMLQBCQQdxDQEgDC0APkEHcQ0BIAwtADpBB3ENASABIQ4gDC8APEEHcQ0BDAILIAwtADRBB3ENACAMLQA4QQdxDQAgDC0AQkEHcQ0AIAEhDiAMLwBAQQdxRQ0CCyAAIQ4LIA1Bf2oOAwABAgALQZgDIQ0gDkGYA2ohDiAMQagDaiEPQQEhEwwCC0GUAyENIA5BlANqIQ4gDEGcA2ohD0ECIRMMAQtBlAMhDSAOQZQDaiEOIAxBpANqIQ9BACETCyAMIA1qKgIAIRcgDyoCACEYIA4qAgAhGSMEIg1BADYCACMSIAwgGSAXkyAYkyATEB4gDSgCACEOIA1BADYCACAOQQFHDQAQDiEOELoEGgwHC0EBIQ9BASEOAkAgDC0AMkEHcQ0AQQEhDiAMLQA2QQdxDQBBASEOIAwtAEJBB3ENAEEBIQ4gDC0APkEHcQ0AQQEhDiAMLQA6QQdxDQAgDC0APEEHcUEARyEOCyAMKgKcAyEXAkAgDC0ANEEHcQ0AIAwtADhBB3ENACAMLQBCQQdxDQAgDC0AQEEHcUEARyEPCyAMKgKgAyEYIwQiDUEANgIAIxIgDCAXIAeTIBcgDhtBABAeIA0oAgAhDiANQQA2AgACQCAOQQFGDQAjBCINQQA2AgAjEiAMIBggCJMgGCAPG0EBEB4gDSgCACEMIA1BADYCACASIQ8gDEEBRw0CCxAOIQ4QugQaDAYLIAwtAABBCHENACMEIg1BADYCACMTIAwQFCANKAIAIQ4gDUEANgIAIA5BAUYNBCMEIg1BADYCACMUIAwgAxAQIRIgDSgCACEOIA1BADYCACAOQQFGDQMgDCoCnAMhFyAMKgKgAyEYIwQiDUEANgIAIwlB3QFqIAAgDCACIBIgBCARIAYgByAXkiAIIBiSIAkgChAkIRIgDSgCACEOIA1BADYCACAOQQFGDQIgEiAPciENQQAhDyANQQFxRQ0AQQEhDyAMIAwtAABBAXI6AAALAkACQAJAIAsoAgRBAWoiDSALKAIAIgwoAuwDIAwoAugDIg5rQQJ1SQ0AA0ACQCALKAIIIgwNACALQgA3AwBBACENQQAhDAwDCyALIAwoAgQ2AgAgCyAMKAIINgIEIAsgDCgCADYCCCAMQQwQyQQgCygCBEEBaiINIAsoAgAiDCgC7AMgDCgC6AMiDmtBAnVPDQALCyALIA02AgQgDiANQQJ0aigCACgCFEGAgIDgAHFBgICAwABHDQAjBCIMQQA2AgAjCUHVAWogCxAUIAwoAgAhDSAMQQA2AgAgDUEBRg0BIAsoAgQhDSALKAIAIQwLIAwNASANDQEMBgsLEA4hDhC6BBoMAwsQDiEOELoEGgwCCxAOIQ4QugQaDAELEA4hDhC6BBoLIAsoAggiDEUNAQNAIAwoAgAhDSAMQQwQyQQgDSEMIA0NAAwCCwALAkAgCygCCCIMRQ0AA0AgDCgCACENIAxBDBDJBCANIQwgDQ0ACwsgC0EQaiIWIz9LIBYjQElyBEAgFhA4CyAWJAAgD0EBcQ8LIA4QDwALkQICA38CfSMAQRBrIgIiAyM/SyADI0BJcgRAIAMQOAsgAyQAIAJBCGogACABQf4BcUECRyIBQQEQpQNDAADAfyEFQwAAwH8hBgJAAkACQCACLQAMQX9qDgIAAQILIAIqAgghBgwBCyACKgIIQwAAAACUQwrXIzyUIQYLIAJBCGogAEEDQQIgARtBARClAwJAAkACQCACLQAMQX9qDgIAAQILIAIqAgghBQwBCyACKgIIQwAAAACUQwrXIzyUIQULIAJBEGoiBCM/SyAEI0BJcgRAIAQQOAsgBCQAQwAAAAAgBiAGQwAAAABdG0MAAAAAIAYgBlsbQwAAAAAgBSAFQwAAAABdG0MAAAAAIAUgBVsbkgviHgIJfwV9IwBBEGsiDSIUIz9LIBQjQElyBEAgFBA4CyAUJAACQAJAAkAgAC0AAEEEcUUNACAAKAKgASAMRw0BCyAAKAKkASAAKAL0AxDJA0cNAEEAIQ4gAC0AqAEgA0YNAQsgAEKAgID8i4CAwL9/NwKAAyAAQoGAgIAQNwL4AiAAQoCAgPyLgIDAv383AvACIABBADYCrAFBASEOCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIIRQ0AQwAAwH8hFkMAAMB/IRcCQAJAAkAgAC8AKCIPQQdxIhAOBQEAAAAHAAsgD0EEdiERAkACQCAPQQhxRQ0AAkAgD0E/Sw0AIAAgEUECdGpBgAFqKgIAIRgMAgsgEUF8aiIRIAAoApQBIg8oAgQgDygCACIPa0ECdU8NCSAPIBFBAnRqKgIAIRgMAQtBACARQf8PcSIRayARIA/BQQBIG7IhGAsgEEEBRg0BQwAAwH8hFyAYvEH/////B3FB////+wdMDQUMBgtDAADAfyEXAkACQCAALwAgIg9BB3EiEA4FAQAAAAcACyAPQQR2IRECQAJAIA9BCHFFDQACQCAPQT9LDQAgACARQQJ0akGAAWoqAgAhGAwCCyARQXxqIhEgACgClAEiDygCBCAPKAIAIg9rQQJ1Tw0JIA8gEUECdGoqAgAhGAwBC0EAIBFB/w9xIhFrIBEgD8FBAEgbsiEYCyAQQQFGDQFDAADAfyEXIBi8Qf////8HcUH////7B0wNBQwGC0MAAMB/IRcCQAJAIAAvACwiD0EHcSIQDgUBAAAABwALIA9BBHYhEQJAAkAgD0EIcUUNAAJAIA9BP0sNACAAIBFBAnRqQYABaioCACEYDAILIBFBfGoiESAAKAKUASIPKAIEIA8oAgAiD2tBAnVPDQkgDyARQQJ0aioCACEYDAELQQAgEUH/D3EiEWsgESAPwUEASBuyIRgLIBBBAUYNAUMAAMB/IRcgGLxB/////wdxQf////sHSg0GDAULQwAAwH8hFwJAIAAvADAiD0EHcSIQDgUGAAAABgALIA9BBHYhEQJAAkAgD0EIcUUNAAJAIA9BP0sNACAAIBFBAnRqQYABaioCACEYDAILIBFBfGoiESAAKAKUASIPKAIEIA8oAgAiD2tBAnVPDQggDyARQQJ0aioCACEYDAELQQAgEUH/D3EiEWsgESAPwUEASBuyIRgLIBBBAUcNAgsgGEMAAMB/IBiLQwAAgH9dGyEXDAQLIAgNASAAKAKsASISRQ0IIABBsAFqIRNBACEQA0ACQAJAAkAgEyAQQRhsaiIPKgIAIhcgF1wgASABXHINACAXIAGTi0MXt9E4XQ0BDAILIAEgAVsNASAXIBdbDQELAkACQCAPKgIEIhcgF1wgAiACXHINACAXIAKTi0MXt9E4XQ0BDAILIAIgAlsNASAXIBdbDQELIA8oAgggBEcNACAPKAIMIAVGDQwLQQEhESAQQQFqIhAgEkcNAAwMCwALQwAAwH8hFyAYvEH/////B3FB////+wdMDQEMAgsCQAJAIAAqAvACIhcgF1wgASABXHINACAXIAGTi0MXt9E4XUUNCAwBC0EAIQ9BASERIAEgAVsNCyAXIBdbDQsLAkACQCAAKgL0AiIXIBdcIAIgAlxyDQAgFyACk4tDF7fROF1FDQgMAQtBACEPQQEhESACIAJbDQsgFyAXWw0LCyAAKAL4AiAERw0GIABB8AJqQQAgACgC/AIgBUYbIQ8MCAsgBiAYlEMK1yM8lCEXCwJAAkACQAJAAkACQCAALwAqIg9BB3EiEA4FAQAAAAUACyAPQQR2IRECQAJAIA9BCHFFDQACQCAPQT9LDQAgACARQQJ0akGAAWoqAgAhGAwCCyARQXxqIhEgACgClAEiDygCBCAPKAIAIg9rQQJ1Tw0HIA8gEUECdGoqAgAhGAwBC0EAIBFB/w9xIhFrIBEgD8FBAEgbsiEYCyAQQQFGDQEgGLxB/////wdxQf////sHTA0DDAQLAkACQCAALwAkIg9BB3EiEA4FAQAAAAUACyAPQQR2IRECQAJAIA9BCHFFDQACQCAPQT9LDQAgACARQQJ0akGAAWoqAgAhGAwCCyARQXxqIhEgACgClAEiDygCBCAPKAIAIg9rQQJ1Tw0HIA8gEUECdGoqAgAhGAwBC0EAIBFB/w9xIhFrIBEgD8FBAEgbsiEYCyAQQQFGDQEgGLxB/////wdxQf////sHTA0DDAQLAkACQCAALwAsIg9BB3EiEA4FAQAAAAUACyAPQQR2IRECQAJAIA9BCHFFDQACQCAPQT9LDQAgACARQQJ0akGAAWoqAgAhGAwCCyARQXxqIhEgACgClAEiDygCBCAPKAIAIg9rQQJ1Tw0HIA8gEUECdGoqAgAhGAwBC0EAIBFB/w9xIhFrIBEgD8FBAEgbsiEYCyAQQQFGDQEgGLxB/////wdxQf////sHSg0EDAMLAkAgAC8AMCIPQQdxIhAOBQQAAAAEAAsgD0EEdiERAkACQCAPQQhxRQ0AAkAgD0E/Sw0AIAAgEUECdGpBgAFqKgIAIRgMAgsgEUF8aiIRIAAoApQBIg8oAgQgDygCACIPa0ECdU8NBiAPIBFBAnRqKgIAIRgMAQtBACARQf8PcSIRayARIA/BQQBIG7IhGAsgEEEBRw0BCyAYQwAAwH8gGItDAACAf10bIRYMAgsgGLxB/////wdxQf////sHSg0BCyAGIBiUQwrXIzyUIRYLQwAAwH8hGUMAAMB/IRgCQAJAAkACQAJAAkAgAC8AIiIPQQdxIhAOBQEAAAAFAAsgD0EEdiERAkACQCAPQQhxRQ0AAkAgD0E/Sw0AIAAgEUECdGpBgAFqKgIAIRoMAgsgEUF8aiIRIAAoApQBIg8oAgQgDygCACIPa0ECdU8NByAPIBFBAnRqKgIAIRoMAQtBACARQf8PcSIRayARIA/BQQBIG7IhGgsgEEEBRg0BQwAAwH8hGCAavEH/////B3FB////+wdMDQMMBAtDAADAfyEYAkACQCAALwAuIg9BB3EiEA4FAQAAAAUACyAPQQR2IRECQAJAIA9BCHFFDQACQCAPQT9LDQAgACARQQJ0akGAAWoqAgAhGgwCCyARQXxqIhEgACgClAEiDygCBCAPKAIAIg9rQQJ1Tw0HIA8gEUECdGoqAgAhGgwBC0EAIBFB/w9xIhFrIBEgD8FBAEgbsiEaCyAQQQFGDQFDAADAfyEYIBq8Qf////8HcUH////7B0oNBAwDC0MAAMB/IRgCQCAALwAwIg9BB3EiEA4FBAAAAAQACyAPQQR2IRECQAJAIA9BCHFFDQACQCAPQT9LDQAgACARQQJ0akGAAWoqAgAhGgwCCyARQXxqIhEgACgClAEiDygCBCAPKAIAIg9rQQJ1Tw0GIA8gEUECdGoqAgAhGgwBC0EAIBFB/w9xIhFrIBEgD8FBAEgbsiEaCyAQQQFHDQELIBpDAADAfyAai0MAAIB/XRshGAwCC0MAAMB/IRggGrxB/////wdxQf////sHSg0BCyAGIBqUQwrXIzyUIRgLAkACQAJAIAAvACYiD0EHcSIQDgUBAAAABgALIA9BBHYhEQJAAkAgD0EIcUUNAAJAIA9BP0sNACAAIBFBAnRqQYABaioCACEaDAILIBFBfGoiESAAKAKUASIPKAIEIA8oAgAiD2tBAnVPDQQgDyARQQJ0aioCACEaDAELQQAgEUH/D3EiEWsgESAPwUEASBuyIRoLIBBBAUYNASAavEH/////B3FB////+wdMDQQMBQsCQAJAIAAvAC4iD0EHcSIQDgUBAAAABgALIA9BBHYhEQJAAkAgD0EIcUUNAAJAIA9BP0sNACAAIBFBAnRqQYABaioCACEaDAILIBFBfGoiESAAKAKUASIPKAIEIA8oAgAiD2tBAnVPDQQgDyARQQJ0aioCACEaDAELQQAgEUH/D3EiEWsgESAPwUEASBuyIRoLIBBBAUYNASAavEH/////B3FB////+wdKDQUMBAsCQCAALwAwIg9BB3EiEA4FBQAAAAUACyAPQQR2IRECQAJAIA9BCHFFDQACQCAPQT9LDQAgACARQQJ0akGAAWoqAgAhGgwCCyARQXxqIhEgACgClAEiDygCBCAPKAIAIg9rQQJ1Tw0DIA8gEUECdGoqAgAhGgwBC0EAIBFB/w9xIhFrIBEgD8FBAEgbsiEaCyAQQQFHDQILIBpDAADAfyAai0MAAIB/XRshGQwDCxDVAgALIBq8Qf////8HcUH////7B0oNAQsgBiAalEMK1yM8lCEZCwJAIAQgASAFIAIgACgC+AIgACoC8AIgACgC/AIgACoC9AIgACoCgAMgACoChAMgF0MAAAAAIBcgF1sbIBZDAAAAACAWIBZbG5IiFyAYQwAAAAAgGCAYWxsgGUMAAAAAIBkgGVsbkiIYIAAoAvQDEJcDRQ0AIABB8AJqIQ8MAwsgACgCrAENAQtBACEPQQEhEQwDCyAAQbABaiESQQAhEANAIAQgASAFIAIgEiAQQRhsaiIPKAIIIA8qAgAgDygCDCAPKgIEIA8qAhAgDyoCFCAXIBggACgC9AMQlwMNAUEBIREgEEEBaiIQIAAoAqwBSQ0ADAILAAsgDiAPRSIRcg0BIAAgDyoCEDgClAMgACAPKgIUOAKYAyAKQQxBECAIG2oiECAQKAIAQQFqNgIAQQMhEEEAIREMAgtBACEPCyAAIAEgAiADIAQgBSAGIAcgCCAKIAtBAWogDCAJEKIDIAAgAzoAqAEgACAAKAL0AxDJAzYCpAECQCARDQBBAyEQQQEhEQwBCyAKIAooAggiECAAKAKsASIRQQFqIhIgECASSxs2AgggAEHwAmogACARQQAgEUEIRxsiEkEYbGpBsAFqIAgbIRACQAJAIBFBCEYNACAIDQELIAAgEiAIQQFzajYCrAELIBAgBTYCDCAQIAQ2AgggECACOAIEIBAgATgCACAQIAAqApQDOAIQIBAgACoCmAM4AhRBASERQQEhEAsCQCAIRQ0AIAAgACoClANBABDuAyAAIAAqApgDQQEQ7gMgACAALQAAQQFyOgAAIABBABDjA0EAQQBBAiAPIABB8AJqRxsgDhshEAsgACAMNgKgASANIBA2AgggDSANQQhqNgIMIABBAiANQQxqENYDIA1BEGoiFSM/SyAVI0BJcgRAIBUQOAsgFSQAIBEL+40CAih/F30jAEGAAWsiDSIzIz9LIDMjQElyBEAgMxA4CyAzJAAgACABIAFbIARBAUZyIwYiDkGqC2oQzwMgACACIAJbIAVBAUZyIA5B2QpqEM8DIAlBAEEEIAgbaiIOIA4oAgBBAWo2AgAgACAAIAMQ9AMiDxDlAyANQcAAaiAAQRRqIhBBAkEAIA9BAkYiERsiEiAPEKQDQQBBAiAPQQFGIhMbIQ5DAADAfyE1QwAAwH8hNgJAAkACQCANLQBEQX9qDgIAAQILIA0qAkAhNgwBCyAGIA0qAkCUQwrXIzyUITYLQQJBACATGyETIAAgNkMAAAAAIDYgNlsbIjcgDhDmAyANQcAAaiAQQQBBAiARGyIRIA8QpAMCQAJAAkAgDS0AREF/ag4CAAECCyANKgJAITUMAQsgBiANKgJAlEMK1yM8lCE1CyAAIDVDAAAAACA1IDVbGyI4IBMQ5gNDAADAfyE2QwAAwH8hNQJAAkACQAJAAkACQAJAAkACQAJAIAAvACIiFEEHcSIVDgUBAAAABQALIBRBBHYhFgJAAkAgFEEIcUUNAAJAIBRBP0sNACAAIBZBAnRqQYABaioCACE5DAILIBZBfGoiFiAAKAKUASIUKAIEIBQoAgAiFGtBAnVPDQcgFCAWQQJ0aioCACE5DAELQQAgFkH/D3EiFmsgFiAUwUEASBuyITkLIBVBAUYNAUMAAMB/ITUgObxB/////wdxQf////sHTA0DDAQLQwAAwH8hNQJAAkAgAC8ALiIUQQdxIhUOBQEAAAAFAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITkMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NByAUIBZBAnRqKgIAITkMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhOQsgFUEBRg0BQwAAwH8hNSA5vEH/////B3FB////+wdKDQQMAwtDAADAfyE1AkAgAC8AMCIUQQdxIhUOBQQAAAAEAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITkMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NBiAUIBZBAnRqKgIAITkMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhOQsgFUEBRw0BCyA5QwAAwH8gOYtDAACAf10bITUMAgtDAADAfyE1IDm8Qf////8HcUH////7B0oNAQsgBiA5lEMK1yM8lCE1CyAAIDVDAAAAACA1IDVbGyI5QQEQ5gMCQAJAAkACQAJAAkAgAC8AJiIUQQdxIhUOBQEAAAAFAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITUMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NByAUIBZBAnRqKgIAITUMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhNQsgFUEBRg0BIDW8Qf////8HcUH////7B0wNAwwECwJAAkAgAC8ALiIUQQdxIhUOBQEAAAAFAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITUMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NByAUIBZBAnRqKgIAITUMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhNQsgFUEBRg0BIDW8Qf////8HcUH////7B0oNBAwDCwJAIAAvADAiFEEHcSIVDgUEAAAABAALIBRBBHYhFgJAAkAgFEEIcUUNAAJAIBRBP0sNACAAIBZBAnRqQYABaioCACE1DAILIBZBfGoiFiAAKAKUASIUKAIEIBQoAgAiFGtBAnVPDQYgFCAWQQJ0aioCACE1DAELQQAgFkH/D3EiFmsgFiAUwUEASBuyITULIBVBAUcNAQsgNUMAAMB/IDWLQwAAgH9dGyE2DAILIDW8Qf////8HcUH////7B0oNAQsgBiA1lEMK1yM8lCE2CyAAIDZDAAAAACA2IDZbGyI6QQMQ5gMgDUHAAGogECASIA8QpQNDAADAfyE1QwAAwH8hNgJAAkACQCANLQBEQX9qDgIAAQILIA0qAkAhNgwBCyANKgJAQwAAAACUQwrXIzyUITYLIABDAAAAACA2IDZDAAAAAF0bQwAAAAAgNiA2WxsgDhDnAyANQcAAaiAQIBEgDxClAwJAAkACQCANLQBEQX9qDgIAAQILIA0qAkAhNQwBCyANKgJAQwAAAACUQwrXIzyUITULIABDAAAAACA1IDVDAAAAAF0bQwAAAAAgNSA1WxsgExDnA0MAAMB/ITZDAADAfyE1AkACQAJAAkACQAJAIAAvAFgiFEEHcSIVDgUBAAAABQALIBRBBHYhFgJAAkAgFEEIcUUNAAJAIBRBP0sNACAAIBZBAnRqQYABaioCACE7DAILIBZBfGoiFiAAKAKUASIUKAIEIBQoAgAiFGtBAnVPDQcgFCAWQQJ0aioCACE7DAELQQAgFkH/D3EiFmsgFiAUwUEASBuyITsLIBVBAUYNAUMAAMB/ITUgO7xB/////wdxQf////sHTA0DDAQLQwAAwH8hNQJAAkAgAC8AZCIUQQdxIhUOBQEAAAAFAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITsMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NByAUIBZBAnRqKgIAITsMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhOwsgFUEBRg0BQwAAwH8hNSA7vEH/////B3FB////+wdKDQQMAwtDAADAfyE1AkAgAC8AZiIUQQdxIhUOBQQAAAAEAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITsMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NBiAUIBZBAnRqKgIAITsMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhOwsgFUEBRw0BCyA7QwAAwH8gO4tDAACAf10bITUMAgtDAADAfyE1IDu8Qf////8HcUH////7B0oNAQsgO0MAAAAAlEMK1yM8lCE1CyAAQwAAAAAgNSA1QwAAAABdG0MAAAAAIDUgNVsbQQEQ5wMCQAJAAkACQAJAAkAgAC8AXCIUQQdxIhUOBQEAAAAFAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITUMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NByAUIBZBAnRqKgIAITUMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhNQsgFUEBRg0BIDW8Qf////8HcUH////7B0wNAwwECwJAAkAgAC8AZCIUQQdxIhUOBQEAAAAFAAsgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIAAgFkECdGpBgAFqKgIAITUMAgsgFkF8aiIWIAAoApQBIhQoAgQgFCgCACIUa0ECdU8NByAUIBZBAnRqKgIAITUMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhNQsgFUEBRg0BIDW8Qf////8HcUH////7B0oNBAwDCwJAIAAvAGYiFEEHcSIVDgUEAAAABAALIBRBBHYhFgJAAkAgFEEIcUUNAAJAIBRBP0sNACAAIBZBAnRqQYABaioCACE1DAILIBZBfGoiFiAAKAKUASIUKAIEIBQoAgAiFGtBAnVPDQYgFCAWQQJ0aioCACE1DAELQQAgFkH/D3EiFmsgFiAUwUEASBuyITULIBVBAUcNAQsgNUMAAMB/IDWLQwAAgH9dGyE2DAILIDW8Qf////8HcUH////7B0oNAQsgNUMAAAAAlEMK1yM8lCE2CyAAQwAAAAAgNiA2QwAAAABdG0MAAAAAIDYgNlsbQQMQ5wMgDUHAAGogECASIA8QpgNDAADAfyE1QwAAwH8hNgJAAkACQCANLQBEQX9qDgIAAQILIA0qAkAhNgwBCyAGIA0qAkCUQwrXIzyUITYLIABDAAAAACA2IDZDAAAAAF0bQwAAAAAgNiA2WxsgDhDoAyANQcAAaiAQIBEgDxCmAwJAAkACQCANLQBEQX9qDgIAAQILIA0qAkAhNQwBCyAGIA0qAkCUQwrXIzyUITULIABDAAAAACA1IDVDAAAAAF0bQwAAAAAgNSA1WxsgExDoA0MAAMB/ITZDAADAfyE1AkACQAJAAkACQAJAIAAvAEYiDkEHcSITDgUBAAAABQALIA5BBHYhEgJAAkAgDkEIcUUNAAJAIA5BP0sNACAAIBJBAnRqQYABaioCACE7DAILIBJBfGoiEiAAKAKUASIOKAIEIA4oAgAiDmtBAnVPDQcgDiASQQJ0aioCACE7DAELQQAgEkH/D3EiEmsgEiAOwUEASBuyITsLIBNBAUYNAUMAAMB/ITUgO7xB/////wdxQf////sHTA0DDAQLQwAAwH8hNQJAAkAgAC8AUiIOQQdxIhMOBQEAAAAFAAsgDkEEdiESAkACQCAOQQhxRQ0AAkAgDkE/Sw0AIAAgEkECdGpBgAFqKgIAITsMAgsgEkF8aiISIAAoApQBIg4oAgQgDigCACIOa0ECdU8NByAOIBJBAnRqKgIAITsMAQtBACASQf8PcSISayASIA7BQQBIG7IhOwsgE0EBRg0BQwAAwH8hNSA7vEH/////B3FB////+wdKDQQMAwtDAADAfyE1AkAgAC8AVCIOQQdxIhMOBQQAAAAEAAsgDkEEdiESAkACQCAOQQhxRQ0AAkAgDkE/Sw0AIAAgEkECdGpBgAFqKgIAITsMAgsgEkF8aiISIAAoApQBIg4oAgQgDigCACIOa0ECdU8NBiAOIBJBAnRqKgIAITsMAQtBACASQf8PcSISayASIA7BQQBIG7IhOwsgE0EBRw0BCyA7QwAAwH8gO4tDAACAf10bITUMAgtDAADAfyE1IDu8Qf////8HcUH////7B0oNAQsgBiA7lEMK1yM8lCE1CyAAQwAAAAAgNSA1QwAAAABdG0MAAAAAIDUgNVsbQQEQ6AMCQAJAAkAgAC8ASiIOQQdxIhMOBQEAAAAGAAsgDkEEdiESAkACQCAOQQhxRQ0AAkAgDkE/Sw0AIAAgEkECdGpBgAFqKgIAITUMAgsgEkF8aiISIAAoApQBIg4oAgQgDigCACIOa0ECdU8NBCAOIBJBAnRqKgIAITUMAQtBACASQf8PcSISayASIA7BQQBIG7IhNQsgE0EBRg0BIDW8Qf////8HcUH////7B0wNBAwFCwJAAkAgAC8AUiIOQQdxIhMOBQEAAAAGAAsgDkEEdiESAkACQCAOQQhxRQ0AAkAgDkE/Sw0AIAAgEkECdGpBgAFqKgIAITUMAgsgEkF8aiISIAAoApQBIg4oAgQgDigCACIOa0ECdU8NBCAOIBJBAnRqKgIAITUMAQtBACASQf8PcSISayASIA7BQQBIG7IhNQsgE0EBRg0BIDW8Qf////8HcUH////7B0oNBQwECwJAIAAvAFQiDkEHcSITDgUFAAAABQALIA5BBHYhEgJAAkAgDkEIcUUNAAJAIA5BP0sNACAAIBJBAnRqQYABaioCACE1DAILIBJBfGoiEiAAKAKUASIOKAIEIA4oAgAiDmtBAnVPDQMgDiASQQJ0aioCACE1DAELQQAgEkH/D3EiEmsgEiAOwUEASBuyITULIBNBAUcNAgsgNUMAAMB/IDWLQwAAgH9dGyE2DAMLENUCAAsgNbxB/////wdxQf////sHSg0BCyAGIDWUQwrXIzyUITYLIDkgOpIhOSA3IDiSITUgAEMAAAAAIDYgNkMAAAAAXRtDAAAAACA2IDZbG0EDEOgDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCCEUNACAAQQEjBkGzFGoQzwNDAADAfyACIDmTIAVBAUYbITZDAADAfyABIDWTIARBAUYbITUCQCAFIARyDQAgECAPQQAgBiAGEKcDIQICQAJAIBAgD0EAIAYgBhCoAyIBQwAAAABgRQ0AIDUgAV4NAQsCQCACQwAAAABgDQAgNSEBDAELIAIgNSA1IAJdGyEBCyAAIBBBAiAPIAYQqQMgEEECIA8gBhCqA5IiNSABIAEgNV0bIDUgASABIAFcGyABIAFbIDUgNVtxG0EAEOwDIBAgD0EBIAcgBhCnAyEBAkACQCAQIA9BASAHIAYQqAMiNUMAAAAAYEUNACA2IDVeDQELAkAgAUMAAAAAYA0AIDYhNQwBCyABIDYgNiABXRshNQsgACAQQQAgDyAGEKkDIBBBACAPIAYQqgOSIjYgNSA1IDZdGyA2IDUgNSA1XBsgNSA1WyA2IDZbcRtBARDsAwwhCyAAKgLYAyEBIAAqAtADIQIgACoCwAMhNyAAKgLIAyE4IAAqAtQDITkgACoCzAMhOiAAKgK8AyE7IAAqAsQDITwgDSANQegAajYCQCAAQQUgDUHAAGoQ1gMgBEEDTw0CIAVBA08NASANQegAaiAAIDUgNSA6IDmSIDuSIDySIjmTIjpDAAAAACA6QwAAAABeGyA1IDVcGyI6QYGACCAEQQN0Qfj//wdxdkEDcSA2IDYgAiABkiA3kiA4kiICkyIBQwAAAAAgAUMAAAAAXhsgNiA2XBsiAUGBgAggBUEDdEH4//8HcXZBA3EQ2QMgCSAJKAIUQQFqNgIUIAkgDEECdGoiDiAOKAIYQQFqNgIYIA0jBkGYNmoiDiAFQQJ0aigCADYCTCANIAE4AkggDSAOIARBAnRqKAIANgJEIA0gOjgCQCANIAw2AlggDSANKQJoNwJQIA0gDUHAAGo2AjAgAEEGIA1BMGoQ1gMgDSoCaCEBIBAgD0EAIAYgBhCnAyE3IDkgAZIgNSAEQX9qQQJJGyEBAkACQCAQIA9BACAGIAYQqAMiNUMAAAAAYEUNACABIDVeDQELAkAgN0MAAAAAYA0AIAEhNQwBCyA3IAEgASA3XRshNQsgACAQQQIgDyAGEKkDIBBBAiAPIAYQqgOSIgEgNSA1IAFdGyABIDUgNSA1XBsgNSA1WyABIAFbcRtBABDsAyANKgJsITUgECAPQQEgByAGEKcDIQEgAiA1kiA2IAVBf2pBAkkbITYCQAJAIBAgD0EBIAcgBhCoAyI1QwAAAABgRQ0AIDYgNV4NAQsCQCABQwAAAABgDQAgNiE1DAELIAEgNiA2IAFdGyE1CyAAIBBBACAPIAYQqQMgEEEAIA8gBhCqA5IiNiA1IDUgNl0bIDYgNSA1IDVcGyA1IDVbIDYgNltxG0EBEOwDDCALAkAgABCrAyIXDQACQAJAIARBf2pBAU0NACABIDWTITYMAQsgACoCzAMgACoC1AOSIAAqArwDkiAAKgLEA5IhNgsgECAPQQAgBiAGEKcDIQECQAJAIBAgD0EAIAYgBhCoAyI1QwAAAABgRQ0AIDYgNV4NAQsCQCABQwAAAABgDQAgNiE1DAELIAEgNiA2IAFdGyE1CyAAIBBBAiAPIAYQqQMgEEECIA8gBhCqA5IiNiA1IDUgNl0bIDYgNSA1IDVcGyA1IDVbIDYgNltxG0EAEOwDAkACQCAFQX9qQQFNDQAgAiA5kyE2DAELIAAqAtADIAAqAtgDkiAAKgLAA5IgACoCyAOSITYLIBAgD0EBIAcgBhCnAyEBAkACQCAQIA9BASAHIAYQqAMiNUMAAAAAYEUNACA2IDVeDQELAkAgAUMAAAAAYA0AIDYhNQwBCyABIDYgNiABXRshNQsgACAQQQAgDyAGEKkDIBBBACAPIAYQqgOSIjYgNSA1IDZdGyA2IDUgNSA1XBsgNSA1WyA2IDZbcRtBARDsAwwgCwJAIAgNACACIDmTITcgASA1kyE2AkACQCAEQQJHDQAgNkMAAAAAXw0BCyAFIARyRQ0AIAVBAkYgN0MAAAAAX3FFDQELIBAgD0EAIAYgBhCnAyEBQwAAAABDAAAAACA2IDZDAAAAAF0bIDYgBEECRhsgNiA2XBshNgJAAkAgECAPQQAgBiAGEKgDIjVDAAAAAGBFDQAgNiA1Xg0BCwJAIAFDAAAAAGANACA2ITUMAQsgASA2IDYgAV0bITULIAAgEEECIA8gBhCpAyAQQQIgDyAGEKoDkiI2IDUgNSA2XRsgNiA1IDUgNVwbIDUgNVsgNiA2W3EbQQAQ7AMgECAPQQEgByAGEKcDIQFDAAAAAEMAAAAAIDcgN0MAAAAAXRsgNyAFQQJGGyA3IDdcGyE2AkACQCAQIA9BASAHIAYQqAMiNUMAAAAAYEUNACA2IDVeDQELAkAgAUMAAAAAYA0AIDYhNQwBCyABIDYgNiABXRshNQsgACAQQQAgDyAGEKkDIBBBACAPIAYQqgOSIjYgNSA1IDZdGyA2IDUgNSA1XBsgNSA1WyA2IDZbcRtBARDsAwwgCyAAEPcDIABBABDtAyAAEKwDQQMhESAAKAIUIhhBAnZBA3EhDgJAAkAgD0ECRw0AAkAgDkF+ag4CAgABC0ECIREMAQsgDiERCyAQIBEgDyAGEKkDITYgECARIA8gBhCqAyE3IBBBA0ECIA9BAkYbIhlBACARQQJJGyIVIA8gBhCpAyAQIBUgDyAGEKoDkiI9IDYgN5IiPiARQQFLIhobITcgECAVIA8gBhCtAyE/AkAgASA1kyJAID4gPSAaGyIBkyI1IDVcDQBDAAAAACAQIA9BACAGIAYQpwMiNiABkyA2IDZcGyI2Q///f38gECAPQQAgBiAGEKgDIjggAZMgOCA4XBsiASA1IAEgNV0bIjUgNSA2XRsgNiA1IDUgNVwbIDUgNVsgNiA2W3EbITULIAQgBSAaGyEbAkAgAiA5kyJBIDeTIkIgQlwNAEMAAAAAIBAgD0EBIAcgBhCnAyI2IDeTIDYgNlwbIgFD//9/fyAQIA9BASAHIAYQqAMiNiA3kyA2IDZcGyI2IEIgNiBCXRsiNiA2IAFdGyABIDYgNiA2XBsgNiA2WyABIAFbcRshQgtBACEWAkACQAJAAkACQAJAAkACQAJAAkAgGw0AAkACQAJAAkAgACgC7AMgACgC6AMiDkYNACANQgA3AkQgDSAANgJAAkAgDigCACgCFEGAgIDgAHFBgICAwABGDQBBACETIAAhDgwDCyMEIg5BADYCACMJQdUBaiANQcAAahAUIA4oAgAhEyAOQQA2AgACQCATQQFGDQAgDSgCRCETIA0oAkAhDgwCCxAOIQ8QugQaIA0oAkgiDUUNLANAIA0oAgAhDiANQQwQyQQgDiENIA4NAAwtCwALQQAhEyANQQA2AkggDUIANwNAQQAhDgsgDg0AQQAhFiATRQ0BC0EAIRQDQAJAIBMgDigC7AMgDigC6AMiDmtBAnVJDQAjBCIOQQA2AgAjCUHWAWoQESAOKAIAIRMgDkEANgIAIBNBAUYNJwwqCyAOIBNBAnRqKAIAIQ4jBCITQQA2AgAjFSAOEBIhDCATKAIAIRIgE0EANgIAIBJBAUYNJwJAIAxFDQBBACEWIBQNAiMEIhNBADYCACMWIA4QFSE2IBMoAgAhEiATQQA2AgAgEkEBRg0oIDaLQxe30ThdDQIjBCITQQA2AgAjFyAOEBUhNiATKAIAIRIgE0EANgIAIBJBAUYNKCAOIRQgNotDF7fROF0NAgsCQAJAIA0oAkRBAWoiEyANKAJAIg4oAuwDIA4oAugDIhJrQQJ1SQ0AA0ACQCANKAJIIg4NACANQgA3A0BBACETQQAhDgwDCyANIA4oAgQ2AkAgDSAOKAIINgJEIA0gDigCADYCSCAOQQwQyQQgDSgCREEBaiITIA0oAkAiDigC7AMgDigC6AMiEmtBAnVPDQALCyANIBM2AkQgEiATQQJ0aigCACgCFEGAgIDgAHFBgICAwABHDQAjBCIOQQA2AgAjCUHVAWogDUHAAGoQFCAOKAIAIRMgDkEANgIAIBNBAUYNBCANKAJEIRMgDSgCQCEOCyAODQAgFCEWIBMNAAsLIA0oAkgiDkUNAANAIA4oAgAhEyAOQQwQyQQgEyEOIBMNAAsLIAAoAuwDIAAoAugDIg5GDQIgDUIANwJEIA0gADYCQCAOKAIAKAIUQYCAgOAAcUGAgIDAAEYNAUEAIRMgACEODAQLEA4hDxC6BBoMJAsjBCIOQQA2AgAjCUHVAWogDUHAAGoQFCAOKAIAIRMgDkEANgIAAkAgE0EBRg0AIA0oAkQhEyANKAJAIQ4MAgsQDiEPELoEGiANKAJIIg1FDSUDQCANKAIAIQ4gDUEMEMkEIA4hDSAODQAMJgsAC0EAIRMgDUEANgJIIA1CADcDQEEAIQ4LIA4NAEMAAAAAITYgE0UNAQtDAAAAACECA0ACQCATIA4oAuwDIA4oAugDIg5rQQJ1SQ0AIwQiDkEANgIAIwlB1gFqEBEgDigCACETIA5BADYCACATQQFHDSMMHgsgDiATQQJ0aigCACEOIwQiE0EANgIAIxggDhAUIBMoAgAhEiATQQA2AgAgEkEBRg0cAkACQCAOKAIUIhNBgICA4ABxQYCAgCBHDQAjBCITQQA2AgAjCUHiAWogDhAUIBMoAgAhEiATQQA2AgAgEkEBRg0eIA4gDi0AAEEBcjoAACMEIhNBADYCACMZIA5BABAWIBMoAgAhDiATQQA2AgAgDkEBRw0BDB4LIA5BFGohEgJAAkACQAJAAkACQCAIRQ0AIwQiE0EANgIAIxQgDiAPEBAhFCATKAIAIQwgE0EANgIAIAxBAUYNASMEIhNBADYCACMaIA4gFCA1IEIQFyATKAIAIQwgE0EANgIAIAxBAUYNASASKAIAIRMLIBNBgIDAAXFBgICAAUYNBQJAIA4gFkcNACMEIhNBADYCACMbIA4gCxAWIBMoAgAhDCATQQA2AgAgDEEBRg0jIwQiE0EANgIAIxwgDkMAAAAAEBggEygCACEMIBNBADYCACAMQQFGDSMMBQsgEC0AAEECdkEDcSEMAkACQCAPQQJHDQBBAyETAkAgDEF+ag4CAgABC0ECIRMMAQsgDCETCyMEIgxBADYCACMdIA4gDyATIDUgQiATQQFLIhwbIjcgNRAZITYgDCgCACEUIAxBADYCACAUQQFGDSIgDioC+AMhAUEAIRRBACEMAkACQAJAIA4tAPwDQX9qDgIBAAILIDUgAZRDCtcjPJQhAQtBACEMIAEgAVwNACABQwAAAABgIQwLIA4qAoAEIQECQAJAAkAgDi0AhARBf2oOAgEAAgsgQiABlEMK1yM8lCEBCyABIAFcDQAgAUMAAAAAYCEUCwJAIDYgNlwiHSA3IDdccg0AAkAgDioCnAEiASABXA0AIA4oAvQDIRQjBCIMQQA2AgAjHiAUQQAQECEcIAwoAgAhFCAMQQA2AgAgFEEBRg0kIBxFDQUgDigCmAEgC0YNBQsjBCIMQQA2AgAjHyASIBMgDyA1EBohASAMKAIAIRQgDEEANgIAIBRBAUYNIyMEIgxBADYCACMgIBIgEyAPIDUQGiE3IAwoAgAhEyAMQQA2AgAgE0EBRg0jIAEgN5IiASA2IDYgAV0bIAEgNiAdGyA2IDZbIAEgAVtxGyE2DAMLAkAgE0ECSSIdIAxBAXNyDQAjBCITQQA2AgAjHyASQQIgDyA1EBohASATKAIAIQwgE0EANgIAIAxBAUYNIyMEIhNBADYCACMgIBJBAiAPIDUQGiE3IBMoAgAhDCATQQA2AgAgDEEBRg0jIA4qAvgDIThDAADAfyE2AkACQAJAIA4tAPwDQX9qDgIAAQILIDghNgwBCyA1IDiUQwrXIzyUITYLAkAgEi0AA0EQcUUNACMEIhNBADYCACMhIBJBAiAPIDUQGiE4IBMoAgAhDCATQQA2AgAgDEEBRg0kIwQiE0EANgIAIyIgEkECIA8gNRAaITkgEygCACEMIBNBADYCACAMQQFGDSQgNiA4IDmSIjhDAAAAACA4IDhbG5IhNgsgASA3kiIBIDYgNiABXRsgASA2IDYgNlwbIDYgNlsgASABW3EbITYMAwsCQCAUIB1xQQFHDQAjBCITQQA2AgAjHyASQQAgDyA1EBohASATKAIAIQwgE0EANgIAIAxBAUYNIyMEIhNBADYCACMgIBJBACAPIDUQGiE3IBMoAgAhDCATQQA2AgAgDEEBRg0jIA4qAoAEIThDAADAfyE2AkACQAJAIA4tAIQEQX9qDgIAAQILIDghNgwBCyBCIDiUQwrXIzyUITYLAkAgEi0AA0EQcUUNACMEIhNBADYCACMhIBJBACAPIDUQGiE4IBMoAgAhDCATQQA2AgAgDEEBRg0kIwQiE0EANgIAIyIgEkEAIA8gNRAaITkgEygCACEMIBNBADYCACAMQQFGDSQgNiA4IDmSIjhDAAAAACA4IDhbG5IhNgsgASA3kiIBIDYgNiABXRsgASA2IDYgNlwbIDYgNlsgASABW3EbITYMAwsjBCIeQQA2AgAjIyANQegAaiASIA5BIGoiH0EBEBMgHigCACEgIB5BADYCACAgQQFGDSJDAADAfyE2AkACQAJAIA0tAGxBf2oOAgABAgsgDSoCaCE2DAELIDUgDSoCaJRDCtcjPJQhNgsjBCIeQQA2AgAjJCANQegAaiASIB9BARATIB4oAgAhICAeQQA2AgAgIEEBRg0iQwAAwH8hAQJAAkACQCANLQBsQX9qDgIAAQILIA0qAmghAQwBCyA1IA0qAmiUQwrXIzyUIQELIwQiHkEANgIAIyUgDUHoAGogEkEBQQEQEyAeKAIAISAgHkEANgIAICBBAUYNIkMAAMB/ITcCQAJAAkAgDS0AbEF/ag4CAAECCyANKgJoITcMAQsgNSANKgJolEMK1yM8lCE3CyMEIh5BADYCACMlIA1B6ABqIBJBA0EBEBMgHigCACEgIB5BADYCACAgQQFGDSIgAUMAAAAAIAEgAVsbITggNkMAAAAAIDYgNlsbITlDAADAfyE2QwAAwH8hAQJAAkACQCANLQBsQX9qDgIAAQILIA0qAmghAQwBCyA1IA0qAmiUQwrXIzyUIQELIDkgOJIhOEEBISBBASEeAkAgDEUNACAOKgL4AyE5QwAAwH8hNgJAAkACQCAOLQD8A0F/ag4CAAECCyA5ITYMAQsgNSA5lEMK1yM8lCE2CwJAIBItAANBEHFFDQAjBCIeQQA2AgAjISASQQIgDyA1EBohOSAeKAIAIR8gHkEANgIAIB9BAUYNJCMEIh5BADYCACMiIBJBAiAPIDUQGiE6IB4oAgAhHyAeQQA2AgAgH0EBRg0kIDYgOSA6kiI5QwAAAAAgOSA5WxuSITYLIDggNpIhNkEAIR4LIDdDAAAAACA3IDdbGyABQwAAAAAgASABWxuSITdDAADAfyEBAkAgFEUNACAOKgKABCE5QwAAwH8hAQJAAkACQCAOLQCEBEF/ag4CAAECCyA5IQEMAQsgQiA5lEMK1yM8lCEBCwJAIBItAANBEHFFDQAjBCIgQQA2AgAjISASQQAgDyA1EBohOSAgKAIAIR8gIEEANgIAIB9BAUYNJCMEIiBBADYCACMiIBJBACAPIDUQGiE6ICAoAgAhHyAgQQA2AgAgH0EBRg0kIAEgOSA6kiI5QwAAAAAgOSA5WxuSIQELIDcgAZIhAUEAISALIBAoAgAiIUGAgIAYcSEfAkACQAJAAkACQAJAAkACQAJAAkACQCAdDQAgH0GAgIAQRyEiDAELQQEhIiAfQYCAgBBGDQELICJFDQIgNiA2Ww0CIDUgNVsNAQwCCyA2IDZbDQIgNSA1XA0CC0ECIR4gNSE2CyAcDQELIB9BgICAEEchIgwBC0EBISIgH0GAgIAQRg0BCyAiRQ0CIAEgAVsNAiBCIEJbDQEMAgsgASABWw0BIEIgQlwNAQtBAiEgIEIhAQsCQCAOLwF6Ih9BB3EiIkUNAAJAAkACQAJAAkACQAJAIB9BCHFFDQAgH0EEdiEjAkACQCAfQT9LIiQNACAOICNBAnRqQYABaiElDAELICNBfGoiJSAOKAKUASImKAIEICYoAgAiJmtBAnVPDQogJiAlQQJ0aiElCyAlKgIAIjkgOVwNBwJAIBwNACAeRQ0CCyAdDQcgIA0HICQNBCAOICNBAnRqQYABaioCACE2DAULIBwNAiAeDQJBACAfQQR2Qf8PcSIeayAeIB/BQQBIG7IhAQwBCwJAICQNACAOICNBAnRqQYABaioCACEBDAELICNBfGoiHiAOKAKUASIgKAIEICAoAgAiIGtBAnVPDQcgICAeQQJ0aioCACEBCyA3IDYgOJMgAZWSIQEMAwsgHQ0DICANA0EAIB9BBHZB/w9xIh5rIB4gH8FBAEgbsiE2DAELICNBfGoiHiAOKAKUASIgKAIEICAoAgAiIGtBAnVPDQQgICAeQQJ0aioCACE2CyABIDeTIDaUIDiSITYLQQAhIEEAIR4LIBIvAQJBD3EiIyAhQQx2QQ9xICMbISECQCAEDQAgHCAMcg0AICFBBEcNACAeRQ0AIDUgNVwNAEEAIR4CQCAiRQ0AIB9BBHYhDAJAAkAgH0EIcUUNAAJAAkAgH0E/SyIcDQAgDiAMQQJ0akGAAWohIwwBCyAMQXxqIiUgDigClAEiIygCBCAjKAIAIiNrQQJ1Tw0GICMgJUECdGohIwsgNSE2ICMqAgAiOSA5XA0DAkAgHA0AIA4gDEECdGpBgAFqKgIAITYMAgsgDEF8aiIMIA4oApQBIhwoAgQgHCgCACIca0ECdU8NBSAcIAxBAnRqKgIAITYMAQtBACAMQf8PcSIMayAMIB/BQQBIG7IhNgsgNSA4kyA2lSEBQQAhIEEAIR4LIDUhNgsCQCAdDQAgBQ0AIBRBAXNFDQAgIUEERw0AICBFDQAgQiBCXA0AQQAhIAJAICJFDQAgH0EEdiEMAkACQCAfQQhxRQ0AAkACQCAfQT9LIhQNACAOIAxBAnRqQYABaiEcDAELIAxBfGoiHyAOKAKUASIcKAIEIBwoAgAiHGtBAnVPDQYgHCAfQQJ0aiEcCyBCIQEgHCoCACI4IDhcDQMCQCAUDQAgDiAMQQJ0akGAAWoqAgAhNgwCCyAMQXxqIgwgDigClAEiFCgCBCAUKAIAIhRrQQJ1Tw0FIBQgDEECdGoqAgAhNgwBC0EAIAxB/w9xIgxrIAwgH8FBAEgbsiE2CyBCIDeTIDaUITZBACEgQQAhHgsgQiEBCyMEIgxBADYCACMmIBIgD0EAIDUgNRAZITcgDCgCACEUIAxBADYCACAUQQFGDSIjBCIMQQA2AgAjJyASQQIgNRAbITggDCgCACEUIAxBADYCACAUQQFGDSIgNyA4kiE3AkACQCAeQQFGDQAgNiA2IDcgNiA3XRsgNyA3XBshNgwBCwJAIDcgN1sNAEEBIR4MAQtBAiEeIDchNgsjBCIMQQA2AgAjJiASIA9BASBCIDUQGSE3IAwoAgAhFCAMQQA2AgAgFEEBRg0iIwQiDEEANgIAIycgEkEAIDUQGyE4IAwoAgAhFCAMQQA2AgAgFEEBRg0iIDcgOJIhNwJAAkAgIEEBRg0AIAEgASA3IAEgN10bIDcgN1wbIQEMAQsCQCA3IDdbDQBBASEgDAELQQIhICA3IQELIwQiDEEANgIAIwlB8gFqIA4gNiABIA8gHiAgIDUgQkEAQQUgCSAKIAsQHBogDCgCACEUIAxBADYCACAUQQFGDSIgDiAdQQJ0aioClAMhNiMEIgxBADYCACMfIBIgEyAPIDUQGiEBIAwoAgAhFCAMQQA2AgAgFEEBRg0iIwQiDEEANgIAIyAgEiATIA8gNRAaITcgDCgCACETIAxBADYCACATQQFGDSIgASA3kiIBIDYgNiABXRsgASA2IDYgNlwbIDYgNlsgASABW3EbITYMAgsQDiEPELoEGgwjCyMEIg5BADYCACMJQfMBahARIA4oAgAhEyAOQQA2AgAgE0EBRw0mDCELIwQiE0EANgIAIxwgDiA2EBggEygCACEMIBNBADYCACAMQQFGDR8LIwQiE0EANgIAIxsgDiALEBYgEygCACEMIBNBADYCACAMQQFGDR4LIA4qApwBITYjBCIOQQA2AgAjJyASIBEgNRAbIQEgDigCACETIA5BADYCACATQQFGDR0gAiA2IAGSkiECCwJAAkAgDSgCREEBaiITIA0oAkAiDigC7AMgDigC6AMiEmtBAnVJDQADQAJAIA0oAkgiDg0AIA1CADcDQEEAIRNBACEODAMLIA0gDigCBDYCQCANIA4oAgg2AkQgDSAOKAIANgJIIA5BDBDJBCANKAJEQQFqIhMgDSgCQCIOKALsAyAOKALoAyISa0ECdU8NAAsLIA0gEzYCRCASIBNBAnRqKAIAKAIUQYCAgOAAcUGAgIDAAEcNACMEIg5BADYCACMJQdUBaiANQcAAahAUIA4oAgAhEyAOQQA2AgAgE0EBRg0DIA0oAkQhEyANKAJAIQ4LIA4NACATDQALIAJDAAAAAJIhNgsgEUEBSyESAkAgDSgCSCIORQ0AA0AgDigCACETIA5BDBDJBCATIQ4gEw0ACwsgNSBCIBIbITsCQCAXQQFGDQAgECARIDsQswMgF0F/arOUIDaSITYLIAAoAuwDIAAoAugDIg5GDQEgDUIANwJsIA0gADYCaCAOKAIAKAIUQYCAgOAAcUGAgIDAAEcNAiMEIg5BADYCACMJQdUBaiANQegAahAUIA4oAgAhEyAOQQA2AgAgE0EBRw0CEA4hDxC6BBogDSgCcCINRQ0hA0AgDSgCACEOIA1BDBDJBCAOIQ0gDg0ADCILAAsQDiEPELoEGgwbCyANQQA2AnAgDUIANwNoC0EAISMjBCIOQQA2AgAjKCAQIBUgQiA1IBIbIjoQGyFDIA4oAgAhEyAOQQA2AgAgE0EBRg0CIAUgBCAaGyEnIAcgBiAaGyFEIAYgByAaGyE4QQAgGyA2IDteIg4bIBsgG0ECRhsgGyAYQYCAgAZxIigbISYCQAJAIA0oAmgNAEMAAAAAIUUgDSgCbA0AQwAAAAAhRgwBC0EBQQIgOiA6XCIkGyEiIwYiE0GkNmoiBSAVQQJ0IhJqIRwgE0H4NWoiDCASaiEhIBNBtDZqIhQgEmohGCAUIBFBAnQiE2ohHSAFIBNqISAgDCATaiEfIBtBAUcgDnEhKUECQQAgEUECSSIFGyEqIABBgAFqISsgEUEBSyETIAggJ0EARyIsciEXICdFIAhBAXNxIS0gACAFQQF0akHyAGohLiAnIChyRSEvICdBf2pBAUshMEEAISNDAAAAACFGQwAAAAAhRQNAIwQiDkEANgIAIykgDUHAAGogACADIAYgOCA1IDsgDUHoAGogIxAdIA4oAgAhEiAOQQA2AgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCASQQFGDQAgJkUNBiMEIg5BADYCACMqIBAgD0EAIAYgBhAZITYgDigCACESIA5BADYCACASQQFGDQUjBCIOQQA2AgAjJiAQIA9BACAGIAYQGSE3IA4oAgAhEiAOQQA2AgAgEkEBRg0BIwQiDkEANgIAIyogECAPQQEgByAGEBkhAiAOKAIAIRIgDkEANgIAIBJBAUYNAiMEIg5BADYCACMmIBAgD0EBIAcgBhAZITkgDigCACESIA5BADYCACASQQFGDQMgDSoCTCEBAkAgNiACIBMbID6TIjYgNlwNACABIDZdDQgLAkAgNyA5IBMbID6TIjYgNlwNACABIDZeDQgLIAAoAvQDIRIjBCIOQQA2AgAjECASQQEQECEMIA4oAgAhEiAOQQA2AgAgEkEBRg0EIAwNBgJAIA0qAlRDAAAAAFsNACMEIg5BADYCACMWIAAQFSE2IA4oAgAhEiAOQQA2AgAgEkEBRg0FIDYgNlwNCSMEIg5BADYCACMWIAAQFSE2IA4oAgAhEiAOQQA2AgAgEkEBRg0FIDZDAAAAAFwNCQsgDSoCTCI2ITsMCQsQDiEPELoEGgwkCxAOIQ8QugQaDCILEA4hDxC6BBoMIQsQDiEPELoEGgwgCxAOIQ8QugQaDB8LEA4hDxC6BBoMHgsgOyE2CyA2IDZbDQIgNiE7CyANKgJMITYLIDZDAAAAAF0NASANKgJcIUcMAgsgDSA2IA0qAkyTIkc4AlwgNiE7DAELIA0gNowiRzgCXAsCQCAtDQBDAAAAACE8QwAAAAAhSAJAAkAgDSgCQCIMIA0oAkQiG0cNACBHITZDAAAAACFIDAELA0AgDCgCACISKgKcASEBIwQiFEEANgIAIyogEkEUaiIOIA8gBSA4IAYQGSECIBQoAgAhFiAUQQA2AgAgFkEBRg0XIwQiFEEANgIAIyYgDiAPIAUgOCAGEBkhNiAUKAIAIRYgFEEANgIAIBZBAUYNFwJAAkAgNkMAAAAAYEUNACABIDZeDQELAkAgAkMAAAAAYA0AIAEhNgwBCyACIAEgASACXRshNgsCQAJAIA0qAlwiAUMAAAAAXUUNACMEIhRBADYCACMXIBIQFSEBIBQoAgAhFiAUQQA2AgAgFkEBRg0ZIDYgAYyUIgJDAAAAAF4gAkMAAAAAXXJBAUcNASMEIhRBADYCACANKgJYITkgDSoCXCFJIyogDiAPIAUgOyA1EBkhNyAUKAIAIRYgFEEANgIAIBZBAUYNGSMEIhRBADYCACMmIA4gDyAFIDsgNRAZIQEgFCgCACEWIBRBADYCACAWQQFGDRkgSSA5lSAClCA2kiECAkACQCABQwAAAABgRQ0AIAIgAV4NAQsgAiEBIDdDAAAAAGBFDQAgNyACIAIgN10bIQELIwQiFEEANgIAIx8gDiARIA8gNRAaITcgFCgCACEWIBRBADYCACAWQQFGDRkjBCIUQQA2AgAjICAOIBEgDyA1EBohOSAUKAIAIQ4gFEEANgIAIA5BAUYNGSACIAJcDQEgNyA5kiI3IAEgASA3XRsgNyABIAEgAVwbIAEgAVsgNyA3W3EbIgEgAVwNASACIAFbDQEjBCIOQQA2AgAjFyASEBUhAiAOKAIAIRQgDkEANgIAIBRBAUYNGSANIAIgEioCnAGUIA0qAliSOAJYIEggASA2k5IhSAwBCyABQwAAAABeRQ0AIwQiFEEANgIAIxYgEhAVIQIgFCgCACESIBRBADYCACASQQFGDRggAkMAAAAAXiACQwAAAABdckEBRw0AIwQiEkEANgIAIA0qAlQhNyANKgJcIUkjKiAOIA8gBSA7IDUQGSE5IBIoAgAhFCASQQA2AgAgFEEBRg0YIwQiEkEANgIAIyYgDiAPIAUgOyA1EBkhASASKAIAIRQgEkEANgIAIBRBAUYNGCBJIDeVIAKUIDaSITcCQAJAIAFDAAAAAGBFDQAgNyABXg0BCyA3IQEgOUMAAAAAYEUNACA5IDcgNyA5XRshAQsjBCISQQA2AgAjHyAOIBEgDyA1EBohOSASKAIAIRQgEkEANgIAIBRBAUYNGCMEIhJBADYCACMgIA4gESAPIDUQGiFJIBIoAgAhDiASQQA2AgAgDkEBRg0YIDcgN1wNACA5IEmSIjkgASABIDldGyA5IAEgASABXBsgASABWyA5IDlbcRsiASABXA0AIDcgAVsNACANIA0qAlQgApM4AlQgSCABIDaTkiFICyAMQQRqIgwgG0cNAAsgDSgCRCEbIA0oAkAhDCANKgJcITYLIA0gNiBIkzgCXAJAIAwgG0YNACAQKAIAQYCAgAZxQQBHIClxICxyISVDAAAAACE8A0AgDCgCACISKgKcASEBIwQiFEEANgIAIyogEkEUaiIOIA8gBSA4IAYQGSECIBQoAgAhFiAUQQA2AgAgFkEBRg0YIwQiFEEANgIAIyYgDiAPIAUgOCAGEBkhNiAUKAIAIRYgFEEANgIAIBZBAUYNGAJAAkAgNkMAAAAAYEUNACABIDZeDQELAkAgAkMAAAAAYA0AIAEhNgwBCyACIAEgASACXRshNgsCQAJAIA0qAlwiAUMAAAAAXUUNACMEIhRBADYCACMXIBIQFSEBIBQoAgAhFiAUQQA2AgAgFkEBRg0aIDYhOSA2IAGMlCIBQwAAAABbDQECQAJAIA0qAlgiAkMAAAAAXA0AIDYgAZIhAgwBCyANKgJcIAKVIAGUIDaSIQILIwQiFEEANgIAIyogDiAPIAUgOyA1EBkhNyAUKAIAIRYgFEEANgIAIBZBAUYNGiMEIhRBADYCACMmIA4gDyAFIDsgNRAZIQEgFCgCACEWIBRBADYCACAWQQFGDRoCQAJAIAFDAAAAAGBFDQAgAiABXg0BCwJAIDdDAAAAAGANACACIQEMAQsgNyACIAIgN10bIQELIwQiFEEANgIAIx8gDiARIA8gNRAaIQIgFCgCACEWIBRBADYCACAWQQFGDRojBCIUQQA2AgAjICAOIBEgDyA1EBohNyAUKAIAIRYgFEEANgIAIBZBAUYNGiACIDeSIgIgASABIAJdGyACIAEgASABXBsgASABWyACIAJbcRshOQwBCyA2ITkgAUMAAAAAXkUNACMEIhRBADYCACMWIBIQFSECIBQoAgAhFiAUQQA2AgAgFkEBRg0ZIDYhOSACQwAAAABeIAJDAAAAAF1yQQFHDQAjBCIUQQA2AgAgDSoCVCE3IA0qAlwhOSMqIA4gDyAFIDsgNRAZIUkgFCgCACEWIBRBADYCACAWQQFGDRkjBCIUQQA2AgAjJiAOIA8gBSA7IDUQGSEBIBQoAgAhFiAUQQA2AgAgFkEBRg0ZIDkgN5UgApQgNpIhAgJAAkAgAUMAAAAAYEUNACACIAFeDQELAkAgSUMAAAAAYA0AIAIhAQwBCyBJIAIgAiBJXRshAQsjBCIUQQA2AgAjHyAOIBEgDyA1EBohAiAUKAIAIRYgFEEANgIAIBZBAUYNGSMEIhRBADYCACMgIA4gESAPIDUQGiE3IBQoAgAhFiAUQQA2AgAgFkEBRg0ZIAIgN5IiAiABIAEgAl0bIAIgASABIAFcGyABIAFbIAIgAltxGyE5CyMEIhRBADYCACMnIA4gESA1EBshASAUKAIAIRYgFEEANgIAIBZBAUYNGCMEIhRBADYCACMnIA4gFSA1EBshNyAUKAIAIRYgFEEANgIAIBZBAUYNGCA5IAGSIQICQAJAAkACQAJAAkAgEi8BeiIUQQdxRQ0AIBRBCHFFDQEgFEEEdiEWAkACQCAUQT9LIhoNACASIBZBAnRqQYABaiEUDAELIBZBfGoiHiASKAKUASIUKAIEIBQoAgAiFGtBAnVPDRwgFCAeQQJ0aiEUCyAUKgIAIkkgSVwNACACIAGTIQECQCAFDQACQAJAIBoNACASIBZBAnRqQYABaiEUDAELIBZBfGoiFiASKAKUASIUKAIEIBQoAgAiFGtBAnVPDR0gFCAWQQJ0aiEUCyAUKgIAIUkMBAsCQAJAIBoNACASIBZBAnRqQYABaiEUDAELIBZBfGoiFiASKAKUASIUKAIEIBQoAgAiFGtBAnVPDRwgFCAWQQJ0aiEUCyAUKgIAIUkMAgsCQCAkDQAgEiATQQN0aiIWKgL4AyEBQQAhFAJAAkACQCAWLQD8A0F/ag4CAQACCyA6IAGUQwrXIzyUIQELIAEgAVwNACABQwAAAABgIRQLIBQgJXINAAJAIA4vAQJBD3EiFA0AIBAoAgBBDHZBD3EhFAsgFEEERw0AIwQiFEEANgIAIBwoAgAhFiMlIA1BMGogDiAWIA8QEyAUKAIAIRYgFEEANgIAIBZBAUYNHiANLQA0QQNGDQAjBCIUQQA2AgAgGCgCACEWIyUgDUEwaiAOIBYgDxATIBQoAgAhFiAUQQA2AgAgFkEBRg0eQQAhFCA6IQEgDS0ANEEDRw0FCyASIBNBA3RqIhYqAvgDIkkhSCAiIRQgOiEBAkACQCAWLQD8AyIaQX9qDgIBAAYLIDogSZRDCtcjPJQhSAsgIiEUIDohASBIQwAAAABgRQ0EIEkgOiBJlEMK1yM8lCAaQQFGGyEBAkAgDi0AA0EQcUUNACMEIhRBADYCACMhIA4gKiAPIDUQGiFJIBQoAgAhGiAUQQA2AgAgGkEBRg0eIwQiFEEANgIAIyIgDiAqIA8gNRAaIUggFCgCACEaIBRBADYCACAaQQFGDR4gASBJIEiSIklDAAAAACBJIElbG5IhAQsgNyABkiIBIAFcICwgFkH4A2oxAARCIIZCgICAgCBRcXIhFAwEC0EAIBRBBHZB/w9xIhZrIBYgFMFBAEgbsiFJIAIgAZMhASATDQELIAEgSZQhAQwBCyABIEmVIQELIDcgAZIhAUEAIRQLIwQiFkEANgIAIyYgDiAPIAUgOyA1EBkhSSAWKAIAIRogFkEANgIAIBpBAUYNGCMEIhZBADYCACMnIA4gESA1EBshSCAWKAIAIRogFkEANgIAIBpBAUYNGCMEIhZBADYCACMmIA4gDyATIDogNRAZITcgFigCACEaIBZBADYCACAaQQFGDRgjBCIWQQA2AgAjJyAOIBUgNRAbIUogFigCACEaIBZBADYCACAaQQFGDRggNyBKkiE3AkACQCAUQQFGDQAgASABIDcgASA3XRsgNyA3XBshAQwBCwJAIDcgN1sNAEEBIRQMAQtBAiEUIDchAQsgEiATQQN0aiIWKgL4AyE3AkACQAJAAkAgFi0A/ANBf2oOAgEAAgsgOiA3lEMK1yM8lCE3C0EBIRYgN0MAAAAAYA0BCwJAIA4vAQJBD3EiGg0AIBAoAgBBDHZBD3EhGgtBASEWIBpBBEcNACMEIhpBADYCACAcKAIAIR4jJSANQTBqIA4gHiAPEBMgGigCACEeIBpBADYCACAeQQFGDRkgDS0ANEEDRg0AIwQiFkEANgIAIBgoAgAhGiMlIA1BMGogDiAaIA8QEyAWKAIAIQ4gFkEANgIAIA5BAUYNGSANLQA0QQNGIRYLIAAtAIgDIRojBCIOQQA2AgAjCUHyAWogEiACIAIgSSBIkiI3IAIgN10bIDcgN1wbIgIgASATGyABIAIgExsgGkEDcUEAIBQgExsgFEEAIBMbIDUgQiAIIBZxIhRBBEEHIBQbIAkgCiALEBwaIA4oAgAhFCAOQQA2AgAgFEEBRg0YQQEhFAJAIAAtAIgDQQRxDQAgEi0AiANBBHFBAnYhFAsjBCIOQQA2AgAjKyAAIBQQFiAOKAIAIRIgDkEANgIAIBJBAUYNGCA8IDkgNpOSITwgDEEEaiIMIBtHDQALCyANIEcgPJMiRzgCXAsgAC0AiAMhEiMEIg5BADYCACMrIAAgEkEEcUECdiBHQwAAAABdchAWIA4oAgAhEiAOQQA2AgAgEkEBRg0TIwQiDkEANgIAIyEgECARIA8gBhAaIQIgDigCACESIA5BADYCACASQQFGDRMjBCIOQQA2AgAjIiAQIBEgDyAGEBohSiAOKAIAIRIgDkEANgIAIBJBAUYNEyMEIg5BADYCACMoIBAgESA7EBshPCAOKAIAIRIgDkEANgIAIBJBAUYNEyANKgJcITYCQAJAAkACQCAmQQJHDQAgNkMAAAAAXkUNAEMAAAAAITYCQAJAAkAgLi8AACIOQQdxDgUCAAAAAQALIA5BBHYhEgJAAkAgDkEIcUUNAAJAIA5BP0sNACArIBJBAnRqKgIAIQEMAgsgEkF8aiISIAAoApQBIg4oAgQgDigCACIOa0ECdU8NGiAOIBJBAnRqKgIAIQEMAQtBACASQf8PcSISayASIA7BQQBIG7IhAQsgAbxB/////wdxQf////sHSg0BCyMEIg5BADYCACMqIBAgDyAFIDggBhAZIQEgDigCACESIA5BADYCACASQQFGDRggASABXA0AIwQiDkEANgIAIyogECAPIAUgOCAGEBkhNiAOKAIAIRIgDkEANgIAIBJBAUYNGCA2IAKTIEqTIDsgDSoCXJOTIjZDAAAAACA2QwAAAABeGyE2CyANIDY4AlwMAQsgNkMAAAAAYEUNAQsgEC0AAEEEdkEHcSEODAELQQAgEC0AAEEEdkEHcSIOIA5BfWpBA0kbIQ4LQwAAAAAhAQJAIA0oAlANAAJAAkACQAJAAkAgDkF/ag4FAAECBAMFCyA2QwAAAD+UIQEMBAsgNiEBDAMLIA0oAkQgDSgCQGtBAnUiDkECSQ0CIDwgNiAOQX9qs5WSITwMAgsgPCA2IA0oAkQgDSgCQGtBAnVBAWqzlSIBkiE8DAELIDZDAAAAP5QgDSgCRCANKAJAa0ECdbOVIgEgAZIgPJIhPAsjBCIOQQA2AgAgDUEANgJkIA0gAiABkjgCYCMsIAAQEiEeIA4oAgAhEiAOQQA2AgAgEkEBRg0TAkACQCANKAJAIhIgDSgCRCIbRw0AQwAAAAAhNkMAAAAAIQEMAQsgICgCACEaQwAAAAAhAUMAAAAAITYDQCASKAIAIQ4jBCIMQQA2AgAjJSANQTBqIA5BFGoiFCAaIA8QEyAMKAIAIRYgDEEANgIAIBZBAUYNGAJAIA0tADRBA0cNACANKgJcIgJDAAAAAF5FDQAgDSANKgJgIAIgDSgCULOVkjgCYAsCQCAIRQ0AIA4gHygCAGoqAgAhAiMEIgxBADYCACANKgJgITcgICgCACEWIxIgDiA3IAKSIBYQHiAMKAIAIRYgDEEANgIAIBZBAUYNGQsCQCAOIA0oAkRBfGooAgBGDQAgDSA8IA0qAmCSOAJgCyMEIgxBADYCACAdKAIAIRYjJSANQTBqIBQgFiAPEBMgDCgCACEWIAxBADYCACAWQQFGDRgCQCANLQA0QQNHDQAgDSoCXCICQwAAAABeRQ0AIA0gDSoCYCACIA0oAlCzlZI4AmALAkACQCAXDQAjBCIMQQA2AgAjJyAUIBEgNRAbIQIgDCgCACEUIAxBADYCACAUQQFGDRogDioCnAEhNyANIDo4AmQgDSANKgJgIAIgN5KSOAJgDAELIwQiDEEANgIAIy0gDiARIDUQGyECIAwoAgAhFCAMQQA2AgAgFEEBRg0ZIA0gAiANKgJgkjgCYAJAAkACQAJAAkACQAJAIB5FDQAjBCIMQQA2AgAjLiAOEBUhAiAMKAIAIRQgDEEANgIAIBRBAUYNIAJAAkACQAJAAkAgDi8AIiIUQQdxIgxFDQACQCAMQQRGDQAgFEEEdiEWAkACQCAUQQhxRQ0AAkAgFEE/Sw0AIA4gFkECdGpBgAFqKgIAITcMAgsgFkF8aiIlIA4oApQBIhYoAgQgFigCACIWa0ECdU8NJCAWICVBAnRqKgIAITcMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhNwsgDEEBRg0CIDe8Qf////8HcUH////7B0wNBAsgAkMAAAAAkiECIA4qApgDIUkMCAsCQAJAIA4vAC4iFkEHcSIlDgUBAAAABwALIBZBBHYhMQJAAkAgFkEIcUUNAAJAIBZBP0sNACAOIDFBAnRqQYABaioCACE3DAILIDFBfGoiMiAOKAKUASIxKAIEIDEoAgAiMWtBAnVPDSMgMSAyQQJ0aioCACE3DAELQQAgMUH/D3EiMWsgMSAWwUEASBuyITcLICVBAUYNASA3vEH/////B3FB////+wdMDQMMBgsCQCAOLwAwIiVBB3EiMQ4FBgAAAAYACyAlQQR2ITICQAJAICVBCHFFDQACQCAlQT9LDQAgDiAyQQJ0akGAAWoqAgAhNwwCCyAyQXxqIjIgDigClAEiJSgCBCAlKAIAIiVrQQJ1Tw0iICUgMkECdGoqAgAhNwwBC0EAIDJB/w9xIjJrIDIgJcFBAEgbsiE3CyAxQQFHDQELIDdDAADAfyA3i0MAAIB/XRshNwwCCyA3vEH/////B3FB////+wdKDQMLIDUgN5RDCtcjPJQhNwsgAiA3QwAAAAAgNyA3WxuSIQIgDioCmAMhSSAMDQMgDi8ALiEWDAILIwQiDEEANgIAIA0qAmQhAiMtIA4gFSA1EBshNyAMKAIAIQ4gDEEANgIAIA5BAUYNHyANIDcgAiACIDddGyA3IAIgAiACXBsgAiACWyA3IDdbcRs4AmQMBgsgAkMAAAAAkiECIA4qApgDIUkLQwAAwH8hNwJAAkAgFkEHcSIMDgUBAAAABQALIBZB8P8DcUEEdiEUAkACQCAWQQhxRQ0AAkAgFkH//wNxQT9LDQAgDiAUQQJ0akGAAWoqAgAhOQwCCyAUQXxqIhYgDigClAEiFCgCBCAUKAIAIhRrQQJ1Tw0cIBQgFkECdGoqAgAhOQwBC0EAIBRB/w9xIhRrIBQgFsFBAEgbsiE5CyAMQQFGDQMgObxB/////wdxQf////sHTA0CDAQLAkAgDi8AMCIMQQdxIhQOBQQAAAAEAAsgDEEEdiEWAkACQCAMQQhxRQ0AAkAgDEE/Sw0AIA4gFkECdGpBgAFqKgIAITkMAgsgFkF8aiIWIA4oApQBIgwoAgQgDCgCACIMa0ECdU8NGyAMIBZBAnRqKgIAITkMAQtBACAWQf8PcSIWayAWIAzBQQBIG7IhOQsgFEEBRg0CIDm8Qf////8HcUH////7B0wNAQwDC0MAAMB/ITcgDEEERg0CIBRBBHYhFgJAAkAgFEEIcUUNAAJAIBRBP0sNACAOIBZBAnRqQYABaioCACE5DAILIBZBfGoiFiAOKAKUASIUKAIEIBQoAgAiFGtBAnVPDRogFCAWQQJ0aioCACE5DAELQQAgFkH/D3EiFmsgFiAUwUEASBuyITkLIAxBAUYNASA5vEH/////B3FB////+wdKDQILIDUgOZRDCtcjPJQhNwwBCyA5QwAAwH8gOYtDAACAf10bITcLQwAAwH8hOQJAAkACQAJAAkACQCAOLwAmIgxBB3EiFA4FAQAAAAUACyAMQQR2IRYCQAJAIAxBCHFFDQACQCAMQT9LDQAgDiAWQQJ0akGAAWoqAgAhSAwCCyAWQXxqIgwgDigClAEiDigCBCAOKAIAIg5rQQJ1Tw0cIA4gDEECdGoqAgAhSAwBC0EAIBZB/w9xIg5rIA4gDMFBAEgbsiFICyAUQQFGDQEgSLxB/////wdxQf////sHTA0DDAQLAkACQCAOLwAuIgxBB3EiFA4FAQAAAAUACyAMQQR2IRYCQAJAIAxBCHFFDQACQCAMQT9LDQAgDiAWQQJ0akGAAWoqAgAhSAwCCyAWQXxqIgwgDigClAEiDigCBCAOKAIAIg5rQQJ1Tw0cIA4gDEECdGoqAgAhSAwBC0EAIBZB/w9xIg5rIA4gDMFBAEgbsiFICyAUQQFGDQEgSLxB/////wdxQf////sHSg0EDAMLAkAgDi8AMCIMQQdxIhQOBQQAAAAEAAsgDEEEdiEWAkACQCAMQQhxRQ0AAkAgDEE/Sw0AIA4gFkECdGpBgAFqKgIAIUgMAgsgFkF8aiIMIA4oApQBIg4oAgQgDigCACIOa0ECdU8NGyAOIAxBAnRqKgIAIUgMAQtBACAWQf8PcSIOayAOIAzBQQBIG7IhSAsgFEEBRw0BCyBIQwAAwH8gSItDAACAf10bITkMAgsgSLxB/////wdxQf////sHSg0BCyA1IEiUQwrXIzyUITkLIEkgN0MAAAAAIDcgN1sbIDlDAAAAACA5IDlbG5KSIAKTIjcgNiA2IDddGyA3IDYgNiA2XBsgNiA2WyA3IDdbcRshNiACIAEgASACXRsgAiABIAEgAVwbIAEgAVsgAiACW3EbIQELIBJBBGoiEiAbRw0ACwsgDSBKIA0qAmCSOAJgAkAgHkUNACANIDYgAZI4AmQLAkACQAJAAkAgMA0AIwQiDkEANgIAIA0qAmQhASMqIBAgDyATIEQgBhAZIQIgDigCACESIA5BADYCACASQQFGDRUjBCIOQQA2AgAjJiAQIA8gEyBEIAYQGSE2IA4oAgAhEiAOQQA2AgAgEkEBRg0VID0gAZIhAQJAAkAgNkMAAAAAYEUNACABIDZeDQELAkAgAkMAAAAAYA0AIAEhNgwBCyACIAEgASACXRshNgsjBCIOQQA2AgAjHyAQIBUgDyAGEBohASAOKAIAIRIgDkEANgIAIBJBAUYNFSMEIg5BADYCACMgIBAgFSAPIAYQGiECIA4oAgAhEiAOQQA2AgAgEkEBRg0VIAEgApIiASA2IDYgAV0bIAEgNiA2IDZcGyA2IDZbIAEgAVtxGyA9kyECDAELIDohAiAvRQ0AIA0gOjgCZCA6IQEgOiECDAELICgNASANKgJkIQELIwQiDkEANgIAIyogECAPIBMgRCAGEBkhNyAOKAIAIRIgDkEANgIAIBJBAUYNEiMEIg5BADYCACMmIBAgDyATIEQgBhAZITYgDigCACESIA5BADYCACASQQFGDRIgPSABkiEBAkACQCA2QwAAAABgRQ0AIAEgNl4NAQsCQCA3QwAAAABgDQAgASE2DAELIDcgASABIDddGyE2CyMEIg5BADYCACMfIBAgFSAPIAYQGiEBIA4oAgAhEiAOQQA2AgAgEkEBRg0SIwQiDkEANgIAIyAgECAVIA8gBhAaITcgDigCACESIA5BADYCACASQQFGDRIgDSABIDeSIgEgNiA2IAFdGyABIDYgNiA2XBsgNiA2WyABIAFbcRsgPZM4AmQLIA0oAkAhDAJAIAhFDQAgDCANKAJEIhpGDQADQAJAIAwoAgAiDi8BFkEPcSIUDQAgECgCAEEMdkEPcSEUCyAOQRRqIRICQAJAAkACQCAUQXxqDgIAAQILIwQiFEEANgIAIBwoAgAhFiMlIA1BMGogEiAWIA8QEyAUKAIAIRYgFEEANgIAIBZBAUYNFUEEIRQgDS0ANEEDRg0BIwQiFkEANgIAIBgoAgAhGyMlIA1BMGogEiAbIA8QEyAWKAIAIRsgFkEANgIAIBtBAUYNFSANLQA0QQNGDQEgDiATQQN0aiIUKgL4AyEBAkACQAJAIBQtAPwDQX9qDgIBAAILIDogAZRDCtcjPJQhAQsgPyE2IAFDAAAAAGANAwsgDiAFQQJ0aioClAMhAQJAAkACQAJAAkAgDi8BeiIUQQdxRQ0AAkAgFEEIcUUNACAUQQR2IRYCQAJAIBRBP0sNACAOIBZBAnRqQYABaiEUDAELAkAgFkF8aiIWIA4oApQBIhQoAgQgFCgCACIUa0ECdUkNACMEIg5BADYCACMJQfMBahARIA4oAgAhEyAOQQA2AgAgE0EBRw0sEA4hDxC6BBoMJAsgFCAWQQJ0aiEUCyAUKgIAIjYgNlwNAQsjBCIUQQA2AgAjJyASIBUgNRAbITYgFCgCACEWIBRBADYCACAWQQFGDQIgDi8BeiIUQQdxIRYCQCAFDQACQAJAIBYNAEMAAMB/ITcMAQsgFEEEdiEWAkAgFEEIcUUNAAJAIBRBP0sNACAOIBZBAnRqQYABaioCACE3DAILAkAgFkF8aiIWIA4oApQBIhQoAgQgFCgCACIUa0ECdUkNACMEIg5BADYCACMJQfMBahARIA4oAgAhEyAOQQA2AgAgE0EBRw0tEA4hDxC6BBoMJQsgFCAWQQJ0aioCACE3DAELQQAgFkH/D3EiFmsgFiAUwUEASBuyITcLIDYgASA3lZIhNgwCCwJAAkAgFg0AQwAAwH8hNwwBCyAUQQR2IRYCQCAUQQhxRQ0AAkAgFEE/Sw0AIA4gFkECdGpBgAFqKgIAITcMAgsCQCAWQXxqIhYgDigClAEiFCgCBCAUKAIAIhRrQQJ1SQ0AIwQiDkEANgIAIwlB8wFqEBEgDigCACETIA5BADYCACATQQFHDSwQDiEPELoEGgwkCyAUIBZBAnRqKgIAITcMAQtBACAWQf8PcSIWayAWIBTBQQBIG7IhNwsgNiABIDeUkiE2DAELIA0qAmQhNgsjBCIUQQA2AgAjJyASIBEgNRAbITcgFCgCACEWIBRBADYCACAWQQFGDQEjBCIUQQA2AgAjJiASIA8gBSA7IDUQGSE5IBQoAgAhFiAUQQA2AgAgFkEBRg0CIwQiFEEANgIAIycgEiARIDUQGyE8IBQoAgAhFiAUQQA2AgAgFkEBRg0CIwQiFEEANgIAIyYgEiAPIBMgOiA1EBkhSSAUKAIAIRYgFEEANgIAIBZBAUYNAiMEIhRBADYCACMnIBIgFSA1EBshSCAUKAIAIRIgFEEANgIAIBJBAUYNAiAQKAIAIRQjBCISQQA2AgAjCUHyAWogDiABIDeSIjcgNyA5IDySIgEgNyABXRsgASABXBsiNyA2IDYgSSBIkiIBIDYgAV0bIAEgAVwbIgEgExsiNiABIDcgExsiASAPIDYgNlwgKEEARyAUQYAecUGACEdxIhQgBXFyQQFxIAEgAVwgEyAUcXJBAXEgNSBCQQFBAiAJIAogCxAcGiASKAIAIRQgEkEANgIAID8hNiAUQQFHDQUQDiEPELoEGgwfCxAOIQ8QugQaDB4LEA4hDxC6BBoMHQsQDiEPELoEGgwcC0EFQQEgEC0AAEEIcRshFAsjBCIWQQA2AgAjLSAOIBUgNRAbITYgFigCACEbIBZBADYCACAbQQFGDRIjBCIWQQA2AgAgHCgCACEbIyUgDUEwaiASIBsgDxATIBYoAgAhGyAWQQA2AgAgG0EBRg0SIAIgNpMhAQJAIA0tADRBA0cNACMEIhZBADYCACAYKAIAIRsjJSANQTBqIBIgGyAPEBMgFigCACEbIBZBADYCACAbQQFGDRMgDS0ANEEDRw0AID8gAUMAAAA/lCI2QwAAAAAgNkMAAAAAXhuSITYMAQsjBCIWQQA2AgAgGCgCACEbIyUgDUEwaiASIBsgDxATIBYoAgAhGyAWQQA2AgAgG0EBRg0SID8hNiANLQA0QQNGDQAjBCIWQQA2AgAgHCgCACEbIyUgDUEwaiASIBsgDxATIBYoAgAhEiAWQQA2AgAgEkEBRg0SAkAgDS0ANEEDRw0AID8gAUMAAAAAIAFDAAAAAF4bkiE2DAELID8hNgJAAkAgFEF/ag4CAgABCyA/IAFDAAAAP5SSITYMAQsgPyABkiE2CyAOICEoAgBqKgIAIQEjBCISQQA2AgAgHCgCACEUIxIgDiA2IEYgAZKSIBQQHiASKAIAIQ4gEkEANgIAIA5BAUYNEiAMQQRqIgwgGkcNAAsgDSgCQCEMCyANKgJgIjYgRSBFIEVcGyEBIDYgRSBFIDZdGyECIEUgRVsgNiA2W3EhDiBDQwAAAAAgIxsgDSoCZJIhNgJAIAxFDQAgDSAMNgJEIAwgDSgCSCAMaxDJBAsgAiABIA4bIUUgRiA2kiFGICNBAWohIyANKAJoDQAgDSgCbA0ACwsgCEUNCwJAICgNACMEIg5BADYCACMsIAAQEiESIA4oAgAhEyAOQQA2AgAgE0EBRg0NIBJFDQwLAkACQAJAAkACQAJAAkACQAJAAkACQAJAICcNACARQQFLIRYgPSA6kiEBDAELIAAgEUEBSyIWQQN0aiIOKgL4AyI2IQECQAJAAkAgDi0A/AMiDkF/ag4CAQACCyBEIDaUQwrXIzyUIQELIAFDAAAAAGBFDQAgNiBEIDaUQwrXIzyUIA5BAUYbIQEgEC0AA0EQcUUNASMEIg5BADYCACMhIBBBAkEAIBFBAkkbIhIgDyAGEBohNiAOKAIAIRMgDkEANgIAIBNBAUYNAiMEIg5BADYCACMiIBAgEiAPIAYQGiECIA4oAgAhEyAOQQA2AgAgE0EBRg0CIAEgNiACkiI2QwAAAAAgNiA2WxuSIQEMAQsgPSBGkiEBCyMEIg5BADYCACMqIBAgDyAWIAcgBhAZIQIgDigCACETIA5BADYCACATQQFGDQEjBCIOQQA2AgAjJiAQIA8gFiAHIAYQGSE2IA4oAgAhEyAOQQA2AgAgE0EBRg0BAkACQCA2QwAAAABgRQ0AIAEgNl4NAQsCQCACQwAAAABgDQAgASE2DAELIAIgASABIAJdGyE2CyMEIg5BADYCACMfIBAgFSAPIAYQGiEBIA4oAgAhEyAOQQA2AgAgE0EBRg0BIwQiDkEANgIAIyAgECAVIA8gBhAaIQIgDigCACETIA5BADYCACATQQFGDQFDAAAAACFKIBAoAgBBCHZBD3EhDgJAIAEgApIiASA2IDYgAV0bIAEgNiA2IDZcGyA2IDZbIAEgAVtxGyA9kyBGkyI2QwAAAABgDQBDAAAAACFLIA5BfmoOAgQDCgtDAAAAACFLIA5BfmoOBwMCBAkHBQYJCxAOIQ8QugQaDB8LEA4hDxC6BBoMHgsgPyA2kiE/DAULID8gNkMAAAA/lJIhPwwECyA2ICOzlSFLDAQLIDYgI7MiAZUhSiA/IDYgASABkpWSIT8MAgsgPyA2ICNBAWqzlSJKkiE/DAELICNBAkkNACA2ICNBf2qzlSFKC0MAAAAAIUsLAkACQCAAKALsAyAAKALoAyIORg0AIA1CADcCRCANIAA2AkAgDigCACgCFEGAgIDgAHFBgICAwABHDQEjBCIOQQA2AgAjCUHVAWogDUHAAGoQFCAOKAIAIRMgDkEANgIAIBNBAUcNARAOIQ8QugQaIA0oAkgiDkUNGANAIA4oAgAhEyAOQQwQyQQgEyEOIBMNAAwZCwALIA1BADYCSCANQgA3A0ALICNFDQojBiIOQaQ2aiAVQQJ0IhNqIQwgDkG0NmogE2ohHSANQSBqQQhqIRwgDUHAAGpBCGohGiANQTBqQQhqIRsgFkEDdCEXQQAhFANAIwQiDkEANgIAIA1BADYCOCANIA0pA0A3AzAjCUH7AWogGyAbIA0oAkhBABAfGiAOKAIAIRMgDkEANgIAAkAgE0EBRw0AEA4hDxC6BBogDSgCOCIORQ0LA0AgDigCACETIA5BDBDJBCATIQ4gEw0ADAwLAAsjBCIOQQA2AgAgDUEANgIoIA0gDSkDMDcDICMJQfsBaiAcIBwgDSgCOEEAEB8aIA4oAgAhEyAOQQA2AgACQAJAAkACQCATQQFGDQBDAAAAACE3IA0oAiQhDiANKAIgIhNFDQFDAAAAACECQwAAAAAhNgwCCxAOIQ8QugQaIA0oAigiDkUNDANAIA4oAgAhEyAOQQwQyQQgEyEOIBMNAAwNCwALQwAAAAAhAkMAAAAAITYgDkUNAQsDQAJAIA4gEygC7AMgEygC6AMiE2tBAnVJDQAjBCIOQQA2AgAjCUHWAWoQESAOKAIAIRMgDkEANgIAIBNBAUcNIRAOIQ8QugQaDAsLAkAgEyAOQQJ0aigCACIOKAIUIhNBgICA4ABxQYCAgCBGDQAgE0GAgMABcUGAgIABRg0AIA4oAtwDIBRHDQIjBCITQQA2AgAjLyAOIBUQECEFIBMoAgAhEiATQQA2AgACQAJAAkACQAJAAkACQAJAIBJBAUYNACAOQRRqIRMCQCAFRQ0AIA4gFkECdGoqApQDIQEjBCISQQA2AgAjJyATIBUgNRAbITkgEigCACEFIBJBADYCACAFQQFGDQEgASA5kiIBIDYgNiABXRsgASA2IDYgNlwbIDYgNlsgASABW3EbITYLAkAgEy8BAkEPcSITDQAgECgCAEEMdkEPcSETCyATQQVHDQggEC0AAEEIcUUNCCMEIhNBADYCACMuIA4QFSEBIBMoAgAhEiATQQA2AgAgEkEBRg0BAkACQAJAAkACQAJAAkACQAJAIA4vACIiEkEHcSITRQ0AAkAgE0EERg0AIBJBBHYhBQJAAkAgEkEIcUUNAAJAIBJBP0sNACAOIAVBAnRqQYABaioCACE5DAILIAVBfGoiGCAOKAKUASIFKAIEIAUoAgAiBWtBAnVPDQQgBSAYQQJ0aioCACE5DAELQQAgBUH/D3EiBWsgBSASwUEASBuyITkLIBNBAUYNBiA5vEH/////B3FB////+wdMDQgLIA4qApgDIUlDAAAAACFIDA0LAkACQCAOLwAuIgVBB3EiGA4FAQAAAAwACyAFQQR2IR4CQAJAIAVBCHFFDQACQCAFQT9LDQAgDiAeQQJ0akGAAWoqAgAhOQwCCyAeQXxqIiAgDigClAEiHigCBCAeKAIAIh5rQQJ1Tw0DIB4gIEECdGoqAgAhOQwBC0EAIB5B/w9xIh5rIB4gBcFBAEgbsiE5CyAYQQFGDQUgObxB/////wdxQf////sHTA0HDAsLAkAgDi8AMCIYQQdxIh4OBQsAAAALAAsgGEEEdiEgIBhBCHFFDQICQCAYQT9LDQAgDiAgQQJ0akGAAWoqAgAhOQwECyAgQXxqIiAgDigClAEiGCgCBCAYKAIAIhhrQQJ1SQ0BCyMEIg5BADYCACMJQfMBahARIA4oAgAhEyAOQQA2AgAgE0EBRw0wEA4hDxC6BBoMGgsgGCAgQQJ0aioCACE5DAELQQAgIEH/D3EiIGsgICAYwUEASBuyITkLIB5BAUcNAQsgOUMAAMB/IDmLQwAAgH9dGyE5DAILIDm8Qf////8HcUH////7B0oNBAsgNSA5lEMK1yM8lCE5CyA5QwAAAAAgOSA5WxshSCAOKgKYAyFJIBMNBCAOLwAuIQUMAwsQDiEPELoEGgwSCxAOIQ8QugQaDBELIA4qApgDIUlDAAAAACFIC0MAAMB/ITkCQAJAIAVBB3EiEw4FAQAAAAUACyAFQfD/A3FBBHYhEgJAAkAgBUEIcUUNAAJAIAVB//8DcUE/Sw0AIA4gEkECdGpBgAFqKgIAITwMAgsgEkF8aiIFIA4oApQBIhIoAgQgEigCACISa0ECdU8NESASIAVBAnRqKgIAITwMAQtBACASQf8PcSISayASIAXBQQBIG7IhPAsgE0EBRg0DIDy8Qf////8HcUH////7B0wNAgwECwJAIA4vADAiE0EHcSISDgUEAAAABAALIBNBBHYhBQJAAkAgE0EIcUUNAAJAIBNBP0sNACAOIAVBAnRqQYABaioCACE8DAILIAVBfGoiBSAOKAKUASITKAIEIBMoAgAiE2tBAnVPDRAgEyAFQQJ0aioCACE8DAELQQAgBUH/D3EiBWsgBSATwUEASBuyITwLIBJBAUYNAiA8vEH/////B3FB////+wdMDQEMAwtDAADAfyE5IBNBBEYNAiASQQR2IQUCQAJAIBJBCHFFDQACQCASQT9LDQAgDiAFQQJ0akGAAWoqAgAhPAwCCyAFQXxqIgUgDigClAEiEigCBCASKAIAIhJrQQJ1Tw0PIBIgBUECdGoqAgAhPAwBC0EAIAVB/w9xIgVrIAUgEsFBAEgbsiE8CyATQQFGDQEgPLxB/////wdxQf////sHSg0CCyA1IDyUQwrXIzyUITkMAQsgPEMAAMB/IDyLQwAAgH9dGyE5C0MAAMB/ITwCQAJAAkACQAJAAkAgDi8AJiITQQdxIhIOBQEAAAAFAAsgE0EEdiEFAkACQCATQQhxRQ0AAkAgE0E/Sw0AIA4gBUECdGpBgAFqKgIAIUcMAgsgBUF8aiITIA4oApQBIg4oAgQgDigCACIOa0ECdU8NESAOIBNBAnRqKgIAIUcMAQtBACAFQf8PcSIOayAOIBPBQQBIG7IhRwsgEkEBRg0BIEe8Qf////8HcUH////7B0wNAwwECwJAAkAgDi8ALiITQQdxIhIOBQEAAAAFAAsgE0EEdiEFAkACQCATQQhxRQ0AAkAgE0E/Sw0AIA4gBUECdGpBgAFqKgIAIUcMAgsgBUF8aiITIA4oApQBIg4oAgQgDigCACIOa0ECdU8NESAOIBNBAnRqKgIAIUcMAQtBACAFQf8PcSIOayAOIBPBQQBIG7IhRwsgEkEBRg0BIEe8Qf////8HcUH////7B0oNBAwDCwJAIA4vADAiE0EHcSISDgUEAAAABAALIBNBBHYhBQJAAkAgE0EIcUUNAAJAIBNBP0sNACAOIAVBAnRqQYABaioCACFHDAILIAVBfGoiEyAOKAKUASIOKAIEIA4oAgAiDmtBAnVPDRAgDiATQQJ0aioCACFHDAELQQAgBUH/D3EiDmsgDiATwUEASBuyIUcLIBJBAUcNAQsgR0MAAMB/IEeLQwAAgH9dGyE8DAILIEe8Qf////8HcUH////7B0oNAQsgNSBHlEMK1yM8lCE8CyABIEiSIgEgAiACIAFdGyABIAIgAiACXBsgAiACWyABIAFbcRsiAiBJIDlDAAAAACA5IDlbGyA8QwAAAAAgPCA8WxuSkiABkyIBIDcgNyABXRsgASA3IDcgN1wbIDcgN1sgASABW3EbIjeSIgEgNiA2IAFdGyABIDYgNiA2XBsgNiA2WyABIAFbcRshNgsjBCIOQQA2AgAjCUH9AWogDUEUaiANQSBqQQAQICAOKAIAIRMgDkEANgIAAkAgE0EBRg0AAkAgDSgCHCIORQ0AA0AgDigCACETIA5BDBDJBCATIQ4gEw0ACwsgDUEANgIcIA0oAiQhDiANKAIgIhMNASAODQEMAgsLEA4hDxC6BBoMCQsgDSANKQMgNwNAIA0oAighDiAaIRICQAJAAkAgDSgCSCITRQ0AA0AgDkUNAiATIA4oAgQ2AgQgEyAOKAIINgIIIA4oAgAhDiASKAIAIRIgEygCACITDQALCyMEIhNBADYCACMJQfsBaiAaIBIgDkEAEB8aIBMoAgAhDiATQQA2AgAgDkEBRw0BDAcLIBJFDQAgEigCACIORQ0AIBJBADYCAANAIA4oAgAhEyAOQQwQyQQgEyEOIBMNAAsLIA0gDSkDMDcDICANKAI4IQ4gHCESAkACQAJAIA0oAigiE0UNAANAIA5FDQIgEyAOKAIENgIEIBMgDigCCDYCCCAOKAIAIQ4gEigCACESIBMoAgAiEw0ACwsjBCITQQA2AgAjCUH7AWogHCASIA5BABAfGiATKAIAIQ4gE0EANgIAIA5BAUYNBwwBCyASRQ0AIBIoAgAiDkUNACASQQA2AgADQCAOKAIAIRMgDkEMEMkEIBMhDiATDQALCyA/IENDAAAAACAUG5IhASBLIDaSITcgDSgCJCEOAkACQCANKAIgIhMgDSgCQEcNACAOIA0oAkRGDQELIAEgApIhSCABIDeSITwgSiA3kiFJA0ACQCAOIBMoAuwDIBMoAugDIhNrQQJ1SQ0AIwQiDkEANgIAIwlB1gFqEBEgDigCACETIA5BADYCACATQQFHDSEMBwsCQCATIA5BAnRqKAIAIg4oAhQiE0GAgIDgAHFBgICAIEYNACATQYCAwAFxQYCAgAFGDQACQCATQRB2QQ9xIhMNACAQKAIAQQx2QQ9xIRMLIA5BFGohEgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBNBf2oOBQEDAgQADQsgEC0AAEEIcQ0ECyMEIhNBADYCACAMKAIAIQUjMCANQfgAaiASIAUgDxATIBMoAgAhEiATQQA2AgAgEkEBRg0KQwAAwH8hNgJAAkACQCANLQB8QX9qDgIAAQILIA0qAnghNgwBCyA1IA0qAniUQwrXIzyUITYLIAEgNkMAAAAAIDYgNlsbkiE2DAgLIwQiE0EANgIAIB0oAgAhBSMlIA1B+ABqIBIgBSAPEBMgEygCACESIBNBADYCACASQQFGDQlDAADAfyE2AkACQAJAIA0tAHxBf2oOAgABAgsgDSoCeCE2DAELIDUgDSoCeJRDCtcjPJQhNgsgPCA2QwAAAAAgNiA2WxuTIA4gFkECdGoqApQDkyE2DAcLIA4gFkECdGoqApQDITYjBCITQQA2AgAgDCgCACESIxIgDiABIDcgNpNDAAAAP5SSIBIQHiATKAIAIQ4gE0EANgIAIA5BAUcNCRAOIQ8QugQaDBQLIwQiE0EANgIAIAwoAgAhBSMlIA1B+ABqIBIgBSAPEBMgEygCACEFIBNBADYCACAFQQFGDQdDAADAfyE2AkACQAJAIA0tAHxBf2oOAgABAgsgDSoCeCE2DAELIDUgDSoCeJRDCtcjPJQhNgsjBCITQQA2AgAgDCgCACEFIxIgDiABIDZDAAAAACA2IDZbG5IgBRAeIBMoAgAhBSATQQA2AgAgBUEBRg0HIA4gF2oiEyoC+AMhNgJAAkACQCATLQD8A0F/ag4CAQACCyA6IDaUQwrXIzyUITYLIDZDAAAAAGANCQsCQAJAAkAgEUECSQ0AIA4qApQDITYjBCITQQA2AgAjJyASIBEgNRAbIQIgEygCACESIBNBADYCACASQQFGDQQgNiACkiE2IEkhAgwBCyAOKgKYAyE2IwQiE0EANgIAIycgEiAZIDUQGyECIBMoAgAhEiATQQA2AgAgEkEBRg0BIDYgApIhAiBJITYLAkACQAJAIDYgNlwgDioClAMiOSA5XHINACA2IDmTi0MXt9E4XQ0BDAILIDYgNlsNASA5IDlbDQELAkAgAiACXCAOKgKYAyI5IDlcIhNyDQAgAiA5k4tDF7fROF1FDQEMCwsgAiACWw0AIBMNCgsjBCITQQA2AgAjCUHyAWogDiA2IAIgD0EAQQAgNSBCQQFBAyAJIAogCxAcGiATKAIAIQ4gE0EANgIAIA5BAUcNCQsQDiEPELoEGgwTCyMEIhNBADYCACMuIA4QFSECIBMoAgAhEiATQQA2AgAgEkEBRg0GQwAAwH8hNgJAAkACQAJAAkACQAJAIA4vADQiE0EHcSISDgUBAAAACgALIBNBBHYhBQJAAkAgE0EIcUUNAAJAIBNBP0sNACAOIAVBAnRqQYABaioCACE5DAILIAVBfGoiBSAOKAKUASITKAIEIBMoAgAiE2tBAnVPDQMgEyAFQQJ0aioCACE5DAELQQAgBUH/D3EiBWsgBSATwUEASBuyITkLIBJBAUYNBSA5vEH/////B3FB////+wdMDQgMCQsCQAJAIA4vAEAiE0EHcSISDgUBAAAACgALIBNBBHYhBQJAAkAgE0EIcUUNAAJAIBNBP0sNACAOIAVBAnRqQYABaioCACE5DAILIAVBfGoiBSAOKAKUASITKAIEIBMoAgAiE2tBAnVPDQMgEyAFQQJ0aioCACE5DAELQQAgBUH/D3EiBWsgBSATwUEASBuyITkLIBJBAUYNBSA5vEH/////B3FB////+wdKDQkMCAsCQCAOLwBCIhNBB3EiEg4FCQAAAAkACyATQQR2IQUgE0EIcUUNAgJAIBNBP0sNACAOIAVBAnRqQYABaioCACE5DAQLIAVBfGoiBSAOKAKUASITKAIEIBMoAgAiE2tBAnVJDQELIwQiDkEANgIAIwlB8wFqEBEgDigCACETIA5BADYCACATQQFHDSwMEgsgEyAFQQJ0aioCACE5DAELQQAgBUH/D3EiBWsgBSATwUEASBuyITkLIBJBAUcNAgsgOUMAAMB/IDmLQwAAgH9dGyE2DAMLEA4hDxC6BBoMEQsgObxB/////wdxQf////sHSg0BCyA6IDmUQwrXIzyUITYLIEggApMgNkMAAAAAIDYgNlsbkiE2QQEhEgwBCyAMKAIAIRILIwQiE0EANgIAIxIgDiA2IBIQHiATKAIAIQ4gE0EANgIAIA5BAUcNAQsQDiEPELoEGgwLCyMEIg5BADYCACMJQf0BaiANQQhqIA1BIGpBABAgIA4oAgAhEyAOQQA2AgAgE0EBRg0IAkAgDSgCECIORQ0AA0AgDigCACETIA5BDBDJBCATIQ4gEw0ACwsgDUEANgIQIA0oAiQhDiANKAIgIhMgDSgCQEcNACAOIA0oAkRHDQALCwJAIA0oAigiDkUNAANAIA4oAgAhEyAOQQwQyQQgEyEOIBMNAAsLIEogAZIhNgJAIA0oAjgiDkUNAANAIA4oAgAhEyAOQQwQyQQgEyEOIBMNAAsLIDYgN5IhPyAUQQFqIhQgI0cNAAwLCwALIwZBixxqEM0DAAsjBkGLHGoQzQMACxAOIQ8QugQaDBMLEA4hDxC6BBoMAwsQDiEPELoEGgwCCxAOIQ8QugQaDAELIwQiDkEANgIAIwlB8wFqEBEgDigCACETIA5BADYCACATQQFHDRYQDiEPELoEGgsgDSgCKCIORQ0AA0AgDigCACETIA5BDBDJBCATIQ4gEw0ACwsgDSgCOCIORQ0AA0AgDigCACETIA5BDBDJBCATIQ4gEw0ACwsgDSgCSCIORQ0MA0AgDigCACETIA5BDBDJBCATIQ4gEw0ADA0LAAsgDSgCSCIORQ0AA0AgDigCACETIA5BDBDJBCATIQ4gEw0ACwsjBCIOQQA2AgAjKiAQIA9BACAGIAYQGSEBIA4oAgAhEyAOQQA2AgAgE0EBRg0AIwQiDkEANgIAIyYgECAPQQAgBiAGEBkhNiAOKAIAIRMgDkEANgIAIBNBAUYNAAJAAkAgNkMAAAAAYEUNACBAIDZeDQELAkAgAUMAAAAAYA0AIEAhNgwBCyABIEAgQCABXRshNgsjBCIOQQA2AgAjHyAQQQIgDyAGEBohASAOKAIAIRMgDkEANgIAIBNBAUYNACMEIg5BADYCACMgIBBBAiAPIAYQGiECIA4oAgAhEyAOQQA2AgAgE0EBRg0AIwQiDkEANgIAIzEgACABIAKSIgEgNiA2IAFdGyABIDYgNiA2XBsgNiA2WyABIAFbcRtBABAeIA4oAgAhEyAOQQA2AgAgE0EBRg0AIwQiDkEANgIAIyogECAPQQEgByAGEBkhASAOKAIAIRMgDkEANgIAIBNBAUYNACMEIg5BADYCACMmIBAgD0EBIAcgBhAZITYgDigCACETIA5BADYCACATQQFGDQACQAJAIDZDAAAAAGBFDQAgQSA2Xg0BCwJAIAFDAAAAAGANACBBITYMAQsgASBBIEEgAV0bITYLIwQiDkEANgIAIx8gEEEAIA8gBhAaIQEgDigCACETIA5BADYCACATQQFGDQAjBCIOQQA2AgAjICAQQQAgDyAGEBohAiAOKAIAIRMgDkEANgIAIBNBAUYNACMEIg5BADYCACMxIAAgASACkiIBIDYgNiABXRsgASA2IDYgNlwbIDYgNlsgASABW3EbQQEQHiAOKAIAIRMgDkEANgIAIBNBAUYNAAJAAkACQCAmQQFGDQAgEC0AA0EDcSIOQQJGDQEgJkECRw0BCyMEIg5BADYCACMqIBAgDyARQQJJIhMgOCAGEBkhASAOKAIAIRIgDkEANgIAIBJBAUYNAiMEIg5BADYCACMmIBAgDyATIDggBhAZITYgDigCACESIA5BADYCACASQQFGDQICQAJAIDZDAAAAAGBFDQAgRSA2Xg0BCwJAIAFDAAAAAGANACBFITYMAQsgASBFIEUgAV0bITYLIwQiDkEANgIAIx8gECARIA8gBhAaIQEgDigCACESIA5BADYCACASQQFGDQIjBCIOQQA2AgAjICAQIBEgDyAGEBohAiAOKAIAIRIgDkEANgIAIBJBAUYNAiMEIg5BADYCACMxIAAgASACkiIBIDYgNiABXRsgASA2IDYgNlwbIDYgNlsgASABW3EbIBMQHiAOKAIAIRMgDkEANgIAIBNBAUcNAQwCCyAmQQJHDQAgDkECRw0AIwQiDkEANgIAIwlBgAJqIAAgDyARIEUgOCAGECEhASAOKAIAIRMgDkEANgIAAkAgE0EBRg0AIwQiDkEANgIAIwlBgQJqIBEQEiESIA4oAgAhEyAOQQA2AgAgE0EBRg0AIwQiDkEANgIAIzEgACA+IAEgPiA7kiI2IAEgNl0bIAEgNiA2IDZcGyA2IDZbIAEgAVtxGyI2IDYgPl0bID4gNiA2IDZcGyA2IDZbID4gPltxGyASEB4gDigCACETIA5BADYCACATQQFHDQELEA4hDxC6BBoMCwsCQAJAAkAgJ0EBRg0AIBAtAANBA3EhDiAnQQJHIhMNASAOQQJGDQELIwQiDkEANgIAIyogECAPIBFBAUsiEyBEIAYQGSECIA4oAgAhEiAOQQA2AgAgEkEBRg0CIwQiDkEANgIAIyYgECAPIBMgRCAGEBkhNiAOKAIAIRIgDkEANgIAIBJBAUYNAiA9IEaSIQECQAJAIDZDAAAAAGBFDQAgASA2Xg0BCwJAIAJDAAAAAGANACABITYMAQsgAiABIAEgAl0bITYLIwQiDkEANgIAIx8gECAVIA8gBhAaIQEgDigCACESIA5BADYCACASQQFGDQIjBCIOQQA2AgAjICAQIBUgDyAGEBohBiAOKAIAIRIgDkEANgIAIBJBAUYNAiMEIg5BADYCACMxIAAgASAGkiIBIDYgNiABXRsgASA2IDYgNlwbIDYgNlsgASABW3EbIBMQHiAOKAIAIRMgDkEANgIAIBNBAUYNAgwBCyATDQAgDkECRw0AIwQiDkEANgIAIwlBgAJqIAAgDyAVID0gRpIgRCAGECEhASAOKAIAIRMgDkEANgIAAkAgE0EBRg0AIwQiDkEANgIAIwlBgQJqIBUQEiESIA4oAgAhEyAOQQA2AgAgE0EBRg0AIwQiDkEANgIAIzEgACA9IAEgPSA6kiI2IAEgNl0bIAEgNiA2IDZcGyA2IDZbIAEgAVtxGyI2IDYgPV0bID0gNiA2IDZcGyA2IDZbID0gPVtxGyASEB4gDigCACETIA5BADYCACATQQFHDQELEA4hDxC6BBoMCwsCQAJAIAhFDQACQCAQKAIAQYCAgAZxQYCAgARHDQACQAJAIAAoAuwDIAAoAugDIhJGDQAgDUIANwJEIA0gADYCQEEAIQ4gACETIBIoAgAoAhRBgICA4ABxQYCAgMAARw0BIwQiDkEANgIAIwlB1QFqIA1BwABqEBQgDigCACETIA5BADYCAAJAIBNBAUYNACANKAJEIQ4gDSgCQCETDAILEA4hDxC6BBogDSgCSCIORQ0PA0AgDigCACETIA5BDBDJBCATIQ4gEw0ADBALAAtBACEOIA1BADYCSCANQgA3A0BBACETCwJAAkAgEw0AIA5FDQELIwYiEkGkNmogFUECdCIFaiEUIBJBiDZqIAVqIRYgACARQQFLQQJ0akGUA2ohCAJAAkADQAJAIA4gEygC7AMgEygC6AMiEmtBAnUiDEkNACMEIg5BADYCACMJQdYBahARIA4oAgAhEyAOQQA2AgAgE0EBRw0ZEA4hDxC6BBoMAwsCQCASIA5BAnRqKAIAIgUoAhRBgIDAAXFBgICAAUYNACAFIBYoAgBBAnRqKgKUAyE2IAUgFCgCAEECdGoqApwDIQEgCCoCACEGIwQiDkEANgIAIBQoAgAhEyMSIAUgBiABkyA2kyATEB4gDigCACETIA5BADYCACATQQFGDQIgDSgCQCITKALsAyATKALoAyISa0ECdSEMIA0oAkQhDgsCQAJAAkAgDkEBaiIOIAxJDQADQAJAIA0oAkgiDg0AIA1CADcDQEEAIQ5BACETDAMLIA0gDigCBDYCQCANIA4oAgg2AkQgDSAOKAIANgJIIA5BDBDJBCANKAJEQQFqIg4gDSgCQCITKALsAyATKALoAyISa0ECdU8NAAsLIA0gDjYCRCASIA5BAnRqKAIAKAIUQYCAgOAAcUGAgIDAAEcNACMEIg5BADYCACMJQdUBaiANQcAAahAUIA4oAgAhEyAOQQA2AgAgE0EBRg0BIA0oAkQhDiANKAJAIRMLIBMNASAODQEMBAsLEA4hDxC6BBoMAQsQDiEPELoEGgsgDSgCSCIORQ0OA0AgDigCACETIA5BDBDJBCATIQ4gEw0ADA8LAAsgDSgCSCIORQ0AA0AgDigCACETIA5BDBDJBCATIQ4gEw0ACwsCQCAVIBFyQQFxRQ0AAkACQAJAAkAgACgC7AMgACgC6AMiDkYNACANQgA3AkQgDSAANgJAAkAgDigCACgCFEGAgIDgAHFBgICAwABGDQBBACETIAAhDgwDCyMEIg5BADYCACMJQdUBaiANQcAAahAUIA4oAgAhEyAOQQA2AgACQCATQQFGDQAgDSgCRCETIA0oAkAhDgwCCxAOIQ8QugQaIA0oAkgiDkUNEQNAIA4oAgAhEyAOQQwQyQQgEyEOIBMNAAwSCwALQQAhEyANQQA2AkggDUIANwNAQQAhDgsgDg0AIBNFDQELIBVBAXEhCCARQQFxIRQgAEGYA2ohFiAAQZQDaiEcIBVBf2ohGwJAAkADQAJAIBMgDigC7AMgDigC6AMiDmtBAnVJDQAjBCIOQQA2AgAjCUHWAWoQESAOKAIAIRMgDkEANgIAIBNBAUcNGRAOIQ8QugQaDAMLAkAgDiATQQJ0aigCACIOKAIUIhNBgICA4ABxQYCAgCBGDQAgE0GAgMABcUGAgIABRg0AAkAgFEUNAEGYAyETQagDIRIgFiEFIBEhDAJAAkACQAJAIBFBf2oOAwMAAQMLQQIhDEGUAyETQZwDIRIMAQtBACEMQZQDIRNBpAMhEgsgHCEFCyAOIBJqKgIAITYgDiATaioCACEBIAUqAgAhBiMEIhNBADYCACMSIA4gBiABkyA2kyAMEB4gEygCACESIBNBADYCACASQQFGDQMLIAhFDQBBmAMhE0GoAyESIBYhBSAVIQwCQAJAAkACQCAbDgMDAAEDC0ECIQxBlAMhE0GcAyESDAELQQAhDEGUAyETQaQDIRILIBwhBQsgDiASaioCACE2IA4gE2oqAgAhASAFKgIAIQYjBCITQQA2AgAjEiAOIAYgAZMgNpMgDBAeIBMoAgAhDiATQQA2AgAgDkEBRg0CCwJAAkACQCANKAJEQQFqIhMgDSgCQCIOKALsAyAOKALoAyISa0ECdUkNAANAAkAgDSgCSCIODQAgDUIANwNAQQAhE0EAIQ4MAwsgDSAOKAIENgJAIA0gDigCCDYCRCANIA4oAgA2AkggDkEMEMkEIA0oAkRBAWoiEyANKAJAIg4oAuwDIA4oAugDIhJrQQJ1Tw0ACwsgDSATNgJEIBIgE0ECdGooAgAoAhRBgICA4ABxQYCAgMAARw0AIwQiDkEANgIAIwlB1QFqIA1BwABqEBQgDigCACETIA5BADYCACATQQFGDQEgDSgCRCETIA0oAkAhDgsgDg0BIBMNAQwECwsQDiEPELoEGgwBCxAOIQ8QugQaCyANKAJIIg5FDQ4DQCAOKAIAIRMgDkEMEMkEIBMhDiATDQAMDwsACyANKAJIIg5FDQADQCAOKAIAIRMgDkEMEMkEIBMhDiATDQALCwJAIBAtAAJBMHENACAKQQFGDQAgAC0AAEEIcUUNAQsjBCIOQQA2AgAjMiAAIAAgJiAEIBFBAUsbIA8gCSAKIAtDAAAAAEMAAAAAIDUgQhAkGiAOKAIAIRMgDkEANgIAIBNBAUYNAQsgDSgCcCIORQ0VA0AgDigCACETIA5BDBDJBCATIQ4gEw0ADBYLAAsQDiEPELoEGgwKCxAOIQ8QugQaDAkLEA4hDxC6BBoMBwsQDiEPELoEGgwGCxAOIQ8QugQaDAULIwQiDkEANgIAIwlB8wFqEBEgDigCACETIA5BADYCACATQQFHDQwQDiEPELoEGgwECxAOIQ8QugQaDAMLEA4hDxC6BBoMAgsQDiEPELoEGgwBCxAOIQ8QugQaCyANKAJAIg5FDQAgDSAONgJEIA4gDSgCSCAOaxDJBAsgDSgCcCINRQ0HA0AgDSgCACEOIA1BDBDJBCAOIQ0gDg0ADAgLAAsQDiEPELoEGgwBCxAOIQ8QugQaCyANKAJIIg1FDQQDQCANKAIAIQ4gDUEMEMkEIA4hDSAODQAMBQsACxAOIQ8QugQaDAELEA4hDxC6BBoLIA0oAkgiDUUNAQNAIA0oAgAhDiANQQwQyQQgDiENIA4NAAwCCwALAAsgDxAPAAsgABCsAwsgDUGAAWoiNCM/SyA0I0BJcgRAIDQQOAsgNCQAC+8BAgN/An0jAEEQayIDIgQjP0sgBCNASXIEQCAEEDgLIAQkACADQQhqIAAgAUH+AXFBAkciAUEBEKQDQwAAwH8hBkMAAMB/IQcCQAJAAkAgAy0ADEF/ag4CAAECCyADKgIIIQcMAQsgAiADKgIIlEMK1yM8lCEHCyADQQhqIABBA0ECIAEbQQEQpAMCQAJAAkAgAy0ADEF/ag4CAAECCyADKgIIIQYMAQsgAiADKgIIlEMK1yM8lCEGCyADQRBqIgUjP0sgBSNASXIEQCAFEDgLIAUkACAHQwAAAAAgByAHWxsgBkMAAAAAIAYgBlsbkgvbAQACQAJAAkACQAJAIAIOBAQAAQIDCwJAIAEvAQ4iAkEHcUUNACAAIAFB6ABqIAIQugMPCyABQegAaiECAkAgAS8BGiIDQQdxRQ0AIAAgAiADELoDDwsgACACIAEvARwQugMPCyAAIAEgAUEMaiADELIDDwsCQCABLwESIgJBB3FFDQAgACABQegAaiACELoDDwsgAUHoAGohAgJAIAEvARoiA0EHcUUNACAAIAIgAxC6Aw8LIAAgAiABLwEcELoDDwsjBkHDG2oQzQMACyAAIAEgAUEMaiADELEDC90BAAJAAkACQAJAAkAgAg4EBAABAgMLAkAgAS8BRCICQQdxRQ0AIAAgAUHoAGogAhC6Aw8LIAFB6ABqIQICQCABLwFQIgNBB3FFDQAgACACIAMQugMPCyAAIAIgAS8BUhC6Aw8LIAAgASABQcIAaiADELIDDwsCQCABLwFIIgJBB3FFDQAgACABQegAaiACELoDDwsgAUHoAGohAgJAIAEvAVAiA0EHcUUNACAAIAIgAxC6Aw8LIAAgAiABLwFSELoDDwsjBkHDG2oQzQMACyAAIAEgAUHCAGogAxCxAwvbAQACQAJAAkACQAJAIAIOBAQAAQIDCwJAIAEvATIiAkEHcUUNACAAIAFB6ABqIAIQugMPCyABQegAaiECAkAgAS8BPiIDQQdxRQ0AIAAgAiADELoDDwsgACACIAEvAUAQugMPCyAAIAEgAUEwaiADELIDDwsCQCABLwE2IgJBB3FFDQAgACABQegAaiACELoDDwsgAUHoAGohAgJAIAEvAT4iA0EHcUUNACAAIAIgAxC6Aw8LIAAgAiABLwFAELoDDwsjBkHDG2oQzQMACyAAIAEgAUEwaiADELEDC7MCAgJ9A39DAADAfyEFAkACQCAAIAJBAXRqLwFeIgdBB3EiCA4FAQAAAAEACyAHQQR2IQkCQAJAAkACQCAHQQhxRQ0AAkAgB0E/Sw0AIAAgCUECdGpB7ABqKgIAIQYMAgsgCUF8aiIJIAAoAoABIgcoAgQgBygCACIHa0ECdU8NAiAHIAlBAnRqKgIAIQYMAQtBACAJQf8PcSIJayAJIAfBQQBIG7IhBgsgCEEBRg0BIAa8Qf////8HcUH////7B0oNAiADIAaUQwrXIzyUIQUMAgsQ1QIACyAGQwAAwH8gBrxB/////wdxQYCAgPwHSBshBQsCQCAALQADQRBxRQ0AIAUgAEEAQQIgAhsiAiABIAQQrQMgACACIAEgBBCwA5IiBEMAAAAAIAQgBFsbkiEFCyAFC7MCAgJ9A39DAADAfyEFAkACQCAAIAJBAXRqLwFiIgdBB3EiCA4FAQAAAAEACyAHQQR2IQkCQAJAAkACQCAHQQhxRQ0AAkAgB0E/Sw0AIAAgCUECdGpB7ABqKgIAIQYMAgsgCUF8aiIJIAAoAoABIgcoAgQgBygCACIHa0ECdU8NAiAHIAlBAnRqKgIAIQYMAQtBACAJQf8PcSIJayAJIAfBQQBIG7IhBgsgCEEBRg0BIAa8Qf////8HcUH////7B0oNAiADIAaUQwrXIzyUIQUMAgsQ1QIACyAGQwAAwH8gBrxB/////wdxQYCAgPwHSBshBQsCQCAALQADQRBxRQ0AIAUgAEEAQQIgAhsiAiABIAQQrQMgACACIAEgBBCwA5IiBEMAAAAAIAQgBFsbkiEFCyAFC5YCAgN/An0jAEEQayIEIgUjP0sgBSNASXIEQCAFEDgLIAUkACAEQQhqIABBAkEAIAJBAkYbQQEgAUH+AXFBAkYbIgEgAhCmA0MAAMB/IQdDAADAfyEIAkACQAJAIAQtAAxBf2oOAgABAgsgBCoCCCEIDAELIAMgBCoCCJRDCtcjPJQhCAsgBEEIaiAAIAEgAhClAwJAAkACQCAELQAMQX9qDgIAAQILIAQqAgghBwwBCyAEKgIIQwAAAACUQwrXIzyUIQcLIARBEGoiBiM/SyAGI0BJcgRAIAYQOAsgBiQAQwAAAAAgCCAIQwAAAABdG0MAAAAAIAggCFsbQwAAAAAgByAHQwAAAABdG0MAAAAAIAcgB1sbkguWAgIDfwJ9IwBBEGsiBCIFIz9LIAUjQElyBEAgBRA4CyAFJAAgBEEIaiAAQQBBAiACQQJGG0EDIAFB/gFxQQJGGyIBIAIQpgNDAADAfyEHQwAAwH8hCAJAAkACQCAELQAMQX9qDgIAAQILIAQqAgghCAwBCyADIAQqAgiUQwrXIzyUIQgLIARBCGogACABIAIQpQMCQAJAAkAgBC0ADEF/ag4CAAECCyAEKgIIIQcMAQsgBCoCCEMAAAAAlEMK1yM8lCEHCyAEQRBqIgYjP0sgBiNASXIEQCAGEDgLIAYkAEMAAAAAIAggCEMAAAAAXRtDAAAAACAIIAhbG0MAAAAAIAcgB0MAAAAAXRtDAAAAACAHIAdbG5IL+wMBBX8jAEEgayIBIgQjP0sgBCNASXIEQCAEEDgLIAQkAAJAAkAgACgC4AMNACAAKALsAyAAKALoA2tBAnUhAgwBCwJAAkACQAJAIAAoAuwDIAAoAugDIgNGDQAgAUIANwIUIAEgADYCEAJAIAMoAgAoAhRBgICA4ABxQYCAgMAARw0AQQAhAiMEIgBBADYCACMJQdUBaiABQRBqEBQgACgCACEDIABBADYCAAJAIANBAUcNABAOIQIQugQaIAEoAhgiAEUNBQNAIAAoAgAhAyAAQQwQyQQgAyEAIAMNAAwGCwALIAEoAhANACABKAIURQ0CC0EAIQIDQCMEIgBBADYCACMJQf0BaiABQQRqIAFBEGpBABAgIAAoAgAhAyAAQQA2AgAgA0EBRg0DAkAgASgCDCIARQ0AA0AgACgCACEDIABBDBDJBCADIQAgAw0ACwsgAkEBaiECIAFBADYCDCABKAIQDQAgASgCFA0ADAILAAtBACECIAFBADYCGCABQgA3AxALIAEoAhgiAEUNAgNAIAAoAgAhAyAAQQwQyQQgAyEAIAMNAAwDCwALEA4hAhC6BBogASgCGCIARQ0AA0AgACgCACEDIABBDBDJBCADIQAgAw0ACwsgAhAPAAsgAUEgaiIFIz9LIAUjQElyBEAgBRA4CyAFJAAgAgulBQECfwJAIAAoAugDIgEgACgC7AMiAkYNAANAAkAgASgCACIAKAIUQYCAgOAAcUGAgIDAAEcNACAAQgA3AqABIABCgICAgICAgOD/ADcCmAEgAEIANwKoASAAQoCAgP6HgIDg/wA3ApQDIABCgICA/oeAgOD/ADcCjAMgAEEANgKIAyAAQoCAgPyLgIDAv383AoADIABCgYCAgBA3AvgCIABCgICA/IuAgMC/fzcC8AIgAEKAgID8i4CAwL9/NwLoAiAAQoGAgIAQNwLgAiAAQoCAgPyLgIDAv383AtgCIABCgICA/IuAgMC/fzcC0AIgAEKBgICAEDcCyAIgAEKAgID8i4CAwL9/NwLAAiAAQoCAgPyLgIDAv383ArgCIABCgYCAgBA3ArACIABCgICA/IuAgMC/fzcCqAIgAEKAgID8i4CAwL9/NwKgAiAAQoGAgIAQNwKYAiAAQoCAgPyLgIDAv383ApACIABCgICA/IuAgMC/fzcCiAIgAEKBgICAEDcCgAIgAEKAgID8i4CAwL9/NwL4ASAAQoCAgPyLgIDAv383AvABIABCgYCAgBA3AugBIABCgICA/IuAgMC/fzcC4AEgAEKAgID8i4CAwL9/NwLYASAAQoGAgIAQNwLQASAAQoCAgPyLgIDAv383AsgBIABCgICA/IuAgMC/fzcCwAEgAEKBgICAEDcCuAEgAEKAgID8i4CAwL9/NwKwASAAQgA3AtQDIABCADcCzAMgAEIANwLEAyAAQgA3ArwDIABCADcCtAMgAEIANwKsAyAAQgA3AqQDIABCADcCnAMgAEMAAAAAQQAQ7gMgAEMAAAAAQQEQ7gMgACAALQAAQQFyOgAAIABBABDjAyAAEPcDIAAQrAMLIAFBBGoiASACRw0ACwsLrgICA38CfSMAQRBrIgQiBSM/SyAFI0BJcgRAIAUQOAsgBSQAAkAgAUEETw0AIARBCGogACMGQaQ2aiABQQJ0IgFqKAIAIAIQpgNDAADAfyEHQwAAwH8hCAJAAkACQCAELQAMQX9qDgIAAQILIAQqAgghCAwBCyADIAQqAgiUQwrXIzyUIQgLIARBCGogACMGQaQ2aiABaigCACACEKUDAkACQAJAIAQtAAxBf2oOAgABAgsgBCoCCCEHDAELIAQqAghDAAAAAJRDCtcjPJQhBwsgBEEQaiIGIz9LIAYjQElyBEAgBhA4CyAGJABDAAAAACAIIAhDAAAAAF0bQwAAAAAgCCAIWxtDAAAAACAHIAdDAAAAAF0bQwAAAAAgByAHWxuSDwsjBkGDFWoQzQMAC5ICAQZ/AkACQAJAIAAoAgQiASAAKAIAIgIoAuwDIAIoAugDIgNrQQJ1Tw0AIAMgAUECdGooAgAiBCgCFEGAgIDgAHFBgICAwABHDQIgBCgC7AMgBCgC6AMiA0YNASAAKAIIIQVBDBDFBCIGIAE2AgggBiACNgIEIAYgBTYCACAAQQA2AgQgACAENgIAIAAgBjYCCANAIAMoAgAiAygCFEGAgIDgAHFBgICAwABHDQMgAygC7AMgAygC6ANGDQJBDBDFBCICQQA2AgggAiAENgIEIAIgBjYCACAAQQA2AgQgACADNgIAIAAgAjYCCCACIQYgAyEEIAMoAuwDIAMoAugDIgNHDQALCxClAgALIAAQuwMLC4QFAQF/IABCADcCoAEgAEKAgICAgICA4P8ANwKYASAAQgA3AqgBIABCgICA/oeAgOD/ADcClAMgAEKAgID+h4CA4P8ANwKMAyAAQQA2AogDIABCgICA/IuAgMC/fzcCgAMgAEKBgICAEDcC+AIgAEKAgID8i4CAwL9/NwLwAiAAQoCAgPyLgIDAv383AugCIABCgYCAgBA3AuACIABCgICA/IuAgMC/fzcC2AIgAEKAgID8i4CAwL9/NwLQAiAAQoGAgIAQNwLIAiAAQoCAgPyLgIDAv383AsACIABCgICA/IuAgMC/fzcCuAIgAEKBgICAEDcCsAIgAEKAgID8i4CAwL9/NwKoAiAAQoCAgPyLgIDAv383AqACIABCgYCAgBA3ApgCIABCgICA/IuAgMC/fzcCkAIgAEKAgID8i4CAwL9/NwKIAiAAQoGAgIAQNwKAAiAAQoCAgPyLgIDAv383AvgBIABCgICA/IuAgMC/fzcC8AEgAEKBgICAEDcC6AEgAEKAgID8i4CAwL9/NwLgASAAQoCAgPyLgIDAv383AtgBIABCgYCAgBA3AtABIABCgICA/IuAgMC/fzcCyAEgAEKAgID8i4CAwL9/NwLAASAAQoGAgIAQNwK4ASAAQoCAgPyLgIDAv383ArABIABCADcC1AMgAEIANwLMAyAAQgA3AsQDIABCADcCvAMgAEIANwK0AyAAQgA3AqwDIABCADcCpAMgAEIANwKcAyAAQwAAAABBABDuAyAAQwAAAABBARDuAyAAIAAtAABBAXI6AAAgABD3AwJAIAAoAugDIgEgACgC7AMiAEYNAANAIAEoAgAQrwMgAUEEaiIBIABHDQALCwuuAgIDfwJ9IwBBEGsiBCIFIz9LIAUjQElyBEAgBRA4CyAFJAACQCABQQRPDQAgBEEIaiAAIwZBtDZqIAFBAnQiAWooAgAgAhCmA0MAAMB/IQdDAADAfyEIAkACQAJAIAQtAAxBf2oOAgABAgsgBCoCCCEIDAELIAMgBCoCCJRDCtcjPJQhCAsgBEEIaiAAIwZBtDZqIAFqKAIAIAIQpQMCQAJAAkAgBC0ADEF/ag4CAAECCyAEKgIIIQcMAQsgBCoCCEMAAAAAlEMK1yM8lCEHCyAEQRBqIgYjP0sgBiNASXIEQCAGEDgLIAYkAEMAAAAAIAggCEMAAAAAXRtDAAAAACAIIAhbG0MAAAAAIAcgB0MAAAAAXRtDAAAAACAHIAdbG5IPCyMGQYMVahDNAwALlwEAAkACQAJAIANBf2oOAgABAgsgAi8ACCIDQQdxRQ0BIAAgAUHoAGogAxC6Aw8LIAIvAAoiA0EHcUUNACAAIAFB6ABqIAMQugMPCwJAIAIvAAAiA0EHcUUNACAAIAFB6ABqIAMQugMPCyABQegAaiEDAkAgAi8ADCIBQQdxRQ0AIAAgAyABELoDDwsgACADIAIvABAQugMLlwEAAkACQAJAIANBf2oOAgABAgsgAi8ACiIDQQdxRQ0BIAAgAUHoAGogAxC6Aw8LIAIvAAgiA0EHcUUNACAAIAFB6ABqIAMQugMPCwJAIAIvAAQiA0EHcUUNACAAIAFB6ABqIAMQugMPCyABQegAaiEDAkAgAi8ADCIBQQdxRQ0AIAAgAyABELoDDwsgACADIAIvABAQugML9QMCAn8CfSAALwFYIQMCQAJAAkACQAJAAkAgAUH+AXFBAkcNAEMAAMB/IQUCQCAALwFUIgEgAyABQQdxGyIBQQdxIgMOBQYAAAAGAAsgAUHw/wNxQQR2IQQCQAJAIAFBCHFFDQACQCABQf//A3FBP0sNACAAIARBAnRqQewAaioCACEGDAILIARBfGoiASAAKAKAASIAKAIEIAAoAgAiAGtBAnVPDQQgACABQQJ0aioCACEGDAELQQAgBEH/D3EiAGsgACABwUEASBuyIQYLIANBAUYNASAGvEH/////B3FB////+wdKDQUMBAtDAADAfyEFAkAgAC8BViIBIAMgAUEHcRsiAUEHcSIDDgUFAAAABQALIAFB8P8DcUEEdiEEAkACQCABQQhxRQ0AAkAgAUH//wNxQT9LDQAgACAEQQJ0akHsAGoqAgAhBgwCCyAEQXxqIgEgACgCgAEiACgCBCAAKAIAIgBrQQJ1Tw0DIAAgAUECdGoqAgAhBgwBC0EAIARB/w9xIgBrIAAgAcFBAEgbsiEGCyADQQFHDQILIAZDAADAfyAGi0MAAIB/XRshBQwDCxDVAgALIAa8Qf////8HcUH////7B0oNAQsgAiAGlEMK1yM8lCEFC0MAAAAAIAUgBUMAAAAAXRtDAAAAACAFIAVbGwu3AgEFfwJAIAIgA0cNACABDwtBDBDFBCIEQQA2AgAgBCACKQIENwIEIAQhBQJAAkAgAigCACICIANGDQAgBCEGA0AjBCIHQQA2AgAjCkEMEBIhBSAHKAIAIQggB0EANgIAIAhBAUYNAiAFQQA2AgAgBSACKQIENwIEIAYgBTYCACAFIQYgAigCACICIANHDQALCyAFIAEoAgA2AgAgASAENgIAIAUPC0EAECYhBRC6BBogBRAlGgNAIAQoAgAhBSAEQQwQyQQgBSEEIAUNAAsjBCIFQQA2AgAjMxARIAUoAgAhBCAFQQA2AgACQAJAIARBAUcNACMEIQUQDiECELoEGiAFQQA2AgAjNBARIAUoAgAhBCAFQQA2AgAgBEEBRw0BQQAQJiEFELoEGiAFELwDCwALIAIQDwALnQMCAX4DfyABKQIAIQMgAEEANgIIIAAgAzcCACABKAIIIQQjBCIFQQA2AgAjCUH7AWogAEEIaiIGIAYgBEEAEB8aIAUoAgAhACAFQQA2AgACQAJAIABBAUcNABAOIQUQugQaIAYoAgAiAUUNAQNAIAEoAgAhACABQQwQyQQgACEBIAANAAwCCwALAkACQCABKAIEQQFqIgAgASgCACIFKALsAyAFKALoAyIFa0ECdUkNAANAAkAgASgCCCIADQAgAUIANwIADAMLIAEgACgCBDYCACABIAAoAgg2AgQgASAAKAIANgIIIABBDBDJBCABKAIEQQFqIgAgASgCACIFKALsAyAFKALoAyIFa0ECdU8NAAsLIAEgADYCBCAFIABBAnRqKAIAKAIUQYCAgOAAcUGAgIDAAEcNACMEIgBBADYCACMJQdUBaiABEBQgACgCACEBIABBADYCACABQQFHDQAQDiEFELoEGiAGKAIAIgFFDQEDQCABKAIAIQAgAUEMEMkEIAAhASAADQAMAgsACw8LIAZBADYCACAFEA8AC9sBAAJAAkACQAJAAkAgAg4EBAABAgMLAkAgAS8BICICQQdxRQ0AIAAgAUHoAGogAhC6Aw8LIAFB6ABqIQICQCABLwEsIgNBB3FFDQAgACACIAMQugMPCyAAIAIgAS8BLhC6Aw8LIAAgASABQR5qIAMQsgMPCwJAIAEvASQiAkEHcUUNACAAIAFB6ABqIAIQugMPCyABQegAaiECAkAgAS8BLCIDQQdxRQ0AIAAgAiADELoDDwsgACACIAEvAS4QugMPCyMGQcMbahDNAwALIAAgASABQR5qIAMQsQMLfwEBfQJAAkAgAkECTw0AQQEhAgwBCwJAIAJBA00NACADDwtBACECCyAAQRRqIgAgASACIAQgBRCnAyEGAkAC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ASAEKAIEIghLIgkbaiIFIAUoAgAgASAIQQAgCRtrIghqNgIAIARBDEEEIAkbaiIEIAQoAgAgCGs2AgAgBiABayEGIAUhBCAAKAI8IAUgByAJayIHIANBDGoQNBCuBEUNAAsLIAZBf0cNAQsgACAAKAIsIgE2AhwgACABNgIUIAAgASAAKAIwajYCECACIQEMAQtBACEBIABBADYCHCAAQgA3AxAgACAAKAIAQSByNgIAIAdBAkYNACACIAUoAgRrIQELIANBIGoiCyM/SyALI0BJcgRAIAsQOAsgCyQAIAELYAEDfyMAQRBrIgMiBCM/SyAEI0BJcgRAIAQQOAsgBCQAIAAgASACQf8BcSADQQhqEDUQrgQhAiADKQMIIQEgA0EQaiIFIz9LIAUjQElyBEAgBRA4CyAFJABCfyABIAIbCw4AIAAoAjwgASACEIkECxMAIAIEQCAAIAEgAvwKAAALIAALkQQBA38CQCACQYAESQ0AIAAgASACEIsEDwsgACACaiEDAkACQCABIABzQQNxDQACQAJAIABBA3ENACAAIQIMAQsCQCACDQAgACECDAELIAAhAgNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICQQNxRQ0BIAIgA0kNAAsLIANBfHEhBAJAIANBwABJDQAgAiAEQUBqIgVLDQADQCACIAEoAgA2AgAgAiABKAIENgIEIAIgASgCCDYCCCACIAEoAgw2AgwgAiABKAIQNgIQIAIgASgCFDYCFCACIAEoAhg2AhggAiABKAIcNgIcIAIgASgCIDYCICACIAEoAiQ2AiQgAiABKAIoNgIoIAIgASgCLDYCLCACIAEoAjA2AjAgAiABKAI0NgI0IAIgASgCODYCOCACIAEoAjw2AjwgAUHAAGohASACQcAAaiICIAVNDQALCyACIARPDQEDQCACIAEoAgA2AgAgAUEEaiEBIAJBBGoiAiAESQ0ADAILAAsCQCADQQRPDQAgACECDAELAkAgAkEETw0AIAAhAgwBCyADQXxqIQQgACECA0AgAiABLQAAOgAAIAIgAS0AAToAASACIAEtAAI6AAIgAiABLQADOgADIAFBBGohASACQQRqIgIgBE0NAAsLAkAgAiADTw0AA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgIgA0cNAAsLIAALJAECfwJAIAAQjgRBAWoiARCzBCICDQBBAA8LIAIgACABEIwEC4gBAQN/IAAhAQJAAkAgAEEDcUUNAAJAIAAtAAANACAAIABrDwsgACEBA0AgAUEBaiIBQQNxRQ0BIAEtAAANAAwCCwALA0AgASICQQRqIQFBgIKECCACKAIAIgNrIANyQYCBgoR4cUGAgYKEeEYNAAsDQCACIgFBAWohAiABLQAADQALCyABIABrCwQAQQELAgALBABBAAsCAAsCAAsNAEHUzgAQkgRB2M4ACwkAQdTOABCTBAtcAQF/IAAgACgCSCIBQX9qIAFyNgJIAkAgACgCACIBQQhxRQ0AIAAgAUEgcjYCAEF/DwsgAEIANwIEIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhBBAAvpAQECfyACQQBHIQMCQAJAAkAgAEEDcUUNACACRQ0AIAFB/wFxIQQDQCAALQAAIARGDQIgAkF/aiICQQBHIQMgAEEBaiIAQQNxRQ0BIAINAAsLIANFDQECQCAALQAAIAFB/wFxRg0AIAJBBEkNACABQf8BcUGBgoQIbCEEA0BBgIKECCAAKAIAIARzIgNrIANyQYCBgoR4cUGAgYKEeEcNAiAAQQRqIQAgAkF8aiICQQNLDQALCyACRQ0BCyABQf8BcSEDA0ACQCAALQAAIANHDQAgAA8LIABBAWohACACQX9qIgINAAsLQQALFwEBfyAAQQAgARCXBCICIABrIAEgAhsLBgBB3M4AC48BAgF+AX8CQCAAvSICQjSIp0H/D3EiA0H/D0YNAAJAIAMNAAJAAkAgAEQAAAAAAAAAAGINAEEAIQMMAQsgAEQAAAAAAADwQ6IgARCaBCEAIAEoAgBBQGohAwsgASADNgIAIAAPCyABIANBgnhqNgIAIAJC/////////4eAf4NCgICAgICAgPA/hL8hAAsgAAvRAQEDfwJAAkAgAigCECIDDQBBACEEIAIQlgQNASACKAIQIQMLAkAgASADIAIoAhQiBGtNDQAgAiAAIAEgAigCJBEFAA8LAkACQCACKAJQQQBIDQAgAUUNACABIQMCQANAIAAgA2oiBUF/ai0AAEEKRg0BIANBf2oiA0UNAgwACwALIAIgACADIAIoAiQRBQAiBCADSQ0CIAEgA2shASACKAIUIQQMAQsgACEFQQAhAwsgBCAFIAEQjAQaIAIgAigCFCABajYCFCADIAFqIQQLIAQLWwECfyACIAFsIQQCQAJAIAMoAkxBf0oNACAAIAQgAxCbBCEADAELIAMQjwQhBSAAIAQgAxCbBCEAIAVFDQAgAxCQBAsCQCAAIARHDQAgAkEAIAEbDwsgACABbgvyAgIDfwF+AkAgAkUNACAAIAE6AAAgACACaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAuYAwEGfyMAQdABayIFIgkjP0sgCSNASXIEQCAJEDgLIAkkACAFIAI2AswBIAVBoAFqQQBBKPwLACAFIAUoAswBNgLIAQJAAkBBACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBCfBEEATg0AQX8hBAwBCwJAAkAgACgCTEEATg0AQQEhBgwBCyAAEI8ERSEGCyAAIAAoAgAiB0FfcTYCAAJAAkACQAJAIAAoAjANACAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEIIAAgBTYCLAwBC0EAIQggACgCEA0BC0F/IQIgABCWBA0BCyAAIAEgBUHIAWogBUHQAGogBUGgAWogAyAEEJ8EIQILIAdBIHEhBAJAIAhFDQAgAEEAQQAgACgCJBEFABogAEEANgIwIAAgCDYCLCAAQQA2AhwgACgCFCEDIABCADcDECACQX8gAxshAgsgACAAKAIAIgMgBHI2AgBBfyACIANBIHEbIQQgBg0AIAAQkAQLIAVB0AFqIgojP0sgCiNASXIEQCAKEDgLIAokACAEC8sTAhV/AX4jAEHAAGsiByIaIz9LIBojQElyBEAgGhA4CyAaJAAgByABNgI8IAdBKWohCCAHQSdqIQkgB0EoaiEKQQAhC0EAIQwCQAJAAkACQANAQQAhDQNAIAEhDiANIAxB/////wdzSg0CIA0gDGohDCAOIQ0CQAJAAkACQAJAAkAgDi0AACIPRQ0AA0ACQAJAAkAgD0H/AXEiDw0AIA0hAQwBCyAPQSVHDQEgDSEPA0ACQCAPLQABQSVGDQAgDyEBDAILIA1BAWohDSAPLQACIRAgD0ECaiIBIQ8gEEElRg0ACwsgDSAOayINIAxB/////wdzIg9KDQoCQCAARQ0AIAAgDiANEKAECyANDQggByABNgI8IAFBAWohDUF/IRECQCABLAABQVBqIhBBCUsNACABLQACQSRHDQAgAUEDaiENQQEhCyAQIRELIAcgDTYCPEEAIRICQAJAIA0sAAAiE0FgaiIBQR9NDQAgDSEQDAELQQAhEiANIRBBASABdCIBQYnRBHFFDQADQCAHIA1BAWoiEDYCPCABIBJyIRIgDSwAASITQWBqIgFBIE8NASAQIQ1BASABdCIBQYnRBHENAAsLAkACQCATQSpHDQACQAJAIBAsAAFBUGoiDUEJSw0AIBAtAAJBJEcNAAJAAkAgAA0AIAQgDUECdGpBCjYCAEEAIRQMAQsgAyANQQN0aigCACEUCyAQQQNqIQFBASELDAELIAsNBiAQQQFqIQECQCAADQAgByABNgI8QQAhC0EAIRQMAwsgAiACKAIAIg1BBGo2AgAgDSgCACEUQQAhCwsgByABNgI8IBRBf0oNAUEAIBRrIRQgEkGAwAByIRIMAQsgB0E8ahChBCIUQQBIDQsgBygCPCEBC0EAIQ1BfyEVAkACQCABLQAAQS5GDQBBACEWDAELAkAgAS0AAUEqRw0AAkACQCABLAACQVBqIhBBCUsNACABLQADQSRHDQACQAJAIAANACAEIBBBAnRqQQo2AgBBACEVDAELIAMgEEEDdGooAgAhFQsgAUEEaiEBDAELIAsNBiABQQJqIQECQCAADQBBACEVDAELIAIgAigCACIQQQRqNgIAIBAoAgAhFQsgByABNgI8IBVBf0ohFgwBCyAHIAFBAWo2AjxBASEWIAdBPGoQoQQhFSAHKAI8IQELA0AgDSEQQRwhFyABIhMsAAAiDUGFf2pBRkkNDCATQQFqIQEgEEE6bCANakGfPGotAAAiDUF/akH/AXFBCEkNAAsgByABNgI8AkACQCANQRtGDQAgDUUNDQJAIBFBAEgNAAJAIAANACAEIBFBAnRqIA02AgAMDQsgByADIBFBA3RqKQMANwMwDAILIABFDQkgB0EwaiANIAIgBhCiBAwBCyARQX9KDQxBACENIABFDQkLIAAtAABBIHENDCASQf//e3EiGCASIBJBgMAAcRshEkEAIRFBjwkhGSAKIRcCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBMtAAAiE8AiDUFTcSANIBNBD3FBA0YbIA0gEBsiDUGof2oOIQQXFxcXFxcXFxAXCQYQEBAXBhcXFxcCBQMXFwoXARcXBAALIAohFwJAIA1Bv39qDgcQFwsXEBAQAAsgDUHTAEYNCwwVC0EAIRFBjwkhGSAHKQMwIRwMBQtBACENAkACQAJAAkACQAJAAkAgEA4IAAECAwQdBQYdCyAHKAIwIAw2AgAMHAsgBygCMCAMNgIADBsLIAcoAjAgDKw3AwAMGgsgBygCMCAMOwEADBkLIAcoAjAgDDoAAAwYCyAHKAIwIAw2AgAMFwsgBygCMCAMrDcDAAwWCyAVQQggFUEISxshFSASQQhyIRJB+AAhDQtBACERQY8JIRkgBykDMCIcIAogDUEgcRCjBCEOIBxQDQMgEkEIcUUNAyANQQR2QY8JaiEZQQIhEQwDC0EAIRFBjwkhGSAHKQMwIhwgChCkBCEOIBJBCHFFDQIgFSAIIA5rIg0gFSANShshFQwCCwJAIAcpAzAiHEJ/VQ0AIAdCACAcfSIcNwMwQQEhEUGPCSEZDAELAkAgEkGAEHFFDQBBASERQZAJIRkMAQtBkQlBjwkgEkEBcSIRGyEZCyAcIAoQpQQhDgsgFiAVQQBIcQ0SIBJB//97cSASIBYbIRICQCAcQgBSDQAgFQ0AIAohDiAKIRdBACEVDA8LIBUgCiAOayAcUGoiDSAVIA1KGyEVDA0LIActADAhDQwLCyAHKAIwIg1BqSYgDRshDiAOIA4gFUH/////ByAVQf////8HSRsQmAQiDWohFwJAIBVBf0wNACAYIRIgDSEVDA0LIBghEiANIRUgFy0AAA0QDAwLIAcpAzAiHFBFDQFBACENDAkLAkAgFUUNACAHKAIwIQ8MAgtBACENIABBICAUQQAgEhCmBAwCCyAHQQA2AgwgByAcPgIIIAcgB0EIajYCMCAHQQhqIQ9BfyEVC0EAIQ0CQANAIA8oAgAiEEUNASAHQQRqIBAQsAQiEEEASA0QIBAgFSANa0sNASAPQQRqIQ8gECANaiINIBVJDQALC0E9IRcgDUEASA0NIABBICAUIA0gEhCmBAJAIA0NAEEAIQ0MAQtBACEQIAcoAjAhDwNAIA8oAgAiDkUNASAHQQRqIA4QsAQiDiAQaiIQIA1LDQEgACAHQQRqIA4QoAQgD0EEaiEPIBAgDUkNAAsLIABBICAUIA0gEkGAwABzEKYEIBQgDSAUIA1KGyENDAkLIBYgFUEASHENCkE9IRcgACAHKwMwIBQgFSASIA0gBREiACINQQBODQgMCwsgDS0AASEPIA1BAWohDQwACwALIAANCiALRQ0EQQEhDQJAA0AgBCANQQJ0aigCACIPRQ0BIAMgDUEDdGogDyACIAYQogRBASEMIA1BAWoiDUEKRw0ADAwLAAsCQCANQQpJDQBBASEMDAsLA0AgBCANQQJ0aigCAA0BQQEhDCANQQFqIg1BCkYNCwwACwALQRwhFwwHCyAHIA06ACdBASEVIAkhDiAKIRcgGCESDAELIAohFwsgFSAXIA5rIgEgFSABShsiEyARQf////8Hc0oNA0E9IRcgFCARIBNqIhAgFCAQShsiDSAPSw0EIABBICANIBAgEhCmBCAAIBkgERCgBCAAQTAgDSAQIBJBgIAEcxCmBCAAQTAgEyABQQAQpgQgACAOIAEQoAQgAEEgIA0gECASQYDAAHMQpgQgBygCPCEBDAELCwtBACEMDAMLQT0hFwsQmQQgFzYCAAtBfyEMCyAHQcAAaiIbIz9LIBsjQElyBEAgGxA4CyAbJAAgDAsZAAJAIAAtAABBIHENACABIAIgABCbBBoLC3sBBX9BACEBAkAgACgCACICLAAAQVBqIgNBCU0NAEEADwsDQEF/IQQCQCABQcyZs+YASw0AQX8gAyABQQpsIgFqIAMgAUH/////B3NLGyEECyAAIAJBAWoiAzYCACACLAABIQUgBCEBIAMhAiAFQVBqIgNBCkkNAAsgBAu2BAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQXdqDhIAAQIFAwQGBwgJCgsMDQ4PEBESCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCyACIAIoAgAiAUEEajYCACAAIAE0AgA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE1AgA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE0AgA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE1AgA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAEpAwA3AwAPCyACIAIoAgAiAUEEajYCACAAIAEyAQA3AwAPCyACIAIoAgAiAUEEajYCACAAIAEzAQA3AwAPCyACIAIoAgAiAUEEajYCACAAIAEwAAA3AwAPCyACIAIoAgAiAUEEajYCACAAIAExAAA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAEpAwA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE1AgA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAEpAwA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAEpAwA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE0AgA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE1AgA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAErAwA5AwAPCyAAIAIgAxECAAsLOgEBfwJAIABQDQADQCABQX9qIgEgAKdBD3EtALBAIAJyOgAAIABCD1YhAyAAQgSIIQAgAw0ACwsgAQs2AQF/AkAgAFANAANAIAFBf2oiASAAp0EHcUEwcjoAACAAQgdWIQIgAEIDiCEAIAINAAsLIAELigECAX4DfwJAAkAgAEKAgICAEFoNACAAIQIMAQsDQCABQX9qIgEgACAAQgqAIgJCCn59p0EwcjoAACAAQv////+fAVYhAyACIQAgAw0ACwsCQCACUA0AIAKnIQMDQCABQX9qIgEgAyADQQpuIgRBCmxrQTByOgAAIANBCUshBSAEIQMgBQ0ACwsgAQuXAQEDfyMAQYACayIFIgYjP0sgBiNASXIEQCAGEDgLIAYkAAJAIAIgA0wNACAEQYDABHENACAFIAEgAiADayIDQYACIANBgAJJIgIbEJ0EGgJAIAINAANAIAAgBUGAAhCgBCADQYB+aiIDQf8BSw0ACwsgACAFIAMQoAQLIAVBgAJqIgcjP0sgByNASXIEQCAHEDgLIAckAAsRACAAIAEgAkGRAkGSAhCeBAvcGAMUfwN+AXwjAEGwBGsiBiIYIz9LIBgjQElyBEAgGBA4CyAYJABBACEHIAZBADYCLAJAAkAgARCqBCIaQn9VDQBBASEIQZkJIQkgAZoiARCqBCEaDAELAkAgBEGAEHFFDQBBASEIQZwJIQkMAQtBnwlBmgkgBEEBcSIIGyEJIAhFIQcLAkACQCAaQoCAgICAgID4/wCDQoCAgICAgID4/wBSDQAgAEEgIAIgCEEDaiIKIARB//97cRCmBCAAIAkgCBCgBCAAQegVQbEfIAVBIHEiCxtBhxpBtR8gCxsgASABYhtBAxCgBCAAQSAgAiAKIARBgMAAcxCmBCACIAogAiAKShshDAwBCyAGQRBqIQ0CQAJAAkACQCABIAZBLGoQmgQiASABoCIBRAAAAAAAAAAAYQ0AIAYgBigCLCIKQX9qNgIsIAVBIHIiDkHhAEcNAQwDCyAFQSByIg5B4QBGDQJBBiADIANBAEgbIQ8gBigCLCEQDAELIAYgCkFjaiIQNgIsQQYgAyADQQBIGyEPIAFEAAAAAAAAsEGiIQELIAZBMGpBAEGgAiAQQQBIG2oiESELA0AgCyAB/AMiCjYCACALQQRqIQsgASAKuKFEAAAAAGXNzUGiIgFEAAAAAAAAAABiDQALAkACQCAQQQFODQAgECESIAshCiARIRMMAQsgESETIBAhEgNAIBJBHSASQR1JGyESAkAgC0F8aiIKIBNJDQAgEq0hG0IAIRoDQCAKIAo1AgAgG4YgGnwiHCAcQoCU69wDgCIaQoCU69wDfn0+AgAgCkF8aiIKIBNPDQALIBxCgJTr3ANUDQAgE0F8aiITIBo+AgALAkADQCALIgogE00NASAKQXxqIgsoAgBFDQALCyAGIAYoAiwgEmsiEjYCLCAKIQsgEkEASg0ACwsCQCASQX9KDQAgD0EZakEJbkEBaiEUIA5B5gBGIRUDQEEAIBJrIgtBCSALQQlJGyEMAkACQCATIApJDQBBAEEEIBMoAgAbIQsMAQtBgJTr3AMgDHYhFkF/IAx0QX9zIRdBACESIBMhCwNAIAsgCygCACIDIAx2IBJqNgIAIAMgF3EgFmwhEiALQQRqIgsgCkkNAAtBAEEEIBMoAgAbIQsgEkUNACAKIBI2AgAgCkEEaiEKCyAGIAYoAiwgDGoiEjYCLCARIBMgC2oiEyAVGyILIBRBAnRqIAogCiALa0ECdSAUShshCiASQQBIDQALC0EAIRICQCATIApPDQAgESATa0ECdUEJbCESQQohCyATKAIAIgNBCkkNAANAIBJBAWohEiADIAtBCmwiC08NAAsLAkAgD0EAIBIgDkHmAEYbayAPQQBHIA5B5wBGcWsiCyAKIBFrQQJ1QQlsQXdqTg0AIAZBMGpBhGBBpGIgEEEASBtqIAtBgMgAaiIDQQltIhZBAnRqIQxBCiELAkAgAyAWQQlsayIDQQdKDQADQCALQQpsIQsgA0EBaiIDQQhHDQALCyAMQQRqIRcCQAJAIAwoAgAiAyADIAtuIhQgC2xrIhYNACAXIApGDQELAkACQCAUQQFxDQBEAAAAAAAAQEMhASALQYCU69wDRw0BIAwgE00NASAMQXxqLQAAQQFxRQ0BC0QBAAAAAABAQyEBC0QAAAAAAADgP0QAAAAAAADwP0QAAAAAAAD4PyAXIApGG0QAAAAAAAD4PyAWIAtBAXYiF0YbIBYgF0kbIR0CQCAHDQAgCS0AAEEtRw0AIB2aIR0gAZohAQsgDCADIBZrIgM2AgAgASAdoCABYQ0AIAwgAyALaiILNgIAAkAgC0GAlOvcA0kNAANAIAxBADYCAAJAIAxBfGoiDCATTw0AIBNBfGoiE0EANgIACyAMIAwoAgBBAWoiCzYCACALQf+T69wDSw0ACwsgESATa0ECdUEJbCESQQohCyATKAIAIgNBCkkNAANAIBJBAWohEiADIAtBCmwiC08NAAsLIAxBBGoiCyAKIAogC0sbIQoLAkADQCAKIgsgE00iAw0BIAtBfGoiCigCAEUNAAsLAkACQCAOQecARg0AIARBCHEhFgwBCyASQX9zQX8gD0EBIA8bIgogEkogEkF7SnEiDBsgCmohD0F/QX4gDBsgBWohBSAEQQhxIhYNAEF3IQoCQCADDQAgC0F8aigCACIMRQ0AQQohA0EAIQogDEEKcA0AA0AgCiIWQQFqIQogDCADQQpsIgNwRQ0ACyAWQX9zIQoLIAsgEWtBAnVBCWwhAwJAIAVBX3FBxgBHDQBBACEWIA8gAyAKakF3aiIKQQAgCkEAShsiCiAPIApIGyEPDAELQQAhFiAPIBIgA2ogCmpBd2oiCkEAIApBAEobIgogDyAKSBshDwtBfyEMIA9B/f///wdB/v///wcgDyAWciIXG0oNASAPIBdBAEdqQQFqIQMCQAJAIAVBX3EiFUHGAEcNACASIANB/////wdzSg0DIBJBACASQQBKGyEKDAELAkAgDSASIBJBH3UiCnMgCmutIA0QpQQiCmtBAUoNAANAIApBf2oiCkEwOgAAIA0gCmtBAkgNAAsLIApBfmoiFCAFOgAAQX8hDCAKQX9qQS1BKyASQQBIGzoAACANIBRrIgogA0H/////B3NKDQILQX8hDCAKIANqIgogCEH/////B3NKDQEgAEEgIAIgCiAIaiIFIAQQpgQgACAJIAgQoAQgAEEwIAIgBSAEQYCABHMQpgQCQAJAAkACQCAVQcYARw0AIAZBEGpBCXIhEiARIBMgEyARSxsiAyETA0AgEzUCACASEKUEIQoCQAJAIBMgA0YNACAKIAZBEGpNDQEDQCAKQX9qIgpBMDoAACAKIAZBEGpLDQAMAgsACyAKIBJHDQAgCkF/aiIKQTA6AAALIAAgCiASIAprEKAEIBNBBGoiEyARTQ0ACwJAIBdFDQAgAEGnJkEBEKAECyATIAtPDQEgD0EBSA0BA0ACQCATNQIAIBIQpQQiCiAGQRBqTQ0AA0AgCkF/aiIKQTA6AAAgCiAGQRBqSw0ACwsgACAKIA9BCSAPQQlIGxCgBCAPQXdqIQogE0EEaiITIAtPDQMgD0EJSiEDIAohDyADDQAMAwsACwJAIA9BAEgNACALIBNBBGogCyATSxshDCAGQRBqQQlyIRIgEyELA0ACQCALNQIAIBIQpQQiCiASRw0AIApBf2oiCkEwOgAACwJAAkAgCyATRg0AIAogBkEQak0NAQNAIApBf2oiCkEwOgAAIAogBkEQaksNAAwCCwALIAAgCkEBEKAEIApBAWohCiAPIBZyRQ0AIABBpyZBARCgBAsgACAKIBIgCmsiAyAPIA8gA0obEKAEIA8gA2shDyALQQRqIgsgDE8NASAPQX9KDQALCyAAQTAgD0ESakESQQAQpgQgACAUIA0gFGsQoAQMAgsgDyEKCyAAQTAgCkEJakEJQQAQpgQLIABBICACIAUgBEGAwABzEKYEIAIgBSACIAVKGyEMDAELIAkgBUEadEEfdUEJcWohFAJAIANBC0sNAEEMIANrIQpEAAAAAAAAMEAhHQNAIB1EAAAAAAAAMECiIR0gCkF/aiIKDQALAkAgFC0AAEEtRw0AIB0gAZogHaGgmiEBDAELIAEgHaAgHaEhAQsCQCAGKAIsIgsgC0EfdSIKcyAKa60gDRClBCIKIA1HDQAgCkF/aiIKQTA6AAAgBigCLCELCyAIQQJyIRYgBUEgcSETIApBfmoiFyAFQQ9qOgAAIApBf2pBLUErIAtBAEgbOgAAIANBAUggBEEIcUVxIRIgBkEQaiELA0AgCyIKIAH8AiILQbDAAGotAAAgE3I6AAAgASALt6FEAAAAAAAAMECiIQECQCAKQQFqIgsgBkEQamtBAUcNACABRAAAAAAAAAAAYSAScQ0AIApBLjoAASAKQQJqIQsLIAFEAAAAAAAAAABiDQALQX8hDCADQf3///8HIBYgDSAXayITaiISa0oNACAAQSAgAiASIANBAmogCyAGQRBqayIKIApBfmogA0gbIAogAxsiA2oiCyAEEKYEIAAgFCAWEKAEIABBMCACIAsgBEGAgARzEKYEIAAgBkEQaiAKEKAEIABBMCADIAprQQBBABCmBCAAIBcgExCgBCAAQSAgAiALIARBgMAAcxCmBCACIAsgAiALShshDAsgBkGwBGoiGSM/SyAZI0BJcgRAIBkQOAsgGSQAIAwLKwEBfyABIAEoAgBBB2pBeHEiAkEQajYCACAAIAIpAwAgAikDCBDBBDkDAAsFACAAvQsEAEEACwQAQgALDQBBoMsAIAAgARCnBAsWAAJAIAANAEEADwsQmQQgADYCAEF/C6MCAQF/QQEhAwJAAkAgAEUNACABQf8ATQ0BAkACQBCEBCgCYCgCAA0AIAFBgH9xQYC/A0YNAxCZBEEZNgIADAELAkAgAUH/D0sNACAAIAFBP3FBgAFyOgABIAAgAUEGdkHAAXI6AABBAg8LAkACQCABQYCwA0kNACABQYBAcUGAwANHDQELIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCwJAIAFBgIB8akH//z9LDQAgACABQT9xQYABcjoAAyAAIAFBEnZB8AFyOgAAIAAgAUEGdkE/cUGAAXI6AAIgACABQQx2QT9xQYABcjoAAUEEDwsQmQRBGTYCAAtBfyEDCyADDwsgACABOgAAQQELFQACQCAADQBBAA8LIAAgAUEAEK8ECy8AAkAgAkUNAANAAkAgACgCACABRw0AIAAPCyAAQQRqIQAgAkF/aiICDQALC0EACwUAEDYAC6ckAQ5/IwBBEGsiASINIz9LIA0jQElyBEAgDRA4CyANJAACQAJAAkACQAJAIABB9AFLDQACQEEAKALoViICQRAgAEELakH4A3EgAEELSRsiA0EDdiIEdiIAQQNxRQ0AAkACQCAAQX9zQQFxIARqIgVBA3QiA0GQ1wBqIgYgAygCmFciBCgCCCIARw0AQQAgAkF+IAV3cTYC6FYMAQsgAEEAKAL4VkkNBCAAKAIMIARHDQQgACAGNgIMIAYgADYCCAsgBEEIaiEAIAQgA0EDcjYCBCAEIANqIgQgBCgCBEEBcjYCBAwFCyADQQAoAvBWIgdNDQECQCAARQ0AAkACQCAAIAR0QQIgBHQiAEEAIABrcnFoIghBA3QiBEGQ1wBqIgUgBCgCmFciACgCCCIGRw0AQQAgAkF+IAh3cSICNgLoVgwBCyAGQQAoAvhWSQ0EIAYoAgwgAEcNBCAGIAU2AgwgBSAGNgIICyAAIANBA3I2AgQgACADaiIFIAQgA2siA0EBcjYCBCAAIARqIAM2AgACQCAHRQ0AIAdBeHFBkNcAaiEGQQAoAvxWIQQCQAJAIAJBASAHQQN2dCIIcQ0AQQAgAiAIcjYC6FYgBiEIDAELIAYoAggiCEEAKAL4VkkNBQsgBiAENgIIIAggBDYCDCAEIAY2AgwgBCAINgIICyAAQQhqIQBBACAFNgL8VkEAIAM2AvBWDAULQQAoAuxWIglFDQEgCWhBAnQoAphZIgUoAgRBeHEgA2shBCAFIQYCQANAAkAgBigCECIADQAgBigCFCIARQ0CCyAAKAIEQXhxIANrIgYgBCAGIARJIgYbIQQgACAFIAYbIQUgACEGDAALAAsgBUEAKAL4ViIKSQ0CIAUoAhghCwJAAkAgBSgCDCIAIAVGDQAgBSgCCCIGIApJDQQgBigCDCAFRw0EIAAoAgggBUcNBCAGIAA2AgwgACAGNgIIDAELAkACQAJAIAUoAhQiBkUNACAFQRRqIQgMAQsgBSgCECIGRQ0BIAVBEGohCAsDQCAIIQwgBiIAQRRqIQggACgCFCIGDQAgAEEQaiEIIAAoAhAiBg0ACyAMIApJDQQgDEEANgIADAELQQAhAAsCQCALRQ0AAkACQCAFIAUoAhwiCEECdCIGKAKYWUcNACAGQZjZAGogADYCACAADQFBACAJQX4gCHdxNgLsVgwCCyALIApJDQQCQAJAIAsoAhAgBUcNACALIAA2AhAMAQsgCyAANgIUCyAARQ0BCyAAIApJDQMgACALNgIYAkAgBSgCECIGRQ0AIAYgCkkNBCAAIAY2AhAgBiAANgIYCyAFKAIUIgZFDQAgBiAKSQ0DIAAgBjYCFCAGIAA2AhgLAkACQCAEQQ9LDQAgBSAEIANqIgBBA3I2AgQgBSAAaiIAIAAoAgRBAXI2AgQMAQsgBSADQQNyNgIEIAUgA2oiAyAEQQFyNgIEIAMgBGogBDYCAAJAIAdFDQAgB0F4cUGQ1wBqIQZBACgC/FYhAAJAAkBBASAHQQN2dCIIIAJxDQBBACAIIAJyNgLoViAGIQgMAQsgBigCCCIIIApJDQULIAYgADYCCCAIIAA2AgwgACAGNgIMIAAgCDYCCAtBACADNgL8VkEAIAQ2AvBWCyAFQQhqIQAMBAtBfyEDIABBv39LDQAgAEELaiIEQXhxIQNBACgC7FYiC0UNAEEfIQcCQCAAQfT//wdLDQAgA0EmIARBCHZnIgBrdkEBcSAAQQF0a0E+aiEHC0EAIANrIQQCQAJAAkACQCAHQQJ0KAKYWSIGDQBBACEAQQAhCAwBC0EAIQAgA0EAQRkgB0EBdmsgB0EfRht0IQVBACEIA0ACQCAGKAIEQXhxIANrIgIgBE8NACACIQQgBiEIIAINAEEAIQQgBiEIIAYhAAwDCyAAIAYoAhQiAiACIAYgBUEddkEEcWooAhAiDEYbIAAgAhshACAFQQF0IQUgDCEGIAwNAAsLAkAgACAIcg0AQQAhCEECIAd0IgBBACAAa3IgC3EiAEUNAyAAaEECdCgCmFkhAAsgAEUNAQsDQCAAKAIEQXhxIANrIgIgBEkhBQJAIAAoAhAiBg0AIAAoAhQhBgsgAiAEIAUbIQQgACAIIAUbIQggBiEAIAYNAAsLIAhFDQAgBEEAKALwViADa08NACAIQQAoAvhWIgxJDQEgCCgCGCEHAkACQCAIKAIMIgAgCEYNACAIKAIIIgYgDEkNAyAGKAIMIAhHDQMgACgCCCAIRw0DIAYgADYCDCAAIAY2AggMAQsCQAJAAkAgCCgCFCIGRQ0AIAhBFGohBQwBCyAIKAIQIgZFDQEgCEEQaiEFCwNAIAUhAiAGIgBBFGohBSAAKAIUIgYNACAAQRBqIQUgACgCECIGDQALIAIgDEkNAyACQQA2AgAMAQtBACEACwJAIAdFDQACQAJAIAggCCgCHCIFQQJ0IgYoAphZRw0AIAZBmNkAaiAANgIAIAANAUEAIAtBfiAFd3EiCzYC7FYMAgsgByAMSQ0DAkACQCAHKAIQIAhHDQAgByAANgIQDAELIAcgADYCFAsgAEUNAQsgACAMSQ0CIAAgBzYCGAJAIAgoAhAiBkUNACAGIAxJDQMgACAGNgIQIAYgADYCGAsgCCgCFCIGRQ0AIAYgDEkNAiAAIAY2AhQgBiAANgIYCwJAAkAgBEEPSw0AIAggBCADaiIAQQNyNgIEIAggAGoiACAAKAIEQQFyNgIEDAELIAggA0EDcjYCBCAIIANqIgUgBEEBcjYCBCAFIARqIAQ2AgACQCAEQf8BSw0AIARB+AFxQZDXAGohAAJAAkBBACgC6FYiA0EBIARBA3Z0IgRxDQBBACADIARyNgLoViAAIQQMAQsgACgCCCIEIAxJDQQLIAAgBTYCCCAEIAU2AgwgBSAANgIMIAUgBDYCCAwBC0EfIQACQCAEQf///wdLDQAgBEEmIARBCHZnIgBrdkEBcSAAQQF0a0E+aiEACyAFIAA2AhwgBUIANwIQIABBAnRBmNkAaiEDAkACQAJAIAtBASAAdCIGcQ0AQQAgCyAGcjYC7FYgAyAFNgIAIAUgAzYCGAwBCyAEQQBBGSAAQQF2ayAAQR9GG3QhACADKAIAIQYDQCAGIgMoAgRBeHEgBEYNAiAAQR12IQYgAEEBdCEAIAMgBkEEcWoiAigCECIGDQALIAJBEGoiACAMSQ0EIAAgBTYCACAFIAM2AhgLIAUgBTYCDCAFIAU2AggMAQsgAyAMSQ0CIAMoAggiACAMSQ0CIAAgBTYCDCADIAU2AgggBUEANgIYIAUgAzYCDCAFIAA2AggLIAhBCGohAAwDCwJAQQAoAvBWIgAgA0kNAEEAKAL8ViEEAkACQCAAIANrIgZBEEkNACAEIANqIgUgBkEBcjYCBCAEIABqIAY2AgAgBCADQQNyNgIEDAELIAQgAEEDcjYCBCAEIABqIgAgACgCBEEBcjYCBEEAIQVBACEGC0EAIAY2AvBWQQAgBTYC/FYgBEEIaiEADAMLAkBBACgC9FYiBSADTQ0AQQAgBSADayIENgL0VkEAQQAoAoBXIgAgA2oiBjYCgFcgBiAEQQFyNgIEIAAgA0EDcjYCBCAAQQhqIQAMAwsCQAJAQQAoAsBaRQ0AQQAoAshaIQQMAQtBAEJ/NwLMWkEAQoCggICAgAQ3AsRaQQAgAUEMakFwcUHYqtWqBXM2AsBaQQBBADYC1FpBAEEANgKkWkGAICEEC0EAIQAgBCADQS9qIgdqIgJBACAEayIMcSIIIANNDQJBACEAAkBBACgCoFoiBEUNAEEAKAKYWiIGIAhqIgsgBk0NAyALIARLDQMLAkACQAJAQQAtAKRaQQRxDQACQAJAAkACQAJAQQAoAoBXIgRFDQBBqNoAIQADQAJAIAQgACgCACIGSQ0AIAQgBiAAKAIEakkNAwsgACgCCCIADQALC0EAELcEIgVBf0YNAyAIIQICQEEAKALEWiIAQX9qIgQgBXFFDQAgCCAFayAEIAVqQQAgAGtxaiECCyACIANNDQMCQEEAKAKgWiIARQ0AQQAoAphaIgQgAmoiBiAETQ0EIAYgAEsNBAsgAhC3BCIAIAVHDQEMBQsgAiAFayAMcSICELcEIgUgACgCACAAKAIEakYNASAFIQALIABBf0YNAQJAIAIgA0EwakkNACAAIQUMBAsgByACa0EAKALIWiIEakEAIARrcSIEELcEQX9GDQEgBCACaiECIAAhBQwDCyAFQX9HDQILQQBBACgCpFpBBHI2AqRaCyAIELcEIQVBABC3BCEAIAVBf0YNASAAQX9GDQEgBSAATw0BIAAgBWsiAiADQShqTQ0BC0EAQQAoAphaIAJqIgA2AphaAkAgAEEAKAKcWk0NAEEAIAA2ApxaCwJAAkACQAJAQQAoAoBXIgRFDQBBqNoAIQADQCAFIAAoAgAiBiAAKAIEIghqRg0CIAAoAggiAA0ADAMLAAsCQAJAQQAoAvhWIgBFDQAgBSAATw0BC0EAIAU2AvhWC0EAIQBBACACNgKsWkEAIAU2AqhaQQBBfzYCiFdBAEEAKALAWjYCjFdBAEEANgK0WgNAIABBA3QiBCAEQZDXAGoiBjYCmFcgBCAGNgKcVyAAQQFqIgBBIEcNAAtBACACQVhqIgBBeCAFa0EHcSIEayIGNgL0VkEAIAUgBGoiBDYCgFcgBCAGQQFyNgIEIAUgAGpBKDYCBEEAQQAoAtBaNgKEVwwCCyAEIAVPDQAgBCAGSQ0AIAAoAgxBCHENACAAIAggAmo2AgRBACAEQXggBGtBB3EiAGoiBjYCgFdBAEEAKAL0ViACaiIFIABrIgA2AvRWIAYgAEEBcjYCBCAEIAVqQSg2AgRBAEEAKALQWjYChFcMAQsCQCAFQQAoAvhWTw0AQQAgBTYC+FYLIAUgAmohBkGo2gAhAAJAAkADQCAAKAIAIgggBkYNASAAKAIIIgANAAwCCwALIAAtAAxBCHFFDQQLQajaACEAAkADQAJAIAQgACgCACIGSQ0AIAQgBiAAKAIEaiIGSQ0CCyAAKAIIIQAMAAsAC0EAIAJBWGoiAEF4IAVrQQdxIghrIgw2AvRWQQAgBSAIaiIINgKAVyAIIAxBAXI2AgQgBSAAakEoNgIEQQBBACgC0Fo2AoRXIAQgBkEnIAZrQQdxakFRaiIAIAAgBEEQakkbIghBGzYCBCAIQQApArBaNwIQIAhBACkCqFo3AghBACAIQQhqNgKwWkEAIAI2AqxaQQAgBTYCqFpBAEEANgK0WiAIQRhqIQADQCAAQQc2AgQgAEEIaiEFIABBBGohACAFIAZJDQALIAggBEYNACAIIAgoAgRBfnE2AgQgBCAIIARrIgVBAXI2AgQgCCAFNgIAAkACQCAFQf8BSw0AIAVB+AFxQZDXAGohAAJAAkBBACgC6FYiBkEBIAVBA3Z0IgVxDQBBACAGIAVyNgLoViAAIQYMAQsgACgCCCIGQQAoAvhWSQ0FCyAAIAQ2AgggBiAENgIMQQwhBUEIIQgMAQtBHyEAAkAgBUH///8HSw0AIAVBJiAFQQh2ZyIAa3ZBAXEgAEEBdGtBPmohAAsgBCAANgIcIARCADcCECAAQQJ0QZjZAGohBgJAAkACQEEAKALsViIIQQEgAHQiAnENAEEAIAggAnI2AuxWIAYgBDYCACAEIAY2AhgMAQsgBUEAQRkgAEEBdmsgAEEfRht0IQAgBigCACEIA0AgCCIGKAIEQXhxIAVGDQIgAEEddiEIIABBAXQhACAGIAhBBHFqIgIoAhAiCA0ACyACQRBqIgBBACgC+FZJDQUgACAENgIAIAQgBjYCGAtBCCEFQQwhCCAEIQYgBCEADAELIAZBACgC+FYiBUkNAyAGKAIIIgAgBUkNAyAAIAQ2AgwgBiAENgIIIAQgADYCCEEAIQBBGCEFQQwhCAsgBCAIaiAGNgIAIAQgBWogADYCAAtBACgC9FYiACADTQ0AQQAgACADayIENgL0VkEAQQAoAoBXIgAgA2oiBjYCgFcgBiAEQQFyNgIEIAAgA0EDcjYCBCAAQQhqIQAMAwsQmQRBMDYCAEEAIQAMAgsQsgQACyAAIAU2AgAgACAAKAIEIAJqNgIEIAUgCCADELQEIQALIAFBEGoiDiM/SyAOI0BJcgRAIA4QOAsgDiQAIAALsQkBB38gAEF4IABrQQdxaiIDIAJBA3I2AgQgAUF4IAFrQQdxaiIEIAMgAmoiBWshAAJAAkACQCAEQQAoAoBXRw0AQQAgBTYCgFdBAEEAKAL0ViAAaiICNgL0ViAFIAJBAXI2AgQMAQsCQCAEQQAoAvxWRw0AQQAgBTYC/FZBAEEAKALwViAAaiICNgLwViAFIAJBAXI2AgQgBSACaiACNgIADAELAkAgBCgCBCIGQQNxQQFHDQAgBCgCDCECAkACQCAGQf8BSw0AAkAgBCgCCCIBIAZB+AFxQZDXAGoiB0YNACABQQAoAvhWSQ0FIAEoAgwgBEcNBQsCQCACIAFHDQBBAEEAKALoVkF+IAZBA3Z3cTYC6FYMAgsCQCACIAdGDQAgAkEAKAL4VkkNBSACKAIIIARHDQULIAEgAjYCDCACIAE2AggMAQsgBCgCGCEIAkACQCACIARGDQAgBCgCCCIBQQAoAvhWSQ0FIAEoAgwgBEcNBSACKAIIIARHDQUgASACNgIMIAIgATYCCAwBCwJAAkACQCAEKAIUIgFFDQAgBEEUaiEHDAELIAQoAhAiAUUNASAEQRBqIQcLA0AgByEJIAEiAkEUaiEHIAIoAhQiAQ0AIAJBEGohByACKAIQIgENAAsgCUEAKAL4VkkNBSAJQQA2AgAMAQtBACECCyAIRQ0AAkACQCAEIAQoAhwiB0ECdCIBKAKYWUcNACABQZjZAGogAjYCACACDQFBAEEAKALsVkF+IAd3cTYC7FYMAgsgCEEAKAL4VkkNBAJAAkAgCCgCECAERw0AIAggAjYCEAwBCyAIIAI2AhQLIAJFDQELIAJBACgC+FYiB0kNAyACIAg2AhgCQCAEKAIQIgFFDQAgASAHSQ0EIAIgATYCECABIAI2AhgLIAQoAhQiAUUNACABIAdJDQMgAiABNgIUIAEgAjYCGAsgBkF4cSICIABqIQAgBCACaiIEKAIEIQYLIAQgBkF+cTYCBCAFIABBAXI2AgQgBSAAaiAANgIAAkAgAEH/AUsNACAAQfgBcUGQ1wBqIQICQAJAQQAoAuhWIgFBASAAQQN2dCIAcQ0AQQAgASAAcjYC6FYgAiEADAELIAIoAggiAEEAKAL4VkkNAwsgAiAFNgIIIAAgBTYCDCAFIAI2AgwgBSAANgIIDAELQR8hAgJAIABB////B0sNACAAQSYgAEEIdmciAmt2QQFxIAJBAXRrQT5qIQILIAUgAjYCHCAFQgA3AhAgAkECdEGY2QBqIQECQAJAAkBBACgC7FYiB0EBIAJ0IgRxDQBBACAHIARyNgLsViABIAU2AgAgBSABNgIYDAELIABBAEEZIAJBAXZrIAJBH0YbdCECIAEoAgAhBwNAIAciASgCBEF4cSAARg0CIAJBHXYhByACQQF0IQIgASAHQQRxaiIEKAIQIgcNAAsgBEEQaiICQQAoAvhWSQ0DIAIgBTYCACAFIAE2AhgLIAUgBTYCDCAFIAU2AggMAQsgAUEAKAL4ViIASQ0BIAEoAggiAiAASQ0BIAIgBTYCDCABIAU2AgggBUEANgIYIAUgATYCDCAFIAI2AggLIANBCGoPCxCyBAAL2A4BCn8CQAJAIABFDQAgAEF4aiIBQQAoAvhWIgJJDQEgAEF8aigCACIDQQNxQQFGDQEgASADQXhxIgBqIQQCQCADQQFxDQAgA0ECcUUNASABIAEoAgAiBWsiASACSQ0CIAUgAGohAAJAIAFBACgC/FZGDQAgASgCDCEDAkAgBUH/AUsNAAJAIAEoAggiBiAFQfgBcUGQ1wBqIgdGDQAgBiACSQ0FIAYoAgwgAUcNBQsCQCADIAZHDQBBAEEAKALoVkF+IAVBA3Z3cTYC6FYMAwsCQCADIAdGDQAgAyACSQ0FIAMoAgggAUcNBQsgBiADNgIMIAMgBjYCCAwCCyABKAIYIQgCQAJAIAMgAUYNACABKAIIIgUgAkkNBSAFKAIMIAFHDQUgAygCCCABRw0FIAUgAzYCDCADIAU2AggMAQsCQAJAAkAgASgCFCIFRQ0AIAFBFGohBgwBCyABKAIQIgVFDQEgAUEQaiEGCwNAIAYhByAFIgNBFGohBiADKAIUIgUNACADQRBqIQYgAygCECIFDQALIAcgAkkNBSAHQQA2AgAMAQtBACEDCyAIRQ0BAkACQCABIAEoAhwiBkECdCIFKAKYWUcNACAFQZjZAGogAzYCACADDQFBAEEAKALsVkF+IAZ3cTYC7FYMAwsgCCACSQ0EAkACQCAIKAIQIAFHDQAgCCADNgIQDAELIAggAzYCFAsgA0UNAgsgAyACSQ0DIAMgCDYCGAJAIAEoAhAiBUUNACAFIAJJDQQgAyAFNgIQIAUgAzYCGAsgASgCFCIFRQ0BIAUgAkkNAyADIAU2AhQgBSADNgIYDAELIAQoAgQiA0EDcUEDRw0AQQAgADYC8FYgBCADQX5xNgIEIAEgAEEBcjYCBCAEIAA2AgAPCyABIARPDQEgBCgCBCIHQQFxRQ0BAkACQCAHQQJxDQACQCAEQQAoAoBXRw0AQQAgATYCgFdBAEEAKAL0ViAAaiIANgL0ViABIABBAXI2AgQgAUEAKAL8VkcNA0EAQQA2AvBWQQBBADYC/FYPCwJAIARBACgC/FYiCUcNAEEAIAE2AvxWQQBBACgC8FYgAGoiADYC8FYgASAAQQFyNgIEIAEgAGogADYCAA8LIAQoAgwhAwJAAkAgB0H/AUsNAAJAIAQoAggiBSAHQfgBcUGQ1wBqIgZGDQAgBSACSQ0GIAUoAgwgBEcNBgsCQCADIAVHDQBBAEEAKALoVkF+IAdBA3Z3cTYC6FYMAgsCQCADIAZGDQAgAyACSQ0GIAMoAgggBEcNBgsgBSADNgIMIAMgBTYCCAwBCyAEKAIYIQoCQAJAIAMgBEYNACAEKAIIIgUgAkkNBiAFKAIMIARHDQYgAygCCCAERw0GIAUgAzYCDCADIAU2AggMAQsCQAJAAkAgBCgCFCIFRQ0AIARBFGohBgwBCyAEKAIQIgVFDQEgBEEQaiEGCwNAIAYhCCAFIgNBFGohBiADKAIUIgUNACADQRBqIQYgAygCECIFDQALIAggAkkNBiAIQQA2AgAMAQtBACEDCyAKRQ0AAkACQCAEIAQoAhwiBkECdCIFKAKYWUcNACAFQZjZAGogAzYCACADDQFBAEEAKALsVkF+IAZ3cTYC7FYMAgsgCiACSQ0FAkACQCAKKAIQIARHDQAgCiADNgIQDAELIAogAzYCFAsgA0UNAQsgAyACSQ0EIAMgCjYCGAJAIAQoAhAiBUUNACAFIAJJDQUgAyAFNgIQIAUgAzYCGAsgBCgCFCIFRQ0AIAUgAkkNBCADIAU2AhQgBSADNgIYCyABIAdBeHEgAGoiAEEBcjYCBCABIABqIAA2AgAgASAJRw0BQQAgADYC8FYPCyAEIAdBfnE2AgQgASAAQQFyNgIEIAEgAGogADYCAAsCQCAAQf8BSw0AIABB+AFxQZDXAGohAwJAAkBBACgC6FYiBUEBIABBA3Z0IgBxDQBBACAFIAByNgLoViADIQAMAQsgAygCCCIAIAJJDQMLIAMgATYCCCAAIAE2AgwgASADNgIMIAEgADYCCA8LQR8hAwJAIABB////B0sNACAAQSYgAEEIdmciA2t2QQFxIANBAXRrQT5qIQMLIAEgAzYCHCABQgA3AhAgA0ECdEGY2QBqIQYCQAJAAkACQEEAKALsViIFQQEgA3QiBHENAEEAIAUgBHI2AuxWIAYgATYCAEEIIQBBGCEDDAELIABBAEEZIANBAXZrIANBH0YbdCEDIAYoAgAhBgNAIAYiBSgCBEF4cSAARg0CIANBHXYhBiADQQF0IQMgBSAGQQRxaiIEKAIQIgYNAAsgBEEQaiIAIAJJDQQgACABNgIAQQghAEEYIQMgBSEGCyABIQUgASEEDAELIAUgAkkNAiAFKAIIIgYgAkkNAiAGIAE2AgwgBSABNgIIQQAhBEEYIQBBCCEDCyABIANqIAY2AgAgASAFNgIMIAEgAGogBDYCAEEAQQAoAohXQX9qIgFBfyABGzYCiFcLDwsQsgQACwcAPwBBEHQLVAIBfgF/AkACQCAArUIHfEL4////H4NBACgCtEwiAK18IgFC/////w9WDQAQtgQgAaciAk8NASACEDcNAQsQmQRBMDYCAEF/DwtBACACNgK0TCAACx0AAkBBACgC2FoNAEEAIAE2AtxaQQAgADYC2FoLCwYAIAAkAQsEACMBCxQAQfDaBCQDQfDaAEEPakFwcSQCCwcAIwAjAmsLBAAjAwsEACMCC1MBAX4CQAJAIANBwABxRQ0AIAEgA0FAaq2GIQJCACEBDAELIANFDQAgAUHAACADa62IIAIgA60iBIaEIQIgASAEhiEBCyAAIAE3AwAgACACNwMIC1MBAX4CQAJAIANBwABxRQ0AIAIgA0FAaq2IIQFCACECDAELIANFDQAgAkHAACADa62GIAEgA60iBIiEIQEgAiAEiCECCyAAIAE3AwAgACACNwMIC70EAgd/An4jAEEgayICIgcjP0sgByNASXIEQCAHEDgLIAckACABQv///////z+DIQkCQAJAIAFCMIhC//8BgyIKpyIDQf+Hf2pB/Q9LDQAgAEI8iCAJQgSGhCEJIANBgIh/aq0hCgJAAkAgAEL//////////w+DIgBCgYCAgICAgIAIVA0AIAlCAXwhCQwBCyAAQoCAgICAgICACFINACAJQgGDIAl8IQkLQgAgCSAJQv////////8HViIDGyEAIAOtIAp8IQkMAQsCQCAAIAmEUA0AIApC//8BUg0AIABCPIggCUIEhoRCgICAgICAgASEIQBC/w8hCQwBCwJAIANB/ocBTQ0AQv8PIQlCACEADAELAkBBgPgAQYH4ACAKUCIEGyIFIANrIgZB8ABMDQBCACEAQgAhCQwBCyAJIAlCgICAgICAwACEIAQbIQlBACEEAkAgBSADRg0AIAJBEGogACAJQYABIAZrEL8EIAIpAxAgAikDGIRCAFIhBAsgAiAAIAkgBhDABCACKQMAIglCPIggAikDCEIEhoQhAAJAAkAgCUL//////////w+DIASthCIJQoGAgICAgICACFQNACAAQgF8IQAMAQsgCUKAgICAgICAgAhSDQAgAEIBgyAAfCEACyAAQoCAgICAgIAIhSAAIABC/////////wdWIgMbIQAgA60hCQsgAkEgaiIIIz9LIAgjQElyBEAgCBA4CyAIJAAgCUI0hiABQoCAgICAgICAgH+DhCAAhL8LBwAgABCOBQsMACAAEMIEQQQQyQQLBQBBihYLEwACQCAAEMYEIgANABDHBAsgAAsxAQJ/IABBASAAQQFLGyEBAkADQCABELMEIgINARDeBCIARQ0BIAARBwAMAAsACyACCwYAEMoEAAsHACAAELUECwcAIAAQyAQLCwBB2RtBABDXBAALEAAgAEHgxwBBCGo2AgAgAAtNAQJ/IAEQjgQiAkENahDFBCIDQQA2AgggAyACNgIEIAMgAjYCACADEM0EIQMCQCACQQFqIgJFDQAgAyABIAL8CgAACyAAIAM2AgAgAAsHACAAQQxqCyAAIAAQywQiAEHQyABBCGo2AgAgAEEEaiABEMwEGiAACwQA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bmx5IGxlYWYgbm9kZXMgd2l0aCBjdXN0b20gbWVhc3VyZSBmdW5jdGlvbnMgc2hvdWxkIG1hbnVhbGx5IG1hcmsgdGhlbXNlbHZlcyBhcyBkaXJ0eQBpc0RpcnR5AG1hcmtEaXJ0eQBkZXN0cm95AHNldERpc3BsYXkAZ2V0RGlzcGxheQBzZXRGbGV4AC0rICAgMFgweAAtMFgrMFggMFgtMHgrMHggMHgAc2V0RmxleEdyb3cAZ2V0RmxleEdyb3cAc2V0T3ZlcmZsb3cAZ2V0T3ZlcmZsb3cAaGFzTmV3TGF5b3V0AGNhbGN1bGF0ZUxheW91dABnZXRDb21wdXRlZExheW91dAB1bnNpZ25lZCBzaG9ydABnZXRDaGlsZENvdW50AHVuc2lnbmVkIGludABzZXRKdXN0aWZ5Q29udGVudABnZXRKdXN0aWZ5Q29udGVudABhdmFpbGFibGVIZWlnaHQgaXMgaW5kZWZpbml0ZSBzbyBoZWlnaHRTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABhdmFpbGFibGVXaWR0aCBpcyBpbmRlZmluaXRlIHNvIHdpZHRoU2l6aW5nTW9kZSBtdXN0IGJlIFNpemluZ01vZGU6Ok1heENvbnRlbnQAc2V0QWxpZ25Db250ZW50AGdldEFsaWduQ29udGVudABnZXRQYXJlbnQAaW1wbGVtZW50AHNldE1heEhlaWdodFBlcmNlbnQAc2V0SGVpZ2h0UGVyY2VudABzZXRNaW5IZWlnaHRQZXJjZW50AHNldEZsZXhCYXNpc1BlcmNlbnQAc2V0R2FwUGVyY2VudABzZXRQb3NpdGlvblBlcmNlbnQAc2V0TWFyZ2luUGVyY2VudABzZXRNYXhXaWR0aFBlcmNlbnQAc2V0V2lkdGhQZXJjZW50AHNldE1pbldpZHRoUGVyY2VudABzZXRQYWRkaW5nUGVyY2VudABjcmVhdGVEZWZhdWx0AHVuaXQAcmlnaHQAaGVpZ2h0AHNldE1heEhlaWdodABnZXRNYXhIZWlnaHQAc2V0SGVpZ2h0AGdldEhlaWdodABzZXRNaW5IZWlnaHQAZ2V0TWluSGVpZ2h0AGdldENvbXB1dGVkSGVpZ2h0AGdldENvbXB1dGVkUmlnaHQAbGVmdABnZXRDb21wdXRlZExlZnQAcmVzZXQAX19kZXN0cnVjdABmbG9hdAB1c2VXZWJEZWZhdWx0cwBzZXRVc2VXZWJEZWZhdWx0cwBzZXRBbGlnbkl0ZW1zAGdldEFsaWduSXRlbXMAc2V0RmxleEJhc2lzAGdldEZsZXhCYXNpcwBDYW5ub3QgZ2V0IGxheW91dCBwcm9wZXJ0aWVzIG9mIG11bHRpLWVkZ2Ugc2hvcnRoYW5kcwAlczolZDogJXMAdmVjdG9yAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAHVuc2lnbmVkIGNoYXIAL2Vtc2RrL2Vtc2NyaXB0ZW4vc3lzdGVtL2xpYi9saWJjeHhhYmkvc3JjL3ByaXZhdGVfdHlwZWluZm8uY3BwAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac3RkOjpleGNlcHRpb24Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBFeHBlY3RlZCBub2RlIHRvIGhhdmUgY3VzdG9tIG1lYXN1cmUgZnVuY3Rpb24Ac2V0RmxleERpcmVjdGlvbgBnZXRGbGV4RGlyZWN0aW9uAEludmFsaWQgRmxleERpcmVjdGlvbgBzZXREaXJlY3Rpb24AZ2V0RGlyZWN0aW9uAHNldE1hcmdpbgBnZXRNYXJnaW4AZ2V0Q29tcHV0ZWRNYXJnaW4AbWFya0xheW91dFNlZW4AbmFuAGJvdHRvbQBnZXRDb21wdXRlZEJvdHRvbQBib29sAHN0ZDo6YmFkX2Z1bmN0aW9uX2NhbGwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAYmFkX2FycmF5X25ld19sZW5ndGgAd2lkdGgAc2V0TWF4V2lkdGgAZ2V0TWF4V2lkdGgAc2V0V2lkdGgAZ2V0V2lkdGgAc2V0TWluV2lkdGgAZ2V0TWluV2lkdGgAZ2V0Q29tcHV0ZWRXaWR0aAB1bnNpZ25lZCBsb25nIGxvbmcAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHRlcm1pbmF0aW5nAHN0ZDo6d3N0cmluZwBiYXNpY19zdHJpbmcAc3RkOjpzdHJpbmcAc3RkOjp1MTZzdHJpbmcAc3RkOjp1MzJzdHJpbmcAc2V0UGFkZGluZwBnZXRQYWRkaW5nAGdldENvbXB1dGVkUGFkZGluZwBUcmllZCB0byBjb25zdHJ1Y3QgWUdOb2RlIHdpdGggbnVsbCBjb25maWcAQXR0ZW1wdGluZyB0byBjb25zdHJ1Y3QgTm9kZSB3aXRoIG51bGwgY29uZmlnAGNyZWF0ZVdpdGhDb25maWcAaW5mAHNldEFsaWduU2VsZgBnZXRBbGlnblNlbGYAU2l6ZQB2YWx1ZQBWYWx1ZQBjcmVhdGUAbWVhc3VyZQBzZXRQb3NpdGlvblR5cGUAZ2V0UG9zaXRpb25UeXBlAGlzUmVmZXJlbmNlQmFzZWxpbmUAc2V0SXNSZWZlcmVuY2VCYXNlbGluZQBjb3B5U3R5bGUAZG91YmxlAGJpdHNldCB0ZXN0IGFyZ3VtZW50IG91dCBvZiByYW5nZQBJbnZhbGlkIHBoeXNpY2FsIGVkZ2UAYmFkX2FsbG9jIHdhcyB0aHJvd24gaW4gLWZuby1leGNlcHRpb25zIG1vZGUATm9kZQBJbnZhbGlkIFNpemluZ01vZGUAZXh0ZW5kAGluc2VydENoaWxkAGdldENoaWxkAHJlbW92ZUNoaWxkAHZvaWQAdGVybWluYXRlX2hhbmRsZXIgdW5leHBlY3RlZGx5IHJldHVybmVkAHNldEV4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGlzRXhwZXJpbWVudGFsRmVhdHVyZUVuYWJsZWQAZGlydGllZABDYW5ub3QgcmVzZXQgYSBub2RlIHdoaWNoIHN0aWxsIGhhcyBjaGlsZHJlbiBhdHRhY2hlZABzdGQ6OmJhZF9hbGxvYwB1bnNldE1lYXN1cmVGdW5jAHVuc2V0RGlydGllZEZ1bmMAc2V0RXJyYXRhAGdldEVycmF0YQBNZWFzdXJlIGZ1bmN0aW9uIHJldHVybmVkIGFuIGludmFsaWQgZGltZW5zaW9uIHRvIFlvZ2E6IFt3aWR0aD0lZiwgaGVpZ2h0PSVmXQBFeHBlY3QgY3VzdG9tIGJhc2VsaW5lIGZ1bmN0aW9uIHRvIG5vdCByZXR1cm4gTmFOAE5BTgBJTkYAY2F0Y2hpbmcgYSBjbGFzcyB3aXRob3V0IGFuIG9iamVjdD8AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZmxvYXQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQ2NF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ2NF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVkIGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGxvbmc+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIGxvbmc+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGRvdWJsZT4AQ2hpbGQgYWxyZWFkeSBoYXMgYSBvd25lciwgaXQgbXVzdCBiZSByZW1vdmVkIGZpcnN0LgBDYW5ub3Qgc2V0IG1lYXN1cmUgZnVuY3Rpb246IE5vZGVzIHdpdGggbWVhc3VyZSBmdW5jdGlvbnMgY2Fubm90IGhhdmUgY2hpbGRyZW4uAENhbm5vdCBhZGQgY2hpbGQ6IE5vZGVzIHdpdGggbWVhc3VyZSBmdW5jdGlvbnMgY2Fubm90IGhhdmUgY2hpbGRyZW4uAChudWxsKQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQBsaWJjKythYmk6IAAlcwoAAADEIgAAaBMAADE1TWVhc3VyZUNhbGxiYWNrAAAApCMAAIwTAAAAAAAAYBMAAFAxNU1lYXN1cmVDYWxsYmFjawAApCMAALATAAABAAAAYBMAAFBLMTVNZWFzdXJlQ2FsbGJhY2sAcHAAdgB2cAAAAAAA6BMAAHwTAACkIgAAXCIAAKQiAABcIgAAxCIAAPATAAA0U2l6ZQBwcHBmaWZpAAAA7CIAAAwUAAAoFAAAMjJNZWFzdXJlQ2FsbGJhY2tXcmFwcGVyAAAAAEgjAABIFAAAAAAAAAIAAABgEwAAAgAAAHQUAAACBAAATjEwZW1zY3JpcHRlbjd3cmFwcGVySTE1TWVhc3VyZUNhbGxiYWNrRUUAAADEIgAAfBQAAE4xMGVtc2NyaXB0ZW44aW50ZXJuYWwxMVdyYXBwZXJCYXNlRQAAAACkIwAAtBQAAAAAAAAAFAAAUDIyTWVhc3VyZUNhbGxiYWNrV3JhcHBlcgAAAKQjAADgFAAAAQAAAAAUAABQSzIyTWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBwcABwcABwcAB2cAAA/CEAAAAUAAB2cHAApBQAABwVAADEIgAAJBUAAE4xMGVtc2NyaXB0ZW4zdmFsRQBwcHAAAAAAAAAAFAAAwQAAAMIAAADDAAAAAAAAACgUAADBAAAAxAAAAMUAAAD8IQAAAAAAAAAAAADoEwAApCIAAFwiAACkIgAAXCIAABwVAACQFQAAHBUAAMQiAACY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'; + +// Decode base64 to Uint8Array. +const wasmBinary = Uint8Array.from(atob(base64Wasm), c => c.charCodeAt(0)); + +// Inlined Emscripten loader from yoga-layout build. +// This code implements the `-sMODULARIZE` settings by taking the generated +// JS program code (INNER_JS_CODE) and wrapping it in a factory function. + +// When targetting node and ES6 we use `await import ..` in the generated code +// so the outer function needs to be marked as async. +function Module(moduleArg = {}) { + var moduleRtn; + +// include: shell.js +// include: minimum_runtime_check.js +(function() { + // "30.0.0" -> 300000 + function humanReadableVersionToPacked(str) { + str = str.split('-')[0]; // Remove any trailing part from e.g. "12.53.3-alpha" + var vers = str.split('.').slice(0, 3); + while(vers.length < 3) vers.push('00'); + vers = vers.map((n, i, arr) => n.padStart(2, '0')); + return vers.join(''); + } + // 300000 -> "30.0.0" + var packedVersionToHumanReadable = n => [n / 10000 | 0, (n / 100 | 0) % 100, n % 100].join('.'); + + var TARGET_NOT_SUPPORTED = 2147483647; + + var currentNodeVersion = typeof process !== 'undefined' && process?.versions?.node ? humanReadableVersionToPacked(process.versions.node) : TARGET_NOT_SUPPORTED; + if (currentNodeVersion < 160000) { + throw new Error(`This emscripten-generated code requires node v${ packedVersionToHumanReadable(160000) } (detected v${packedVersionToHumanReadable(currentNodeVersion)})`); + } + + var currentSafariVersion = typeof navigator !== 'undefined' && navigator?.userAgent?.includes("Safari/") && navigator.userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/) ? humanReadableVersionToPacked(navigator.userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentSafariVersion < 150000) { + throw new Error(`This emscripten-generated code requires Safari v${ packedVersionToHumanReadable(150000) } (detected v${currentSafariVersion})`); + } + + var currentFirefoxVersion = typeof navigator !== 'undefined' && navigator?.userAgent?.match(/Firefox\/(\d+(?:\.\d+)?)/) ? parseFloat(navigator.userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentFirefoxVersion < 79) { + throw new Error(`This emscripten-generated code requires Firefox v79 (detected v${currentFirefoxVersion})`); + } + + var currentChromeVersion = typeof navigator !== 'undefined' && navigator?.userAgent?.match(/Chrome\/(\d+(?:\.\d+)?)/) ? parseFloat(navigator.userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentChromeVersion < 85) { + throw new Error(`This emscripten-generated code requires Chrome v85 (detected v${currentChromeVersion})`); + } +})(); + +// end include: minimum_runtime_check.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(moduleArg) => Promise +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = moduleArg; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = !!globalThis.window; +var ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = true; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (ENVIRONMENT_IS_NODE) { + // When building an ES module `require` is not normally available. + // We need to use `createRequire()` to construct the require()` function. + const { createRequire } = import('module'); + /** @suppress{duplicate} */ + + +} + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) + + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +var _scriptName = __importMetaUrl; + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var readAsync, readBinary; + +if (ENVIRONMENT_IS_NODE) { + const isNode = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; + if (!isNode) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require("node:fs"); + + if (_scriptName.startsWith('file:')) { + scriptDirectory = require("node:path").dirname(require('url').fileURLToPath(_scriptName)) + '/'; + } + +// include: node_shell_read.js +readBinary = (filename) => { + // We need to re-wrap `file://` strings to URLs. + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename); + assert(Buffer.isBuffer(ret)); + return ret; +}; + +readAsync = (filename, binary = true) => { + // See the comment in the `readBinary` function. + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename, binary ? undefined : 'utf8'); + assert(binary ? Buffer.isBuffer(ret) : typeof ret == 'string'); + return ret; +}; +// end include: node_shell_read.js + if (process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + + arguments_ = process.argv.slice(2); + + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + +} else +if (ENVIRONMENT_IS_SHELL) { + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL('.', _scriptName).href; // includes trailing slash + } catch { + // Must be a `blob:` or `data:` URL (e.g. `blob:http://site.com/etc/etc`), we cannot + // infer anything from them. + } + + if (!(globalThis.window || globalThis.WorkerGlobalScope)) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + { +// include: web_or_worker_shell_read.js +if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url) => { + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use XHR on webview if URL is a file URL. + if (isFileURI(url)) { + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + resolve(xhr.response); + return; + } + reject(xhr.status); + }; + xhr.onerror = reject; + xhr.send(null); + }); + } + var response = fetch(url, { credentials: 'same-origin' }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + ' : ' + response.url); + }; +// end include: web_or_worker_shell_read.js + } +} else +{ + throw new Error('environment detection error'); +} + +var out = console.log.bind(console); +var err = console.error.bind(console); + +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +// perform assertions in shell.js after we set up out() and err(), as otherwise +// if an assertion fails it cannot print the message + +assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.'); + +// end include: shell.js + +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; + +if (!globalThis.WebAssembly) { + err('no native wasm support detected'); +} + +// Wasm globals + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we +// don't define it at all in release modes. This matches the behaviour of +// MINIMAL_RUNTIME. +// TODO(sbc): Make this the default even without STRICT enabled. +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +/** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ +var isFileURI = (filename) => filename.startsWith('file://'); + +// include: runtime_common.js +// include: runtime_stack_check.js +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = 0x02135467;checkInt32(0x02135467); + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE;checkInt32(0x89BACDFE); + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029;checkInt32(1668509029); +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[((max)>>2)]; + var cookie2 = HEAPU32[(((max)+(4))>>2)]; + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} +// end include: runtime_stack_check.js +// include: runtime_exceptions.js +// end include: runtime_exceptions.js +// include: runtime_debug.js +var runtimeDebug = true; // Switch to false at runtime to disable logging at the right times + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(...args) { + if (!runtimeDebug && typeof runtimeDebug != 'undefined') return; + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn(...args); +} + +// Endianness check +(() => { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) abort('Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'); +})(); + +function consumedModuleProp(prop) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + set() { + abort(`Attempt to set \`Module.${prop}\` after it has already been processed. This can happen, for example, when code is injected via '--post-js' rather than '--pre-js'`); + + } + }); + } +} + +function makeInvalidEarlyAccess(name) { + return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`); + +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_preloadFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +function missingLibrarySymbol(sym) { + + // Any symbol that is not included from the JS library is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + }, + }); + } +} + +var MAX_UINT8 = (2 ** 8) - 1; +var MAX_UINT16 = (2 ** 16) - 1; +var MAX_UINT32 = (2 ** 32) - 1; +var MAX_UINT53 = (2 ** 53) - 1; +var MAX_UINT64 = (2 ** 64) - 1; + +var MIN_INT8 = - (2 ** ( 8 - 1)); +var MIN_INT16 = - (2 ** (16 - 1)); +var MIN_INT32 = - (2 ** (32 - 1)); +var MIN_INT53 = - (2 ** (53 - 1)); +var MIN_INT64 = - (2 ** (64 - 1)); + +function checkInt(value, bits, min, max) { + assert(Number.isInteger(Number(value)), `attempt to write non-integer (${value}) into integer heap`); + assert(value <= max, `value (${value}) too large to write as ${bits}-bit value`); + assert(value >= min, `value (${value}) too small to write as ${bits}-bit value`); +} + +var checkInt1 = (value) => checkInt(value, 1, 1); +var checkInt8 = (value) => checkInt(value, 8, MIN_INT8, MAX_UINT8); +var checkInt16 = (value) => checkInt(value, 16, MIN_INT16, MAX_UINT16); +var checkInt32 = (value) => checkInt(value, 32, MIN_INT32, MAX_UINT32); +var checkInt53 = (value) => checkInt(value, 53, MIN_INT53, MAX_UINT53); +var checkInt64 = (value) => checkInt(value, 64, MIN_INT64, MAX_UINT64); + +// end include: runtime_debug.js +var readyPromiseResolve, readyPromiseReject; + +// Memory management +var +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +// BigInt64Array type is not correctly defined in closure +var +/** not-@type {!BigInt64Array} */ + HEAP64, +/* BigUint64Array type is not correctly defined in closure +/** not-@type {!BigUint64Array} */ + HEAPU64; + +var runtimeInitialized = false; + + + +function updateMemoryViews() { + var b = wasmMemory.buffer; + HEAP8 = new Int8Array(b); + HEAP16 = new Int16Array(b); + HEAPU8 = new Uint8Array(b); + HEAPU16 = new Uint16Array(b); + HEAP32 = new Int32Array(b); + HEAPU32 = new Uint32Array(b); + HEAPF32 = new Float32Array(b); + HEAPF64 = new Float64Array(b); + HEAP64 = new BigInt64Array(b); + HEAPU64 = new BigUint64Array(b); +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// end include: runtime_common.js +assert(globalThis.Int32Array && globalThis.Float64Array && Int32Array.prototype.subarray && Int32Array.prototype.set, + 'JS engine does not provide full typed array support'); + +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + consumedModuleProp('preRun'); + // Begin ATPRERUNS hooks + callRuntimeCallbacks(onPreRuns); + // End ATPRERUNS hooks +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + setStackLimits(); + + checkStackCookie(); + + // No ATINITS hooks + + wasmExports['__wasm_call_ctors'](); + + // No ATPOSTCTORS hooks +} + +function postRun() { + checkStackCookie(); + // PThreads reuse the runtime from the main thread. + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + consumedModuleProp('postRun'); + + // Begin ATPOSTRUNS hooks + callRuntimeCallbacks(onPostRuns); + // End ATPOSTRUNS hooks +} + +/** @param {string|number=} what */ +function abort(what) { + Module['onAbort']?.(what); + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // definition for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + readyPromiseReject?.(e); + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// show errors on likely calls to FS when it was not included +var FS = { + error() { + abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM'); + }, + init() { FS.error() }, + createDataFile() { FS.error() }, + createPreloadedFile() { FS.error() }, + createLazyFile() { FS.error() }, + open() { FS.error() }, + mkdev() { FS.error() }, + registerDevice() { FS.error() }, + analyzePath() { FS.error() }, + + ErrnoError() { FS.error() }, +}; + + +function createExportWrapper(name, nargs) { + return (...args) => { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled. + assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`); + return f(...args); + }; +} + +var wasmBinaryFile; + + + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + // Throwing a plain string here, even though it not normally adviables since + // this gets turning into an `abort` in instantiateArrayBuffer. + throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'; +} + +function getWasmBinary(binaryFile) { + // If we don't have the binary yet, load it asynchronously using readAsync. + if (!wasmBinary) { + // Fetch the binary using readAsync + try { + var response = readAsync(binaryFile); + return new Uint8Array(response); + } catch { + // Fall back to getBinarySync below; + } + } + + // Otherwise, getBinarySync should be able to get it synchronously + return getBinarySync(binaryFile); +} + +function instantiateSync(file, info) { + var module; + var binary = getBinarySync(file); + module = new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module, info); + return [instance, module]; +} + +function getWasmImports() { + // prepare imports + var imports = { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + }; + return imports; +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + wasmExports = instance.exports; + + assignWasmExports(wasmExports); + + updateMemoryViews(); + + return wasmExports; + } + + // Prefer streaming instantiation if available. + + var info = getWasmImports(); + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module['instantiateWasm']) { + return new Promise((resolve, reject) => { + try { + Module['instantiateWasm'](info, (inst, mod) => { + resolve(receiveInstance(inst, mod)); + }); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + reject(e); + } + }); + } + + wasmBinaryFile ??= ''; + var result = instantiateSync(wasmBinaryFile, info); + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, + // the above line no longer optimizes out down to the following line. + // When the regression is fixed, we can remove this if/else. + return receiveInstance(result[0]); +} + +// end include: preamble.js + +// Begin JS library code + + + class ExitStatus { + name = 'ExitStatus'; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var addOnPostRun = (cb) => onPostRuns.push(cb); + + var onPreRuns = []; + var addOnPreRun = (cb) => onPreRuns.push(cb); + + + + /** + * @param {number} ptr + * @param {string} type + */ + function getValue(ptr, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': return HEAP8[ptr]; + case 'i8': return HEAP8[ptr]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP64[((ptr)>>3)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + + var noExitRuntime = true; + + var ptrToString = (ptr) => { + assert(typeof ptr === 'number', `ptrToString expects a number, got ${typeof ptr}`); + // Convert to 32-bit unsigned value + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + }; + + var setStackLimits = () => { + var stackLow = _emscripten_stack_get_base(); + var stackHigh = _emscripten_stack_get_end(); + ___set_stack_limits(stackLow, stackHigh); + }; + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[ptr] = value;checkInt8(value); break; + case 'i8': HEAP8[ptr] = value;checkInt8(value); break; + case 'i16': HEAP16[((ptr)>>1)] = value;checkInt16(value); break; + case 'i32': HEAP32[((ptr)>>2)] = value;checkInt32(value); break; + case 'i64': HEAP64[((ptr)>>3)] = BigInt(value);checkInt64(value); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var warnOnce = (text) => { + warnOnce.shown ||= {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; + err(text); + } + }; + + + + var exceptionCaught = []; + + + + var uncaughtExceptionCount = 0; + var ___cxa_begin_catch = (ptr) => { + var info = new ExceptionInfo(ptr); + if (!info.get_caught()) { + info.set_caught(true); + uncaughtExceptionCount--; + } + info.set_rethrown(false); + exceptionCaught.push(info); + ___cxa_increment_exception_refcount(ptr); + return ___cxa_get_exception_ptr(ptr); + }; + + + var exceptionLast = 0; + + + var ___cxa_end_catch = () => { + // Clear state flag. + _setThrew(0, 0); + assert(exceptionCaught.length > 0); + // Call destructor if one is registered then clear it. + var info = exceptionCaught.pop(); + + ___cxa_decrement_exception_refcount(info.excPtr); + exceptionLast = 0; // XXX in decRef? + }; + + + class ExceptionInfo { + // excPtr - Thrown object pointer to wrap. Metadata pointer is calculated from it. + constructor(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - 24; + } + + set_type(type) { + HEAPU32[(((this.ptr)+(4))>>2)] = type; + } + + get_type() { + return HEAPU32[(((this.ptr)+(4))>>2)]; + } + + set_destructor(destructor) { + HEAPU32[(((this.ptr)+(8))>>2)] = destructor; + } + + get_destructor() { + return HEAPU32[(((this.ptr)+(8))>>2)]; + } + + set_caught(caught) { + caught = caught ? 1 : 0; + HEAP8[(this.ptr)+(12)] = caught;checkInt8(caught); + } + + get_caught() { + return HEAP8[(this.ptr)+(12)] != 0; + } + + set_rethrown(rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(this.ptr)+(13)] = rethrown;checkInt8(rethrown); + } + + get_rethrown() { + return HEAP8[(this.ptr)+(13)] != 0; + } + + // Initialize native structure fields. Should be called once after allocated. + init(type, destructor) { + this.set_adjusted_ptr(0); + this.set_type(type); + this.set_destructor(destructor); + } + + set_adjusted_ptr(adjustedPtr) { + HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr; + } + + get_adjusted_ptr() { + return HEAPU32[(((this.ptr)+(16))>>2)]; + } + } + + + var setTempRet0 = (val) => __emscripten_tempret_set(val); + var findMatchingCatch = (args) => { + var thrown = + exceptionLast; + if (!thrown) { + // just pass through the null ptr + setTempRet0(0); + return 0; + } + var info = new ExceptionInfo(thrown); + info.set_adjusted_ptr(thrown); + var thrownType = info.get_type(); + if (!thrownType) { + // just pass through the thrown ptr + setTempRet0(0); + return thrown; + } + + // can_catch receives a **, add indirection + // The different catch blocks are denoted by different types. + // Due to inheritance, those types may not precisely match the + // type of the thrown object. Find one which matches, and + // return the type of the catch block which should be called. + for (var caughtType of args) { + if (caughtType === 0 || caughtType === thrownType) { + // Catch all clause matched or exactly the same type is caught + break; + } + var adjusted_ptr_addr = info.ptr + 16; + if (___cxa_can_catch(caughtType, thrownType, adjusted_ptr_addr)) { + setTempRet0(caughtType); + return thrown; + } + } + setTempRet0(thrownType); + return thrown; + }; + var ___cxa_find_matching_catch_2 = () => findMatchingCatch([]); + + var ___cxa_find_matching_catch_3 = (arg0) => findMatchingCatch([arg0]); + + + + var ___cxa_rethrow = () => { + var info = exceptionCaught.pop(); + if (!info) { + abort('no exception to throw'); + } + var ptr = info.excPtr; + if (!info.get_rethrown()) { + // Only pop if the corresponding push was through rethrow_primary_exception + exceptionCaught.push(info); + info.set_rethrown(true); + info.set_caught(false); + uncaughtExceptionCount++; + } + exceptionLast = ptr; + assert(false, 'Exception thrown, but exception catching is not enabled. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch.'); + }; + + + + var ___cxa_throw = (ptr, type, destructor) => { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + assert(false, 'Exception thrown, but exception catching is not enabled. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch.'); + }; + + + + var ___handle_stack_overflow = (requested) => { + var base = _emscripten_stack_get_base(); + var end = _emscripten_stack_get_end(); + abort(`stack overflow (Attempt to set SP to ${ptrToString(requested)}` + + `, with stack limits [${ptrToString(end)} - ${ptrToString(base)}` + + ']). If you require more stack space build with -sSTACK_SIZE='); + }; + + var ___resumeException = (ptr) => { + if (!exceptionLast) { + exceptionLast = ptr; + } + assert(false, 'Exception thrown, but exception catching is not enabled. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch.'); + }; + + var __abort_js = () => + abort('native code called abort()'); + + var createNamedFunction = (name, func) => Object.defineProperty(func, 'name', { value: name }); + + var emval_freelist = []; + + var emval_handles = [0,1,,1,null,1,true,1,false,1]; + + var BindingError = class BindingError extends Error { constructor(message) { super(message); this.name = 'BindingError'; }}; + var throwBindingError = (message) => { throw new BindingError(message); }; + var Emval = { + toValue:(handle) => { + if (!handle) { + throwBindingError(`Cannot use deleted val. handle = ${handle}`); + } + // handle 2 is supposed to be `undefined`. + assert(handle === 2 || emval_handles[handle] !== undefined && handle % 2 === 0, `invalid handle: ${handle}`); + return emval_handles[handle]; + }, + toHandle:(value) => { + switch (value) { + case undefined: return 2; + case null: return 4; + case true: return 6; + case false: return 8; + default:{ + const handle = emval_freelist.pop() || emval_handles.length; + emval_handles[handle] = value; + emval_handles[handle + 1] = 1; + return handle; + } + } + }, + }; + + class PureVirtualError extends Error {} + + var AsciiToString = (ptr) => { + var str = ''; + while (1) { + var ch = HEAPU8[ptr++]; + if (!ch) return str; + str += String.fromCharCode(ch); + } + }; + + var registeredInstances = { + }; + + var getBasestPointer = (class_, ptr) => { + if (ptr === undefined) { + throwBindingError('ptr should not be undefined'); + } + while (class_.baseClass) { + ptr = class_.upcast(ptr); + class_ = class_.baseClass; + } + return ptr; + }; + + var registerInheritedInstance = (class_, ptr, instance) => { + ptr = getBasestPointer(class_, ptr); + if (registeredInstances.hasOwnProperty(ptr)) { + throwBindingError(`Tried to register registered instance: ${ptr}`); + } else { + registeredInstances[ptr] = instance; + } + }; + + var registeredTypes = { + }; + + + + var getTypeName = (type) => { + var ptr = ___getTypeName(type); + var rv = AsciiToString(ptr); + _free(ptr); + return rv; + }; + + var requireRegisteredType = (rawType, humanName) => { + var impl = registeredTypes[rawType]; + if (undefined === impl) { + throwBindingError(`${humanName} has unknown type ${getTypeName(rawType)}`); + } + return impl; + }; + + + + + var unregisterInheritedInstance = (class_, ptr) => { + ptr = getBasestPointer(class_, ptr); + if (registeredInstances.hasOwnProperty(ptr)) { + delete registeredInstances[ptr]; + } else { + throwBindingError(`Tried to unregister unregistered instance: ${ptr}`); + } + }; + + var detachFinalizer = (handle) => {}; + + var finalizationRegistry = false; + + + var runDestructor = ($$) => { + if ($$.smartPtr) { + $$.smartPtrType.rawDestructor($$.smartPtr); + } else { + $$.ptrType.registeredClass.rawDestructor($$.ptr); + } + }; + var releaseClassHandle = ($$) => { + $$.count.value -= 1; + var toDelete = 0 === $$.count.value; + if (toDelete) { + runDestructor($$); + } + }; + + var downcastPointer = (ptr, ptrClass, desiredClass) => { + if (ptrClass === desiredClass) { + return ptr; + } + if (undefined === desiredClass.baseClass) { + return null; // no conversion + } + + var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass); + if (rv === null) { + return null; + } + return desiredClass.downcast(rv); + }; + + var registeredPointers = { + }; + + + var getInheritedInstance = (class_, ptr) => { + ptr = getBasestPointer(class_, ptr); + return registeredInstances[ptr]; + }; + + var InternalError = class InternalError extends Error { constructor(message) { super(message); this.name = 'InternalError'; }}; + var throwInternalError = (message) => { throw new InternalError(message); }; + + var makeClassHandle = (prototype, record) => { + if (!record.ptrType || !record.ptr) { + throwInternalError('makeClassHandle requires ptr and ptrType'); + } + var hasSmartPtrType = !!record.smartPtrType; + var hasSmartPtr = !!record.smartPtr; + if (hasSmartPtrType !== hasSmartPtr) { + throwInternalError('Both smartPtrType and smartPtr must be specified'); + } + record.count = { value: 1 }; + return attachFinalizer(Object.create(prototype, { + $$: { + value: record, + writable: true, + }, + })); + }; + /** @suppress {globalThis} */ + function RegisteredPointer_fromWireType(ptr) { + // ptr is a raw pointer (or a raw smartpointer) + + // rawPointer is a maybe-null raw pointer + var rawPointer = this.getPointee(ptr); + if (!rawPointer) { + this.destructor(ptr); + return null; + } + + var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer); + if (undefined !== registeredInstance) { + // JS object has been neutered, time to repopulate it + if (0 === registeredInstance.$$.count.value) { + registeredInstance.$$.ptr = rawPointer; + registeredInstance.$$.smartPtr = ptr; + return registeredInstance['clone'](); + } else { + // else, just increment reference count on existing object + // it already has a reference to the smart pointer + var rv = registeredInstance['clone'](); + this.destructor(ptr); + return rv; + } + } + + function makeDefaultHandle() { + if (this.isSmartPointer) { + return makeClassHandle(this.registeredClass.instancePrototype, { + ptrType: this.pointeeType, + ptr: rawPointer, + smartPtrType: this, + smartPtr: ptr, + }); + } else { + return makeClassHandle(this.registeredClass.instancePrototype, { + ptrType: this, + ptr, + }); + } + } + + var actualType = this.registeredClass.getActualType(rawPointer); + var registeredPointerRecord = registeredPointers[actualType]; + if (!registeredPointerRecord) { + return makeDefaultHandle.call(this); + } + + var toType; + if (this.isConst) { + toType = registeredPointerRecord.constPointerType; + } else { + toType = registeredPointerRecord.pointerType; + } + var dp = downcastPointer( + rawPointer, + this.registeredClass, + toType.registeredClass); + if (dp === null) { + return makeDefaultHandle.call(this); + } + if (this.isSmartPointer) { + return makeClassHandle(toType.registeredClass.instancePrototype, { + ptrType: toType, + ptr: dp, + smartPtrType: this, + smartPtr: ptr, + }); + } else { + return makeClassHandle(toType.registeredClass.instancePrototype, { + ptrType: toType, + ptr: dp, + }); + } + } + var attachFinalizer = (handle) => { + if (!globalThis.FinalizationRegistry) { + attachFinalizer = (handle) => handle; + return handle; + } + // If the running environment has a FinalizationRegistry (see + // https://github.com/tc39/proposal-weakrefs), then attach finalizers + // for class handles. We check for the presence of FinalizationRegistry + // at run-time, not build-time. + finalizationRegistry = new FinalizationRegistry((info) => { + console.warn(info.leakWarning); + releaseClassHandle(info.$$); + }); + attachFinalizer = (handle) => { + var $$ = handle.$$; + var hasSmartPtr = !!$$.smartPtr; + if (hasSmartPtr) { + // We should not call the destructor on raw pointers in case other code expects the pointee to live + var info = { $$: $$ }; + // Create a warning as an Error instance in advance so that we can store + // the current stacktrace and point to it when / if a leak is detected. + // This is more useful than the empty stacktrace of `FinalizationRegistry` + // callback. + var cls = $$.ptrType.registeredClass; + var err = new Error(`Embind found a leaked C++ instance ${cls.name} <${ptrToString($$.ptr)}>.\n` + + "We'll free it automatically in this case, but this functionality is not reliable across various environments.\n" + + "Make sure to invoke .delete() manually once you're done with the instance instead.\n" + + "Originally allocated"); // `.stack` will add "at ..." after this sentence + if ('captureStackTrace' in Error) { + Error.captureStackTrace(err, RegisteredPointer_fromWireType); + } + info.leakWarning = err.stack.replace(/^Error: /, ''); + finalizationRegistry.register(handle, info, handle); + } + return handle; + }; + detachFinalizer = (handle) => finalizationRegistry.unregister(handle); + return attachFinalizer(handle); + }; + var __embind_create_inheriting_constructor = (constructorName, wrapperType, properties) => { + constructorName = AsciiToString(constructorName); + wrapperType = requireRegisteredType(wrapperType, 'wrapper'); + properties = Emval.toValue(properties); + + var registeredClass = wrapperType.registeredClass; + var wrapperPrototype = registeredClass.instancePrototype; + var baseClass = registeredClass.baseClass; + var baseClassPrototype = baseClass.instancePrototype; + var baseConstructor = registeredClass.baseClass.constructor; + var ctor = createNamedFunction(constructorName, function(...args) { + registeredClass.baseClass.pureVirtualFunctions.forEach(function(name) { + if (this[name] === baseClassPrototype[name]) { + throw new PureVirtualError(`Pure virtual function ${name} must be implemented in JavaScript`); + } + }.bind(this)); + + Object.defineProperty(this, '__parent', { + value: wrapperPrototype + }); + this['__construct'](...args); + }); + + // It's a little nasty that we're modifying the wrapper prototype here. + + wrapperPrototype['__construct'] = function __construct(...args) { + if (this === wrapperPrototype) { + throwBindingError("Pass correct 'this' to __construct"); + } + + var inner = baseConstructor['implement'](this, ...args); + detachFinalizer(inner); + var $$ = inner.$$; + inner['notifyOnDestruction'](); + $$.preservePointerOnDelete = true; + Object.defineProperties(this, { $$: { + value: $$ + }}); + attachFinalizer(this); + registerInheritedInstance(registeredClass, $$.ptr, this); + }; + + wrapperPrototype['__destruct'] = function __destruct() { + if (this === wrapperPrototype) { + throwBindingError("Pass correct 'this' to __destruct"); + } + + detachFinalizer(this); + unregisterInheritedInstance(registeredClass, this.$$.ptr); + }; + + ctor.prototype = Object.create(wrapperPrototype); + Object.assign(ctor.prototype, properties); + return Emval.toHandle(ctor); + }; + + var structRegistrations = { + }; + + var runDestructors = (destructors) => { + while (destructors.length) { + var ptr = destructors.pop(); + var del = destructors.pop(); + del(ptr); + } + }; + + /** @suppress {globalThis} */ + function readPointer(pointer) { + return this.fromWireType(HEAPU32[((pointer)>>2)]); + } + + var awaitingDependencies = { + }; + + + var typeDependencies = { + }; + + var whenDependentTypesAreResolved = (myTypes, dependentTypes, getTypeConverters) => { + myTypes.forEach((type) => typeDependencies[type] = dependentTypes); + + function onComplete(typeConverters) { + var myTypeConverters = getTypeConverters(typeConverters); + if (myTypeConverters.length !== myTypes.length) { + throwInternalError('Mismatched type converter count'); + } + for (var i = 0; i < myTypes.length; ++i) { + registerType(myTypes[i], myTypeConverters[i]); + } + } + + var typeConverters = new Array(dependentTypes.length); + var unregisteredTypes = []; + var registered = 0; + dependentTypes.forEach((dt, i) => { + if (registeredTypes.hasOwnProperty(dt)) { + typeConverters[i] = registeredTypes[dt]; + } else { + unregisteredTypes.push(dt); + if (!awaitingDependencies.hasOwnProperty(dt)) { + awaitingDependencies[dt] = []; + } + awaitingDependencies[dt].push(() => { + typeConverters[i] = registeredTypes[dt]; + ++registered; + if (registered === unregisteredTypes.length) { + onComplete(typeConverters); + } + }); + } + }); + if (0 === unregisteredTypes.length) { + onComplete(typeConverters); + } + }; + var __embind_finalize_value_object = (structType) => { + var reg = structRegistrations[structType]; + delete structRegistrations[structType]; + + var rawConstructor = reg.rawConstructor; + var rawDestructor = reg.rawDestructor; + var fieldRecords = reg.fields; + var fieldTypes = fieldRecords.map((field) => field.getterReturnType). + concat(fieldRecords.map((field) => field.setterArgumentType)); + whenDependentTypesAreResolved([structType], fieldTypes, (fieldTypes) => { + var fields = {}; + fieldRecords.forEach((field, i) => { + var fieldName = field.fieldName; + var getterReturnType = fieldTypes[i]; + var optional = fieldTypes[i].optional; + var getter = field.getter; + var getterContext = field.getterContext; + var setterArgumentType = fieldTypes[i + fieldRecords.length]; + var setter = field.setter; + var setterContext = field.setterContext; + fields[fieldName] = { + read: (ptr) => getterReturnType.fromWireType(getter(getterContext, ptr)), + write: (ptr, o) => { + var destructors = []; + setter(setterContext, ptr, setterArgumentType.toWireType(destructors, o)); + runDestructors(destructors); + }, + optional, + }; + }); + + return [{ + name: reg.name, + fromWireType: (ptr) => { + var rv = {}; + for (var i in fields) { + rv[i] = fields[i].read(ptr); + } + rawDestructor(ptr); + return rv; + }, + toWireType: (destructors, o) => { + // todo: Here we have an opportunity for -O3 level "unsafe" optimizations: + // assume all fields are present without checking. + for (var fieldName in fields) { + if (!(fieldName in o) && !fields[fieldName].optional) { + throw new TypeError(`Missing field: "${fieldName}"`); + } + } + var ptr = rawConstructor(); + for (fieldName in fields) { + fields[fieldName].write(ptr, o[fieldName]); + } + if (destructors !== null) { + destructors.push(rawDestructor, ptr); + } + return ptr; + }, + readValueFromPointer: readPointer, + destructorFunction: rawDestructor, + }]; + }); + }; + + + + + + /** @param {Object=} options */ + function sharedRegisterType(rawType, registeredInstance, options = {}) { + var name = registeredInstance.name; + if (!rawType) { + throwBindingError(`type "${name}" must have a positive integer typeid pointer`); + } + if (registeredTypes.hasOwnProperty(rawType)) { + if (options.ignoreDuplicateRegistrations) { + return; + } else { + throwBindingError(`Cannot register type '${name}' twice`); + } + } + + registeredTypes[rawType] = registeredInstance; + delete typeDependencies[rawType]; + + if (awaitingDependencies.hasOwnProperty(rawType)) { + var callbacks = awaitingDependencies[rawType]; + delete awaitingDependencies[rawType]; + callbacks.forEach((cb) => cb()); + } + } + /** @param {Object=} options */ + function registerType(rawType, registeredInstance, options = {}) { + return sharedRegisterType(rawType, registeredInstance, options); + } + + var integerReadValueFromPointer = (name, width, signed) => { + // integers are quite common, so generate very specialized functions + switch (width) { + case 1: return signed ? + (pointer) => HEAP8[pointer] : + (pointer) => HEAPU8[pointer]; + case 2: return signed ? + (pointer) => HEAP16[((pointer)>>1)] : + (pointer) => HEAPU16[((pointer)>>1)] + case 4: return signed ? + (pointer) => HEAP32[((pointer)>>2)] : + (pointer) => HEAPU32[((pointer)>>2)] + case 8: return signed ? + (pointer) => HEAP64[((pointer)>>3)] : + (pointer) => HEAPU64[((pointer)>>3)] + default: + throw new TypeError(`invalid integer width (${width}): ${name}`); + } + }; + + var embindRepr = (v) => { + if (v === null) { + return 'null'; + } + var t = typeof v; + if (t === 'object' || t === 'array' || t === 'function') { + return v.toString(); + } else { + return '' + v; + } + }; + + var assertIntegerRange = (typeName, value, minRange, maxRange) => { + if (value < minRange || value > maxRange) { + throw new TypeError(`Passing a number "${embindRepr(value)}" from JS side to C/C++ side to an argument of type "${typeName}", which is outside the valid range [${minRange}, ${maxRange}]!`); + } + }; + /** @suppress {globalThis} */ + var __embind_register_bigint = (primitiveType, name, size, minRange, maxRange) => { + name = AsciiToString(name); + + const isUnsignedType = minRange === 0n; + + let fromWireType = (value) => value; + if (isUnsignedType) { + // uint64 get converted to int64 in ABI, fix them up like we do for 32-bit integers. + const bitSize = size * 8; + fromWireType = (value) => { + return BigInt.asUintN(bitSize, value); + } + maxRange = fromWireType(maxRange); + } + + registerType(primitiveType, { + name, + fromWireType: fromWireType, + toWireType: (destructors, value) => { + if (typeof value == "number") { + value = BigInt(value); + } + else if (typeof value != "bigint") { + throw new TypeError(`Cannot convert "${embindRepr(value)}" to ${this.name}`); + } + assertIntegerRange(name, value, minRange, maxRange); + return value; + }, + readValueFromPointer: integerReadValueFromPointer(name, size, !isUnsignedType), + destructorFunction: null, // This type does not need a destructor + }); + }; + + + /** @suppress {globalThis} */ + var __embind_register_bool = (rawType, name, trueValue, falseValue) => { + name = AsciiToString(name); + registerType(rawType, { + name, + fromWireType: function(wt) { + // ambiguous emscripten ABI: sometimes return values are + // true or false, and sometimes integers (0 or 1) + return !!wt; + }, + toWireType: function(destructors, o) { + return o ? trueValue : falseValue; + }, + readValueFromPointer: function(pointer) { + return this.fromWireType(HEAPU8[pointer]); + }, + destructorFunction: null, // This type does not need a destructor + }); + }; + + + + var shallowCopyInternalPointer = (o) => { + return { + count: o.count, + deleteScheduled: o.deleteScheduled, + preservePointerOnDelete: o.preservePointerOnDelete, + ptr: o.ptr, + ptrType: o.ptrType, + smartPtr: o.smartPtr, + smartPtrType: o.smartPtrType, + }; + }; + + var throwInstanceAlreadyDeleted = (obj) => { + function getInstanceTypeName(handle) { + return handle.$$.ptrType.registeredClass.name; + } + throwBindingError(getInstanceTypeName(obj) + ' instance already deleted'); + }; + + + + + + var deletionQueue = []; + var flushPendingDeletes = () => { + while (deletionQueue.length) { + var obj = deletionQueue.pop(); + obj.$$.deleteScheduled = false; + obj['delete'](); + } + }; + + var delayFunction; + var init_ClassHandle = () => { + let proto = ClassHandle.prototype; + + Object.assign(proto, { + "isAliasOf"(other) { + if (!(this instanceof ClassHandle)) { + return false; + } + if (!(other instanceof ClassHandle)) { + return false; + } + + var leftClass = this.$$.ptrType.registeredClass; + var left = this.$$.ptr; + other.$$ = /** @type {Object} */ (other.$$); + var rightClass = other.$$.ptrType.registeredClass; + var right = other.$$.ptr; + + while (leftClass.baseClass) { + left = leftClass.upcast(left); + leftClass = leftClass.baseClass; + } + + while (rightClass.baseClass) { + right = rightClass.upcast(right); + rightClass = rightClass.baseClass; + } + + return leftClass === rightClass && left === right; + }, + + "clone"() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + + if (this.$$.preservePointerOnDelete) { + this.$$.count.value += 1; + return this; + } else { + var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { + $$: { + value: shallowCopyInternalPointer(this.$$), + } + })); + + clone.$$.count.value += 1; + clone.$$.deleteScheduled = false; + return clone; + } + }, + + "delete"() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError('Object already scheduled for deletion'); + } + + detachFinalizer(this); + releaseClassHandle(this.$$); + + if (!this.$$.preservePointerOnDelete) { + this.$$.smartPtr = undefined; + this.$$.ptr = undefined; + } + }, + + "isDeleted"() { + return !this.$$.ptr; + }, + + "deleteLater"() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError('Object already scheduled for deletion'); + } + deletionQueue.push(this); + if (deletionQueue.length === 1 && delayFunction) { + delayFunction(flushPendingDeletes); + } + this.$$.deleteScheduled = true; + return this; + }, + }); + + // Support `using ...` from https://github.com/tc39/proposal-explicit-resource-management. + const symbolDispose = Symbol.dispose; + if (symbolDispose) { + proto[symbolDispose] = proto['delete']; + } + }; + /** @constructor */ + function ClassHandle() { + } + + + + var ensureOverloadTable = (proto, methodName, humanName) => { + if (undefined === proto[methodName].overloadTable) { + var prevFunc = proto[methodName]; + // Inject an overload resolver function that routes to the appropriate overload based on the number of arguments. + proto[methodName] = function(...args) { + // TODO This check can be removed in -O3 level "unsafe" optimizations. + if (!proto[methodName].overloadTable.hasOwnProperty(args.length)) { + throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`); + } + return proto[methodName].overloadTable[args.length].apply(this, args); + }; + // Move the previous function into the overload table. + proto[methodName].overloadTable = []; + proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; + } + }; + + /** @param {number=} numArguments */ + var exposePublicSymbol = (name, value, numArguments) => { + if (Module.hasOwnProperty(name)) { + if (undefined === numArguments || (undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])) { + throwBindingError(`Cannot register public name '${name}' twice`); + } + + // We are exposing a function with the same name as an existing function. Create an overload table and a function selector + // that routes between the two. + ensureOverloadTable(Module, name, name); + if (Module[name].overloadTable.hasOwnProperty(numArguments)) { + throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`); + } + // Add the new function into the overload table. + Module[name].overloadTable[numArguments] = value; + } else { + Module[name] = value; + Module[name].argCount = numArguments; + } + }; + + var char_0 = 48; + + var char_9 = 57; + var makeLegalFunctionName = (name) => { + assert(typeof name === 'string'); + name = name.replace(/[^a-zA-Z0-9_]/g, '$'); + var f = name.charCodeAt(0); + if (f >= char_0 && f <= char_9) { + return `_${name}`; + } + return name; + }; + + + /** @constructor */ + function RegisteredClass(name, + constructor, + instancePrototype, + rawDestructor, + baseClass, + getActualType, + upcast, + downcast) { + this.name = name; + this.constructor = constructor; + this.instancePrototype = instancePrototype; + this.rawDestructor = rawDestructor; + this.baseClass = baseClass; + this.getActualType = getActualType; + this.upcast = upcast; + this.downcast = downcast; + this.pureVirtualFunctions = []; + } + + + var upcastPointer = (ptr, ptrClass, desiredClass) => { + while (ptrClass !== desiredClass) { + if (!ptrClass.upcast) { + throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`); + } + ptr = ptrClass.upcast(ptr); + ptrClass = ptrClass.baseClass; + } + return ptr; + }; + + /** @suppress {globalThis} */ + function constNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError(`null is not a valid ${this.name}`); + } + return 0; + } + + if (!handle.$$) { + throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`); + } + if (!handle.$$.ptr) { + throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; + } + + + /** @suppress {globalThis} */ + function genericPointerToWireType(destructors, handle) { + var ptr; + if (handle === null) { + if (this.isReference) { + throwBindingError(`null is not a valid ${this.name}`); + } + + if (this.isSmartPointer) { + ptr = this.rawConstructor(); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + return ptr; + } else { + return 0; + } + } + + if (!handle || !handle.$$) { + throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`); + } + if (!handle.$$.ptr) { + throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`); + } + if (!this.isConst && handle.$$.ptrType.isConst) { + throwBindingError(`Cannot convert argument of type ${(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name)} to parameter type ${this.name}`); + } + var handleClass = handle.$$.ptrType.registeredClass; + ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + + if (this.isSmartPointer) { + // TODO: this is not strictly true + // We could support BY_EMVAL conversions from raw pointers to smart pointers + // because the smart pointer can hold a reference to the handle + if (undefined === handle.$$.smartPtr) { + throwBindingError('Passing raw pointer to smart pointer is illegal'); + } + + switch (this.sharingPolicy) { + case 0: // NONE + // no upcasting + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } else { + throwBindingError(`Cannot convert argument of type ${(handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name)} to parameter type ${this.name}`); + } + break; + + case 1: // INTRUSIVE + ptr = handle.$$.smartPtr; + break; + + case 2: // BY_EMVAL + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } else { + var clonedHandle = handle['clone'](); + ptr = this.rawShare( + ptr, + Emval.toHandle(() => clonedHandle['delete']()) + ); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + } + break; + + default: + throwBindingError('Unsupporting sharing policy'); + } + } + return ptr; + } + + + + /** @suppress {globalThis} */ + function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError(`null is not a valid ${this.name}`); + } + return 0; + } + + if (!handle.$$) { + throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`); + } + if (!handle.$$.ptr) { + throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`); + } + if (handle.$$.ptrType.isConst) { + throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; + } + + + + var init_RegisteredPointer = () => { + Object.assign(RegisteredPointer.prototype, { + getPointee(ptr) { + if (this.rawGetPointee) { + ptr = this.rawGetPointee(ptr); + } + return ptr; + }, + destructor(ptr) { + this.rawDestructor?.(ptr); + }, + readValueFromPointer: readPointer, + fromWireType: RegisteredPointer_fromWireType, + }); + }; + /** @constructor + @param {*=} pointeeType, + @param {*=} sharingPolicy, + @param {*=} rawGetPointee, + @param {*=} rawConstructor, + @param {*=} rawShare, + @param {*=} rawDestructor, + */ + function RegisteredPointer( + name, + registeredClass, + isReference, + isConst, + + // smart pointer properties + isSmartPointer, + pointeeType, + sharingPolicy, + rawGetPointee, + rawConstructor, + rawShare, + rawDestructor + ) { + this.name = name; + this.registeredClass = registeredClass; + this.isReference = isReference; + this.isConst = isConst; + + // smart pointer properties + this.isSmartPointer = isSmartPointer; + this.pointeeType = pointeeType; + this.sharingPolicy = sharingPolicy; + this.rawGetPointee = rawGetPointee; + this.rawConstructor = rawConstructor; + this.rawShare = rawShare; + this.rawDestructor = rawDestructor; + + if (!isSmartPointer && registeredClass.baseClass === undefined) { + if (isConst) { + this.toWireType = constNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } else { + this.toWireType = nonConstNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } + } else { + this.toWireType = genericPointerToWireType; + // Here we must leave this.destructorFunction undefined, since whether genericPointerToWireType returns + // a pointer that needs to be freed up is runtime-dependent, and cannot be evaluated at registration time. + // TODO: Create an alternative mechanism that allows removing the use of var destructors = []; array in + // craftInvokerFunction altogether. + } + } + + /** @param {number=} numArguments */ + var replacePublicSymbol = (name, value, numArguments) => { + if (!Module.hasOwnProperty(name)) { + throwInternalError('Replacing nonexistent public symbol'); + } + // If there's an overload table for this symbol, replace the symbol in the overload table instead. + if (undefined !== Module[name].overloadTable && undefined !== numArguments) { + Module[name].overloadTable[numArguments] = value; + } else { + Module[name] = value; + Module[name].argCount = numArguments; + } + }; + + + + var wasmTableMirror = []; + + + var getWasmTableEntry = (funcPtr) => { + var func = wasmTableMirror[funcPtr]; + if (!func) { + /** @suppress {checkTypes} */ + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + /** @suppress {checkTypes} */ + assert(wasmTable.get(funcPtr) == func, 'JavaScript-side Wasm function table mirror is out of date!'); + return func; + }; + var embind__requireFunction = (signature, rawFunction, isAsync = false) => { + assert(!isAsync, 'Async bindings are only supported with JSPI.'); + + signature = AsciiToString(signature); + + function makeDynCaller() { + var rtn = getWasmTableEntry(rawFunction); + return rtn; + } + + var fp = makeDynCaller(); + if (typeof fp != 'function') { + throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`); + } + return fp; + }; + + + + class UnboundTypeError extends Error {} + + var throwUnboundTypeError = (message, types) => { + var unboundTypes = []; + var seen = {}; + function visit(type) { + if (seen[type]) { + return; + } + if (registeredTypes[type]) { + return; + } + if (typeDependencies[type]) { + typeDependencies[type].forEach(visit); + return; + } + unboundTypes.push(type); + seen[type] = true; + } + types.forEach(visit); + + throw new UnboundTypeError(`${message}: ` + unboundTypes.map(getTypeName).join([', '])); + }; + + var __embind_register_class = (rawType, + rawPointerType, + rawConstPointerType, + baseClassRawType, + getActualTypeSignature, + getActualType, + upcastSignature, + upcast, + downcastSignature, + downcast, + name, + destructorSignature, + rawDestructor) => { + name = AsciiToString(name); + getActualType = embind__requireFunction(getActualTypeSignature, getActualType); + upcast &&= embind__requireFunction(upcastSignature, upcast); + downcast &&= embind__requireFunction(downcastSignature, downcast); + rawDestructor = embind__requireFunction(destructorSignature, rawDestructor); + var legalFunctionName = makeLegalFunctionName(name); + + exposePublicSymbol(legalFunctionName, function() { + // this code cannot run if baseClassRawType is zero + throwUnboundTypeError(`Cannot construct ${name} due to unbound types`, [baseClassRawType]); + }); + + whenDependentTypesAreResolved( + [rawType, rawPointerType, rawConstPointerType], + baseClassRawType ? [baseClassRawType] : [], + (base) => { + base = base[0]; + + var baseClass; + var basePrototype; + if (baseClassRawType) { + baseClass = base.registeredClass; + basePrototype = baseClass.instancePrototype; + } else { + basePrototype = ClassHandle.prototype; + } + + var constructor = createNamedFunction(name, function(...args) { + if (Object.getPrototypeOf(this) !== instancePrototype) { + throw new BindingError(`Use 'new' to construct ${name}`); + } + if (undefined === registeredClass.constructor_body) { + throw new BindingError(`${name} has no accessible constructor`); + } + var body = registeredClass.constructor_body[args.length]; + if (undefined === body) { + throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${args.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`); + } + return body.apply(this, args); + }); + + var instancePrototype = Object.create(basePrototype, { + constructor: { value: constructor }, + }); + + constructor.prototype = instancePrototype; + + var registeredClass = new RegisteredClass(name, + constructor, + instancePrototype, + rawDestructor, + baseClass, + getActualType, + upcast, + downcast); + + if (registeredClass.baseClass) { + // Keep track of class hierarchy. Used to allow sub-classes to inherit class functions. + registeredClass.baseClass.__derivedClasses ??= []; + + registeredClass.baseClass.__derivedClasses.push(registeredClass); + } + + var referenceConverter = new RegisteredPointer(name, + registeredClass, + true, + false, + false); + + var pointerConverter = new RegisteredPointer(name + '*', + registeredClass, + false, + false, + false); + + var constPointerConverter = new RegisteredPointer(name + ' const*', + registeredClass, + false, + true, + false); + + registeredPointers[rawType] = { + pointerType: pointerConverter, + constPointerType: constPointerConverter + }; + + replacePublicSymbol(legalFunctionName, constructor); + + return [referenceConverter, pointerConverter, constPointerConverter]; + } + ); + }; + + + + + function usesDestructorStack(argTypes) { + // Skip return value at index 0 - it's not deleted here. + for (var i = 1; i < argTypes.length; ++i) { + // The type does not define a destructor function - must use dynamic stack + if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) { + return true; + } + } + return false; + } + + + function checkArgCount(numArgs, minArgs, maxArgs, humanName, throwBindingError) { + if (numArgs < minArgs || numArgs > maxArgs) { + var argCountMessage = minArgs == maxArgs ? minArgs : `${minArgs} to ${maxArgs}`; + throwBindingError(`function ${humanName} called with ${numArgs} arguments, expected ${argCountMessage}`); + } + } + function createJsInvoker(argTypes, isClassMethodFunc, returns, isAsync) { + var needsDestructorStack = usesDestructorStack(argTypes); + var argCount = argTypes.length - 2; + var argsList = []; + var argsListWired = ['fn']; + if (isClassMethodFunc) { + argsListWired.push('thisWired'); + } + for (var i = 0; i < argCount; ++i) { + argsList.push(`arg${i}`) + argsListWired.push(`arg${i}Wired`) + } + argsList = argsList.join(',') + argsListWired = argsListWired.join(',') + + var invokerFnBody = `return function (${argsList}) {\n`; + + invokerFnBody += "checkArgCount(arguments.length, minArgs, maxArgs, humanName, throwBindingError);\n"; + + if (needsDestructorStack) { + invokerFnBody += "var destructors = [];\n"; + } + + var dtorStack = needsDestructorStack ? "destructors" : "null"; + var args1 = ["humanName", "throwBindingError", "invoker", "fn", "runDestructors", "fromRetWire", "toClassParamWire"]; + + if (isClassMethodFunc) { + invokerFnBody += `var thisWired = toClassParamWire(${dtorStack}, this);\n`; + } + + for (var i = 0; i < argCount; ++i) { + var argName = `toArg${i}Wire`; + invokerFnBody += `var arg${i}Wired = ${argName}(${dtorStack}, arg${i});\n`; + args1.push(argName); + } + + invokerFnBody += (returns || isAsync ? "var rv = ":"") + `invoker(${argsListWired});\n`; + + var returnVal = returns ? "rv" : ""; + + if (needsDestructorStack) { + invokerFnBody += "runDestructors(destructors);\n"; + } else { + for (var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method. + var paramName = (i === 1 ? "thisWired" : ("arg"+(i - 2)+"Wired")); + if (argTypes[i].destructorFunction !== null) { + invokerFnBody += `${paramName}_dtor(${paramName});\n`; + args1.push(`${paramName}_dtor`); + } + } + } + + if (returns) { + invokerFnBody += "var ret = fromRetWire(rv);\n" + + "return ret;\n"; + } else { + } + + invokerFnBody += "}\n"; + + args1.push('checkArgCount', 'minArgs', 'maxArgs'); + invokerFnBody = `if (arguments.length !== ${args1.length}){ throw new Error(humanName + "Expected ${args1.length} closure arguments " + arguments.length + " given."); }\n${invokerFnBody}`; + return new Function(args1, invokerFnBody); + } + + function getRequiredArgCount(argTypes) { + var requiredArgCount = argTypes.length - 2; + for (var i = argTypes.length - 1; i >= 2; --i) { + if (!argTypes[i].optional) { + break; + } + requiredArgCount--; + } + return requiredArgCount; + } + + function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc, /** boolean= */ isAsync) { + // humanName: a human-readable string name for the function to be generated. + // argTypes: An array that contains the embind type objects for all types in the function signature. + // argTypes[0] is the type object for the function return value. + // argTypes[1] is the type object for function this object/class type, or null if not crafting an invoker for a class method. + // argTypes[2...] are the actual function parameters. + // classType: The embind type object for the class to be bound, or null if this is not a method of a class. + // cppInvokerFunc: JS Function object to the C++-side function that interops into C++ code. + // cppTargetFunc: Function pointer (an integer to FUNCTION_TABLE) to the target C++ function the cppInvokerFunc will end up calling. + // isAsync: Optional. If true, returns an async function. Async bindings are only supported with JSPI. + var argCount = argTypes.length; + + if (argCount < 2) { + throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); + } + + assert(!isAsync, 'Async bindings are only supported with JSPI.'); + var isClassMethodFunc = (argTypes[1] !== null && classType !== null); + + // Free functions with signature "void function()" do not need an invoker that marshalls between wire types. + // TODO: This omits argument count check - enable only at -O3 or similar. + // if (ENABLE_UNSAFE_OPTS && argCount == 2 && argTypes[0].name == "void" && !isClassMethodFunc) { + // return FUNCTION_TABLE[fn]; + // } + + // Determine if we need to use a dynamic stack to store the destructors for the function parameters. + // TODO: Remove this completely once all function invokers are being dynamically generated. + var needsDestructorStack = usesDestructorStack(argTypes); + + var returns = !argTypes[0].isVoid; + + var expectedArgCount = argCount - 2; + var minArgs = getRequiredArgCount(argTypes); + // Builld the arguments that will be passed into the closure around the invoker + // function. + var retType = argTypes[0]; + var instType = argTypes[1]; + var closureArgs = [humanName, throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, retType.fromWireType.bind(retType), instType?.toWireType.bind(instType)]; + for (var i = 2; i < argCount; ++i) { + var argType = argTypes[i]; + closureArgs.push(argType.toWireType.bind(argType)); + } + if (!needsDestructorStack) { + // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method. + for (var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { + if (argTypes[i].destructorFunction !== null) { + closureArgs.push(argTypes[i].destructorFunction); + } + } + } + closureArgs.push(checkArgCount, minArgs, expectedArgCount); + + let invokerFactory = createJsInvoker(argTypes, isClassMethodFunc, returns, isAsync); + var invokerFn = invokerFactory(...closureArgs); + return createNamedFunction(humanName, invokerFn); + } + + + var heap32VectorToArray = (count, firstElement) => { + var array = []; + for (var i = 0; i < count; i++) { + // TODO(https://github.com/emscripten-core/emscripten/issues/17310): + // Find a way to hoist the `>> 2` or `>> 3` out of this loop. + array.push(HEAPU32[(((firstElement)+(i * 4))>>2)]); + } + return array; + }; + + + + + + var getFunctionName = (signature) => { + signature = signature.trim(); + const argsIndex = signature.indexOf("("); + if (argsIndex === -1) return signature; + assert(signature.endsWith(")"), "Parentheses for argument names should match."); + return signature.slice(0, argsIndex); + }; + var __embind_register_class_class_function = (rawClassType, + methodName, + argCount, + rawArgTypesAddr, + invokerSignature, + rawInvoker, + fn, + isAsync, + isNonnullReturn) => { + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + methodName = AsciiToString(methodName); + methodName = getFunctionName(methodName); + rawInvoker = embind__requireFunction(invokerSignature, rawInvoker, isAsync); + whenDependentTypesAreResolved([], [rawClassType], (classType) => { + classType = classType[0]; + var humanName = `${classType.name}.${methodName}`; + + function unboundTypesHandler() { + throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`, rawArgTypes); + } + + if (methodName.startsWith('@@')) { + methodName = Symbol[methodName.substring(2)]; + } + + var proto = classType.registeredClass.constructor; + if (undefined === proto[methodName]) { + // This is the first function to be registered with this name. + unboundTypesHandler.argCount = argCount-1; + proto[methodName] = unboundTypesHandler; + } else { + // There was an existing function with the same name registered. Set up + // a function overload routing table. + ensureOverloadTable(proto, methodName, humanName); + proto[methodName].overloadTable[argCount-1] = unboundTypesHandler; + } + + whenDependentTypesAreResolved([], rawArgTypes, (argTypes) => { + // Replace the initial unbound-types-handler stub with the proper + // function. If multiple overloads are registered, the function handlers + // go into an overload table. + var invokerArgsArray = [argTypes[0] /* return value */, null /* no class 'this'*/].concat(argTypes.slice(1) /* actual params */); + var func = craftInvokerFunction(humanName, invokerArgsArray, null /* no class 'this'*/, rawInvoker, fn, isAsync); + if (undefined === proto[methodName].overloadTable) { + func.argCount = argCount-1; + proto[methodName] = func; + } else { + proto[methodName].overloadTable[argCount-1] = func; + } + + if (classType.registeredClass.__derivedClasses) { + for (const derivedClass of classType.registeredClass.__derivedClasses) { + if (!derivedClass.constructor.hasOwnProperty(methodName)) { + // TODO: Add support for overloads + derivedClass.constructor[methodName] = func; + } + } + } + + return []; + }); + return []; + }); + }; + + + + + var __embind_register_class_constructor = ( + rawClassType, + argCount, + rawArgTypesAddr, + invokerSignature, + invoker, + rawConstructor + ) => { + assert(argCount > 0); + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + invoker = embind__requireFunction(invokerSignature, invoker); + var args = [rawConstructor]; + var destructors = []; + + whenDependentTypesAreResolved([], [rawClassType], (classType) => { + classType = classType[0]; + var humanName = `constructor ${classType.name}`; + + if (undefined === classType.registeredClass.constructor_body) { + classType.registeredClass.constructor_body = []; + } + if (undefined !== classType.registeredClass.constructor_body[argCount - 1]) { + throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`); + } + classType.registeredClass.constructor_body[argCount - 1] = () => { + throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`, rawArgTypes); + }; + + whenDependentTypesAreResolved([], rawArgTypes, (argTypes) => { + // Insert empty slot for context type (argTypes[1]). + argTypes.splice(1, 0, null); + classType.registeredClass.constructor_body[argCount - 1] = craftInvokerFunction(humanName, argTypes, null, invoker, rawConstructor); + return []; + }); + return []; + }); + }; + + + + + + + + var __embind_register_class_function = (rawClassType, + methodName, + argCount, + rawArgTypesAddr, // [ReturnType, ThisType, Args...] + invokerSignature, + rawInvoker, + context, + isPureVirtual, + isAsync, + isNonnullReturn) => { + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + methodName = AsciiToString(methodName); + methodName = getFunctionName(methodName); + rawInvoker = embind__requireFunction(invokerSignature, rawInvoker, isAsync); + + whenDependentTypesAreResolved([], [rawClassType], (classType) => { + classType = classType[0]; + var humanName = `${classType.name}.${methodName}`; + + if (methodName.startsWith("@@")) { + methodName = Symbol[methodName.substring(2)]; + } + + if (isPureVirtual) { + classType.registeredClass.pureVirtualFunctions.push(methodName); + } + + function unboundTypesHandler() { + throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`, rawArgTypes); + } + + var proto = classType.registeredClass.instancePrototype; + var method = proto[methodName]; + if (undefined === method || (undefined === method.overloadTable && method.className !== classType.name && method.argCount === argCount - 2)) { + // This is the first overload to be registered, OR we are replacing a + // function in the base class with a function in the derived class. + unboundTypesHandler.argCount = argCount - 2; + unboundTypesHandler.className = classType.name; + proto[methodName] = unboundTypesHandler; + } else { + // There was an existing function with the same name registered. Set up + // a function overload routing table. + ensureOverloadTable(proto, methodName, humanName); + proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler; + } + + whenDependentTypesAreResolved([], rawArgTypes, (argTypes) => { + var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context, isAsync); + + // Replace the initial unbound-handler-stub function with the + // appropriate member function, now that all types are resolved. If + // multiple overloads are registered for this function, the function + // goes into an overload table. + if (undefined === proto[methodName].overloadTable) { + // Set argCount in case an overload is registered later + memberFunction.argCount = argCount - 2; + proto[methodName] = memberFunction; + } else { + proto[methodName].overloadTable[argCount - 2] = memberFunction; + } + + return []; + }); + return []; + }); + }; + + + + var __emval_decref = (handle) => { + if (handle > 9 && 0 === --emval_handles[handle + 1]) { + assert(emval_handles[handle] !== undefined, `Decref for unallocated handle.`); + emval_handles[handle] = undefined; + emval_freelist.push(handle); + } + }; + + + var EmValType = { + name: 'emscripten::val', + fromWireType: (handle) => { + var rv = Emval.toValue(handle); + __emval_decref(handle); + return rv; + }, + toWireType: (destructors, value) => Emval.toHandle(value), + readValueFromPointer: readPointer, + destructorFunction: null, // This type does not need a destructor + + // TODO: do we need a deleteObject here? write a test where + // emval is passed into JS via an interface + }; + var __embind_register_emval = (rawType) => registerType(rawType, EmValType); + + var floatReadValueFromPointer = (name, width) => { + switch (width) { + case 4: return function(pointer) { + return this.fromWireType(HEAPF32[((pointer)>>2)]); + }; + case 8: return function(pointer) { + return this.fromWireType(HEAPF64[((pointer)>>3)]); + }; + default: + throw new TypeError(`invalid float width (${width}): ${name}`); + } + }; + + + + var __embind_register_float = (rawType, name, size) => { + name = AsciiToString(name); + registerType(rawType, { + name, + fromWireType: (value) => value, + toWireType: (destructors, value) => { + if (typeof value != "number" && typeof value != "boolean") { + throw new TypeError(`Cannot convert ${embindRepr(value)} to ${this.name}`); + } + // The VM will perform JS to Wasm value conversion, according to the spec: + // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue + return value; + }, + readValueFromPointer: floatReadValueFromPointer(name, size), + destructorFunction: null, // This type does not need a destructor + }); + }; + + + + + + /** @suppress {globalThis} */ + var __embind_register_integer = (primitiveType, name, size, minRange, maxRange) => { + name = AsciiToString(name); + + const isUnsignedType = minRange === 0; + + let fromWireType = (value) => value; + if (isUnsignedType) { + var bitshift = 32 - 8*size; + fromWireType = (value) => (value << bitshift) >>> bitshift; + maxRange = fromWireType(maxRange); + } + + registerType(primitiveType, { + name, + fromWireType: fromWireType, + toWireType: (destructors, value) => { + if (typeof value != "number" && typeof value != "boolean") { + throw new TypeError(`Cannot convert "${embindRepr(value)}" to ${name}`); + } + assertIntegerRange(name, value, minRange, maxRange); + // The VM will perform JS to Wasm value conversion, according to the spec: + // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue + return value; + }, + readValueFromPointer: integerReadValueFromPointer(name, size, minRange !== 0), + destructorFunction: null, // This type does not need a destructor + }); + }; + + + var __embind_register_memory_view = (rawType, dataTypeIndex, name) => { + var typeMapping = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array, + BigInt64Array, + BigUint64Array, + ]; + + var TA = typeMapping[dataTypeIndex]; + + function decodeMemoryView(handle) { + var size = HEAPU32[((handle)>>2)]; + var data = HEAPU32[(((handle)+(4))>>2)]; + return new TA(HEAP8.buffer, data, size); + } + + name = AsciiToString(name); + registerType(rawType, { + name, + fromWireType: decodeMemoryView, + readValueFromPointer: decodeMemoryView, + }, { + ignoreDuplicateRegistrations: true, + }); + }; + + + + + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.codePointAt(i); + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + i++; + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + }; + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + }; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + }; + + + + var UTF8Decoder = globalThis.TextDecoder && new TextDecoder(); + + var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { + var maxIdx = idx + maxBytesToRead; + if (ignoreNul) return maxIdx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. + // As a tiny code save trick, compare idx against maxIdx using a negation, + // so that maxBytesToRead=undefined/NaN means Infinity. + while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx; + return idx; + }; + + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number=} idx + * @param {number=} maxBytesToRead + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { + + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); + + // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index. + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ''; + }; + var __embind_register_std_string = (rawType, name) => { + name = AsciiToString(name); + var stdStringIsUTF8 = true; + + registerType(rawType, { + name, + // For some method names we use string keys here since they are part of + // the public/external API and/or used by the runtime-generated code. + fromWireType(value) { + var length = HEAPU32[((value)>>2)]; + var payload = value + 4; + + var str; + if (stdStringIsUTF8) { + str = UTF8ToString(payload, length, true); + } else { + str = ''; + for (var i = 0; i < length; ++i) { + str += String.fromCharCode(HEAPU8[payload + i]); + } + } + + _free(value); + + return str; + }, + toWireType(destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } + + var length; + var valueIsOfTypeString = (typeof value == 'string'); + + // We accept `string` or array views with single byte elements + if (!(valueIsOfTypeString || (ArrayBuffer.isView(value) && value.BYTES_PER_ELEMENT == 1))) { + throwBindingError('Cannot pass non-string to std::string'); + } + if (stdStringIsUTF8 && valueIsOfTypeString) { + length = lengthBytesUTF8(value); + } else { + length = value.length; + } + + // assumes POINTER_SIZE alignment + var base = _malloc(4 + length + 1); + var ptr = base + 4; + HEAPU32[((base)>>2)] = length;checkInt32(length); + if (valueIsOfTypeString) { + if (stdStringIsUTF8) { + stringToUTF8(value, ptr, length + 1); + } else { + for (var i = 0; i < length; ++i) { + var charCode = value.charCodeAt(i); + if (charCode > 255) { + _free(base); + throwBindingError('String has UTF-16 code units that do not fit in 8 bits'); + } + HEAPU8[ptr + i] = charCode; + } + } + } else { + HEAPU8.set(value, ptr); + } + + if (destructors !== null) { + destructors.push(_free, base); + } + return base; + }, + readValueFromPointer: readPointer, + destructorFunction(ptr) { + _free(ptr); + }, + }); + }; + + + + + var UTF16Decoder = globalThis.TextDecoder ? new TextDecoder('utf-16le') : undefined;; + + var UTF16ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var idx = ((ptr)>>1); + var endIdx = findStringEnd(HEAPU16, idx, maxBytesToRead / 2, ignoreNul); + + // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. + if (endIdx - idx > 16 && UTF16Decoder) + return UTF16Decoder.decode(HEAPU16.subarray(idx, endIdx)); + + // Fallback: decode without UTF16Decoder + var str = ''; + + // If maxBytesToRead is not passed explicitly, it will be undefined, and the + // for-loop's condition will always evaluate to true. The loop is then + // terminated on the first null char. + for (var i = idx; i < endIdx; ++i) { + var codeUnit = HEAPU16[i]; + // fromCharCode constructs a character from a UTF-16 code unit, so we can + // pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + + return str; + }; + + var stringToUTF16 = (str, outPtr, maxBytesToWrite) => { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + maxBytesToWrite ??= 0x7FFFFFFF; + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)] = codeUnit;checkInt16(codeUnit); + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)] = 0;checkInt16(0); + return outPtr - startPtr; + }; + + var lengthBytesUTF16 = (str) => str.length*2; + + var UTF32ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var str = ''; + var startIdx = ((ptr)>>2); + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + for (var i = 0; !(i >= maxBytesToRead / 4); i++) { + var utf32 = HEAPU32[startIdx + i]; + if (!utf32 && !ignoreNul) break; + str += String.fromCodePoint(utf32); + } + return str; + }; + + var stringToUTF32 = (str, outPtr, maxBytesToWrite) => { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + maxBytesToWrite ??= 0x7FFFFFFF; + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + var codePoint = str.codePointAt(i); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + if (codePoint > 0xFFFF) { + i++; + } + HEAP32[((outPtr)>>2)] = codePoint;checkInt32(codePoint); + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)] = 0;checkInt32(0); + return outPtr - startPtr; + }; + + var lengthBytesUTF32 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var codePoint = str.codePointAt(i); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + if (codePoint > 0xFFFF) { + i++; + } + len += 4; + } + + return len; + }; + var __embind_register_std_wstring = (rawType, charSize, name) => { + name = AsciiToString(name); + var decodeString, encodeString, lengthBytesUTF; + if (charSize === 2) { + decodeString = UTF16ToString; + encodeString = stringToUTF16; + lengthBytesUTF = lengthBytesUTF16; + } else { + assert(charSize === 4, 'only 2-byte and 4-byte strings are currently supported'); + decodeString = UTF32ToString; + encodeString = stringToUTF32; + lengthBytesUTF = lengthBytesUTF32; + } + registerType(rawType, { + name, + fromWireType: (value) => { + // Code mostly taken from _embind_register_std_string fromWireType + var length = HEAPU32[((value)>>2)]; + var str = decodeString(value + 4, length * charSize, true); + + _free(value); + + return str; + }, + toWireType: (destructors, value) => { + if (!(typeof value == 'string')) { + throwBindingError(`Cannot pass non-string to C++ string type ${name}`); + } + + // assumes POINTER_SIZE alignment + var length = lengthBytesUTF(value); + var ptr = _malloc(4 + length + charSize); + HEAPU32[((ptr)>>2)] = length / charSize;checkInt32(length / charSize); + + encodeString(value, ptr + 4, length + charSize); + + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + readValueFromPointer: readPointer, + destructorFunction(ptr) { + _free(ptr); + } + }); + }; + + + + var __embind_register_value_object = ( + rawType, + name, + constructorSignature, + rawConstructor, + destructorSignature, + rawDestructor + ) => { + structRegistrations[rawType] = { + name: AsciiToString(name), + rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), + rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), + fields: [], + }; + }; + + + + var __embind_register_value_object_field = ( + structType, + fieldName, + getterReturnType, + getterSignature, + getter, + getterContext, + setterArgumentType, + setterSignature, + setter, + setterContext + ) => { + structRegistrations[structType].fields.push({ + fieldName: AsciiToString(fieldName), + getterReturnType, + getter: embind__requireFunction(getterSignature, getter), + getterContext, + setterArgumentType, + setter: embind__requireFunction(setterSignature, setter), + setterContext, + }); + }; + + + var __embind_register_void = (rawType, name) => { + name = AsciiToString(name); + registerType(rawType, { + isVoid: true, // void return values can be optimized out sometimes + name, + fromWireType: () => undefined, + // TODO: assert if anything else is given? + toWireType: (destructors, o) => undefined, + }); + }; + + var emval_methodCallers = []; + var emval_addMethodCaller = (caller) => { + var id = emval_methodCallers.length; + emval_methodCallers.push(caller); + return id; + }; + + var emval_lookupTypes = (argCount, argTypes) => { + var a = new Array(argCount); + for (var i = 0; i < argCount; ++i) { + a[i] = requireRegisteredType(HEAPU32[(((argTypes)+(i*4))>>2)], + `parameter ${i}`); + } + return a; + }; + + + var emval_returnValue = (toReturnWire, destructorsRef, handle) => { + var destructors = []; + var result = toReturnWire(destructors, handle); + if (destructors.length) { + // void, primitives and any other types w/o destructors don't need to allocate a handle + HEAPU32[((destructorsRef)>>2)] = Emval.toHandle(destructors); + } + return result; + }; + + + var emval_symbols = { + }; + + var getStringOrSymbol = (address) => { + var symbol = emval_symbols[address]; + if (symbol === undefined) { + return AsciiToString(address); + } + return symbol; + }; + var __emval_create_invoker = (argCount, argTypesPtr, kind) => { + var GenericWireTypeSize = 8; + + var [retType, ...argTypes] = emval_lookupTypes(argCount, argTypesPtr); + var toReturnWire = retType.toWireType.bind(retType); + var argFromPtr = argTypes.map(type => type.readValueFromPointer.bind(type)); + argCount--; // remove the extracted return type + + var captures = {'toValue': Emval.toValue}; + var args = argFromPtr.map((argFromPtr, i) => { + var captureName = `argFromPtr${i}`; + captures[captureName] = argFromPtr; + return `${captureName}(args${i ? '+' + i * GenericWireTypeSize : ''})`; + }); + var functionBody; + switch (kind){ + case 0: + functionBody = 'toValue(handle)'; + break; + case 2: + functionBody = 'new (toValue(handle))'; + break; + case 3: + functionBody = ''; + break; + case 1: + captures['getStringOrSymbol'] = getStringOrSymbol; + functionBody = 'toValue(handle)[getStringOrSymbol(methodName)]'; + break; + } + functionBody += `(${args})`; + if (!retType.isVoid) { + captures['toReturnWire'] = toReturnWire; + captures['emval_returnValue'] = emval_returnValue; + functionBody = `return emval_returnValue(toReturnWire, destructorsRef, ${functionBody})`; + } + functionBody = `return function (handle, methodName, destructorsRef, args) { + ${functionBody} + }`; + + var invokerFunction = new Function(Object.keys(captures), functionBody)(...Object.values(captures)); + var functionName = `methodCaller<(${argTypes.map(t => t.name)}) => ${retType.name}>`; + return emval_addMethodCaller(createNamedFunction(functionName, invokerFunction)); + }; + + + + + var __emval_invoke = (caller, handle, methodName, destructorsRef, args) => { + return emval_methodCallers[caller](handle, methodName, destructorsRef, args); + }; + + + + var __emval_run_destructors = (handle) => { + var destructors = Emval.toValue(handle); + runDestructors(destructors); + __emval_decref(handle); + }; + + var _emscripten_get_now = () => performance.now(); + + var getHeapMax = () => + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + 2147483648; + + var alignMemory = (size, alignment) => { + assert(alignment, "alignment argument is required"); + return Math.ceil(size / alignment) * alignment; + }; + + var growMemory = (size) => { + var oldHeapSize = wasmMemory.buffer.byteLength; + var pages = ((size - oldHeapSize + 65535) / 65536) | 0; + try { + // round size grow request up to wasm page size (fixed 64KB per spec) + wasmMemory.grow(pages); // .grow() takes a delta compared to the previous size + updateMemoryViews(); + return 1 /*success*/; + } catch(e) { + err(`growMemory: Attempted to grow heap from ${oldHeapSize} bytes to ${size} bytes, but got error: ${e}`); + } + // implicit 0 return to save code size (caller will cast "undefined" into 0 + // anyhow) + }; + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + requestedSize >>>= 0; + // With multithreaded builds, races can happen (another thread might increase the size + // in between), so return a failure, and let the caller retry. + assert(requestedSize > oldSize); + + // Memory resize rules: + // 1. Always increase heap size to at least the requested size, rounded up + // to next page multiple. + // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap + // geometrically: increase the heap size according to + // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most + // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). + // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap + // linearly: increase the heap size by at least + // MEMORY_GROWTH_LINEAR_STEP bytes. + // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by + // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest + // 4. If we were unable to allocate as much memory, it may be due to + // over-eager decision to excessively reserve due to (3) above. + // Hence if an allocation fails, cut down on the amount of excess + // growth, in an attempt to succeed to perform a smaller allocation. + + // A limit is set for how much we can grow. We should not exceed that + // (the wasm binary specifies it, so if we tried, we'd fail anyhow). + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`); + return false; + } + + // Loop through potential heap size increases. If we attempt a too eager + // reservation that fails, cut down on the attempted size and reserve a + // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth + // but limit overreserving (default to capping at +96MB overgrowth at most) + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); + + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + + var t0 = _emscripten_get_now(); + var replacement = growMemory(newSize); + var t1 = _emscripten_get_now(); + dbg(`Heap resize call from ${oldSize} to ${newSize} took ${(t1 - t0)} msecs. Success: ${!!replacement}`); + if (replacement) { + + return true; + } + } + err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`); + return false; + }; + + var SYSCALLS = { + varargs:undefined, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + var _fd_close = (fd) => { + abort('fd_close called without SYSCALLS_REQUIRE_FILESYSTEM'); + }; + + var INT53_MAX = 9007199254740992; + + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num); + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + + + return 70; + ; + } + + var printCharBuffers = [null,[],[]]; + + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + assert(buffer); + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + + var flush_NO_FILESYSTEM = () => { + // flush anything remaining in the buffers during shutdown + _fflush(0); + if (printCharBuffers[1].length) printChar(1, 10); + if (printCharBuffers[2].length) printChar(2, 10); + }; + + + var _fd_write = (fd, iov, iovcnt, pnum) => { + // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0 + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr+j]); + } + num += len; + } + HEAPU32[((pnum)>>2)] = num;checkInt32(num); + return 0; + }; + +assert(emval_handles.length === 5 * 2); +init_ClassHandle(); +init_RegisteredPointer(); +// End JS library code + +// include: postlibrary.js +// This file is included after the automatically-generated JS library code +// but before the wasm module is created. + +{ + + // Begin ATMODULES hooks + if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime']; +if (Module['print']) out = Module['print']; +if (Module['printErr']) err = Module['printErr']; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + +Module['FS_createDataFile'] = FS.createDataFile; +Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + + // End ATMODULES hooks + + checkIncomingModuleAPI(); + + if (Module['arguments']) arguments_ = Module['arguments']; + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + // Assertions on removed incoming Module JS APIs. + assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['read'] == 'undefined', 'Module.read option was removed'); + assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); + assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); + assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)'); + assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); + assert(typeof Module['ENVIRONMENT'] == 'undefined', 'Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); + assert(typeof Module['STACK_SIZE'] == 'undefined', 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY + assert(typeof Module['wasmMemory'] == 'undefined', 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); + assert(typeof Module['INITIAL_MEMORY'] == 'undefined', 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].shift()(); + } + } + consumedModuleProp('preInit'); +} + +// Begin runtime exports + var missingLibrarySymbols = [ + 'writeI53ToI64', + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'readI53FromI64', + 'readI53FromU64', + 'convertI32PairToI53', + 'convertI32PairToI53Checked', + 'convertU32PairToI53', + 'stackAlloc', + 'getTempRet0', + 'zeroMemory', + 'exitJS', + 'withStackSave', + 'strError', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'readEmAsmArgs', + 'jstoi_q', + 'getExecutableName', + 'autoResumeAudioContext', + 'getDynCaller', + 'dynCall', + 'handleException', + 'keepRuntimeAlive', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'callUserCallback', + 'maybeExit', + 'asyncLoad', + 'asmjsMangle', + 'mmapAlloc', + 'HandleAllocator', + 'getUniqueRunDependency', + 'addRunDependency', + 'removeRunDependency', + 'addOnInit', + 'addOnPostCtor', + 'addOnPreMain', + 'addOnExit', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'ccall', + 'cwrap', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'intArrayFromString', + 'intArrayToString', + 'stringToAscii', + 'stringToNewUTF8', + 'stringToUTF8OnStack', + 'writeArrayToMemory', + 'registerKeyEventCallback', + 'maybeCStringToJsString', + 'findEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerWheelEventCallback', + 'registerUiEventCallback', + 'registerFocusEventCallback', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'setLetterbox', + 'softFullscreenResizeWebGLRenderTarget', + 'doRequestFullscreen', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'registerPointerlockErrorEventCallback', + 'requestPointerLock', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'registerBeforeUnloadEventCallback', + 'fillBatteryEventData', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'jsStackTrace', + 'getCallstack', + 'convertPCtoSourceLocation', + 'getEnvStrings', + 'checkWasiClock', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'initRandomFill', + 'randomFill', + 'safeSetTimeout', + 'setImmediateWrapped', + 'safeRequestAnimationFrame', + 'clearImmediateWrapped', + 'registerPostMainLoop', + 'registerPreMainLoop', + 'getPromise', + 'makePromise', + 'idsToPromises', + 'makePromiseCallback', + 'Browser_asyncPrepareDataCounter', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'getSocketFromFD', + 'getSocketAddress', + 'heapObjectForWebGLType', + 'toTypedArrayIndex', + 'webgl_enable_ANGLE_instanced_arrays', + 'webgl_enable_OES_vertex_array_object', + 'webgl_enable_WEBGL_draw_buffers', + 'webgl_enable_WEBGL_multi_draw', + 'webgl_enable_EXT_polygon_offset_clamp', + 'webgl_enable_EXT_clip_control', + 'webgl_enable_WEBGL_polygon_mode', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + 'emscriptenWebGLGetUniform', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'writeGLArray', + 'registerWebGlEventCallback', + 'runAndAbortIfError', + 'ALLOC_NORMAL', + 'ALLOC_STACK', + 'allocate', + 'writeStringToMemory', + 'writeAsciiToMemory', + 'allocateUTF8', + 'allocateUTF8OnStack', + 'demangle', + 'stackTrace', + 'getNativeTypeSize', + 'getFunctionArgsName', + 'createJsInvokerSignature', + 'getInheritedInstanceCount', + 'getLiveInheritedInstances', + 'enumReadValueFromPointer', + 'setDelayFunction', + 'validateThis', + 'count_emval_handles', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + + var unexportedSymbols = [ + 'run', + 'out', + 'err', + 'callMain', + 'abort', + 'wasmExports', + 'HEAPF32', + 'HEAPF64', + 'HEAP8', + 'HEAPU8', + 'HEAP16', + 'HEAPU16', + 'HEAP32', + 'HEAPU32', + 'HEAP64', + 'HEAPU64', + 'writeStackCookie', + 'checkStackCookie', + 'INT53_MAX', + 'INT53_MIN', + 'bigintToI53Checked', + 'stackSave', + 'stackRestore', + 'setTempRet0', + 'createNamedFunction', + 'ptrToString', + 'getHeapMax', + 'growMemory', + 'ENV', + 'setStackLimits', + 'ERRNO_CODES', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'readEmAsmArgsArray', + 'alignMemory', + 'wasmTable', + 'wasmMemory', + 'noExitRuntime', + 'addOnPreRun', + 'addOnPostRun', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'AsciiToString', + 'UTF16Decoder', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'JSEvents', + 'specialHTMLTargets', + 'findCanvasEventTarget', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'UNWIND_CACHE', + 'ExitStatus', + 'flush_NO_FILESYSTEM', + 'emSetImmediate', + 'emClearImmediate_deps', + 'emClearImmediate', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionLast', + 'exceptionCaught', + 'ExceptionInfo', + 'findMatchingCatch', + 'Browser', + 'requestFullscreen', + 'requestFullScreen', + 'setCanvasSize', + 'getUserMedia', + 'createContext', + 'getPreloadedImageData__data', + 'wget', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'SYSCALLS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'GL', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'SDL', + 'SDL_gfx', + 'print', + 'printErr', + 'jstoi_s', + 'InternalError', + 'BindingError', + 'throwInternalError', + 'throwBindingError', + 'registeredTypes', + 'awaitingDependencies', + 'typeDependencies', + 'tupleRegistrations', + 'structRegistrations', + 'sharedRegisterType', + 'whenDependentTypesAreResolved', + 'getTypeName', + 'getFunctionName', + 'heap32VectorToArray', + 'requireRegisteredType', + 'usesDestructorStack', + 'checkArgCount', + 'getRequiredArgCount', + 'createJsInvoker', + 'UnboundTypeError', + 'PureVirtualError', + 'EmValType', + 'EmValOptionalType', + 'throwUnboundTypeError', + 'ensureOverloadTable', + 'exposePublicSymbol', + 'replacePublicSymbol', + 'embindRepr', + 'registeredInstances', + 'getBasestPointer', + 'registerInheritedInstance', + 'unregisterInheritedInstance', + 'getInheritedInstance', + 'registeredPointers', + 'registerType', + 'integerReadValueFromPointer', + 'floatReadValueFromPointer', + 'assertIntegerRange', + 'readPointer', + 'runDestructors', + 'craftInvokerFunction', + 'embind__requireFunction', + 'genericPointerToWireType', + 'constNoSmartPtrRawPointerToWireType', + 'nonConstNoSmartPtrRawPointerToWireType', + 'init_RegisteredPointer', + 'RegisteredPointer', + 'RegisteredPointer_fromWireType', + 'runDestructor', + 'releaseClassHandle', + 'finalizationRegistry', + 'detachFinalizer_deps', + 'detachFinalizer', + 'attachFinalizer', + 'makeClassHandle', + 'init_ClassHandle', + 'ClassHandle', + 'throwInstanceAlreadyDeleted', + 'deletionQueue', + 'flushPendingDeletes', + 'delayFunction', + 'RegisteredClass', + 'shallowCopyInternalPointer', + 'downcastPointer', + 'upcastPointer', + 'char_0', + 'char_9', + 'makeLegalFunctionName', + 'emval_freelist', + 'emval_handles', + 'emval_symbols', + 'getStringOrSymbol', + 'Emval', + 'emval_returnValue', + 'emval_lookupTypes', + 'emval_methodCallers', + 'emval_addMethodCaller', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); + + // End runtime exports + // Begin JS library exports + // End JS library exports + +// end include: postlibrary.js + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} + +// Imports from the Wasm binary. +var ___getTypeName = makeInvalidEarlyAccess('___getTypeName'); +var _fflush = makeInvalidEarlyAccess('_fflush'); +var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_end'); +var _emscripten_stack_get_base = makeInvalidEarlyAccess('_emscripten_stack_get_base'); +var _malloc = makeInvalidEarlyAccess('_malloc'); +var _free = makeInvalidEarlyAccess('_free'); +var _setThrew = makeInvalidEarlyAccess('_setThrew'); +var __emscripten_tempret_set = makeInvalidEarlyAccess('__emscripten_tempret_set'); +var _emscripten_stack_init = makeInvalidEarlyAccess('_emscripten_stack_init'); +var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_free'); +var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore'); +var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc'); +var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current'); +var ___cxa_increment_exception_refcount = makeInvalidEarlyAccess('___cxa_increment_exception_refcount'); +var ___cxa_decrement_exception_refcount = makeInvalidEarlyAccess('___cxa_decrement_exception_refcount'); +var ___cxa_can_catch = makeInvalidEarlyAccess('___cxa_can_catch'); +var ___cxa_get_exception_ptr = makeInvalidEarlyAccess('___cxa_get_exception_ptr'); +var ___set_stack_limits = Module['___set_stack_limits'] = makeInvalidEarlyAccess('___set_stack_limits'); +var memory = makeInvalidEarlyAccess('memory'); +var __indirect_function_table = makeInvalidEarlyAccess('__indirect_function_table'); +var wasmMemory = makeInvalidEarlyAccess('wasmMemory'); +var wasmTable = makeInvalidEarlyAccess('wasmTable'); + +function assignWasmExports(wasmExports) { + assert(typeof wasmExports['__getTypeName'] != 'undefined', 'missing Wasm export: __getTypeName'); + ___getTypeName = createExportWrapper('__getTypeName', 1); + assert(typeof wasmExports['fflush'] != 'undefined', 'missing Wasm export: fflush'); + _fflush = createExportWrapper('fflush', 1); + assert(typeof wasmExports['emscripten_stack_get_end'] != 'undefined', 'missing Wasm export: emscripten_stack_get_end'); + _emscripten_stack_get_end = wasmExports['emscripten_stack_get_end']; + assert(typeof wasmExports['emscripten_stack_get_base'] != 'undefined', 'missing Wasm export: emscripten_stack_get_base'); + _emscripten_stack_get_base = wasmExports['emscripten_stack_get_base']; + assert(typeof wasmExports['malloc'] != 'undefined', 'missing Wasm export: malloc'); + _malloc = createExportWrapper('malloc', 1); + assert(typeof wasmExports['free'] != 'undefined', 'missing Wasm export: free'); + _free = createExportWrapper('free', 1); + assert(typeof wasmExports['setThrew'] != 'undefined', 'missing Wasm export: setThrew'); + _setThrew = createExportWrapper('setThrew', 2); + assert(typeof wasmExports['_emscripten_tempret_set'] != 'undefined', 'missing Wasm export: _emscripten_tempret_set'); + __emscripten_tempret_set = createExportWrapper('_emscripten_tempret_set', 1); + assert(typeof wasmExports['emscripten_stack_init'] != 'undefined', 'missing Wasm export: emscripten_stack_init'); + _emscripten_stack_init = wasmExports['emscripten_stack_init']; + assert(typeof wasmExports['emscripten_stack_get_free'] != 'undefined', 'missing Wasm export: emscripten_stack_get_free'); + _emscripten_stack_get_free = wasmExports['emscripten_stack_get_free']; + assert(typeof wasmExports['_emscripten_stack_restore'] != 'undefined', 'missing Wasm export: _emscripten_stack_restore'); + __emscripten_stack_restore = wasmExports['_emscripten_stack_restore']; + assert(typeof wasmExports['_emscripten_stack_alloc'] != 'undefined', 'missing Wasm export: _emscripten_stack_alloc'); + __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc']; + assert(typeof wasmExports['emscripten_stack_get_current'] != 'undefined', 'missing Wasm export: emscripten_stack_get_current'); + _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current']; + assert(typeof wasmExports['__cxa_increment_exception_refcount'] != 'undefined', 'missing Wasm export: __cxa_increment_exception_refcount'); + ___cxa_increment_exception_refcount = createExportWrapper('__cxa_increment_exception_refcount', 1); + assert(typeof wasmExports['__cxa_decrement_exception_refcount'] != 'undefined', 'missing Wasm export: __cxa_decrement_exception_refcount'); + ___cxa_decrement_exception_refcount = createExportWrapper('__cxa_decrement_exception_refcount', 1); + assert(typeof wasmExports['__cxa_can_catch'] != 'undefined', 'missing Wasm export: __cxa_can_catch'); + ___cxa_can_catch = createExportWrapper('__cxa_can_catch', 3); + assert(typeof wasmExports['__cxa_get_exception_ptr'] != 'undefined', 'missing Wasm export: __cxa_get_exception_ptr'); + ___cxa_get_exception_ptr = createExportWrapper('__cxa_get_exception_ptr', 1); + assert(typeof wasmExports['__set_stack_limits'] != 'undefined', 'missing Wasm export: __set_stack_limits'); + ___set_stack_limits = Module['___set_stack_limits'] = createExportWrapper('__set_stack_limits', 2); + assert(typeof wasmExports['memory'] != 'undefined', 'missing Wasm export: memory'); + memory = wasmMemory = wasmExports['memory']; + assert(typeof wasmExports['__indirect_function_table'] != 'undefined', 'missing Wasm export: __indirect_function_table'); + __indirect_function_table = wasmTable = wasmExports['__indirect_function_table']; +} + +var wasmImports = { + /** @export */ + __cxa_begin_catch: ___cxa_begin_catch, + /** @export */ + __cxa_end_catch: ___cxa_end_catch, + /** @export */ + __cxa_find_matching_catch_2: ___cxa_find_matching_catch_2, + /** @export */ + __cxa_find_matching_catch_3: ___cxa_find_matching_catch_3, + /** @export */ + __cxa_rethrow: ___cxa_rethrow, + /** @export */ + __cxa_throw: ___cxa_throw, + /** @export */ + __handle_stack_overflow: ___handle_stack_overflow, + /** @export */ + __resumeException: ___resumeException, + /** @export */ + _abort_js: __abort_js, + /** @export */ + _embind_create_inheriting_constructor: __embind_create_inheriting_constructor, + /** @export */ + _embind_finalize_value_object: __embind_finalize_value_object, + /** @export */ + _embind_register_bigint: __embind_register_bigint, + /** @export */ + _embind_register_bool: __embind_register_bool, + /** @export */ + _embind_register_class: __embind_register_class, + /** @export */ + _embind_register_class_class_function: __embind_register_class_class_function, + /** @export */ + _embind_register_class_constructor: __embind_register_class_constructor, + /** @export */ + _embind_register_class_function: __embind_register_class_function, + /** @export */ + _embind_register_emval: __embind_register_emval, + /** @export */ + _embind_register_float: __embind_register_float, + /** @export */ + _embind_register_integer: __embind_register_integer, + /** @export */ + _embind_register_memory_view: __embind_register_memory_view, + /** @export */ + _embind_register_std_string: __embind_register_std_string, + /** @export */ + _embind_register_std_wstring: __embind_register_std_wstring, + /** @export */ + _embind_register_value_object: __embind_register_value_object, + /** @export */ + _embind_register_value_object_field: __embind_register_value_object_field, + /** @export */ + _embind_register_void: __embind_register_void, + /** @export */ + _emval_create_invoker: __emval_create_invoker, + /** @export */ + _emval_decref: __emval_decref, + /** @export */ + _emval_invoke: __emval_invoke, + /** @export */ + _emval_run_destructors: __emval_run_destructors, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write, + /** @export */ + invoke_fi, + /** @export */ + invoke_fii, + /** @export */ + invoke_fiif, + /** @export */ + invoke_fiiif, + /** @export */ + invoke_fiiiff, + /** @export */ + invoke_fiiifff, + /** @export */ + invoke_i, + /** @export */ + invoke_ii, + /** @export */ + invoke_iiffiiiffiiiii, + /** @export */ + invoke_iii, + /** @export */ + invoke_iiiii, + /** @export */ + invoke_iiiiiiiiffff, + /** @export */ + invoke_v, + /** @export */ + invoke_vi, + /** @export */ + invoke_vif, + /** @export */ + invoke_vifi, + /** @export */ + invoke_vii, + /** @export */ + invoke_viiff, + /** @export */ + invoke_viii, + /** @export */ + invoke_viiiffffii, + /** @export */ + invoke_viiiffiiiii, + /** @export */ + invoke_viiii, + /** @export */ + invoke_viiiii +}; + +function invoke_i(index) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_iii(index,a1,a2) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_v(index) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_ii(index,a1) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_vi(index,a1) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_fi(index,a1) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_vii(index,a1,a2) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiff(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_vif(index,a1,a2) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_fiiiff(index,a1,a2,a3,a4,a5) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_fiiif(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_fiif(index,a1,a2,a3) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiffiiiffiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiiffffii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_vifi(index,a1,a2,a3) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viii(index,a1,a2,a3) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_fiiifff(index,a1,a2,a3,a4,a5,a6) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_fii(index,a1,a2) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiiffiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiiiiiiffff(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiiii(index,a1,a2,a3,a4,a5) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4,a5); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +var calledRun; + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +function run() { + + stackCheckInit(); + + preRun(); + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + assert(!calledRun); + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + (moduleRtn = Module); + Module['onRuntimeInitialized']?.(); + consumedModuleProp('onRuntimeInitialized'); + + assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(() => { + setTimeout(() => Module['setStatus'](''), 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + flush_NO_FILESYSTEM(); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); + warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)'); + } +} + +var wasmExports; + +wasmExports = createWasm(); + +run(); + +// end include: postamble.js + +// include: postamble_modularize.js +// In MODULARIZE mode we wrap the generated code in a factory function +// and return either the Module itself, or a promise of the module. +// +// We assign to the `moduleRtn` global here and configure closure to see +// this as and extern so it won't get minified. + +if (runtimeInitialized) { + moduleRtn = Module; +} else { + // Set up the promise that indicates the Module is initialized + moduleRtn = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); +} + +// Assertion for attempting to access module properties on the incoming +// moduleArg. In the past we used this object as the prototype of the module +// and assigned properties to it, but now we return a distinct object. This +// keeps the instance private until it is ready (i.e the promise has been +// resolved). +for (const prop of Object.keys(Module)) { + if (!(prop in moduleArg)) { + Object.defineProperty(moduleArg, prop, { + configurable: true, + get() { + abort(`Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`) + } + }); + } +} +// end include: postamble_modularize.js + + + + return moduleRtn; +} + +// Export using a UMD style export, or ES6 exports if selected + + + + +// Initialize yoga-layout with embedded WASM. +// Pass wasmBinary directly - Emscripten will use instantiateSync for synchronous loading. +// Note: Despite Emscripten's async API, this is synchronous (-sWASM_ASYNC_COMPILATION=0). +const yogaModule = Module({ + wasmBinary +}); + +// CommonJS export - the initialized module (synchronous). +// ============================================ +// Inlined YGEnums (CJS) +// ============================================ +/** + * Yoga Layout Enums + * + * Converted from upstream yoga/javascript/src/generated/YGEnums.ts + * Copyright (c) Meta Platforms, Inc. and affiliates. + * MIT License + */ + +const Align = { + Auto: 0, + FlexStart: 1, + Center: 2, + FlexEnd: 3, + Stretch: 4, + Baseline: 5, + SpaceBetween: 6, + SpaceAround: 7, + SpaceEvenly: 8, +} + +const BoxSizing = { + BorderBox: 0, + ContentBox: 1, +} + +const Dimension = { + Width: 0, + Height: 1, +} + +const Direction = { + Inherit: 0, + LTR: 1, + RTL: 2, +} + +const Display = { + Flex: 0, + None: 1, + Contents: 2, +} + +const Edge = { + Left: 0, + Top: 1, + Right: 2, + Bottom: 3, + Start: 4, + End: 5, + Horizontal: 6, + Vertical: 7, + All: 8, +} + +const Errata = { + None: 0, + StretchFlexBasis: 1, + AbsolutePositionWithoutInsetsExcludesPadding: 2, + AbsolutePercentAgainstInnerSize: 4, + All: 2147483647, + Classic: 2147483646, +} + +const ExperimentalFeature = { + WebFlexBasis: 0, +} + +const FlexDirection = { + Column: 0, + ColumnReverse: 1, + Row: 2, + RowReverse: 3, +} + +const Gutter = { + Column: 0, + Row: 1, + All: 2, +} + +const Justify = { + FlexStart: 0, + Center: 1, + FlexEnd: 2, + SpaceBetween: 3, + SpaceAround: 4, + SpaceEvenly: 5, +} + +const LogLevel = { + Error: 0, + Warn: 1, + Info: 2, + Debug: 3, + Verbose: 4, + Fatal: 5, +} + +const MeasureMode = { + Undefined: 0, + Exactly: 1, + AtMost: 2, +} + +const NodeType = { + Default: 0, + Text: 1, +} + +const Overflow = { + Visible: 0, + Hidden: 1, + Scroll: 2, +} + +const PositionType = { + Static: 0, + Relative: 1, + Absolute: 2, +} + +const Unit = { + Undefined: 0, + Point: 1, + Percent: 2, + Auto: 3, +} + +const Wrap = { + NoWrap: 0, + Wrap: 1, + WrapReverse: 2, +} + +// Flat constant exports for compatibility with yoga-layout npm package API. +const constants = { + ALIGN_AUTO: Align.Auto, + ALIGN_FLEX_START: Align.FlexStart, + ALIGN_CENTER: Align.Center, + ALIGN_FLEX_END: Align.FlexEnd, + ALIGN_STRETCH: Align.Stretch, + ALIGN_BASELINE: Align.Baseline, + ALIGN_SPACE_BETWEEN: Align.SpaceBetween, + ALIGN_SPACE_AROUND: Align.SpaceAround, + ALIGN_SPACE_EVENLY: Align.SpaceEvenly, + BOX_SIZING_BORDER_BOX: BoxSizing.BorderBox, + BOX_SIZING_CONTENT_BOX: BoxSizing.ContentBox, + DIMENSION_WIDTH: Dimension.Width, + DIMENSION_HEIGHT: Dimension.Height, + DIRECTION_INHERIT: Direction.Inherit, + DIRECTION_LTR: Direction.LTR, + DIRECTION_RTL: Direction.RTL, + DISPLAY_FLEX: Display.Flex, + DISPLAY_NONE: Display.None, + DISPLAY_CONTENTS: Display.Contents, + EDGE_LEFT: Edge.Left, + EDGE_TOP: Edge.Top, + EDGE_RIGHT: Edge.Right, + EDGE_BOTTOM: Edge.Bottom, + EDGE_START: Edge.Start, + EDGE_END: Edge.End, + EDGE_HORIZONTAL: Edge.Horizontal, + EDGE_VERTICAL: Edge.Vertical, + EDGE_ALL: Edge.All, + ERRATA_NONE: Errata.None, + ERRATA_STRETCH_FLEX_BASIS: Errata.StretchFlexBasis, + ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING: + Errata.AbsolutePositionWithoutInsetsExcludesPadding, + ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE: + Errata.AbsolutePercentAgainstInnerSize, + ERRATA_ALL: Errata.All, + ERRATA_CLASSIC: Errata.Classic, + EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS: ExperimentalFeature.WebFlexBasis, + FLEX_DIRECTION_COLUMN: FlexDirection.Column, + FLEX_DIRECTION_COLUMN_REVERSE: FlexDirection.ColumnReverse, + FLEX_DIRECTION_ROW: FlexDirection.Row, + FLEX_DIRECTION_ROW_REVERSE: FlexDirection.RowReverse, + GUTTER_COLUMN: Gutter.Column, + GUTTER_ROW: Gutter.Row, + GUTTER_ALL: Gutter.All, + JUSTIFY_FLEX_START: Justify.FlexStart, + JUSTIFY_CENTER: Justify.Center, + JUSTIFY_FLEX_END: Justify.FlexEnd, + JUSTIFY_SPACE_BETWEEN: Justify.SpaceBetween, + JUSTIFY_SPACE_AROUND: Justify.SpaceAround, + JUSTIFY_SPACE_EVENLY: Justify.SpaceEvenly, + LOG_LEVEL_ERROR: LogLevel.Error, + LOG_LEVEL_WARN: LogLevel.Warn, + LOG_LEVEL_INFO: LogLevel.Info, + LOG_LEVEL_DEBUG: LogLevel.Debug, + LOG_LEVEL_VERBOSE: LogLevel.Verbose, + LOG_LEVEL_FATAL: LogLevel.Fatal, + MEASURE_MODE_UNDEFINED: MeasureMode.Undefined, + MEASURE_MODE_EXACTLY: MeasureMode.Exactly, + MEASURE_MODE_AT_MOST: MeasureMode.AtMost, + NODE_TYPE_DEFAULT: NodeType.Default, + NODE_TYPE_TEXT: NodeType.Text, + OVERFLOW_VISIBLE: Overflow.Visible, + OVERFLOW_HIDDEN: Overflow.Hidden, + OVERFLOW_SCROLL: Overflow.Scroll, + POSITION_TYPE_STATIC: PositionType.Static, + POSITION_TYPE_RELATIVE: PositionType.Relative, + POSITION_TYPE_ABSOLUTE: PositionType.Absolute, + UNIT_UNDEFINED: Unit.Undefined, + UNIT_POINT: Unit.Point, + UNIT_PERCENT: Unit.Percent, + UNIT_AUTO: Unit.Auto, + WRAP_NO_WRAP: Wrap.NoWrap, + WRAP_WRAP: Wrap.Wrap, + WRAP_WRAP_REVERSE: Wrap.WrapReverse, +} + +const YGEnums = constants; + + +// ============================================ +// Inlined wrapAssembly (CJS) +// ============================================ +/** + * Yoga Layout Assembly Wrapper + * + * Converted from upstream yoga/javascript/src/wrapAssembly.ts + * Copyright (c) Meta Platforms, Inc. and affiliates. + * MIT License + * + * This wrapper provides a nicer JavaScript API on top of the raw + * Emscripten bindings, adding conveniences like: + * - Node.create() factory method + * - node.free() for cleanup + * - Patched setters that accept strings like "100%" or "auto" + * - calculateLayout with default parameters + */ + + + + +/** + * Wrap raw Emscripten yoga module with convenience API. + * + * @param {object} lib - Raw Emscripten module + * @returns {object} Wrapped Yoga API + */ +function wrapAssembly(lib) { + function patch(prototype, name, fn) { + const original = prototype[name] + + prototype[name] = function (...args) { + return fn.call(this, original, ...args) + } + } + + for (const fnName of [ + 'setPosition', + 'setMargin', + 'setFlexBasis', + 'setWidth', + 'setHeight', + 'setMinWidth', + 'setMinHeight', + 'setMaxWidth', + 'setMaxHeight', + 'setPadding', + 'setGap', + ]) { + const methods = { + [Unit.Point]: lib.Node.prototype[fnName], + [Unit.Percent]: lib.Node.prototype[`${fnName}Percent`], + [Unit.Auto]: lib.Node.prototype[`${fnName}Auto`], + } + + patch(lib.Node.prototype, fnName, function (original, ...args) { + // We patch all these functions to add support for the following calls: + // .setWidth(100) / .setWidth("100%") / .setWidth(.getWidth()) / .setWidth("auto") + + const value = args.pop() + let unit, asNumber + + if (value === 'auto') { + unit = Unit.Auto + asNumber = undefined + } else if (typeof value === 'object') { + unit = value.unit + asNumber = value.valueOf() + } else { + unit = + typeof value === 'string' && value.endsWith('%') + ? Unit.Percent + : Unit.Point + asNumber = parseFloat(value) + if ( + value !== undefined && + !Number.isNaN(value) && + Number.isNaN(asNumber) + ) { + throw new Error(`Invalid value ${value} for ${fnName}`) + } + } + + if (!methods[unit]) + throw new Error( + `Failed to execute "${fnName}": Unsupported unit '${value}'` + ) + + if (asNumber !== undefined) { + return methods[unit].call(this, ...args, asNumber) + } else { + return methods[unit].call(this, ...args) + } + }) + } + + function wrapMeasureFunction(measureFunction) { + return lib.MeasureCallback.implement({ + measure: (...args) => { + const { width, height } = measureFunction(...args) + return { + width: width ?? NaN, + height: height ?? NaN, + } + }, + }) + } + + patch(lib.Node.prototype, 'setMeasureFunc', function (original, measureFunc) { + // This patch is just a convenience patch, since it helps write more + // idiomatic source code (such as .setMeasureFunc(null)) + if (measureFunc) { + return original.call(this, wrapMeasureFunction(measureFunc)) + } else { + return this.unsetMeasureFunc() + } + }) + + function wrapDirtiedFunc(dirtiedFunction) { + return lib.DirtiedCallback.implement({ dirtied: dirtiedFunction }) + } + + patch(lib.Node.prototype, 'setDirtiedFunc', function (original, dirtiedFunc) { + original.call(this, wrapDirtiedFunc(dirtiedFunc)) + }) + + patch(lib.Config.prototype, 'free', function () { + // Since we handle the memory allocation ourselves (via lib.Config.create), + // we also need to handle the deallocation + lib.Config.destroy(this) + }) + + patch(lib.Node, 'create', (_, config) => { + // We decide the constructor we want to call depending on the parameters + return config ? lib.Node.createWithConfig(config) : lib.Node.createDefault() + }) + + patch(lib.Node.prototype, 'free', function () { + // Since we handle the memory allocation ourselves (via lib.Node.create), + // we also need to handle the deallocation + lib.Node.destroy(this) + }) + + patch(lib.Node.prototype, 'freeRecursive', function () { + for (let t = 0, T = this.getChildCount(); t < T; ++t) { + this.getChild(0).freeRecursive() + } + this.free() + }) + + patch( + lib.Node.prototype, + 'calculateLayout', + function (original, width = NaN, height = NaN, direction = Direction.LTR) { + // Just a small patch to add support for the function default parameters + return original.call(this, width, height, direction) + } + ) + + return { + Config: lib.Config, + Node: lib.Node, + ...YGEnums, + } +} + + +// Apply wrapper to get official yoga-layout API. +module.exports = wrapAssembly(yogaModule); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81ec7323b..1cf54d6c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -804,6 +804,9 @@ importers: '@socketaddon/iocraft': specifier: file:../package-builder/build/dev/out/socketaddon-iocraft version: file:packages/package-builder/build/dev/out/socketaddon-iocraft + '@socketaddon/opentui': + specifier: file:../package-builder/build/dev/out/socketaddon-opentui + version: file:packages/package-builder/build/dev/out/socketaddon-opentui '@socketregistry/hyrious__bun.lockb': specifier: 'catalog:' version: 1.0.19 @@ -2346,6 +2349,10 @@ packages: resolution: {directory: packages/package-builder/build/dev/out/socketaddon-iocraft, type: directory} engines: {node: '>=18'} + '@socketaddon/opentui@file:packages/package-builder/build/dev/out/socketaddon-opentui': + resolution: {directory: packages/package-builder/build/dev/out/socketaddon-opentui, type: directory} + engines: {node: '>=18'} + '@socketregistry/es-set-tostringtag@1.0.10': resolution: {integrity: sha512-btXmvw1JpA8WtSoXx9mTapo9NAyIDKRRzK84i48d8zc0X09M6ORfobVnHbgwhXf7CFhkRzhYrHG9dqbI9vpELQ==} engines: {node: '>=18'} @@ -5874,6 +5881,8 @@ snapshots: '@socketaddon/iocraft@file:packages/package-builder/build/dev/out/socketaddon-iocraft': {} + '@socketaddon/opentui@file:packages/package-builder/build/dev/out/socketaddon-opentui': {} + '@socketregistry/es-set-tostringtag@1.0.10': {} '@socketregistry/hasown@1.0.7': {}